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