diff --git a/backend/postgres/src/main/java/org/dotwebstack/framework/backend/postgres/codec/GeometryCodec.java b/backend/postgres/src/main/java/org/dotwebstack/framework/backend/postgres/codec/GeometryCodec.java index 140a820fc..fb04006ef 100644 --- a/backend/postgres/src/main/java/org/dotwebstack/framework/backend/postgres/codec/GeometryCodec.java +++ b/backend/postgres/src/main/java/org/dotwebstack/framework/backend/postgres/codec/GeometryCodec.java @@ -86,6 +86,8 @@ public EncodedParameter encode(Object value, int dataType) { Assert.requireType(value, Geometry.class, "value must be Geometry type"); var geometry = (Geometry) value; + Assert.requireNonNull(geometry.getCoordinate(), "Encoding of geometry failed, coordinate can't be empty."); + var outputDimension = Double.isNaN(geometry.getCoordinate() .getZ()) ? 2 : 3; diff --git a/backend/postgres/src/test/java/org/dotwebstack/framework/backend/postgres/codec/GeometryCodecTest.java b/backend/postgres/src/test/java/org/dotwebstack/framework/backend/postgres/codec/GeometryCodecTest.java index 86073aa85..76b34c7f3 100644 --- a/backend/postgres/src/test/java/org/dotwebstack/framework/backend/postgres/codec/GeometryCodecTest.java +++ b/backend/postgres/src/test/java/org/dotwebstack/framework/backend/postgres/codec/GeometryCodecTest.java @@ -100,6 +100,14 @@ void encode_returnsEncodedParameter_forGeometry() { assertThat(actual, notNullValue()); } + @Test + void encode_throwsException_forInvalidGeometry() { + var geometry = geometryFactory.createPoint(); + + var thrown = Assertions.assertThrows(IllegalArgumentException.class, () -> geometryCodec.encode(geometry)); + assertThat(thrown.getMessage(), equalTo("Encoding of geometry failed, coordinate can't be empty.")); + } + @Test void decode_returnsGeometry_forByteBufTextFormatted() { var geometry = geometryFactory.createPoint(new Coordinate(1, 2)); diff --git a/example/example-openapi/src/main/resources/config/openapi.yaml b/example/example-openapi/src/main/resources/config/openapi.yaml index f03229c53..653cb456c 100644 --- a/example/example-openapi/src/main/resources/config/openapi.yaml +++ b/example/example-openapi/src/main/resources/config/openapi.yaml @@ -204,16 +204,16 @@ paths: x-dws-expr: "$header.'content-crs' == 'epsg:28992' ? 7415 : 7931" contains: fromGeoJSON: - x-dws-expr: "json:asString($body._geo.contains)!" + x-dws-expr: "json:asString(args._geo.contains)!" intersects: fromGeoJSON: - x-dws-expr: "json:asString($body._geo.intersects)!" + x-dws-expr: "json:asString(args._geo.intersects)!" touches: fromGeoJSON: - x-dws-expr: "json:asString($body._geo.touches)!" + x-dws-expr: "json:asString(args._geo.touches)!" within: fromGeoJSON: - x-dws-expr: "json:asString($body._geo.within)!" + x-dws-expr: "json:asString(args._geo.within)!" parameters: - name: content-crs in: header diff --git a/ext/ext-spatial/src/main/java/org/dotwebstack/framework/ext/spatial/GeometryReader.java b/ext/ext-spatial/src/main/java/org/dotwebstack/framework/ext/spatial/GeometryReader.java index 8db405ed8..e43f649c9 100644 --- a/ext/ext-spatial/src/main/java/org/dotwebstack/framework/ext/spatial/GeometryReader.java +++ b/ext/ext-spatial/src/main/java/org/dotwebstack/framework/ext/spatial/GeometryReader.java @@ -8,6 +8,7 @@ import java.util.Base64; import java.util.List; import java.util.Map; +import java.util.Objects; import org.locationtech.jts.geom.Geometry; import org.locationtech.jts.io.ParseException; import org.locationtech.jts.io.WKBReader; @@ -72,8 +73,16 @@ private static Geometry getGeometryFromWkb(String wkb) { private static Geometry getGeometryFromGeoJson(String geoJson) { var geoJsonReader = new GeoJsonReader(); + try { - return geoJsonReader.read(geoJson); + var geometry = geoJsonReader.read(geoJson); + + // Type is validated in het locationtech library. + if (Objects.isNull(geometry.getCoordinate())) { + throw requestValidationException("Coordinates can't be null!"); + } + + return geometry; } catch (ParseException e) { throw requestValidationException("The filter input GeoJSON is invalid!", e); } diff --git a/ext/ext-spatial/src/test/java/org/dotwebstack/framework/ext/spatial/GeometryReaderTest.java b/ext/ext-spatial/src/test/java/org/dotwebstack/framework/ext/spatial/GeometryReaderTest.java index cc1cce6cb..4bc4a01e0 100644 --- a/ext/ext-spatial/src/test/java/org/dotwebstack/framework/ext/spatial/GeometryReaderTest.java +++ b/ext/ext-spatial/src/test/java/org/dotwebstack/framework/ext/spatial/GeometryReaderTest.java @@ -70,9 +70,20 @@ void readGeometry_forWkb_returnsGeometry() { @Test void readGeometry_forGeoJson_returnsGeometry() { - var geoJson = "{\n" + " \"type\": \"Point\",\n" + " \"coordinates\": [\n" + " 194936.73,\n" + " 470973.96\n" - + " ],\n" + " \"crs\": {\n" + " \"type\": \"name\",\n" + " \"properties\": {\n" - + " \"name\": \"EPSG:28992\"\n" + " }\n" + " }\n" + "}"; + var geoJson = """ + { + "type": "Point", + "coordinates": [ + 194936.73, + 470973.96 + ], + "crs": { + "type": "name", + "properties": { + "name": "EPSG:28992" + } + } + }"""; Map data = Map.of(FROM_GEOJSON, geoJson); Geometry geometry = GeometryReader.readGeometry(data); @@ -86,6 +97,25 @@ void readGeometry_forGeoJson_returnsGeometry() { .getZ()), is(true)); } + @Test + void getGeometryFromGeoJson_throwsException_whenCoordinatesAreNull() { + var geoJson = """ + { + "type": "Point", + "crs": { + "type": "name", + "properties": { + "name": "EPSG:28992" + } + } + }"""; + + Map data = Map.of(FROM_GEOJSON, geoJson); + + var exception = assertThrows(RequestValidationException.class, () -> GeometryReader.readGeometry(data)); + assertThat(exception.getMessage(), is("Coordinates can't be null!")); + } + @Test void readGeometry_forIllegalWkt_returnsException() { var wkt = "POINT (194936.73 470973.96";