[ https://issues.apache.org/jira/browse/OLINGO-1392?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Vladislav Glinskiy updated OLINGO-1392: --------------------------------------- Description: Olingo V4 client reports value type for `Edm.GeometryCollection` and `Edm.GeographyCollection` OData types as `ValueType.COMPLEX` instead of expected `ValueType.GEOSPATIAL`. Debugging shows that the client uses [JsonDeserializer|https://github.com/apache/olingo-odata4/blob/master/lib/client-core/src/main/java/org/apache/olingo/client/core/serialization/JsonDeserializer.java#L64] which does not work correctly with values of `Edm.GeometryCollection` and `Edm.GeographyCollection` OData types, such as: {code:java} { "GeometryCollectionField":{ "type":"GeometryCollection", "geometries":[ { "type":"Point", "coordinates":[ 1.0, 1.0 ], "crs":{ "type":"name", "properties":{ "name":"EPSG:4326" } } } ], "crs":{ "type":"name", "properties":{ "name":"EPSG:4326" } } } } {code} [I created a unit test to reproduce the issue|https://github.com/vladglinskiy/olingo-odata4/commit/4613e2a4f266bf99f56dd4cac2d58df0c03efa1d#diff-c2bf3c9859b1f7113d0296bc1b6dcb5dR58]: {code:java} @Test public void toEntityWithGeometryCollectionField() throws Exception { GeospatialCollection collection = new GeospatialCollection(Geospatial.Dimension.GEOMETRY, SRID.valueOf("4326"), Collections.<Geospatial>singletonList(POINT)); ByteArrayOutputStream output = new ByteArrayOutputStream(); OutputStreamWriter writer = new OutputStreamWriter(output, Constants.UTF8); Entity entity = new Entity(); final Property propertyResource = new Property(); propertyResource.setName("GeometryCollectionField"); propertyResource.setValue(ValueType.GEOSPATIAL, collection); entity.getProperties().add(propertyResource); SERIALIZER.write(writer, new ResWrap(null, null, entity)); System.out.println(new String(output.toByteArray())); ResWrap<Entity> entityResWrap = DESERIALIZER.toEntity(new ByteArrayInputStream(output.toByteArray())); Property geometryCollection = entityResWrap.getPayload().getProperty("GeometryCollectionField"); Assert.assertNotNull(geometryCollection); ValueType actualValueType = geometryCollection.getValueType(); Assert.assertEquals("Unexpected GeospatialCollection type", ValueType.GEOSPATIAL, actualValueType); Assert.assertTrue(geometryCollection.asGeospatial() instanceof GeospatialCollection); } {code} Please, note that the deserializer works fine for GeometryPoint type. [toEntityWithPointField test|https://github.com/vladglinskiy/olingo-odata4/commit/4613e2a4f266bf99f56dd4cac2d58df0c03efa1d#diff-c2bf3c9859b1f7113d0296bc1b6dcb5dR35] demonstrates that. *Steps to reproduce:* 1. git clone [https://github.com/vladglinskiy/olingo-odata4.git] 2. mvn clean test -pl lib/client-core/ -Dtest=JsonDeserializerTest the test will fail with the following error: {code:java} ------------------------------------------------------- T E S T S ------------------------------------------------------- Running org.apache.olingo.client.core.serialization.JsonDeserializerTest Tests run: 2, Failures: 1, Errors: 0, Skipped: 0, Time elapsed: 0.214 sec <<< FAILURE! - in org.apache.olingo.client.core.serialization.JsonDeserializerTest toEntityWithGeometryCollectionField(org.apache.olingo.client.core.serialization.JsonDeserializerTest) Time elapsed: 0.181 sec <<< FAILURE! java.lang.AssertionError: Unexpected GeospatialCollection type expected:<GEOSPATIAL> but was:<COMPLEX> at org.junit.Assert.fail(Assert.java:88) at org.junit.Assert.failNotEquals(Assert.java:743) at org.junit.Assert.assertEquals(Assert.java:118) at org.apache.olingo.client.core.serialization.JsonDeserializerTest.toEntityWithGeometryCollectionField(JsonDeserializerTest.java:104) Results : Failed tests: JsonDeserializerTest.toEntityWithGeometryCollectionField:104 Unexpected GeospatialCollection type expected:<GEOSPATIAL> but was:<COMPLEX> {code} was: Olingo V4 client reports value type for `Edm.GeometryCollection` and `Edm.GeographyCollection` OData types as `ValueType.COMPLEX` instead of expected `ValueType.GEOSPATIAL`. Debugging shows that the client uses [JsonDeserializer|https://github.com/apache/olingo-odata4/blob/master/lib/client-core/src/main/java/org/apache/olingo/client/core/serialization/JsonDeserializer.java#L64] which does not work correctly with values of `Edm.GeometryCollection` and `Edm.GeographyCollection` OData types, such as: {code} { "GeometryCollectionField":{ "type":"GeometryCollection", "geometries":[ { "type":"Point", "coordinates":[ 1.0, 1.0 ], "crs":{ "type":"name", "properties":{ "name":"EPSG:4326" } } } ], "crs":{ "type":"name", "properties":{ "name":"EPSG:4326" } } } } {code} [I created a unit test to reproduce the issue|https://github.com/vladglinskiy/olingo-odata4/commit/4613e2a4f266bf99f56dd4cac2d58df0c03efa1d#diff-c2bf3c9859b1f7113d0296bc1b6dcb5dR58]: {code:java} @Test public void toEntityWithGeometryCollectionField() throws Exception { GeospatialCollection collection = new GeospatialCollection(Geospatial.Dimension.GEOMETRY, SRID.valueOf("4326"), Collections.<Geospatial>singletonList(POINT)); ByteArrayOutputStream output = new ByteArrayOutputStream(); OutputStreamWriter writer = new OutputStreamWriter(output, Constants.UTF8); Entity entity = new Entity(); final Property propertyResource = new Property(); propertyResource.setName("GeometryCollectionField"); propertyResource.setValue(ValueType.GEOSPATIAL, collection); entity.getProperties().add(propertyResource); SERIALIZER.write(writer, new ResWrap(null, null, entity)); System.out.println(new String(output.toByteArray())); ResWrap<Entity> entityResWrap = DESERIALIZER.toEntity(new ByteArrayInputStream(output.toByteArray())); Property geometryCollection = entityResWrap.getPayload().getProperty("GeometryCollectionField"); Assert.assertNotNull(geometryCollection); ValueType actualValueType = geometryCollection.getValueType(); Assert.assertEquals("Unexpected GeospatialCollection type", ValueType.GEOSPATIAL, actualValueType); Assert.assertTrue(geometryCollection.asGeospatial() instanceof GeospatialCollection); } {code} Please, note that the deserializer works fine with GeometryPoint type. [toEntityWithPointField test|https://github.com/vladglinskiy/olingo-odata4/commit/4613e2a4f266bf99f56dd4cac2d58df0c03efa1d#diff-c2bf3c9859b1f7113d0296bc1b6dcb5dR35] demonstrates that. *Steps to reproduce:* 1. git clone https://github.com/vladglinskiy/olingo-odata4.git 2. mvn clean test -pl lib/client-core/ -Dtest=JsonDeserializerTest the test will fail with the following error: {code} ------------------------------------------------------- T E S T S ------------------------------------------------------- Running org.apache.olingo.client.core.serialization.JsonDeserializerTest Tests run: 2, Failures: 1, Errors: 0, Skipped: 0, Time elapsed: 0.214 sec <<< FAILURE! - in org.apache.olingo.client.core.serialization.JsonDeserializerTest toEntityWithGeometryCollectionField(org.apache.olingo.client.core.serialization.JsonDeserializerTest) Time elapsed: 0.181 sec <<< FAILURE! java.lang.AssertionError: Unexpected GeospatialCollection type expected:<GEOSPATIAL> but was:<COMPLEX> at org.junit.Assert.fail(Assert.java:88) at org.junit.Assert.failNotEquals(Assert.java:743) at org.junit.Assert.assertEquals(Assert.java:118) at org.apache.olingo.client.core.serialization.JsonDeserializerTest.toEntityWithGeometryCollectionField(JsonDeserializerTest.java:104) Results : Failed tests: JsonDeserializerTest.toEntityWithGeometryCollectionField:104 Unexpected GeospatialCollection type expected:<GEOSPATIAL> but was:<COMPLEX> {code} > Olingo V4 client reports invalid value type for `Edm.GeometryCollection` and > `Edm.GeographyCollection` JSON values > ------------------------------------------------------------------------------------------------------------------ > > Key: OLINGO-1392 > URL: https://issues.apache.org/jira/browse/OLINGO-1392 > Project: Olingo > Issue Type: Bug > Components: odata4-client > Reporter: Vladislav Glinskiy > Priority: Major > Fix For: (Java) V4 4.7.0 > > > Olingo V4 client reports value type for `Edm.GeometryCollection` and > `Edm.GeographyCollection` OData types as `ValueType.COMPLEX` instead of > expected `ValueType.GEOSPATIAL`. > Debugging shows that the client uses > [JsonDeserializer|https://github.com/apache/olingo-odata4/blob/master/lib/client-core/src/main/java/org/apache/olingo/client/core/serialization/JsonDeserializer.java#L64] > which does not work correctly with values of `Edm.GeometryCollection` and > `Edm.GeographyCollection` OData types, such as: > {code:java} > { > "GeometryCollectionField":{ > "type":"GeometryCollection", > "geometries":[ > { > "type":"Point", > "coordinates":[ > 1.0, > 1.0 > ], > "crs":{ > "type":"name", > "properties":{ > "name":"EPSG:4326" > } > } > } > ], > "crs":{ > "type":"name", > "properties":{ > "name":"EPSG:4326" > } > } > } > } > {code} > [I created a unit test to reproduce the > issue|https://github.com/vladglinskiy/olingo-odata4/commit/4613e2a4f266bf99f56dd4cac2d58df0c03efa1d#diff-c2bf3c9859b1f7113d0296bc1b6dcb5dR58]: > {code:java} > @Test > public void toEntityWithGeometryCollectionField() throws Exception { > GeospatialCollection collection = new > GeospatialCollection(Geospatial.Dimension.GEOMETRY, SRID.valueOf("4326"), > > Collections.<Geospatial>singletonList(POINT)); > ByteArrayOutputStream output = new ByteArrayOutputStream(); > OutputStreamWriter writer = new OutputStreamWriter(output, > Constants.UTF8); > Entity entity = new Entity(); > final Property propertyResource = new Property(); > propertyResource.setName("GeometryCollectionField"); > propertyResource.setValue(ValueType.GEOSPATIAL, collection); > entity.getProperties().add(propertyResource); > SERIALIZER.write(writer, new ResWrap(null, null, entity)); > System.out.println(new String(output.toByteArray())); > ResWrap<Entity> entityResWrap = DESERIALIZER.toEntity(new > ByteArrayInputStream(output.toByteArray())); > Property geometryCollection = > entityResWrap.getPayload().getProperty("GeometryCollectionField"); > Assert.assertNotNull(geometryCollection); > ValueType actualValueType = geometryCollection.getValueType(); > Assert.assertEquals("Unexpected GeospatialCollection type", > ValueType.GEOSPATIAL, actualValueType); > Assert.assertTrue(geometryCollection.asGeospatial() instanceof > GeospatialCollection); > } > {code} > Please, note that the deserializer works fine for GeometryPoint type. > [toEntityWithPointField > test|https://github.com/vladglinskiy/olingo-odata4/commit/4613e2a4f266bf99f56dd4cac2d58df0c03efa1d#diff-c2bf3c9859b1f7113d0296bc1b6dcb5dR35] > demonstrates that. > *Steps to reproduce:* > 1. git clone [https://github.com/vladglinskiy/olingo-odata4.git] > 2. mvn clean test -pl lib/client-core/ -Dtest=JsonDeserializerTest > the test will fail with the following error: > {code:java} > ------------------------------------------------------- > T E S T S > ------------------------------------------------------- > Running org.apache.olingo.client.core.serialization.JsonDeserializerTest > Tests run: 2, Failures: 1, Errors: 0, Skipped: 0, Time elapsed: 0.214 sec <<< > FAILURE! - in org.apache.olingo.client.core.serialization.JsonDeserializerTest > toEntityWithGeometryCollectionField(org.apache.olingo.client.core.serialization.JsonDeserializerTest) > Time elapsed: 0.181 sec <<< FAILURE! > java.lang.AssertionError: Unexpected GeospatialCollection type > expected:<GEOSPATIAL> but was:<COMPLEX> > at org.junit.Assert.fail(Assert.java:88) > at org.junit.Assert.failNotEquals(Assert.java:743) > at org.junit.Assert.assertEquals(Assert.java:118) > at > org.apache.olingo.client.core.serialization.JsonDeserializerTest.toEntityWithGeometryCollectionField(JsonDeserializerTest.java:104) > Results : > Failed tests: > JsonDeserializerTest.toEntityWithGeometryCollectionField:104 Unexpected > GeospatialCollection type expected:<GEOSPATIAL> but was:<COMPLEX> > {code} -- This message was sent by Atlassian Jira (v8.3.2#803003)