You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@olingo.apache.org by mi...@apache.org on 2022/02/26 10:24:48 UTC

[olingo-odata4] branch master updated: [OLINGO-1471] Adding support for multiple interior rings

This is an automated email from the ASF dual-hosted git repository.

mibo pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/olingo-odata4.git


The following commit(s) were added to refs/heads/master by this push:
     new 64b1a44  [OLINGO-1471] Adding support for multiple interior rings
64b1a44 is described below

commit 64b1a449de6271ff1b74f4927599ccfda553e0fc
Author: shawkins <sh...@redhat.com>
AuthorDate: Wed Jul 22 11:47:56 2020 -0400

    [OLINGO-1471] Adding support for multiple interior rings
---
 .../core/deserializer/json/ODataJsonDeserializer.java       | 13 +++++++------
 .../deserializer/json/ODataJsonDeserializerEntityTest.java  | 13 ++++++++-----
 2 files changed, 15 insertions(+), 11 deletions(-)

diff --git a/lib/server-core/src/main/java/org/apache/olingo/server/core/deserializer/json/ODataJsonDeserializer.java b/lib/server-core/src/main/java/org/apache/olingo/server/core/deserializer/json/ODataJsonDeserializer.java
index ea3cdf4..08f9263 100644
--- a/lib/server-core/src/main/java/org/apache/olingo/server/core/deserializer/json/ODataJsonDeserializer.java
+++ b/lib/server-core/src/main/java/org/apache/olingo/server/core/deserializer/json/ODataJsonDeserializer.java
@@ -971,13 +971,14 @@ public class ODataJsonDeserializer implements ODataDeserializer {
 
   private Polygon readGeoPolygon(final String name, final Geospatial.Dimension dimension, JsonNode node, SRID srid)
       throws DeserializerException, EdmPrimitiveTypeException {
-    // GeoJSON would allow for more than one interior polygon (hole).
-    // But there is no place in the data object to store this information so for now we throw an error.
     // There could be a more strict verification that the lines describe boundaries and have the correct winding order.
-    if (node.isArray() && (node.size() == 1 || node.size() == 2)) {
-      return new Polygon(dimension, srid,
-          node.size() > 1 ? readGeoPointValues(name, dimension, 4, true, node.get(1)) : null,
-          readGeoPointValues(name, dimension, 4, true, node.get(0)));
+    if (node.isArray() && (node.size() >= 1)) {
+      List<LineString> interiors = new ArrayList<>();
+      for (int i = 1; i < node.size(); i++) {
+        interiors.add(new LineString(dimension, srid, readGeoPointValues(name, dimension, 4, true, node.get(i))));
+      }
+      return new Polygon(dimension, srid, interiors,
+          new LineString(dimension, srid, readGeoPointValues(name, dimension, 4, true, node.get(0))));
     }
     throw new DeserializerException("Invalid polygon values '" + node + "' in property: " + name,
         DeserializerException.MessageKeys.INVALID_VALUE_FOR_PROPERTY, name);
diff --git a/lib/server-test/src/test/java/org/apache/olingo/server/core/deserializer/json/ODataJsonDeserializerEntityTest.java b/lib/server-test/src/test/java/org/apache/olingo/server/core/deserializer/json/ODataJsonDeserializerEntityTest.java
index 9de9b10..a6f380a 100644
--- a/lib/server-test/src/test/java/org/apache/olingo/server/core/deserializer/json/ODataJsonDeserializerEntityTest.java
+++ b/lib/server-test/src/test/java/org/apache/olingo/server/core/deserializer/json/ODataJsonDeserializerEntityTest.java
@@ -1046,6 +1046,14 @@ public class ODataJsonDeserializerEntityTest extends AbstractODataDeserializerTe
         entityType);
     polygon = (Polygon) entity.getProperties().get(0).getValue();
     assertEquals(0, polygon.getNumberOfInteriorRings());
+    
+    entity = deserialize("{\"" + entityType.getPropertyNames().get(0) + "\":{"
+        + "\"type\":\"Polygon\",\"coordinates\":[[[0,0],[3,0],[3,3],[0,3],[0,0]],"
+        + "[[1,1],[1,2],[2,2],[2,1],[1,1]],"
+        + "[[1,1],[1,2],[2,2],[2,1],[1,1]]]}}",
+        entityType);
+    polygon = (Polygon) entity.getProperties().get(0).getValue();
+    assertEquals(2, polygon.getNumberOfInteriorRings());
 
     expectException("{\"" + entityType.getPropertyNames().get(0) + "\":{"
         + "\"type\":\"Polygon\",\"coordinates\":{\"ext\":[[0,0],[3,0],[0,3],[0,0]]}}}", entityType,
@@ -1056,11 +1064,6 @@ public class ODataJsonDeserializerEntityTest extends AbstractODataDeserializerTe
     expectException("{\"" + entityType.getPropertyNames().get(0) + "\":{"
         + "\"type\":\"Polygon\",\"coordinates\":[[[0,0],[3,0],[3,3],[0,3],[42,87]]]}}", entityType,
         ContentType.JSON, DeserializerException.MessageKeys.INVALID_VALUE_FOR_PROPERTY);
-    expectException("{\"" + entityType.getPropertyNames().get(0) + "\":{"
-        + "\"type\":\"Polygon\",\"coordinates\":[[[0,0],[3,0],[3,3],[0,3],[0,0]],"
-        + "[[1,1],[1,2],[2,2],[2,1],[1,1]],"
-        + "[[1,1],[1,2],[2,2],[2,1],[1,1]]]}}", entityType,
-        ContentType.JSON, DeserializerException.MessageKeys.INVALID_VALUE_FOR_PROPERTY);
   }
 
   @Test