From 68d966da2cbca571f60f2e72eae9dcd206dd5673 Mon Sep 17 00:00:00 2001 From: Christoph Strobl Date: Thu, 23 Jun 2016 12:32:56 +0200 Subject: [PATCH 1/2] DATAMONGO-1453 - Parse error into GeoJsonPoint if coordinates are "integers". Prepare issue branch. --- pom.xml | 2 +- spring-data-mongodb-cross-store/pom.xml | 4 ++-- spring-data-mongodb-distribution/pom.xml | 2 +- spring-data-mongodb-log4j/pom.xml | 2 +- spring-data-mongodb/pom.xml | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/pom.xml b/pom.xml index 3a9b4f5ad7..189589bc62 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ org.springframework.data spring-data-mongodb-parent - 1.10.0.BUILD-SNAPSHOT + 1.10.0.DATAMONGO-1453-SNAPSHOT pom Spring Data MongoDB diff --git a/spring-data-mongodb-cross-store/pom.xml b/spring-data-mongodb-cross-store/pom.xml index 6554045e11..e7669accf7 100644 --- a/spring-data-mongodb-cross-store/pom.xml +++ b/spring-data-mongodb-cross-store/pom.xml @@ -6,7 +6,7 @@ org.springframework.data spring-data-mongodb-parent - 1.10.0.BUILD-SNAPSHOT + 1.10.0.DATAMONGO-1453-SNAPSHOT ../pom.xml @@ -48,7 +48,7 @@ org.springframework.data spring-data-mongodb - 1.10.0.BUILD-SNAPSHOT + 1.10.0.DATAMONGO-1453-SNAPSHOT diff --git a/spring-data-mongodb-distribution/pom.xml b/spring-data-mongodb-distribution/pom.xml index 2d02722262..8264503329 100644 --- a/spring-data-mongodb-distribution/pom.xml +++ b/spring-data-mongodb-distribution/pom.xml @@ -13,7 +13,7 @@ org.springframework.data spring-data-mongodb-parent - 1.10.0.BUILD-SNAPSHOT + 1.10.0.DATAMONGO-1453-SNAPSHOT ../pom.xml diff --git a/spring-data-mongodb-log4j/pom.xml b/spring-data-mongodb-log4j/pom.xml index ee5e3336db..3f55e94739 100644 --- a/spring-data-mongodb-log4j/pom.xml +++ b/spring-data-mongodb-log4j/pom.xml @@ -5,7 +5,7 @@ org.springframework.data spring-data-mongodb-parent - 1.10.0.BUILD-SNAPSHOT + 1.10.0.DATAMONGO-1453-SNAPSHOT ../pom.xml diff --git a/spring-data-mongodb/pom.xml b/spring-data-mongodb/pom.xml index edfa519fad..19fd122e86 100644 --- a/spring-data-mongodb/pom.xml +++ b/spring-data-mongodb/pom.xml @@ -11,7 +11,7 @@ org.springframework.data spring-data-mongodb-parent - 1.10.0.BUILD-SNAPSHOT + 1.10.0.DATAMONGO-1453-SNAPSHOT ../pom.xml From 1190f1198c3d5dabd259e09f29ff6cd3a5c09e22 Mon Sep 17 00:00:00 2001 From: Christoph Strobl Date: Thu, 23 Jun 2016 12:34:56 +0200 Subject: [PATCH 2/2] DATAMONGO-1453 - Fix GeoJson conversion when coordinates are Integers. We now use Number instead of Double for reading "coordinates" from GeoJSON representations. --- .../mongodb/core/convert/GeoConverters.java | 6 +- .../data/mongodb/core/geo/GeoJsonTests.java | 68 ++++++++++++++++++- 2 files changed, 70 insertions(+), 4 deletions(-) diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/GeoConverters.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/GeoConverters.java index bcbdef5e24..f4d3cdc663 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/GeoConverters.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/GeoConverters.java @@ -1,5 +1,5 @@ /* - * Copyright 2014-2015 the original author or authors. + * Copyright 2014-2016 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -599,7 +599,7 @@ public GeoJsonPoint convert(DBObject source) { Assert.isTrue(ObjectUtils.nullSafeEquals(source.get("type"), "Point"), String.format("Cannot convert type '%s' to Point.", source.get("type"))); - List dbl = (List) source.get("coordinates"); + List dbl = (List) source.get("coordinates"); return new GeoJsonPoint(dbl.get(0).doubleValue(), dbl.get(1).doubleValue()); } } @@ -832,7 +832,7 @@ static List toListOfPoint(BasicDBList listOfCoordinatePairs) { Assert.isInstanceOf(List.class, point); - List coordinatesList = (List) point; + List coordinatesList = (List) point; points.add(new GeoJsonPoint(coordinatesList.get(0).doubleValue(), coordinatesList.get(1).doubleValue())); } diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/geo/GeoJsonTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/geo/GeoJsonTests.java index 01d9611675..c94172774f 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/geo/GeoJsonTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/geo/GeoJsonTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2015 the original author or authors. + * Copyright 2015-2016 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -29,6 +29,7 @@ import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Configuration; +import org.springframework.dao.DataAccessException; import org.springframework.data.annotation.Id; import org.springframework.data.annotation.PersistenceConstructor; import org.springframework.data.geo.GeoResults; @@ -36,6 +37,7 @@ import org.springframework.data.geo.Metrics; import org.springframework.data.geo.Point; import org.springframework.data.mongodb.config.AbstractMongoConfiguration; +import org.springframework.data.mongodb.core.CollectionCallback; import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.data.mongodb.core.index.GeoSpatialIndexType; import org.springframework.data.mongodb.core.index.GeoSpatialIndexed; @@ -43,11 +45,15 @@ import org.springframework.data.mongodb.core.mapping.Document; import org.springframework.data.mongodb.core.query.NearQuery; import org.springframework.data.mongodb.core.query.Query; +import org.springframework.data.mongodb.test.util.BasicDbListBuilder; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; +import com.mongodb.BasicDBObject; +import com.mongodb.DBCollection; import com.mongodb.Mongo; import com.mongodb.MongoClient; +import com.mongodb.MongoException; import com.mongodb.WriteConcern; /** @@ -317,6 +323,66 @@ public void nearWithMinAndMaxDistance() { assertThat(venues.size(), is(2)); } + /** + * @see DATAMONGO-1453 + */ + @Test + public void shouldConvertPointRepresentationCorrectlyWhenSourceCoordinatesUsesInteger() { + + this.template.execute(template.getCollectionName(DocumentWithPropertyUsingGeoJsonType.class), + new CollectionCallback() { + + @Override + public Object doInCollection(DBCollection collection) throws MongoException, DataAccessException { + + BasicDBObject pointRepresentation = new BasicDBObject(); + pointRepresentation.put("type", "Point"); + pointRepresentation.put("coordinates", new BasicDbListBuilder().add(0).add(0).get()); + + BasicDBObject document = new BasicDBObject(); + document.append("_id", "datamongo-1453"); + document.append("geoJsonPoint", pointRepresentation); + + return collection.save(document); + } + }); + + assertThat(template.findOne(query(where("id").is("datamongo-1453")), + DocumentWithPropertyUsingGeoJsonType.class).geoJsonPoint, is(equalTo(new GeoJsonPoint(0D, 0D)))); + } + + /** + * @see DATAMONGO-1453 + */ + @Test + public void shouldConvertLineStringRepresentationCorrectlyWhenSourceCoordinatesUsesInteger() { + + this.template.execute(template.getCollectionName(DocumentWithPropertyUsingGeoJsonType.class), + new CollectionCallback() { + + @Override + public Object doInCollection(DBCollection collection) throws MongoException, DataAccessException { + + BasicDBObject lineStringRepresentation = new BasicDBObject(); + lineStringRepresentation.put("type", "LineString"); + lineStringRepresentation.put("coordinates", + new BasicDbListBuilder().add(new BasicDbListBuilder().add(0).add(0).get()) + .add(new BasicDbListBuilder().add(1).add(1).get()).get()); + + BasicDBObject document = new BasicDBObject(); + document.append("_id", "datamongo-1453"); + document.append("geoJsonLineString", lineStringRepresentation); + + return collection.save(document); + } + }); + + assertThat( + template.findOne(query(where("id").is("datamongo-1453")), + DocumentWithPropertyUsingGeoJsonType.class).geoJsonLineString, + is(equalTo(new GeoJsonLineString(new Point(0D, 0D), new Point(1, 1))))); + } + private void addVenues() { template.insert(new Venue2DSphere("Penn Station", -73.99408, 40.75057));