in lib/server-core/src/main/java/org/apache/olingo/server/core/deserializer/json/ODataJsonDeserializer.java [862:925]
private Geospatial readPrimitiveGeoValue(final String name, final EdmPrimitiveType type, ObjectNode jsonNode)
throws DeserializerException, EdmPrimitiveTypeException {
JsonNode typeNode = jsonNode.remove(Constants.ATTR_TYPE);
if (typeNode != null && typeNode.isTextual()) {
final Class<? extends Geospatial> geoDataType = jsonNameToGeoDataType.get(typeNode.asText());
if (geoDataType != null && (type == null || geoDataType.equals(type.getDefaultType()))) {
final JsonNode topNode = jsonNode.remove(
geoDataType.equals(GeospatialCollection.class) ? Constants.JSON_GEOMETRIES : Constants.JSON_COORDINATES);
SRID srid = null;
if (jsonNode.has(Constants.JSON_CRS)) {
srid = SRID.valueOf(
jsonNode.remove(Constants.JSON_CRS).get(Constants.PROPERTIES).
get(Constants.JSON_NAME).asText().split(":")[1]);
}
assertJsonNodeIsEmpty(jsonNode);
if (topNode != null && topNode.isArray()) {
final Geospatial.Dimension dimension = type == null || type.getName().startsWith("Geometry") ?
Geospatial.Dimension.GEOMETRY :
Geospatial.Dimension.GEOGRAPHY;
if (geoDataType.equals(Point.class)) {
return readGeoPointValue(name, dimension, topNode, srid);
} else if (geoDataType.equals(MultiPoint.class)) {
return new MultiPoint(dimension, srid, readGeoPointValues(name, dimension, 0, false, topNode));
} else if (geoDataType.equals(LineString.class)) {
// Although a line string with less than two points is not really one, the OData specification says:
// "The coordinates member of a LineString can have zero or more positions".
// Therefore the required minimal size of the points array currently is zero.
return new LineString(dimension, srid, readGeoPointValues(name, dimension, 0, false, topNode));
} else if (geoDataType.equals(MultiLineString.class)) {
List<LineString> lines = new ArrayList<>();
for (final JsonNode element : topNode) {
// Line strings can be empty (see above).
lines.add(new LineString(dimension, srid, readGeoPointValues(name, dimension, 0, false, element)));
}
return new MultiLineString(dimension, srid, lines);
} else if (geoDataType.equals(Polygon.class)) {
return readGeoPolygon(name, dimension, topNode, srid);
} else if (geoDataType.equals(MultiPolygon.class)) {
List<Polygon> polygons = new ArrayList<>();
for (final JsonNode element : topNode) {
polygons.add(readGeoPolygon(name, dimension, element, null));
}
return new MultiPolygon(dimension, srid, polygons);
} else if (geoDataType.equals(GeospatialCollection.class)) {
List<Geospatial> elements = new ArrayList<>();
for (final JsonNode element : topNode) {
if (element.isObject()) {
elements.add(readPrimitiveGeoValue(name, null, (ObjectNode) element));
} else {
throw new DeserializerException("Invalid value '" + element + "' in property: " + name,
DeserializerException.MessageKeys.INVALID_VALUE_FOR_PROPERTY, name);
}
}
return new GeospatialCollection(dimension, srid, elements);
}
}
}
}
throw new DeserializerException("Invalid value '" + jsonNode + "' for property: " + name,
DeserializerException.MessageKeys.INVALID_VALUE_FOR_PROPERTY, name);
}