You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@olingo.apache.org by ra...@apache.org on 2018/09/24 17:33:51 UTC
olingo-odata4 git commit: OLINGO-1294 adding polygon support for
multiple interior rings
Repository: olingo-odata4
Updated Branches:
refs/heads/master 8cbe468c2 -> ebdf0d3e3
OLINGO-1294 adding polygon support for multiple interior rings
Project: http://git-wip-us.apache.org/repos/asf/olingo-odata4/repo
Commit: http://git-wip-us.apache.org/repos/asf/olingo-odata4/commit/ebdf0d3e
Tree: http://git-wip-us.apache.org/repos/asf/olingo-odata4/tree/ebdf0d3e
Diff: http://git-wip-us.apache.org/repos/asf/olingo-odata4/diff/ebdf0d3e
Branch: refs/heads/master
Commit: ebdf0d3e3a604133e1a54e79aecd7299e6b7c55e
Parents: 8cbe468
Author: shawkins <sh...@redhat.com>
Authored: Fri Sep 21 17:36:02 2018 -0400
Committer: shawkins <sh...@redhat.com>
Committed: Fri Sep 21 17:36:02 2018 -0400
----------------------------------------------------------------------
.../serialization/AtomGeoValueDeserializer.java | 12 ++--
.../serialization/AtomGeoValueSerializer.java | 4 +-
.../serialization/JsonGeoValueDeserializer.java | 10 +--
.../serialization/JsonGeoValueSerializer.java | 12 ++--
.../olingo/commons/api/edm/geo/Polygon.java | 65 +++++++++++++++++--
.../primitivetype/AbstractGeospatialType.java | 67 +++++++++-----------
.../core/edm/primitivetype/EdmGeoTest.java | 31 ++++++++-
.../serializer/json/ODataJsonSerializer.java | 4 +-
.../core/uri/parser/UriTokenizerTest.java | 5 ++
.../json/ODataJsonDeserializerEntityTest.java | 6 +-
10 files changed, 147 insertions(+), 69 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/ebdf0d3e/lib/client-core/src/main/java/org/apache/olingo/client/core/serialization/AtomGeoValueDeserializer.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/main/java/org/apache/olingo/client/core/serialization/AtomGeoValueDeserializer.java b/lib/client-core/src/main/java/org/apache/olingo/client/core/serialization/AtomGeoValueDeserializer.java
index 38add8d..74ad5c9 100644
--- a/lib/client-core/src/main/java/org/apache/olingo/client/core/serialization/AtomGeoValueDeserializer.java
+++ b/lib/client-core/src/main/java/org/apache/olingo/client/core/serialization/AtomGeoValueDeserializer.java
@@ -113,8 +113,8 @@ class AtomGeoValueDeserializer {
private Polygon polygon(final XMLEventReader reader, final StartElement start,
final EdmPrimitiveTypeKind type, final SRID srid) throws XMLStreamException {
- List<Point> extPoints = null;
- List<Point> intPoints = null;
+ LineString extPoints = null;
+ List<LineString> intRings = new ArrayList<LineString>();
boolean foundEndProperty = false;
while (reader.hasNext() && !foundEndProperty) {
@@ -122,10 +122,12 @@ class AtomGeoValueDeserializer {
if (event.isStartElement()) {
if (event.asStartElement().getName().equals(Constants.QNAME_POLYGON_EXTERIOR)) {
- extPoints = points(reader, event.asStartElement(), type, null);
+ List<Point> points = points(reader, event.asStartElement(), type, null);
+ extPoints = new LineString(GeoUtils.getDimension(type), srid, points);
}
if (event.asStartElement().getName().equals(Constants.QNAME_POLYGON_INTERIOR)) {
- intPoints = points(reader, event.asStartElement(), type, null);
+ List<Point> points = points(reader, event.asStartElement(), type, null);
+ intRings.add(new LineString(GeoUtils.getDimension(type), srid, points));
}
}
@@ -134,7 +136,7 @@ class AtomGeoValueDeserializer {
}
}
- return new Polygon(GeoUtils.getDimension(type), srid, intPoints, extPoints);
+ return new Polygon(GeoUtils.getDimension(type), srid, intRings, extPoints);
}
private MultiLineString multiLineString(final XMLEventReader reader, final StartElement start,
http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/ebdf0d3e/lib/client-core/src/main/java/org/apache/olingo/client/core/serialization/AtomGeoValueSerializer.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/main/java/org/apache/olingo/client/core/serialization/AtomGeoValueSerializer.java b/lib/client-core/src/main/java/org/apache/olingo/client/core/serialization/AtomGeoValueSerializer.java
index 1030597..be5dbde 100644
--- a/lib/client-core/src/main/java/org/apache/olingo/client/core/serialization/AtomGeoValueSerializer.java
+++ b/lib/client-core/src/main/java/org/apache/olingo/client/core/serialization/AtomGeoValueSerializer.java
@@ -103,11 +103,11 @@ class AtomGeoValueSerializer {
writer.writeEndElement();
writer.writeEndElement();
}
- if (!polygon.getInterior().isEmpty()) {
+ for (int i = 0; i < polygon.getNumberOfInteriorRings(); i++) {
writer.writeStartElement(Constants.PREFIX_GML, Constants.ELEM_POLYGON_INTERIOR, Constants.NS_GML);
writer.writeStartElement(Constants.PREFIX_GML, Constants.ELEM_POLYGON_LINEARRING, Constants.NS_GML);
- points(writer, polygon.getInterior().iterator(), false);
+ points(writer, polygon.getInterior(i).iterator(), false);
writer.writeEndElement();
writer.writeEndElement();
http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/ebdf0d3e/lib/client-core/src/main/java/org/apache/olingo/client/core/serialization/JsonGeoValueDeserializer.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/main/java/org/apache/olingo/client/core/serialization/JsonGeoValueDeserializer.java b/lib/client-core/src/main/java/org/apache/olingo/client/core/serialization/JsonGeoValueDeserializer.java
index 75aab4a..3b967ae 100644
--- a/lib/client-core/src/main/java/org/apache/olingo/client/core/serialization/JsonGeoValueDeserializer.java
+++ b/lib/client-core/src/main/java/org/apache/olingo/client/core/serialization/JsonGeoValueDeserializer.java
@@ -127,19 +127,21 @@ class JsonGeoValueDeserializer {
}
}
- List<Point> intPoints = null;
- if (itor.hasNext()) {
+ List<LineString> intRings = new ArrayList<LineString>();
+ while (itor.hasNext()) {
final Iterator<JsonNode> intItor = itor.next().elements();
if (intItor.hasNext()) {
- intPoints = new ArrayList<Point>();
+ List<Point> intPoints = new ArrayList<Point>();
while (intItor.hasNext()) {
final Iterator<JsonNode> mpItor = intItor.next().elements();
intPoints.add(point(mpItor, type, srid));
}
+ intRings.add(new LineString(GeoUtils.getDimension(type), srid, intPoints));
}
}
- return new Polygon(GeoUtils.getDimension(type), srid, intPoints, extPoints);
+ LineString exterior = new LineString(GeoUtils.getDimension(type), srid, extPoints);
+ return new Polygon(GeoUtils.getDimension(type), srid, intRings, exterior);
}
private MultiPolygon multiPolygon(final Iterator<JsonNode> itor, final EdmPrimitiveTypeKind type, final SRID srid) {
http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/ebdf0d3e/lib/client-core/src/main/java/org/apache/olingo/client/core/serialization/JsonGeoValueSerializer.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/main/java/org/apache/olingo/client/core/serialization/JsonGeoValueSerializer.java b/lib/client-core/src/main/java/org/apache/olingo/client/core/serialization/JsonGeoValueSerializer.java
index 12ac4f5..8801c99 100644
--- a/lib/client-core/src/main/java/org/apache/olingo/client/core/serialization/JsonGeoValueSerializer.java
+++ b/lib/client-core/src/main/java/org/apache/olingo/client/core/serialization/JsonGeoValueSerializer.java
@@ -84,14 +84,12 @@ class JsonGeoValueSerializer {
}
private void polygon(final JsonGenerator jgen, final Polygon polygon) throws IOException {
- if (!polygon.getExterior().isEmpty()) {
- jgen.writeStartArray();
- lineString(jgen, polygon.getExterior());
- jgen.writeEndArray();
- }
- if (!polygon.getInterior().isEmpty()) {
+ jgen.writeStartArray();
+ lineString(jgen, polygon.getExterior());
+ jgen.writeEndArray();
+ for (int i = 0; i < polygon.getNumberOfInteriorRings(); i++) {
jgen.writeStartArray();
- lineString(jgen, polygon.getInterior());
+ lineString(jgen, polygon.getInterior(i));
jgen.writeEndArray();
}
}
http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/ebdf0d3e/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/geo/Polygon.java
----------------------------------------------------------------------
diff --git a/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/geo/Polygon.java b/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/geo/Polygon.java
index 7ac4681..02b16b8 100644
--- a/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/geo/Polygon.java
+++ b/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/geo/Polygon.java
@@ -18,6 +18,7 @@
*/
package org.apache.olingo.commons.api.edm.geo;
+import java.util.Arrays;
import java.util.List;
import org.apache.olingo.commons.api.edm.EdmPrimitiveTypeKind;
@@ -27,7 +28,7 @@ import org.apache.olingo.commons.api.edm.EdmPrimitiveTypeKind;
*/
public class Polygon extends Geospatial {
- final ComposedGeospatial<Point> interior;
+ final ComposedGeospatial<LineString> interiorRings;
final ComposedGeospatial<Point> exterior;
/**
@@ -37,28 +38,78 @@ public class Polygon extends Geospatial {
* @param srid SRID values
* @param interior List of interior points
* @param exterior List of exterior point
+ * @deprecated
*/
public Polygon(final Dimension dimension, final SRID srid,
final List<Point> interior, final List<Point> exterior) {
super(dimension, Type.POLYGON, srid);
- this.interior = new MultiPoint(dimension, srid, interior);
- this.exterior = new MultiPoint(dimension, srid, exterior);
+ if (interior != null) {
+ LineString lineString = new LineString(dimension, srid, interior);
+ this.interiorRings = new MultiLineString(dimension, srid, Arrays.asList(lineString));
+ } else {
+ this.interiorRings = null;
+ }
+ this.exterior = new LineString(dimension, srid, exterior);
}
+
+ /**
+ * Creates a new polygon.
+ *
+ * @param dimension Dimension of the polygon
+ * @param srid SRID values
+ * @param interiors List of interior rings
+ * @param exterior Ring of exterior point
+ */
+ public Polygon(final Dimension dimension, final SRID srid,
+ final List<LineString> interiors, LineString exterior) {
+ super(dimension, Type.POLYGON, srid);
+ if (interiors != null) {
+ this.interiorRings = new MultiLineString(dimension, srid, interiors);
+ } else {
+ this.interiorRings = null;
+ }
+ this.exterior = exterior;
+ }
/**
* Gets interior points.
*
* @return interior points.
+ * @deprecated
+ * @see #getInterior(int)
*/
public ComposedGeospatial<Point> getInterior() {
- return interior;
+ if (interiorRings == null || interiorRings.geospatials.isEmpty()) {
+ return null;
+ }
+ return getInterior(0);
+ }
+
+ /**
+ * Get the number of interior rings
+ * @return number of interior rings
+ */
+ public int getNumberOfInteriorRings() {
+ if (interiorRings == null) {
+ return 0;
+ }
+ return interiorRings.geospatials.size();
+ }
+
+ /**
+ * Gets the nth interior ring
+ * @param n
+ * @return the ring or an exception if no such ring exists
+ */
+ public ComposedGeospatial<Point> getInterior(int n) {
+ return interiorRings.geospatials.get(n);
}
/**
* Gets exterior points.
*
- * @return exterior points.I
+ * @return exterior points.
*/
public ComposedGeospatial<Point> getExterior() {
return exterior;
@@ -83,7 +134,7 @@ public class Polygon extends Geospatial {
final Polygon polygon = (Polygon) o;
return dimension == polygon.dimension
&& (srid == null ? polygon.srid == null : srid.equals(polygon.srid))
- && (interior == null ? polygon.interior == null : interior.equals(polygon.interior))
+ && (interiorRings == null ? polygon.interiorRings == null : interiorRings.equals(polygon.interiorRings))
&& (exterior == null ? polygon.exterior == null : exterior.equals(polygon.exterior));
}
@@ -91,7 +142,7 @@ public class Polygon extends Geospatial {
public int hashCode() {
int result = dimension == null ? 0 : dimension.hashCode();
result = 31 * result + (srid == null ? 0 : srid.hashCode());
- result = 31 * result + (interior == null ? 0 : interior.hashCode());
+ result = 31 * result + (interiorRings == null ? 0 : interiorRings.hashCode());
result = 31 * result + (exterior == null ? 0 : exterior.hashCode());
return result;
}
http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/ebdf0d3e/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/primitivetype/AbstractGeospatialType.java
----------------------------------------------------------------------
diff --git a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/primitivetype/AbstractGeospatialType.java b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/primitivetype/AbstractGeospatialType.java
index b712f9f..d4e05e9 100644
--- a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/primitivetype/AbstractGeospatialType.java
+++ b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/primitivetype/AbstractGeospatialType.java
@@ -26,6 +26,7 @@ import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.apache.olingo.commons.api.edm.EdmPrimitiveTypeException;
+import org.apache.olingo.commons.api.edm.geo.ComposedGeospatial;
import org.apache.olingo.commons.api.edm.geo.Geospatial;
import org.apache.olingo.commons.api.edm.geo.Geospatial.Dimension;
import org.apache.olingo.commons.api.edm.geo.Geospatial.Type;
@@ -176,16 +177,20 @@ public abstract class AbstractGeospatialType<T extends Geospatial> extends Singl
final String[] first = polygon.split("\\),\\(");
- final List<Point> interior = new ArrayList<Point>();
- for (final String pointCoo : split(first[0].substring(1, first[0].length()), ',')) {
- interior.add(newPoint(null, pointCoo, isNullable, maxLength, precision, scale, isUnicode));
+ final List<LineString> interiorRings = new ArrayList<LineString>();
+ for (int i = 0; i < first.length -1; i++) {
+ List<Point> interior = new ArrayList<Point>();
+ for (final String pointCoo : split(first[i].substring(i==0?1:0, first[i].length()), ',')) {
+ interior.add(newPoint(null, pointCoo, isNullable, maxLength, precision, scale, isUnicode));
+ }
+ interiorRings.add(new LineString(dimension, srid, interior));
}
final List<Point> exterior = new ArrayList<Point>();
- for (final String pointCoo : split(first[1].substring(0, first[1].length() - 1), ',')) {
+ for (final String pointCoo : split(first[first.length -1].substring(0, first[first.length -1].length() - 1), ',')) {
exterior.add(newPoint(null, pointCoo, isNullable, maxLength, precision, scale, isUnicode));
}
- return new Polygon(dimension, srid, interior, exterior);
+ return new Polygon(dimension, srid, interiorRings, new LineString(dimension, srid, exterior));
}
protected Polygon stringToPolygon(final String value, final Boolean isNullable, final Integer maxLength,
@@ -343,21 +348,17 @@ public abstract class AbstractGeospatialType<T extends Geospatial> extends Singl
return result.append(")'").toString();
}
- private String lineString(final LineString lineString, final Boolean isNullable,
- final Integer maxLength, final Integer precision, final Integer scale, final Boolean isUnicode)
- throws EdmPrimitiveTypeException {
-
- final StringBuilder result = new StringBuilder();
-
- for (final Iterator<Point> itor = lineString.iterator(); itor.hasNext();) {
+ private StringBuilder appendPoints(final ComposedGeospatial<Point> points, final Boolean isNullable,
+ final Integer maxLength, final Integer precision, final Integer scale, final Boolean isUnicode,
+ final StringBuilder result) throws EdmPrimitiveTypeException {
+ for (final Iterator<Point> itor = points.iterator(); itor.hasNext();) {
result.append(point(itor.next(), isNullable, maxLength, precision, scale, isUnicode));
if (itor.hasNext()) {
result.append(',');
}
}
-
- return result.toString();
- }
+ return result;
+}
protected String toString(final LineString lineString, final Boolean isNullable, final Integer maxLength,
final Integer precision, final Integer scale, final Boolean isUnicode) throws EdmPrimitiveTypeException {
@@ -366,10 +367,10 @@ public abstract class AbstractGeospatialType<T extends Geospatial> extends Singl
throw new EdmPrimitiveTypeException("The value '" + lineString + "' is not valid.");
}
- return toStringBuilder(lineString.getSrid()).
+ StringBuilder builder = toStringBuilder(lineString.getSrid()).
append(reference.getSimpleName()).
- append('(').
- append(lineString(lineString, isNullable, maxLength, precision, scale, isUnicode)).
+ append('(');
+ return appendPoints(lineString, isNullable, maxLength, precision, scale, isUnicode, builder).
append(")'").toString();
}
@@ -385,8 +386,8 @@ public abstract class AbstractGeospatialType<T extends Geospatial> extends Singl
append('(');
for (final Iterator<LineString> itor = multiLineString.iterator(); itor.hasNext();) {
- result.append('(').
- append(lineString(itor.next(), isNullable, maxLength, precision, scale, isUnicode)).
+ result.append('(');
+ appendPoints(itor.next(), isNullable, maxLength, precision, scale, isUnicode, result).
append(')');
if (itor.hasNext()) {
result.append(',');
@@ -402,20 +403,14 @@ public abstract class AbstractGeospatialType<T extends Geospatial> extends Singl
final StringBuilder result = new StringBuilder();
- result.append('(');
- for (final Iterator<Point> itor = polygon.getInterior().iterator(); itor.hasNext();) {
- result.append(point(itor.next(), isNullable, maxLength, precision, scale, isUnicode));
- if (itor.hasNext()) {
- result.append(',');
- }
- }
- result.append("),(");
- for (final Iterator<Point> itor = polygon.getExterior().iterator(); itor.hasNext();) {
- result.append(point(itor.next(), isNullable, maxLength, precision, scale, isUnicode));
- if (itor.hasNext()) {
- result.append(',');
- }
+ for (int i = 0; i < polygon.getNumberOfInteriorRings(); i++) {
+ result.append('(');
+ appendPoints(polygon.getInterior(i), isNullable, maxLength, precision, scale, isUnicode, result);
+ result.append("),");
}
+
+ result.append('(');
+ appendPoints(polygon.getExterior(), isNullable, maxLength, precision, scale, isUnicode, result);
return result.append(')').toString();
}
@@ -490,14 +485,14 @@ public abstract class AbstractGeospatialType<T extends Geospatial> extends Singl
case GeographyLineString:
case GeometryLineString:
- result.append(lineString((LineString) item, isNullable, maxLength, precision, scale, isUnicode));
+ appendPoints((LineString) item, isNullable, maxLength, precision, scale, isUnicode, result);
break;
case GeographyMultiLineString:
case GeometryMultiLineString:
for (final Iterator<LineString> itor = ((MultiLineString) item).iterator(); itor.hasNext();) {
- result.append('(').
- append(lineString(itor.next(), isNullable, maxLength, precision, scale, isUnicode)).
+ result.append('(');
+ appendPoints(itor.next(), isNullable, maxLength, precision, scale, isUnicode, result).
append(')');
if (itor.hasNext()) {
result.append(',');
http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/ebdf0d3e/lib/commons-core/src/test/java/org/apache/olingo/commons/core/edm/primitivetype/EdmGeoTest.java
----------------------------------------------------------------------
diff --git a/lib/commons-core/src/test/java/org/apache/olingo/commons/core/edm/primitivetype/EdmGeoTest.java b/lib/commons-core/src/test/java/org/apache/olingo/commons/core/edm/primitivetype/EdmGeoTest.java
index 28f31e0..449fa42 100644
--- a/lib/commons-core/src/test/java/org/apache/olingo/commons/core/edm/primitivetype/EdmGeoTest.java
+++ b/lib/commons-core/src/test/java/org/apache/olingo/commons/core/edm/primitivetype/EdmGeoTest.java
@@ -120,7 +120,7 @@ public class EdmGeoTest extends PrimitiveTypeBaseTest {
valueOfString(input, null, null, null, null, null, Polygon.class);
assertNotNull(polygon);
assertEquals("0", polygon.getSrid().toString());
- Iterator<Point> itor = polygon.getInterior().iterator();
+ Iterator<Point> itor = polygon.getInterior(0).iterator();
assertEquals(1, itor.next().getX(), 0);
assertEquals(1, itor.next().getY(), 0);
itor = polygon.getExterior().iterator();
@@ -130,6 +130,31 @@ public class EdmGeoTest extends PrimitiveTypeBaseTest {
assertEquals(input, EdmGeographyPolygon.getInstance().valueToString(polygon, null, null, null, null, null));
}
+
+ @Test
+ public void polygonMultipleHoles() throws EdmPrimitiveTypeException {
+ final String input = "geography'SRID=4326;Polygon((1.0 1.0,1.0 1.0),(2.0 2.0,2.0 2.0)"
+ + ",(1.0 1.0,2.0 2.0,3.0 3.0,1.0 1.0))'";
+
+ expectContentErrorInValueOfString(EdmGeometryPolygon.getInstance(), input);
+
+ final Polygon polygon = EdmGeographyPolygon.getInstance().
+ valueOfString(input, null, null, null, null, null, Polygon.class);
+ assertNotNull(polygon);
+ assertEquals("4326", polygon.getSrid().toString());
+ Iterator<Point> itor = polygon.getInterior(0).iterator();
+ assertEquals(1, itor.next().getX(), 0);
+ assertEquals(1, itor.next().getY(), 0);
+ itor = polygon.getInterior(1).iterator();
+ assertEquals(2, itor.next().getX(), 0);
+ assertEquals(2, itor.next().getY(), 0);
+ itor = polygon.getExterior().iterator();
+ itor.next();
+ assertEquals(2, itor.next().getX(), 0);
+ assertEquals(3, itor.next().getY(), 0);
+
+ assertEquals(input, EdmGeographyPolygon.getInstance().valueToString(polygon, null, null, null, null, null));
+ }
@Test
public void multiPolygon() throws EdmPrimitiveTypeException {
@@ -145,8 +170,8 @@ public class EdmGeoTest extends PrimitiveTypeBaseTest {
assertNotNull(multiPolygon);
assertEquals("0", multiPolygon.getSrid().toString());
final Iterator<Polygon> itor = multiPolygon.iterator();
- assertEquals(1, itor.next().getInterior().iterator().next().getX(), 0);
- assertEquals(1, itor.next().getInterior().iterator().next().getX(), 0);
+ assertEquals(1, itor.next().getInterior(0).iterator().next().getX(), 0);
+ assertEquals(1, itor.next().getInterior(0).iterator().next().getX(), 0);
assertEquals(input, EdmGeometryMultiPolygon.getInstance().
valueToString(multiPolygon, null, null, null, null, null));
http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/ebdf0d3e/lib/server-core/src/main/java/org/apache/olingo/server/core/serializer/json/ODataJsonSerializer.java
----------------------------------------------------------------------
diff --git a/lib/server-core/src/main/java/org/apache/olingo/server/core/serializer/json/ODataJsonSerializer.java b/lib/server-core/src/main/java/org/apache/olingo/server/core/serializer/json/ODataJsonSerializer.java
index 4322210..40435ae 100644
--- a/lib/server-core/src/main/java/org/apache/olingo/server/core/serializer/json/ODataJsonSerializer.java
+++ b/lib/server-core/src/main/java/org/apache/olingo/server/core/serializer/json/ODataJsonSerializer.java
@@ -1060,9 +1060,9 @@ public class ODataJsonSerializer extends AbstractODataSerializer {
json.writeStartArray();
writeGeoPoints(json, polygon.getExterior());
json.writeEndArray();
- if (!polygon.getInterior().isEmpty()) {
+ for (int i = 0; i < polygon.getNumberOfInteriorRings(); i++) {
json.writeStartArray();
- writeGeoPoints(json, polygon.getInterior());
+ writeGeoPoints(json, polygon.getInterior(i));
json.writeEndArray();
}
}
http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/ebdf0d3e/lib/server-core/src/test/java/org/apache/olingo/server/core/uri/parser/UriTokenizerTest.java
----------------------------------------------------------------------
diff --git a/lib/server-core/src/test/java/org/apache/olingo/server/core/uri/parser/UriTokenizerTest.java b/lib/server-core/src/test/java/org/apache/olingo/server/core/uri/parser/UriTokenizerTest.java
index 23bf1d1..e47f6c8 100644
--- a/lib/server-core/src/test/java/org/apache/olingo/server/core/uri/parser/UriTokenizerTest.java
+++ b/lib/server-core/src/test/java/org/apache/olingo/server/core/uri/parser/UriTokenizerTest.java
@@ -603,6 +603,11 @@ public class UriTokenizerTest {
public void geoPolygon() {
assertTrue(new UriTokenizer("geography'SRID=4326;Polygon((0 0,1 0,0 1,0 0))'").next(TokenKind.GeographyPolygon));
assertTrue(new UriTokenizer("geometry'SRID=0;Polygon((0 0,1 0,0 1,0 0))'").next(TokenKind.GeometryPolygon));
+ assertTrue(new UriTokenizer("geometry'SRID=0;Polygon((1 1,2 1,2 2,1 2,1 1),(0 0,4 0,4 4,0 4,0 0))'")
+ .next(TokenKind.GeometryPolygon));
+ assertTrue(new UriTokenizer(
+ "geometry'SRID=0;Polygon((0 0,1 1,2 2,0 0),(1 1,2 1,2 2,1 2,1 1),(0 0,4 0,4 4,0 4,0 0))'")
+ .next(TokenKind.GeometryPolygon));
wrongToken(TokenKind.GeometryPolygon,
"geometry'SRID=0;Polygon((0 0,4 0,4 4,0 4,0 0),(1 1,2 1,2 2,1 2,1 1))'",
'x');
http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/ebdf0d3e/lib/server-test/src/test/java/org/apache/olingo/server/core/deserializer/json/ODataJsonDeserializerEntityTest.java
----------------------------------------------------------------------
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 1eb96a9..fecae80 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
@@ -1036,13 +1036,13 @@ public class ODataJsonDeserializerEntityTest extends AbstractODataDeserializerTe
Polygon polygon = (Polygon) entity.getProperties().get(0).getValue();
assertEquals(Geospatial.Dimension.GEOMETRY, polygon.getDimension());
assertEquals(0, polygon.getExterior().iterator().next().getX(), 0);
- assertEquals(1, polygon.getInterior().iterator().next().getY(), 0);
+ assertEquals(1, polygon.getInterior(0).iterator().next().getY(), 0);
entity = deserialize("{\"" + entityType.getPropertyNames().get(0) + "\":{"
+ "\"type\":\"Polygon\",\"coordinates\":[[[0,0],[3,0],[3,3],[0,3],[0,0]]]}}",
entityType);
polygon = (Polygon) entity.getProperties().get(0).getValue();
- assertTrue(polygon.getInterior().isEmpty());
+ assertEquals(0, polygon.getNumberOfInteriorRings());
expectException("{\"" + entityType.getPropertyNames().get(0) + "\":{"
+ "\"type\":\"Polygon\",\"coordinates\":{\"ext\":[[0,0],[3,0],[0,3],[0,0]]}}}", entityType,
@@ -1070,7 +1070,7 @@ public class ODataJsonDeserializerEntityTest extends AbstractODataDeserializerTe
+ "[[[0.0,0.0],[30.0,0.0],[0.0,30.0],[0.0,0.0]]]]}}",
entityType);
final MultiPolygon multiPolygon = (MultiPolygon) entity.getProperties().get(0).getValue();
- assertEquals(1, multiPolygon.iterator().next().getInterior().iterator().next().getX(), 0);
+ assertEquals(1, multiPolygon.iterator().next().getInterior(0).iterator().next().getX(), 0);
expectException("{\"" + entityType.getPropertyNames().get(0) + "\":{"
+ "\"type\":\"MultiPolygon\",\"coordinates\":[{\"first\":[[[0,0],[3,0],[3,3],[0,3],[0,0]]]}]}}", entityType,