Revision 46916

View differences:

trunk/org.gvsig.desktop/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.dal/org.gvsig.fmap.dal.impl/src/main/java/org/gvsig/fmap/dal/feature/impl/DefaultFeature.java
31 31
import java.util.ArrayList;
32 32
import java.util.Date;
33 33
import java.util.HashMap;
34
import java.util.HashSet;
34 35
import java.util.Iterator;
35 36
import java.util.List;
36 37
import java.util.Map;
37 38
import java.util.Objects;
39
import java.util.Set;
38 40
import java.util.function.Predicate;
39 41
import javax.json.JsonObject;
40 42
import org.apache.commons.lang3.ArrayUtils;
41 43
import org.apache.commons.lang3.StringUtils;
44
import org.apache.commons.lang3.tuple.Pair;
42 45
import org.cresques.cts.IProjection;
43 46
import org.gvsig.expressionevaluator.ExpressionUtils;
44 47
import org.gvsig.fmap.dal.DALLocator;
......
56 59
import org.gvsig.fmap.dal.feature.FeatureReference;
57 60
import org.gvsig.fmap.dal.feature.FeatureStore;
58 61
import org.gvsig.fmap.dal.feature.FeatureType;
62
import org.gvsig.fmap.dal.feature.ForeingKey;
59 63
import org.gvsig.fmap.dal.feature.exception.IllegalValueException;
60 64
import org.gvsig.fmap.dal.feature.exception.SetReadOnlyAttributeException;
61 65
import org.gvsig.fmap.dal.feature.impl.dynobjectutils.DynObjectFeatureFacade;
......
65 69
import org.gvsig.fmap.geom.Geometry;
66 70
import org.gvsig.fmap.geom.primitive.Envelope;
67 71
import org.gvsig.json.Json;
72
import org.gvsig.json.JsonArrayBuilder;
68 73
import org.gvsig.json.JsonObjectBuilder;
74
import org.gvsig.json.SupportToJson;
69 75
import org.gvsig.tools.ToolsLocator;
70 76
import org.gvsig.tools.dataTypes.Coercion;
71 77
import org.gvsig.tools.dataTypes.CoercionException;
72 78
import org.gvsig.tools.dataTypes.DataType;
73 79
import org.gvsig.tools.dataTypes.DataTypesManager;
80
import org.gvsig.tools.dynobject.DynField;
81
import static org.gvsig.tools.dynobject.DynField.RELATION_TYPE_COMPOSITION;
74 82
import org.gvsig.tools.dynobject.DynObject;
75 83
import org.gvsig.tools.evaluator.Evaluator;
76 84
import org.gvsig.tools.evaluator.EvaluatorData;
......
78 86
import org.gvsig.tools.exception.BaseException;
79 87
import org.gvsig.tools.exception.BaseRuntimeException;
80 88
import org.gvsig.tools.lang.Cloneable;
89
import org.gvsig.tools.util.Bitmask;
81 90
import org.slf4j.Logger;
82 91
import org.slf4j.LoggerFactory;
83 92

  
......
1528 1537

  
1529 1538
    @Override
1530 1539
    public JsonObjectBuilder toJsonBuilder() {
1540
        return this.toJsonBuilder(null, Bitmask.createBitmask(TOJSON_MODE_SHALLOW), null);
1541
//        JsonObjectBuilder builder = Json.createObjectBuilder();
1542
//        Date date;
1543
//        Geometry geom;
1544
//        FeatureType ft = this.getType();
1545
//        for (FeatureAttributeDescriptor desc : ft) {
1546
//            if (desc.isComputed()) {
1547
//                continue;
1548
//            }
1549
//            if(this.isNull(desc.getName())){
1550
//                builder.addNull(desc.getName());
1551
//                continue;
1552
//            }
1553
//            switch (desc.getType()) {
1554
//                case DataTypes.GEOMETRY:
1555
//                    geom = this.getGeometry(desc.getIndex());
1556
//                    if (geom != null) {
1557
//                        builder.add(desc.getName(), geom.convertToHexWKBQuietly());
1558
//                    }
1559
//                    break;
1560
//                case DataTypes.BOOLEAN:
1561
//                    builder.add(desc.getName(), this.getBoolean(desc.getIndex()));
1562
//                    break;
1563
//                case DataTypes.BYTE:
1564
//                    builder.add(desc.getName(), this.getByte(desc.getIndex()));
1565
//                    break;
1566
//                case DataTypes.INT:
1567
//                    builder.add(desc.getName(), this.getInt(desc.getIndex()));
1568
//                    break;
1569
//                case DataTypes.LONG:
1570
//                    builder.add(desc.getName(), this.getLong(desc.getIndex()));
1571
//                    break;
1572
//                case DataTypes.DOUBLE:
1573
//                    builder.add(desc.getName(), this.getDouble(desc.getIndex()));
1574
//                    break;
1575
//                case DataTypes.FLOAT:
1576
//                    builder.add(desc.getName(), this.getFloat(desc.getIndex()));
1577
//                    break;
1578
//                case DataTypes.DECIMAL:
1579
//                    builder.add(desc.getName(), this.getDecimal(desc.getIndex()));
1580
//                    break;
1581
//                case DataTypes.DATE:
1582
//                    // Format date as ISO 8601
1583
//                    date = this.getDate(desc.getIndex());
1584
//                    if (date == null) {
1585
//                        builder.addNull(desc.getName());
1586
//                    } else {
1587
//                        LocalDateTime localDateTime = LocalDateTime.ofInstant(new Date(date.getTime()).toInstant(), ZoneId.systemDefault());
1588
//                        String value = DateTimeFormatter.ISO_DATE.format(localDateTime);
1589
//                        builder.add(desc.getName(), value);
1590
//                    }
1591
//                    break;
1592
//                case DataTypes.TIMESTAMP:
1593
//                    // Format date as ISO 8601
1594
//                    date = this.getTimestamp(desc.getIndex());
1595
//                    if (date == null) {
1596
//                        builder.addNull(desc.getName());
1597
//                    } else {
1598
//                        LocalDateTime localDateTime = LocalDateTime.ofInstant(new Date(date.getTime()).toInstant(), ZoneId.systemDefault());
1599
//                        String value = DateTimeFormatter.ISO_DATE_TIME.format(localDateTime);
1600
//                        builder.add(desc.getName(), value);
1601
//                    }
1602
//                    break;
1603
//                case DataTypes.TIME:
1604
//                    // Format date as ISO 8601
1605
//                    date = this.getTime(desc.getIndex());
1606
//                    if (date == null) {
1607
//                        builder.addNull(desc.getName());
1608
//                    } else {
1609
//                        LocalDateTime localDateTime = LocalDateTime.ofInstant(new Date(date.getTime()).toInstant(), ZoneId.systemDefault());
1610
//                        String value = DateTimeFormatter.ISO_TIME.format(localDateTime);
1611
//                        builder.add(desc.getName(), value);
1612
//                    }
1613
//                    break;
1614
//                default:
1615
//                    builder.add(desc.getName(), this.getStringOrDefault(desc.getIndex(), ""));
1616
//            }
1617
//        }
1618
//        return builder;
1619
    }
1620

  
1621
    public static final String TOJSON_MODE = "mode";
1622
    public static final int TOJSON_MODE_SHALLOW = 0;
1623
    public static final int TOJSON_MODE_DEEP =        0b00001;
1624
    public static final int TOJSON_MODE_COMPUTEDS =   0b00010;
1625
    public static final int TOJSON_MODE_COLLECTIONS = 0b00100;
1626
    
1627
    @Override
1628
    public JsonObjectBuilder toJsonBuilder(Map<String, Object> props) {    
1629
        Bitmask modemask = null;
1630
        Set<String> visiteds = null;
1631
        int mode = TOJSON_MODE_SHALLOW;
1632
        if( props!=null ) {
1633
            mode = (int) props.getOrDefault(TOJSON_MODE,mode);
1634
            modemask = Bitmask.createBitmask(mode);
1635
            if( modemask.isSetBits(TOJSON_MODE_DEEP) ) {
1636
                visiteds = (Set<String>) props.getOrDefault("visiteds", null);
1637
                if( visiteds == null ) {
1638
                    visiteds = new HashSet<>();
1639
                    props.put("visiteds", visiteds);
1640
                }
1641
            }
1642
        } else {
1643
            modemask = Bitmask.createBitmask(mode);
1644
        }
1645
        return this.toJsonBuilder(props, modemask, visiteds);
1646
    }
1647
    
1648
    private JsonObjectBuilder toJsonBuilder(Map<String, Object> props, Bitmask mode, Set<String> visiteds) {    
1531 1649
        JsonObjectBuilder builder = Json.createObjectBuilder();
1532 1650
        Date date;
1533 1651
        Geometry geom;
1534 1652
        FeatureType ft = this.getType();
1653
        
1535 1654
        for (FeatureAttributeDescriptor desc : ft) {
1536
            if (desc.isComputed()) {
1537
                continue;
1655
            if (desc.isComputed() ) { 
1656
                if( !mode.isSetBits(TOJSON_MODE_COMPUTEDS) ) {
1657
                    if( !(mode.isSetBits(TOJSON_MODE_COLLECTIONS) && desc.getType()==DataTypes.LIST) ) { 
1658
                        continue;
1659
                    }
1660
                }
1538 1661
            }
1539 1662
            if(this.isNull(desc.getName())){
1540 1663
                builder.addNull(desc.getName());
1541 1664
                continue;
1542 1665
            }
1666
            if( desc.isForeingKey() && !desc.getForeingKey().isClosedList() && mode.isSetBits(TOJSON_MODE_DEEP) ) {
1667
                if( desc.getRelationType()==RELATION_TYPE_COMPOSITION ) { // --Ojo--
1668
                    Object value = this.get(desc.getName());
1669
                    Feature f = desc.getForeingKey().getFeature(null, value);
1670
                    String x = f.getReference().getCode();
1671
                    if( visiteds==null ) {
1672
                        if( f instanceof DefaultFeature ) {
1673
                            builder.add(desc.getName(), ((DefaultFeature)f).toJsonBuilder(props, mode, visiteds));
1674
                        } else {
1675
                            builder.add(desc.getName(), f.toJsonBuilder(props));
1676
                        }
1677
                    } else if( !visiteds.contains(x) ) {
1678
                        visiteds.add(x);
1679
                        if( f instanceof DefaultFeature ) {
1680
                            builder.add(desc.getName(), ((DefaultFeature)f).toJsonBuilder(props, mode, visiteds));
1681
                        } else {
1682
                            builder.add(desc.getName(), f.toJsonBuilder(props));
1683
                        }
1684
                    }
1685
                    continue;
1686
                }
1687
            }
1543 1688
            switch (desc.getType()) {
1544 1689
                case DataTypes.GEOMETRY:
1545 1690
                    geom = this.getGeometry(desc.getIndex());
......
1601 1746
                        builder.add(desc.getName(), value);
1602 1747
                    }
1603 1748
                    break;
1749
                case DataTypes.LIST: 
1750
                    if( mode.isSetBits(TOJSON_MODE_COLLECTIONS) ) {
1751
                        if( desc.getRelationType()==RELATION_TYPE_COMPOSITION ) {
1752
                            JsonArrayBuilder arraybuilder = Json.createArrayBuilder();
1753
                            Object x = this.get(desc.getName());
1754
                            if( x instanceof List ) {
1755
                                for (Object v : (List)x) {
1756
                                    if( v instanceof DefaultFeature ) {
1757
                                        arraybuilder.add(((DefaultFeature)v).toJsonBuilder(props, mode, visiteds));
1758
                                    } else if( v instanceof Feature ) {
1759
                                        arraybuilder.add(((Feature)v).toJsonBuilder(props));
1760
                                    }
1761
                                }
1762
                            }
1763
                            builder.add(desc.getName(), arraybuilder);
1764
                        }
1765
                    }
1766
                    break;
1767
                    
1604 1768
                default:
1605 1769
                    builder.add(desc.getName(), this.getStringOrDefault(desc.getIndex(), ""));
1606 1770
            }

Also available in: Unified diff