mirror of
https://github.com/honeymoose/OpenSearch.git
synced 2025-02-25 22:36:20 +00:00
Adding parse gates for valid GeoJSON coordinates. Includes unit tests.
This commit is contained in:
parent
345c06e5e8
commit
49935659e4
@ -206,13 +206,17 @@ public abstract class ShapeBuilder implements ToXContent {
|
|||||||
private static CoordinateNode parseCoordinates(XContentParser parser) throws IOException {
|
private static CoordinateNode parseCoordinates(XContentParser parser) throws IOException {
|
||||||
XContentParser.Token token = parser.nextToken();
|
XContentParser.Token token = parser.nextToken();
|
||||||
|
|
||||||
// Base case
|
// Base cases
|
||||||
if (token != XContentParser.Token.START_ARRAY) {
|
if (token != XContentParser.Token.START_ARRAY &&
|
||||||
|
token != XContentParser.Token.END_ARRAY &&
|
||||||
|
token != XContentParser.Token.VALUE_NULL) {
|
||||||
double lon = parser.doubleValue();
|
double lon = parser.doubleValue();
|
||||||
token = parser.nextToken();
|
token = parser.nextToken();
|
||||||
double lat = parser.doubleValue();
|
double lat = parser.doubleValue();
|
||||||
token = parser.nextToken();
|
token = parser.nextToken();
|
||||||
return new CoordinateNode(new Coordinate(lon, lat));
|
return new CoordinateNode(new Coordinate(lon, lat));
|
||||||
|
} else if (token == XContentParser.Token.VALUE_NULL) {
|
||||||
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
List<CoordinateNode> nodes = new ArrayList<>();
|
List<CoordinateNode> nodes = new ArrayList<>();
|
||||||
|
@ -158,8 +158,8 @@ public class GeoJSONShapeParserTests extends ElasticsearchTestCase {
|
|||||||
@Test
|
@Test
|
||||||
public void testParse_invalidPolygon() throws IOException {
|
public void testParse_invalidPolygon() throws IOException {
|
||||||
/**
|
/**
|
||||||
* TODO parser should fail if poly is not composed of an array of LinearRings
|
* The following 3 test cases ensure proper error handling of invalid polygons
|
||||||
* This test only checks number of coordinates, not the validity of the LinearRing
|
* per the GeoJSON specification
|
||||||
*/
|
*/
|
||||||
// test case 1: create an invalid polygon with only 2 points
|
// test case 1: create an invalid polygon with only 2 points
|
||||||
String invalidPoly1 = XContentFactory.jsonBuilder().startObject().field("type", "polygon")
|
String invalidPoly1 = XContentFactory.jsonBuilder().startObject().field("type", "polygon")
|
||||||
@ -175,7 +175,7 @@ public class GeoJSONShapeParserTests extends ElasticsearchTestCase {
|
|||||||
ElasticsearchGeoAssertions.assertValidParseException(parser);
|
ElasticsearchGeoAssertions.assertValidParseException(parser);
|
||||||
|
|
||||||
// test case 2: create an invalid polygon with only 1 point
|
// test case 2: create an invalid polygon with only 1 point
|
||||||
String invalidPolyGeoJson1 = XContentFactory.jsonBuilder().startObject().field("type", "polygon")
|
String invalidPoly2 = XContentFactory.jsonBuilder().startObject().field("type", "polygon")
|
||||||
.startArray("coordinates")
|
.startArray("coordinates")
|
||||||
.startArray()
|
.startArray()
|
||||||
.startArray().value(-74.011).value(40.753).endArray()
|
.startArray().value(-74.011).value(40.753).endArray()
|
||||||
@ -183,7 +183,44 @@ public class GeoJSONShapeParserTests extends ElasticsearchTestCase {
|
|||||||
.endArray()
|
.endArray()
|
||||||
.endObject().string();
|
.endObject().string();
|
||||||
|
|
||||||
parser = JsonXContent.jsonXContent.createParser(invalidPolyGeoJson1);
|
parser = JsonXContent.jsonXContent.createParser(invalidPoly2);
|
||||||
|
parser.nextToken();
|
||||||
|
ElasticsearchGeoAssertions.assertValidParseException(parser);
|
||||||
|
|
||||||
|
// test case 3: create an invalid polygon with 0 points
|
||||||
|
String invalidPoly3 = XContentFactory.jsonBuilder().startObject().field("type", "polygon")
|
||||||
|
.startArray("coordinates")
|
||||||
|
.startArray()
|
||||||
|
.startArray().endArray()
|
||||||
|
.endArray()
|
||||||
|
.endArray()
|
||||||
|
.endObject().string();
|
||||||
|
|
||||||
|
parser = JsonXContent.jsonXContent.createParser(invalidPoly3);
|
||||||
|
parser.nextToken();
|
||||||
|
ElasticsearchGeoAssertions.assertValidParseException(parser);
|
||||||
|
|
||||||
|
// test case 4: create an invalid polygon with null value points
|
||||||
|
String invalidPoly4 = XContentFactory.jsonBuilder().startObject().field("type", "polygon")
|
||||||
|
.startArray("coordinates")
|
||||||
|
.startArray()
|
||||||
|
.startArray().nullValue().nullValue().endArray()
|
||||||
|
.endArray()
|
||||||
|
.endArray()
|
||||||
|
.endObject().string();
|
||||||
|
|
||||||
|
parser = JsonXContent.jsonXContent.createParser(invalidPoly4);
|
||||||
|
parser.nextToken();
|
||||||
|
ElasticsearchGeoAssertions.assertValidParseException(parser);
|
||||||
|
|
||||||
|
// test case 5: create an invalid polygon with 1 invalid LinearRing
|
||||||
|
String invalidPoly5 = XContentFactory.jsonBuilder().startObject().field("type", "polygon")
|
||||||
|
.startArray("coordinates")
|
||||||
|
.nullValue().nullValue()
|
||||||
|
.endArray()
|
||||||
|
.endObject().string();
|
||||||
|
|
||||||
|
parser = JsonXContent.jsonXContent.createParser(invalidPoly5);
|
||||||
parser.nextToken();
|
parser.nextToken();
|
||||||
ElasticsearchGeoAssertions.assertValidParseException(parser);
|
ElasticsearchGeoAssertions.assertValidParseException(parser);
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user