From e57735c6cdf5ba30272bfe7a621247e653ab4454 Mon Sep 17 00:00:00 2001 From: Tim Swast Date: Mon, 7 Nov 2016 10:49:17 -0800 Subject: [PATCH 1/2] Removes Datastore geospatial sample. --- appengine/datastore/geo/pom.xml | 94 ---------- .../com/example/appengine/GeoServlet.java | 175 ------------------ .../com/example/appengine/StartupServlet.java | 80 -------- .../src/main/webapp/WEB-INF/appengine-web.xml | 21 --- .../main/webapp/WEB-INF/datastore-indexes.xml | 26 --- .../geo/src/main/webapp/WEB-INF/web.xml | 47 ----- .../com/example/appengine/GeoServletTest.java | 89 --------- .../example/appengine/StartupServletTest.java | 116 ------------ 8 files changed, 648 deletions(-) delete mode 100644 appengine/datastore/geo/pom.xml delete mode 100644 appengine/datastore/geo/src/main/java/com/example/appengine/GeoServlet.java delete mode 100644 appengine/datastore/geo/src/main/java/com/example/appengine/StartupServlet.java delete mode 100644 appengine/datastore/geo/src/main/webapp/WEB-INF/appengine-web.xml delete mode 100644 appengine/datastore/geo/src/main/webapp/WEB-INF/datastore-indexes.xml delete mode 100644 appengine/datastore/geo/src/main/webapp/WEB-INF/web.xml delete mode 100644 appengine/datastore/geo/src/test/java/com/example/appengine/GeoServletTest.java delete mode 100644 appengine/datastore/geo/src/test/java/com/example/appengine/StartupServletTest.java diff --git a/appengine/datastore/geo/pom.xml b/appengine/datastore/geo/pom.xml deleted file mode 100644 index 481928544fe..00000000000 --- a/appengine/datastore/geo/pom.xml +++ /dev/null @@ -1,94 +0,0 @@ - - - 4.0.0 - war - 1.0-SNAPSHOT - com.example.appengine - appengine-datastore-geo - - - com.google.cloud - doc-samples - 1.0.0 - ../../.. - - - - - com.google.appengine - appengine-api-1.0-sdk - ${appengine.sdk.version} - - - javax.servlet - servlet-api - jar - provided - - - - - junit - junit - 4.12 - test - - - org.mockito - mockito-all - 1.10.19 - test - - - com.google.appengine - appengine-testing - ${appengine.sdk.version} - test - - - com.google.appengine - appengine-api-stubs - ${appengine.sdk.version} - test - - - com.google.appengine - appengine-tools-sdk - ${appengine.sdk.version} - test - - - com.google.truth - truth - 0.30 - test - - - - - - ${project.build.directory}/${project.build.finalName}/WEB-INF/classes - - - - com.google.appengine - appengine-maven-plugin - ${appengine.sdk.version} - - - - diff --git a/appengine/datastore/geo/src/main/java/com/example/appengine/GeoServlet.java b/appengine/datastore/geo/src/main/java/com/example/appengine/GeoServlet.java deleted file mode 100644 index 694e2107ef9..00000000000 --- a/appengine/datastore/geo/src/main/java/com/example/appengine/GeoServlet.java +++ /dev/null @@ -1,175 +0,0 @@ -/* - * Copyright 2016 Google Inc. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.example.appengine; - -import com.google.appengine.api.datastore.DatastoreService; -import com.google.appengine.api.datastore.DatastoreServiceFactory; -import com.google.appengine.api.datastore.Entity; -import com.google.appengine.api.datastore.FetchOptions; -import com.google.appengine.api.datastore.GeoPt; -import com.google.appengine.api.datastore.Query; -import com.google.appengine.api.datastore.Query.CompositeFilterOperator; -import com.google.appengine.api.datastore.Query.Filter; -import com.google.appengine.api.datastore.Query.FilterOperator; -import com.google.appengine.api.datastore.Query.FilterPredicate; -import com.google.appengine.api.datastore.Query.GeoRegion.Circle; -import com.google.appengine.api.datastore.Query.GeoRegion.Rectangle; -import com.google.appengine.api.datastore.Query.StContainsFilter; - -import java.io.IOException; -import java.io.PrintWriter; -import java.util.List; - -import javax.servlet.ServletException; -import javax.servlet.http.HttpServlet; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - -/** - * A servlet to demonstrate the use of Cloud Datastore geospatial queries. - */ -public class GeoServlet extends HttpServlet { - static final String BRAND_PROPERTY = "brand"; - static final String LOCATION_PROPERTY = "location"; - - static final String BRAND_PARAMETER = "brand"; - static final String LATITUDE_PARAMETER = "lat"; - static final String LONGITUDE_PARAMETER = "lon"; - static final String RADIUS_PARAMETER = "r"; - - static final String BRAND_DEFAULT = "Ocean Ave Shell"; - static final String LATITUDE_DEFAULT = "37.7895873"; - static final String LONGITUDE_DEFAULT = "-122.3917317"; - static final String RADIUS_DEFAULT = "1000.0"; - - // Number of meters (approximately) in 1 degree of latitude. - // http://gis.stackexchange.com/a/2964 - private static final double DEGREE_METERS = 111111.0; - - private final DatastoreService datastore; - - public GeoServlet() { - datastore = DatastoreServiceFactory.getDatastoreService(); - } - - private static String getParameterOrDefault( - HttpServletRequest req, String parameter, String defaultValue) { - String value = req.getParameter(parameter); - if (value == null || value.isEmpty()) { - value = defaultValue; - } - return value; - } - - private static GeoPt getOffsetPoint( - GeoPt original, double latOffsetMeters, double lonOffsetMeters) { - // Approximate the number of degrees to offset by meters. - // http://gis.stackexchange.com/a/2964 - // How long (approximately) is one degree of longitude? - double lonDegreeMeters = DEGREE_METERS * Math.cos(original.getLatitude()); - return new GeoPt( - (float) (original.getLatitude() + latOffsetMeters / DEGREE_METERS), - // This may cause errors if given points near the north or south pole. - (float) (original.getLongitude() + lonOffsetMeters / lonDegreeMeters)); - } - - @Override - public void doGet(HttpServletRequest req, HttpServletResponse resp) - throws IOException, ServletException { - resp.setContentType("text/plain"); - resp.setCharacterEncoding("UTF-8"); - PrintWriter out = resp.getWriter(); - - String brand = getParameterOrDefault(req, BRAND_PARAMETER, BRAND_DEFAULT); - String latStr = getParameterOrDefault(req, LATITUDE_PARAMETER, LATITUDE_DEFAULT); - String lonStr = getParameterOrDefault(req, LONGITUDE_PARAMETER, LONGITUDE_DEFAULT); - String radiusStr = getParameterOrDefault(req, RADIUS_PARAMETER, RADIUS_DEFAULT); - - float latitude; - float longitude; - double r; - try { - latitude = Float.parseFloat(latStr); - longitude = Float.parseFloat(lonStr); - r = Double.parseDouble(radiusStr); - } catch (IllegalArgumentException e) { - resp.sendError( - HttpServletResponse.SC_BAD_REQUEST, String.format("Got bad value: %s", e.getMessage())); - return; - } - - // Get lat/lon for rectangle. - GeoPt c = new GeoPt(latitude, longitude); - GeoPt ne = getOffsetPoint(c, r, r); - float neLat = ne.getLatitude(); - float neLon = ne.getLongitude(); - GeoPt sw = getOffsetPoint(c, -1 * r, -1 * r); - float swLat = sw.getLatitude(); - float swLon = sw.getLongitude(); - - // [START geospatial_stcontainsfilter_examples] - // Testing for containment within a circle - GeoPt center = new GeoPt(latitude, longitude); - double radius = r; // Value is in meters. - Filter f1 = new StContainsFilter("location", new Circle(center, radius)); - Query q1 = new Query("GasStation").setFilter(f1); - - // Testing for containment within a rectangle - GeoPt southwest = new GeoPt(swLat, swLon); - GeoPt northeast = new GeoPt(neLat, neLon); - Filter f2 = new StContainsFilter("location", new Rectangle(southwest, northeast)); - Query q2 = new Query("GasStation").setFilter(f2); - // [END geospatial_stcontainsfilter_examples] - - List circleResults = datastore.prepare(q1).asList(FetchOptions.Builder.withDefaults()); - out.printf("Got %d stations in %f meter radius circle.\n", circleResults.size(), radius); - printStations(out, circleResults); - out.println(); - - List rectResults = datastore.prepare(q2).asList(FetchOptions.Builder.withDefaults()); - out.printf("Got %d stations in rectangle.\n", rectResults.size()); - printStations(out, rectResults); - out.println(); - - List brandResults = getStationsWithBrand(center, radius, brand); - out.printf("Got %d stations in circle with brand %s.\n", brandResults.size(), brand); - printStations(out, brandResults); - out.println(); - } - - private void printStations(PrintWriter out, List stations) { - for (Entity station : stations) { - GeoPt location = (GeoPt) station.getProperty(LOCATION_PROPERTY); - out.printf( - "%s: @%f, %f\n", - (String) station.getProperty(BRAND_PROPERTY), - location.getLatitude(), - location.getLongitude()); - } - } - - private List getStationsWithBrand(GeoPt center, double radius, String value) { - // [START geospatial_containment_and_equality_combination] - Filter f = - CompositeFilterOperator.and( - new StContainsFilter("location", new Circle(center, radius)), - new FilterPredicate("brand", FilterOperator.EQUAL, value)); - // [END geospatial_containment_and_equality_combination] - Query q = new Query("GasStation").setFilter(f); - return datastore.prepare(q).asList(FetchOptions.Builder.withDefaults()); - } -} diff --git a/appengine/datastore/geo/src/main/java/com/example/appengine/StartupServlet.java b/appengine/datastore/geo/src/main/java/com/example/appengine/StartupServlet.java deleted file mode 100644 index 3a60b032730..00000000000 --- a/appengine/datastore/geo/src/main/java/com/example/appengine/StartupServlet.java +++ /dev/null @@ -1,80 +0,0 @@ -/* - * Copyright 2016 Google Inc. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.example.appengine; - -import com.google.appengine.api.datastore.DatastoreService; -import com.google.appengine.api.datastore.DatastoreServiceFactory; -import com.google.appengine.api.datastore.Entity; -import com.google.appengine.api.datastore.EntityNotFoundException; -import com.google.appengine.api.datastore.GeoPt; -import com.google.appengine.api.datastore.Key; -import com.google.appengine.api.datastore.KeyFactory; - -import java.io.IOException; - -import javax.servlet.ServletException; -import javax.servlet.http.HttpServlet; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - -/** - * A startup handler to populate the datastore with example entities. - */ -public class StartupServlet extends HttpServlet { - static final String IS_POPULATED_ENTITY = "IsPopulated"; - static final String IS_POPULATED_KEY_NAME = "is-populated"; - - @Override - protected void doGet(HttpServletRequest req, HttpServletResponse resp) - throws ServletException, IOException { - resp.setContentType("text/plain"); - DatastoreService datastore = DatastoreServiceFactory.getDatastoreService(); - - Key isPopulatedKey = KeyFactory.createKey(IS_POPULATED_ENTITY, IS_POPULATED_KEY_NAME); - boolean isAlreadyPopulated; - try { - datastore.get(isPopulatedKey); - isAlreadyPopulated = true; - } catch (EntityNotFoundException expected) { - isAlreadyPopulated = false; - } - if (isAlreadyPopulated) { - resp.getWriter().println("ok"); - return; - } - - // [START create_entity_with_geopt_property] - Entity station = new Entity("GasStation"); - station.setProperty("brand", "Ocean Ave Shell"); - station.setProperty("location", new GeoPt(37.7913156f, -122.3926051f)); - datastore.put(station); - // [END create_entity_with_geopt_property] - - station = new Entity("GasStation"); - station.setProperty("brand", "Charge Point Charging Station"); - station.setProperty("location", new GeoPt(37.7909778f, -122.3929963f)); - datastore.put(station); - - station = new Entity("GasStation"); - station.setProperty("brand", "76"); - station.setProperty("location", new GeoPt(37.7860533f, -122.3940325f)); - datastore.put(station); - - datastore.put(new Entity(isPopulatedKey)); - resp.getWriter().println("ok"); - } -} diff --git a/appengine/datastore/geo/src/main/webapp/WEB-INF/appengine-web.xml b/appengine/datastore/geo/src/main/webapp/WEB-INF/appengine-web.xml deleted file mode 100644 index e9d8b21cb8f..00000000000 --- a/appengine/datastore/geo/src/main/webapp/WEB-INF/appengine-web.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - YOUR-PROJECT-ID - YOUR-VERSION-ID - true - diff --git a/appengine/datastore/geo/src/main/webapp/WEB-INF/datastore-indexes.xml b/appengine/datastore/geo/src/main/webapp/WEB-INF/datastore-indexes.xml deleted file mode 100644 index 513b883ed78..00000000000 --- a/appengine/datastore/geo/src/main/webapp/WEB-INF/datastore-indexes.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/appengine/datastore/geo/src/main/webapp/WEB-INF/web.xml b/appengine/datastore/geo/src/main/webapp/WEB-INF/web.xml deleted file mode 100644 index 12d26c6bcab..00000000000 --- a/appengine/datastore/geo/src/main/webapp/WEB-INF/web.xml +++ /dev/null @@ -1,47 +0,0 @@ - - - - - geo - com.example.appengine.GeoServlet - - - geo - / - - - startup - com.example.appengine.StartupServlet - - - startup - /_ah/start - - - - - profile - /* - - - CONFIDENTIAL - - - diff --git a/appengine/datastore/geo/src/test/java/com/example/appengine/GeoServletTest.java b/appengine/datastore/geo/src/test/java/com/example/appengine/GeoServletTest.java deleted file mode 100644 index 770126036bc..00000000000 --- a/appengine/datastore/geo/src/test/java/com/example/appengine/GeoServletTest.java +++ /dev/null @@ -1,89 +0,0 @@ -/* - * Copyright 2016 Google Inc. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.example.appengine; - -import static com.google.common.truth.Truth.assertThat; -import static org.mockito.Matchers.anyString; -import static org.mockito.Matchers.eq; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; - -import com.google.appengine.tools.development.testing.LocalDatastoreServiceTestConfig; -import com.google.appengine.tools.development.testing.LocalServiceTestHelper; -import org.junit.After; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.junit.runners.JUnit4; -import org.mockito.Mock; -import org.mockito.MockitoAnnotations; - -import java.io.PrintWriter; -import java.io.StringWriter; - -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - -/** - * Unit tests for {@link GeoServlet}. - */ -@RunWith(JUnit4.class) -public class GeoServletTest { - - private final LocalServiceTestHelper helper = - new LocalServiceTestHelper(new LocalDatastoreServiceTestConfig()); - - @Mock private HttpServletRequest mockRequest; - @Mock private HttpServletResponse mockResponse; - private StringWriter responseWriter; - private GeoServlet servletUnderTest; - - @Before - public void setUp() throws Exception { - MockitoAnnotations.initMocks(this); - helper.setUp(); - - // Set up a fake HTTP response. - responseWriter = new StringWriter(); - when(mockResponse.getWriter()).thenReturn(new PrintWriter(responseWriter)); - - servletUnderTest = new GeoServlet(); - } - - @After - public void tearDown() { - helper.tearDown(); - } - - @Test - public void doGet_emptyDatastore_writesNoGasStations() throws Exception { - servletUnderTest.doGet(mockRequest, mockResponse); - - assertThat(responseWriter.toString()) - .named("GeoServlet response") - .contains("Got 0 stations"); - } - - @Test - public void doGet_badRadius_returnsError() throws Exception { - when(mockRequest.getParameter(GeoServlet.RADIUS_PARAMETER)).thenReturn("this-is-not-a-float"); - - servletUnderTest.doGet(mockRequest, mockResponse); - - verify(mockResponse).sendError(eq(HttpServletResponse.SC_BAD_REQUEST), anyString()); - } -} diff --git a/appengine/datastore/geo/src/test/java/com/example/appengine/StartupServletTest.java b/appengine/datastore/geo/src/test/java/com/example/appengine/StartupServletTest.java deleted file mode 100644 index d9c91af0efb..00000000000 --- a/appengine/datastore/geo/src/test/java/com/example/appengine/StartupServletTest.java +++ /dev/null @@ -1,116 +0,0 @@ -/* - * Copyright 2016 Google Inc. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.example.appengine; - -import static com.google.common.truth.Truth.assertThat; -import static org.mockito.Mockito.when; - -import com.google.appengine.api.datastore.DatastoreService; -import com.google.appengine.api.datastore.DatastoreServiceFactory; -import com.google.appengine.api.datastore.Entity; -import com.google.appengine.api.datastore.GeoPt; -import com.google.appengine.api.datastore.Query; -import com.google.appengine.api.datastore.Query.CompositeFilterOperator; -import com.google.appengine.api.datastore.Query.Filter; -import com.google.appengine.api.datastore.Query.FilterOperator; -import com.google.appengine.api.datastore.Query.FilterPredicate; -import com.google.appengine.api.datastore.Query.GeoRegion.Circle; -import com.google.appengine.api.datastore.Query.StContainsFilter; -import com.google.appengine.tools.development.testing.LocalDatastoreServiceTestConfig; -import com.google.appengine.tools.development.testing.LocalServiceTestHelper; -import org.junit.After; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.junit.runners.JUnit4; -import org.mockito.Mock; -import org.mockito.MockitoAnnotations; - -import java.io.PrintWriter; -import java.io.StringWriter; - -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - -/** - * Unit tests for {@link StartupServlet}. - */ -@RunWith(JUnit4.class) -public class StartupServletTest { - - private final LocalServiceTestHelper helper = - new LocalServiceTestHelper( - // Set no eventual consistency, that way queries return all results. - // https://cloud.google.com/appengine/docs/java/tools/localunittesting#Java_Writing_High_Replication_Datastore_tests - new LocalDatastoreServiceTestConfig() - .setDefaultHighRepJobPolicyUnappliedJobPercentage(0)); - - @Mock private HttpServletRequest mockRequest; - @Mock private HttpServletResponse mockResponse; - private StringWriter responseWriter; - private DatastoreService datastore; - - private StartupServlet servletUnderTest; - - @Before - public void setUp() throws Exception { - MockitoAnnotations.initMocks(this); - helper.setUp(); - datastore = DatastoreServiceFactory.getDatastoreService(); - - // Set up a fake HTTP response. - responseWriter = new StringWriter(); - when(mockResponse.getWriter()).thenReturn(new PrintWriter(responseWriter)); - - servletUnderTest = new StartupServlet(); - } - - @After - public void tearDown() { - helper.tearDown(); - } - - @Test - public void doGet_emptyDatastore_writesOkay() throws Exception { - servletUnderTest.doGet(mockRequest, mockResponse); - assertThat(responseWriter.toString()).named("StartupServlet response").isEqualTo("ok\n"); - } - - @Test - public void doGet_emptyDatastore_writesGasStation() throws Exception { - servletUnderTest.doGet(mockRequest, mockResponse); - - GeoPt center = new GeoPt(37.7895873f, -122.3917317f); - double radius = 1000.0; // Radius in meters. - String value = "Ocean Ave Shell"; - Filter f = - CompositeFilterOperator.and( - new StContainsFilter("location", new Circle(center, radius)), - new FilterPredicate("brand", FilterOperator.EQUAL, value)); - Query q = new Query("GasStation").setFilter(f); - Entity result = datastore.prepare(q).asSingleEntity(); - assertThat(result.getProperty("brand")).named("brand").isEqualTo("Ocean Ave Shell"); - } - - @Test - public void doGet_alreadyPopulated_writesOkay() throws Exception { - datastore.put( - new Entity(StartupServlet.IS_POPULATED_ENTITY, StartupServlet.IS_POPULATED_KEY_NAME)); - servletUnderTest.doGet(mockRequest, mockResponse); - assertThat(responseWriter.toString()).named("StartupServlet response").isEqualTo("ok\n"); - } -} From 8d5c78106dd83074b8b92cd2255ceb246f8c1910 Mon Sep 17 00:00:00 2001 From: Tim Swast Date: Mon, 7 Nov 2016 10:58:11 -0800 Subject: [PATCH 2/2] Remove references to geo sample. --- pom.xml | 1 - travis.sh | 1 - 2 files changed, 2 deletions(-) diff --git a/pom.xml b/pom.xml index 7cbd67184c6..e03ac213162 100644 --- a/pom.xml +++ b/pom.xml @@ -48,7 +48,6 @@ appengine/channel appengine/cloudsql appengine/datastore - appengine/datastore/geo appengine/datastore/indexes appengine/datastore/indexes-exploding appengine/datastore/indexes-perfect diff --git a/travis.sh b/travis.sh index cc50dddd00c..3b36d3326bc 100755 --- a/travis.sh +++ b/travis.sh @@ -81,7 +81,6 @@ test_localhost() { devserver_tests=( appengine/helloworld - appengine/datastore/geo appengine/datastore/indexes appengine/datastore/indexes-exploding appengine/datastore/indexes-perfect