Revision 47756 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

View differences:

DefaultFeature.java
50 50
import org.gvsig.fmap.dal.SupportTransactions;
51 51
import org.gvsig.fmap.dal.exception.DataEvaluatorRuntimeException;
52 52
import org.gvsig.fmap.dal.exception.DataException;
53
import org.gvsig.fmap.dal.exception.DataRuntimeException;
53 54
import org.gvsig.fmap.dal.feature.DataProfile;
54 55
import org.gvsig.fmap.dal.feature.EditableFeature;
55 56
import org.gvsig.fmap.dal.feature.EditableFeatureAttributeDescriptor;
......
80 81
import org.gvsig.tools.dataTypes.DataTypesManager;
81 82
import org.gvsig.tools.dispose.DisposeUtils;
82 83
import org.gvsig.tools.dynobject.DynField;
83
import static org.gvsig.tools.dynobject.DynField.RELATION_TYPE_AGGREGATE;
84
import static org.gvsig.tools.dynobject.DynField.RELATION_TYPE_COLLABORATION;
85
import static org.gvsig.tools.dynobject.DynField.RELATION_TYPE_COMPOSITION;
86 84
import org.gvsig.tools.dynobject.DynObject;
87 85
import org.gvsig.tools.dynobject.Tags;
88 86
import org.gvsig.tools.evaluator.Evaluator;
......
1637 1635
    }
1638 1636

  
1639 1637
    public static final String TOJSON_MODE = "mode";
1638
    public static final String FORMAT_MODE = "format";
1639
    
1640
    public static final String FORMAT_MODE_GVSIGDESKTOP = "gvsigdesktop";
1641
    public static final String FORMAT_MODE_GEOJSON = "geojson";
1642
    
1640 1643
    public static final int TOJSON_MODE_SHALLOW = 0;
1641 1644
    public static final int TOJSON_MODE_DEEP =        0b00001;
1642 1645
    public static final int TOJSON_MODE_COMPUTEDS =   0b00010;
......
1644 1647
    
1645 1648
    @Override
1646 1649
    public JsonObjectBuilder toJsonBuilder(Map<String, Object> props) {    
1650
        if( props == null ) {
1651
            return toJsonBuilderDefault(props);
1652
        }
1653
        String format = (String) props.getOrDefault(FORMAT_MODE,FORMAT_MODE_GVSIGDESKTOP);
1654
        switch(format.toLowerCase()) {
1655
            case FORMAT_MODE_GEOJSON:
1656
                return toJsonBuilderGeoJson(props);
1657
            case FORMAT_MODE_GVSIGDESKTOP:
1658
            default:
1659
                return toJsonBuilderDefault(props);
1660
        }
1661
    }
1662
    
1663
    public JsonObjectBuilder toJsonBuilderDefault(Map<String, Object> props) {    
1647 1664
        Bitmask modemask = null;
1648 1665
        Set<String> visiteds = null;
1649 1666
        int mode = TOJSON_MODE_SHALLOW;
......
1663 1680
        return this.toJsonBuilder(props, modemask, visiteds);
1664 1681
    }
1665 1682
    
1683
    private JsonObjectBuilder toJsonBuilderGeoJson(Map<String, Object> props) {    
1684
        FeatureType ft = this.getType();
1685
        Geometry geom = this.getDefaultGeometry();
1686
        
1687
        Bitmask mode = Bitmask.createBitmask((int) props.getOrDefault(TOJSON_MODE,TOJSON_MODE_SHALLOW));
1688
        boolean skipNulls = (boolean) props.getOrDefault("skipnulls", false);
1689
        String skipField = (String) props.getOrDefault("skipfield", null);
1690
        Map<String,Object>properties = new HashMap<>();
1691
        
1692
        for (FeatureAttributeDescriptor desc : ft) {
1693
            if (desc.isComputed() ) { 
1694
                if( !mode.isSetBits(TOJSON_MODE_COMPUTEDS) ) {
1695
                    continue;
1696
                }
1697
            }
1698
            if(!StringUtils.isBlank(skipField) && StringUtils.equals(skipField, desc.getName())){
1699
                continue;
1700
            }
1701
            if( this.isNull(desc.getName()) ){
1702
                if(!skipNulls){
1703
                    properties.put(desc.getName(),null);
1704
                }
1705
                continue;
1706
            }
1707
            switch (desc.getType()) {
1708
                case DataTypes.BOOLEAN:
1709
                    properties.put(desc.getName(), this.getBoolean(desc.getIndex()));
1710
                    break;
1711
                case DataTypes.BYTE:
1712
                    properties.put(desc.getName(), this.getByte(desc.getIndex()));
1713
                    break;
1714
                case DataTypes.INT:
1715
                    properties.put(desc.getName(), this.getInt(desc.getIndex()));
1716
                    break;
1717
                case DataTypes.LONG:
1718
                    properties.put(desc.getName(), this.getLong(desc.getIndex()));
1719
                    break;
1720
                case DataTypes.DOUBLE:
1721
                    properties.put(desc.getName(), this.getDouble(desc.getIndex()));
1722
                    break;
1723
                case DataTypes.FLOAT:
1724
                    properties.put(desc.getName(), this.getFloat(desc.getIndex()));
1725
                    break;
1726
                case DataTypes.DECIMAL:
1727
                    properties.put(desc.getName(), this.getDecimal(desc.getIndex()));
1728
                    break;
1729
                case DataTypes.DATE: {
1730
                        // Format date as ISO 8601
1731
                        java.sql.Date date = this.getDate(desc.getIndex());
1732
                        LocalDateTime localDateTime = LocalDateTime.ofInstant(new Date(date.getTime()).toInstant(), ZoneId.systemDefault());
1733
                        String value = DateTimeFormatter.ISO_DATE.format(localDateTime);
1734
                        properties.put(desc.getName(), value);
1735
                    }
1736
                    break;
1737
                case DataTypes.TIMESTAMP: {
1738
                        // Format date as ISO 8601
1739
                        java.sql.Date date = this.getDate(desc.getIndex());
1740
                        LocalDateTime localDateTime = LocalDateTime.ofInstant(new Date(date.getTime()).toInstant(), ZoneId.systemDefault());
1741
                        String value = DateTimeFormatter.ISO_DATE_TIME.format(localDateTime);
1742
                        properties.put(desc.getName(), value);
1743
                    }
1744
                    break;
1745
                case DataTypes.TIME: {
1746
                        // Format date as ISO 8601
1747
                        java.sql.Date date = this.getDate(desc.getIndex());
1748
                        LocalDateTime localDateTime = LocalDateTime.ofInstant(new Date(date.getTime()).toInstant(), ZoneId.systemDefault());
1749
                        String value = DateTimeFormatter.ISO_TIME.format(localDateTime);
1750
                        properties.put(desc.getName(), value);
1751
                    }
1752
                    break;
1753

  
1754
                    
1755
                default:
1756
                    properties.put(desc.getName(), this.getStringOrDefault(desc.getIndex(), ""));
1757
            }
1758
        }
1759
        String json_s;
1760
        try {
1761
            json_s = geom.convertToGeoJson(properties, (boolean) props.getOrDefault("encodecrs", true));
1762
        } catch (Exception ex) {
1763
            throw new ConvertFeatureToGeoJsonException(ex);
1764
        }
1765
        JsonObjectBuilder json = Json.createObjectBuilder(json_s);
1766
        return json;
1767
        
1768
    }
1769
    
1770
    private static class ConvertFeatureToGeoJsonException extends DataRuntimeException {
1771

  
1772
        private static final long serialVersionUID = -1;
1773
        private final static String MESSAGE_FORMAT = "Create GeoJson builder exception.";
1774
        private final static String MESSAGE_KEY = "_ConvertFeatureToGeoJsonException";
1775

  
1776
        public ConvertFeatureToGeoJsonException(Throwable cause) {
1777
            super(MESSAGE_FORMAT, cause, MESSAGE_KEY, serialVersionUID);
1778
        }
1779

  
1780
    }
1781

  
1666 1782
    private JsonObjectBuilder toJsonBuilder(Map<String, Object> props, Bitmask mode, Set<String> visiteds) {    
1667 1783
        JsonObjectBuilder builder = Json.createObjectBuilder();
1668 1784
        Date date;
......
1916 2032
        Expression filter = ExpressionUtils.createExpression(builder.toString());                            
1917 2033
        return filter;
1918 2034
    }
1919
}
2035
}

Also available in: Unified diff