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