From 026b97448e30c036ae7d1cff4f37ceb4ad767c44 Mon Sep 17 00:00:00 2001 From: Laurie White Date: Fri, 22 Apr 2016 13:49:05 -0700 Subject: [PATCH 1/6] Added files via upload Moved examples from https://cloud.google.com/appengine/docs/java/requests to Github. --- appengine/requests/README.md | 43 +++++++ appengine/requests/pom.xml | 112 ++++++++++++++++++ .../appengine/requests/LoggingServlet.java | 41 +++++++ .../appengine/requests/RequestsServlet.java | 33 ++++++ .../src/main/webapp/WEB-INF/appengine-web.xml | 6 + .../requests/src/main/webapp/WEB-INF/web.xml | 26 ++++ .../requests/LoggingServletTest.java | 101 ++++++++++++++++ .../requests/RequestsServletTest.java | 76 ++++++++++++ 8 files changed, 438 insertions(+) create mode 100644 appengine/requests/README.md create mode 100644 appengine/requests/pom.xml create mode 100644 appengine/requests/src/main/java/com/example/appengine/requests/LoggingServlet.java create mode 100644 appengine/requests/src/main/java/com/example/appengine/requests/RequestsServlet.java create mode 100644 appengine/requests/src/main/webapp/WEB-INF/appengine-web.xml create mode 100644 appengine/requests/src/main/webapp/WEB-INF/web.xml create mode 100644 appengine/requests/src/test/java/com/example/appengine/requests/LoggingServletTest.java create mode 100644 appengine/requests/src/test/java/com/example/appengine/requests/RequestsServletTest.java diff --git a/appengine/requests/README.md b/appengine/requests/README.md new file mode 100644 index 00000000000..d8079247643 --- /dev/null +++ b/appengine/requests/README.md @@ -0,0 +1,43 @@ +# Request Handling sample for Google App Engine + +This sample provides Java code samples in support of the "Handling Requests" description [Requests][requests-doc] on [Google App +Engine][ae-docs]. + +[requests-doc]: https://cloud.google.com/appengine/docs/java/requests +[ae-docs]: https://cloud.google.com/appengine/docs/java/ + +## Running locally +This example uses the +[Maven gcloud plugin](https://cloud.google.com/appengine/docs/java/managed-vms/maven). +To run this sample locally: + + $ mvn appengine:devserver + +To see the results of the RequestsServlet, open localhost:8080 in a WWW browser. + +To see the results of the LoggingServlet, open localhost:8080/logs in a WWW browser +and examine the logs to see the actual messages. + +## Deploying +In the following command, replace YOUR-PROJECT-ID with your +[Google Cloud Project ID](https://developers.google.com/console/help/new/#projectnumber) +and SOME-VERSION with a valid version number. + + $ mvn appengine:update -Dappengine.appId=YOUR-PROJECT-ID -Dappengine.version=SOME-VERSION + +## Setup +To save your project settings so that you don't need to enter the + parameters, you can: + +1. Update the tag in src/main/webapp/WEB-INF/appengine-web.xml + with your project name. + +2. Update the tag in src/main/webapp/WEB-INF/appengine-web.xml + with a valid version number. + + +You will now be able to run + + $ mvn appengine:update + +without the need for any additional parameters. diff --git a/appengine/requests/pom.xml b/appengine/requests/pom.xml new file mode 100644 index 00000000000..37ed7e3f61d --- /dev/null +++ b/appengine/requests/pom.xml @@ -0,0 +1,112 @@ + + + + 4.0.0 + war + 1.0-SNAPSHOT + com.example.appengine + appengine-requests + + + com.google.cloud + doc-samples + 1.0.0 + ../.. + + + + com.google.appengine + appengine-maven-plugin + ${appengine.sdk.version} + + + com.google.guava + guava + 19.0 + + + javax.servlet + servlet-api + 2.5 + jar + provided + + + org.json + json + 20151123 + + + + junit + junit + 4.10 + 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.28 + test + + + + + + ${project.build.directory}/${project.build.finalName}/WEB-INF/classes + + + org.apache.maven.plugins + 3.3 + maven-compiler-plugin + + 1.7 + 1.7 + + + + com.google.appengine + appengine-maven-plugin + ${appengine.sdk.version} + + + + diff --git a/appengine/requests/src/main/java/com/example/appengine/requests/LoggingServlet.java b/appengine/requests/src/main/java/com/example/appengine/requests/LoggingServlet.java new file mode 100644 index 00000000000..434796b7c9e --- /dev/null +++ b/appengine/requests/src/main/java/com/example/appengine/requests/LoggingServlet.java @@ -0,0 +1,41 @@ +/* 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.requests; + +import java.io.IOException; +import java.util.logging.Logger; + +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +// [START simple_logging_example] +public class LoggingServlet extends HttpServlet { + private static final Logger log = Logger.getLogger(LoggingServlet.class.getName()); + + @Override + public void doGet(HttpServletRequest req, HttpServletResponse resp) + throws IOException { + log.info("An informational message."); + log.warning("A warning message."); + log.severe("An error message."); + // [START_EXCLUDE] + resp.setContentType("text/plain"); + resp.getWriter().println("Check logs for results"); + // [END_EXCLUDE] + } +} +// [END simple_logging_example] + diff --git a/appengine/requests/src/main/java/com/example/appengine/requests/RequestsServlet.java b/appengine/requests/src/main/java/com/example/appengine/requests/RequestsServlet.java new file mode 100644 index 00000000000..7c7f562bf6e --- /dev/null +++ b/appengine/requests/src/main/java/com/example/appengine/requests/RequestsServlet.java @@ -0,0 +1,33 @@ +/* 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.requests; + +import java.io.IOException; + +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +// [START simple_request_example] +public class RequestsServlet extends HttpServlet { + @Override + public void doGet(HttpServletRequest req, HttpServletResponse resp) + throws IOException { + resp.setContentType("text/plain"); + resp.getWriter().println("Hello, world"); + } +} +// [END simple_request_example] + diff --git a/appengine/requests/src/main/webapp/WEB-INF/appengine-web.xml b/appengine/requests/src/main/webapp/WEB-INF/appengine-web.xml new file mode 100644 index 00000000000..c9e245399bf --- /dev/null +++ b/appengine/requests/src/main/webapp/WEB-INF/appengine-web.xml @@ -0,0 +1,6 @@ + + + YOUR-PROJECT-ID + YOUR-VERSION-ID + true + diff --git a/appengine/requests/src/main/webapp/WEB-INF/web.xml b/appengine/requests/src/main/webapp/WEB-INF/web.xml new file mode 100644 index 00000000000..7784c6a56c6 --- /dev/null +++ b/appengine/requests/src/main/webapp/WEB-INF/web.xml @@ -0,0 +1,26 @@ + + + + requests + com.example.appengine.requests.RequestsServlet + + + logging + com.example.appengine.requests.LoggingServlet + + + requests + / + + + requests + /requests + + + logging + /logs + + diff --git a/appengine/requests/src/test/java/com/example/appengine/requests/LoggingServletTest.java b/appengine/requests/src/test/java/com/example/appengine/requests/LoggingServletTest.java new file mode 100644 index 00000000000..b251436b1c4 --- /dev/null +++ b/appengine/requests/src/test/java/com/example/appengine/requests/LoggingServletTest.java @@ -0,0 +1,101 @@ +/* + * 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.requests; + +import static com.google.common.truth.Truth.assertThat; +import static org.mockito.Mockito.when; + +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.ByteArrayOutputStream; +import java.io.PrintStream; +import java.io.PrintWriter; +import java.io.StringWriter; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +/** + * Unit tests for {@link LoggingServlet}. + */ +@RunWith(JUnit4.class) +public class LoggingServletTest { + // Set up a helper so that the ApiProxy returns a valid environment for local testing. + private final LocalServiceTestHelper helper = new LocalServiceTestHelper(); + + // To capture and restore stderr + private final ByteArrayOutputStream stderr = new ByteArrayOutputStream(); + private static final PrintStream REAL_ERR = System.err; + + @Mock private HttpServletRequest mockRequest; + @Mock private HttpServletResponse mockResponse; + private StringWriter responseWriter; + private LoggingServlet servletUnderTest; + + @Before + public void setUp() throws Exception { + // Capture stderr to examine messages written to it + System.setErr(new PrintStream(stderr)); + + MockitoAnnotations.initMocks(this); + helper.setUp(); + + // Set up a fake HTTP response. + responseWriter = new StringWriter(); + when(mockResponse.getWriter()).thenReturn(new PrintWriter(responseWriter)); + + servletUnderTest = new LoggingServlet(); + } + + @After + public void tearDown() { + // Restore stderr + System.setErr(LoggingServletTest.REAL_ERR); + + helper.tearDown(); + } + + @Test + public void testListLogs() throws Exception { + servletUnderTest.doGet(mockRequest, mockResponse); + + String out = stderr.toString(); + + // We expect three log messages to be created + // with the following messages. + assertThat(out).contains("An informational message."); + assertThat(out).contains("A warning message."); + assertThat(out).contains("An error message."); + + // We expect three log messages to be created + // with the following severities. + // Since there's no guarantee of case, use lowercase + String lcOut = out.toLowerCase(); + assertThat(lcOut).contains("info"); + assertThat(lcOut).contains("warning"); + assertThat(lcOut).contains("severe"); + } + +} diff --git a/appengine/requests/src/test/java/com/example/appengine/requests/RequestsServletTest.java b/appengine/requests/src/test/java/com/example/appengine/requests/RequestsServletTest.java new file mode 100644 index 00000000000..4af808a0586 --- /dev/null +++ b/appengine/requests/src/test/java/com/example/appengine/requests/RequestsServletTest.java @@ -0,0 +1,76 @@ +/* + * 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.requests; + +import static com.google.common.truth.Truth.assertThat; +import static org.mockito.Mockito.when; + +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 RequestsServlet}. + */ +@RunWith(JUnit4.class) +public class RequestsServletTest { + // Set up a helper so that the ApiProxy returns a valid environment for local testing. + private final LocalServiceTestHelper helper = new LocalServiceTestHelper(); + + @Mock private HttpServletRequest mockRequest; + @Mock private HttpServletResponse mockResponse; + private StringWriter responseWriter; + private RequestsServlet 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 RequestsServlet(); + } + + @After public void tearDown() { + helper.tearDown(); + } + + @Test + public void doGet_writesResponse() throws Exception { + servletUnderTest.doGet(mockRequest, mockResponse); + + // We expect a greeting to be returned. + assertThat(responseWriter.toString()) + .named("RequestsServlet response") + .contains("Hello, world"); + } +} From d742d522c10ddaa081811b8b1ca80848f7e63f66 Mon Sep 17 00:00:00 2001 From: Laurie White Date: Fri, 22 Apr 2016 13:53:52 -0700 Subject: [PATCH 2/6] Added files via upload Updated high level pom.xml --- pom.xml | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/pom.xml b/pom.xml index cf0cb626aab..461eddb4bc3 100644 --- a/pom.xml +++ b/pom.xml @@ -30,7 +30,7 @@ - 1.9.36 + 1.9.34 1 1.19.0 1.19.0 @@ -39,28 +39,24 @@ - 3.3.9 + 3.1.0 appengine/analytics appengine/appidentity - appengine/datastore - appengine/guestbook-objectify appengine/helloworld appengine/logs appengine/mailgun appengine/mailjet appengine/memcache - appengine/oauth2 - appengine/search + appengine/requests appengine/sendgrid appengine/static-files appengine/twilio appengine/urlfetch appengine/users bigquery - compute/cmdline datastore logging managed_vms/analytics From 3f88050e5a3d5d7c736069c2ff0a238e0da1916d Mon Sep 17 00:00:00 2001 From: Laurie White Date: Fri, 22 Apr 2016 14:02:39 -0700 Subject: [PATCH 3/6] Added files via upload Okay, maybe this is the correct version of the file now. --- pom.xml | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 461eddb4bc3..c061e167053 100644 --- a/pom.xml +++ b/pom.xml @@ -30,7 +30,7 @@ - 1.9.34 + 1.9.36 1 1.19.0 1.19.0 @@ -39,24 +39,29 @@ - 3.1.0 + 3.3.9 appengine/analytics appengine/appidentity + appengine/datastore + appengine/guestbook-objectify appengine/helloworld appengine/logs appengine/mailgun appengine/mailjet appengine/memcache + appengine/oauth2 appengine/requests + appengine/search appengine/sendgrid appengine/static-files appengine/twilio appengine/urlfetch appengine/users bigquery + compute/cmdline datastore logging managed_vms/analytics From 625fd7c41de6ba65eda87e9e489091c3ae506490 Mon Sep 17 00:00:00 2001 From: Laurie White Date: Fri, 22 Apr 2016 14:06:37 -0700 Subject: [PATCH 4/6] Update pom.xml --- pom.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/pom.xml b/pom.xml index c061e167053..cb181a14a9e 100644 --- a/pom.xml +++ b/pom.xml @@ -56,6 +56,8 @@ appengine/requests appengine/search appengine/sendgrid + appengine/remote/remote-client + appengine/remote/remote-server appengine/static-files appengine/twilio appengine/urlfetch From c9c1cc6cfe581bcbdc3bd46bc69ca99ed859ed09 Mon Sep 17 00:00:00 2001 From: Laurie White Date: Fri, 22 Apr 2016 15:11:36 -0700 Subject: [PATCH 5/6] Update README.md Cleaned up some syntax problems. --- appengine/requests/README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/appengine/requests/README.md b/appengine/requests/README.md index d8079247643..45ea04fdb8b 100644 --- a/appengine/requests/README.md +++ b/appengine/requests/README.md @@ -13,9 +13,9 @@ To run this sample locally: $ mvn appengine:devserver -To see the results of the RequestsServlet, open localhost:8080 in a WWW browser. +To see the results of the RequestsServlet, open `localhost:8080` in a WWW browser. -To see the results of the LoggingServlet, open localhost:8080/logs in a WWW browser +To see the results of the LoggingServlet, open `localhost:8080/logs` in a WWW browser and examine the logs to see the actual messages. ## Deploying @@ -29,10 +29,10 @@ and SOME-VERSION with a valid version number. To save your project settings so that you don't need to enter the parameters, you can: -1. Update the tag in src/main/webapp/WEB-INF/appengine-web.xml +1. Update the `` tag in src/main/webapp/WEB-INF/appengine-web.xml with your project name. -2. Update the tag in src/main/webapp/WEB-INF/appengine-web.xml +2. Update the `` tag in src/main/webapp/WEB-INF/appengine-web.xml with a valid version number. From 672b7082c48a7a8a91788d4e7ecc8d199b7b309b Mon Sep 17 00:00:00 2001 From: Laurie White Date: Fri, 22 Apr 2016 16:17:55 -0700 Subject: [PATCH 6/6] Added files via upload --- appengine/requests/pom.xml | 10 +--------- .../appengine/requests/LoggingServletTest.java | 8 -------- .../appengine/requests/RequestsServletTest.java | 13 +------------ 3 files changed, 2 insertions(+), 29 deletions(-) diff --git a/appengine/requests/pom.xml b/appengine/requests/pom.xml index 37ed7e3f61d..68dd81c2cd3 100644 --- a/appengine/requests/pom.xml +++ b/appengine/requests/pom.xml @@ -93,15 +93,7 @@ Copyright 2016 Google Inc. All Rights Reserved. ${project.build.directory}/${project.build.finalName}/WEB-INF/classes - - org.apache.maven.plugins - 3.3 - maven-compiler-plugin - - 1.7 - 1.7 - - + com.google.appengine appengine-maven-plugin diff --git a/appengine/requests/src/test/java/com/example/appengine/requests/LoggingServletTest.java b/appengine/requests/src/test/java/com/example/appengine/requests/LoggingServletTest.java index b251436b1c4..e84c3d1db19 100644 --- a/appengine/requests/src/test/java/com/example/appengine/requests/LoggingServletTest.java +++ b/appengine/requests/src/test/java/com/example/appengine/requests/LoggingServletTest.java @@ -19,8 +19,6 @@ import static com.google.common.truth.Truth.assertThat; import static org.mockito.Mockito.when; -import com.google.appengine.tools.development.testing.LocalServiceTestHelper; - import org.junit.After; import org.junit.Before; import org.junit.Test; @@ -42,9 +40,6 @@ */ @RunWith(JUnit4.class) public class LoggingServletTest { - // Set up a helper so that the ApiProxy returns a valid environment for local testing. - private final LocalServiceTestHelper helper = new LocalServiceTestHelper(); - // To capture and restore stderr private final ByteArrayOutputStream stderr = new ByteArrayOutputStream(); private static final PrintStream REAL_ERR = System.err; @@ -60,7 +55,6 @@ public void setUp() throws Exception { System.setErr(new PrintStream(stderr)); MockitoAnnotations.initMocks(this); - helper.setUp(); // Set up a fake HTTP response. responseWriter = new StringWriter(); @@ -73,8 +67,6 @@ public void setUp() throws Exception { public void tearDown() { // Restore stderr System.setErr(LoggingServletTest.REAL_ERR); - - helper.tearDown(); } @Test diff --git a/appengine/requests/src/test/java/com/example/appengine/requests/RequestsServletTest.java b/appengine/requests/src/test/java/com/example/appengine/requests/RequestsServletTest.java index 4af808a0586..4e27eebbb3b 100644 --- a/appengine/requests/src/test/java/com/example/appengine/requests/RequestsServletTest.java +++ b/appengine/requests/src/test/java/com/example/appengine/requests/RequestsServletTest.java @@ -19,9 +19,6 @@ import static com.google.common.truth.Truth.assertThat; import static org.mockito.Mockito.when; -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; @@ -40,9 +37,6 @@ */ @RunWith(JUnit4.class) public class RequestsServletTest { - // Set up a helper so that the ApiProxy returns a valid environment for local testing. - private final LocalServiceTestHelper helper = new LocalServiceTestHelper(); - @Mock private HttpServletRequest mockRequest; @Mock private HttpServletResponse mockResponse; private StringWriter responseWriter; @@ -51,7 +45,6 @@ public class RequestsServletTest { @Before public void setUp() throws Exception { MockitoAnnotations.initMocks(this); - helper.setUp(); // Set up a fake HTTP response. responseWriter = new StringWriter(); @@ -59,11 +52,7 @@ public void setUp() throws Exception { servletUnderTest = new RequestsServlet(); } - - @After public void tearDown() { - helper.tearDown(); - } - + @Test public void doGet_writesResponse() throws Exception { servletUnderTest.doGet(mockRequest, mockResponse);