From 6ba300b14580513a4c0a209e548e72679d8d59d3 Mon Sep 17 00:00:00 2001 From: Laurie White Date: Fri, 15 Apr 2016 14:20:40 -0700 Subject: [PATCH 1/4] Moved Users samples to Github --- appengine/users/README.md | 33 +++++ appengine/users/pom.xml | 118 ++++++++++++++++++ .../example/appengine/users/UsersServlet.java | 48 +++++++ .../users/src/main/webapp/WEB-INF/web.xml | 14 +++ .../users/src/main/webapp/appengine-web.xml | 7 ++ appengine/users/src/main/webapp/web.xml | 14 +++ .../appengine/users/UsersServletTest.java | 108 ++++++++++++++++ 7 files changed, 342 insertions(+) create mode 100644 appengine/users/README.md create mode 100644 appengine/users/pom.xml create mode 100644 appengine/users/src/main/java/com/example/appengine/users/UsersServlet.java create mode 100644 appengine/users/src/main/webapp/WEB-INF/web.xml create mode 100644 appengine/users/src/main/webapp/appengine-web.xml create mode 100644 appengine/users/src/main/webapp/web.xml create mode 100644 appengine/users/src/test/java/com/example/appengine/users/UsersServletTest.java diff --git a/appengine/users/README.md b/appengine/users/README.md new file mode 100644 index 00000000000..a6fe21c89c2 --- /dev/null +++ b/appengine/users/README.md @@ -0,0 +1,33 @@ +# Users Authentication sample for Google App Engine + +This sample demonstrates how to use the [Users API][appid] on [Google App +Engine][ae-docs]. + +[appid]: https://cloud.google.com/appengine/docs/java/users/ +[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 gcloud:run + +## Deploying +In the following command, replace YOUR-PROJECT-ID with your +[Google Cloud Project ID](https://developers.google.com/console/help/new/#projectnumber). + + $ mvn gcloud:deploy -Dgcloud.gcloud_project=YOUR-PROJECT-ID + +## Setup +To save your project settings so that you don't need to enter the +`-Dgcloud.gcloud_project=YOUR-CLOUD-PROJECT-ID` parameters, you can: + +1. Update the tag in src/main/webapp/WEB-INF/appengine-web.xml + with your project name. + +You will now be able to run + + $ mvn gcloud:deploy + +without the need for any additional parameters. diff --git a/appengine/users/pom.xml b/appengine/users/pom.xml new file mode 100644 index 00000000000..b466cda42f8 --- /dev/null +++ b/appengine/users/pom.xml @@ -0,0 +1,118 @@ + + + + 4.0.0 + war + 1.0-SNAPSHOT + com.example.appengine + appengine-users + + + com.google.cloud + doc-samples + 1.0.0 + ../.. + + + + com.google.appengine + appengine-api-1.0-sdk + ${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 + + + com.google.appengine + gcloud-maven-plugin + 2.0.9.101.v20160316 + + + 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/users/src/main/java/com/example/appengine/users/UsersServlet.java b/appengine/users/src/main/java/com/example/appengine/users/UsersServlet.java new file mode 100644 index 00000000000..edf8f4fd52f --- /dev/null +++ b/appengine/users/src/main/java/com/example/appengine/users/UsersServlet.java @@ -0,0 +1,48 @@ +/* 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. + */ +// [START users_API_example] +package com.example.appengine.users; + +import java.io.IOException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import com.google.appengine.api.users.UserService; +import com.google.appengine.api.users.UserServiceFactory; + +public class UsersServlet extends HttpServlet { + @Override + public void doGet(HttpServletRequest req, HttpServletResponse resp) + throws IOException { + UserService userService = UserServiceFactory.getUserService(); + + String thisURL = req.getRequestURI(); + + resp.setContentType("text/html"); + if (req.getUserPrincipal() != null) { + resp.getWriter().println("

Hello, " + + req.getUserPrincipal().getName() + + "! You can sign out.

"); + } else { + resp.getWriter().println("

Please sign in.

"); + } + } +} +// [END users_API_example] + diff --git a/appengine/users/src/main/webapp/WEB-INF/web.xml b/appengine/users/src/main/webapp/WEB-INF/web.xml new file mode 100644 index 00000000000..4078e688ea4 --- /dev/null +++ b/appengine/users/src/main/webapp/WEB-INF/web.xml @@ -0,0 +1,14 @@ + + + + users + com.example.appengine.users.MyServlet + + + users + / + + diff --git a/appengine/users/src/main/webapp/appengine-web.xml b/appengine/users/src/main/webapp/appengine-web.xml new file mode 100644 index 00000000000..c3df08fec7d --- /dev/null +++ b/appengine/users/src/main/webapp/appengine-web.xml @@ -0,0 +1,7 @@ + + + YOUR-PROJECT-ID + YOUR-VERSION-ID + true + true + diff --git a/appengine/users/src/main/webapp/web.xml b/appengine/users/src/main/webapp/web.xml new file mode 100644 index 00000000000..4078e688ea4 --- /dev/null +++ b/appengine/users/src/main/webapp/web.xml @@ -0,0 +1,14 @@ + + + + users + com.example.appengine.users.MyServlet + + + users + / + + diff --git a/appengine/users/src/test/java/com/example/appengine/users/UsersServletTest.java b/appengine/users/src/test/java/com/example/appengine/users/UsersServletTest.java new file mode 100644 index 00000000000..752ff314485 --- /dev/null +++ b/appengine/users/src/test/java/com/example/appengine/users/UsersServletTest.java @@ -0,0 +1,108 @@ +/* + * Copyright 2015 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.users; + +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; +import javax.management.remote.JMXPrincipal; + +/** + * Unit tests for {@link UsersServlet}. + */ +@RunWith(JUnit4.class) +public class UsersServletTest { + private final String fakeURL = "fakey.fake.fak"; + private final String FAKE_NAME = "Fake"; + // Set up a helper so that the ApiProxy returns a valid environment for local testing. + private final LocalServiceTestHelper helper = new LocalServiceTestHelper(); + + @Mock private HttpServletRequest mockRequestNotLoggedIn; + @Mock private HttpServletRequest mockRequestLoggedIn; + @Mock private HttpServletResponse mockResponse; + private StringWriter responseWriter; + private UsersServlet servletUnderTest; + + @Before + public void setUp() throws Exception { + MockitoAnnotations.initMocks(this); + helper.setUp(); + + // Set up some fake HTTP requests + // If the user isn't logged in, use this request + when (mockRequestNotLoggedIn.getRequestURI()).thenReturn(fakeURL); + when (mockRequestNotLoggedIn.getUserPrincipal()).thenReturn(null); + + // If the user is logged in, use this request + when (mockRequestLoggedIn.getRequestURI()).thenReturn(fakeURL); + // Most of the classes that implement Principal have been + // deprecated. JMXPrincipal seems like a safe choice. + when (mockRequestLoggedIn.getUserPrincipal()).thenReturn(new JMXPrincipal(FAKE_NAME)); + + // Set up a fake HTTP response. + responseWriter = new StringWriter(); + when(mockResponse.getWriter()).thenReturn(new PrintWriter(responseWriter)); + + servletUnderTest = new UsersServlet(); + } + + @After public void tearDown() { + helper.tearDown(); + } + + @Test + public void doGet_userNotLoggedIn_writesResponse() throws Exception { + servletUnderTest.doGet(mockRequestNotLoggedIn, mockResponse); + + // If a user isn't logged in, we expect a prompt + // to login to be returned. + assertThat(responseWriter.toString()) + .named("UsersServlet response") + .contains("

Please .

"); + } + @Test + public void doGet_userLoggedIn_writesResponse() throws Exception { + servletUnderTest.doGet(mockRequestLoggedIn, mockResponse); + + // If a user is logged in, we expect a prompt + // to logout to be returned. + assertThat(responseWriter.toString()) + .named("UsersServlet response") + .contains("

Hello, " + FAKE_NAME + "!"); + assertThat(responseWriter.toString()) + .named("UsersServlet response") + .contains("sign out"); + } +} From f5c1b4d902cedfb9735b706f59cfe317ca033d92 Mon Sep 17 00:00:00 2001 From: Laurie White Date: Tue, 19 Apr 2016 09:43:49 -0700 Subject: [PATCH 2/4] Fixed style and README.md. --- appengine/users/README.md | 12 +++-- appengine/users/pom.xml | 10 ++--- .../example/appengine/users/UsersServlet.java | 45 ++++++++++--------- .../webapp/{ => WEB-INF}/appengine-web.xml | 1 - .../users/src/main/webapp/WEB-INF/web.xml | 2 +- appengine/users/src/main/webapp/web.xml | 14 ------ .../appengine/users/UsersServletTest.java | 17 +++---- 7 files changed, 47 insertions(+), 54 deletions(-) rename appengine/users/src/main/webapp/{ => WEB-INF}/appengine-web.xml (93%) delete mode 100644 appengine/users/src/main/webapp/web.xml diff --git a/appengine/users/README.md b/appengine/users/README.md index a6fe21c89c2..4d6d60a6a02 100644 --- a/appengine/users/README.md +++ b/appengine/users/README.md @@ -11,23 +11,27 @@ This example uses the [Maven gcloud plugin](https://cloud.google.com/appengine/docs/java/managed-vms/maven). To run this sample locally: - $ mvn gcloud:run + $ mvn appengine:devserver ## Deploying In the following command, replace YOUR-PROJECT-ID with your [Google Cloud Project ID](https://developers.google.com/console/help/new/#projectnumber). - $ mvn gcloud:deploy -Dgcloud.gcloud_project=YOUR-PROJECT-ID + $ 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 -`-Dgcloud.gcloud_project=YOUR-CLOUD-PROJECT-ID` parameters, you can: + 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 gcloud:deploy + $ mvn appengine:update without the need for any additional parameters. diff --git a/appengine/users/pom.xml b/appengine/users/pom.xml index b466cda42f8..c81b522746b 100644 --- a/appengine/users/pom.xml +++ b/appengine/users/pom.xml @@ -30,11 +30,11 @@ Copyright 2015 Google Inc. All Rights Reserved. - com.google.appengine - appengine-api-1.0-sdk - ${appengine.sdk.version} - - + com.google.appengine + appengine-maven-plugin + ${appengine.sdk.version} + + com.google.guava guava 19.0 diff --git a/appengine/users/src/main/java/com/example/appengine/users/UsersServlet.java b/appengine/users/src/main/java/com/example/appengine/users/UsersServlet.java index edf8f4fd52f..cd976a1820c 100644 --- a/appengine/users/src/main/java/com/example/appengine/users/UsersServlet.java +++ b/appengine/users/src/main/java/com/example/appengine/users/UsersServlet.java @@ -12,37 +12,40 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + // [START users_API_example] package com.example.appengine.users; +import com.google.appengine.api.users.UserService; +import com.google.appengine.api.users.UserServiceFactory; + import java.io.IOException; + import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -import com.google.appengine.api.users.UserService; -import com.google.appengine.api.users.UserServiceFactory; public class UsersServlet extends HttpServlet { - @Override - public void doGet(HttpServletRequest req, HttpServletResponse resp) - throws IOException { - UserService userService = UserServiceFactory.getUserService(); - - String thisURL = req.getRequestURI(); - - resp.setContentType("text/html"); - if (req.getUserPrincipal() != null) { - resp.getWriter().println("

Hello, " + - req.getUserPrincipal().getName() + - "! You can sign out.

"); - } else { - resp.getWriter().println("

Please sign in.

"); - } + @Override + public void doGet(HttpServletRequest req, HttpServletResponse resp) + throws IOException { + UserService userService = UserServiceFactory.getUserService(); + + String thisUrl = req.getRequestURI(); + + resp.setContentType("text/html"); + if (req.getUserPrincipal() != null) { + resp.getWriter().println("

Hello, " + + req.getUserPrincipal().getName() + + "! You can sign out.

"); + } else { + resp.getWriter().println("

Please sign in.

"); } + } } // [END users_API_example] diff --git a/appengine/users/src/main/webapp/appengine-web.xml b/appengine/users/src/main/webapp/WEB-INF/appengine-web.xml similarity index 93% rename from appengine/users/src/main/webapp/appengine-web.xml rename to appengine/users/src/main/webapp/WEB-INF/appengine-web.xml index c3df08fec7d..c9e245399bf 100644 --- a/appengine/users/src/main/webapp/appengine-web.xml +++ b/appengine/users/src/main/webapp/WEB-INF/appengine-web.xml @@ -3,5 +3,4 @@ YOUR-PROJECT-ID YOUR-VERSION-ID true - true diff --git a/appengine/users/src/main/webapp/WEB-INF/web.xml b/appengine/users/src/main/webapp/WEB-INF/web.xml index 4078e688ea4..4b2b77234dc 100644 --- a/appengine/users/src/main/webapp/WEB-INF/web.xml +++ b/appengine/users/src/main/webapp/WEB-INF/web.xml @@ -5,7 +5,7 @@ version="2.5"> users - com.example.appengine.users.MyServlet + com.example.appengine.users.UsersServlet users diff --git a/appengine/users/src/main/webapp/web.xml b/appengine/users/src/main/webapp/web.xml deleted file mode 100644 index 4078e688ea4..00000000000 --- a/appengine/users/src/main/webapp/web.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - users - com.example.appengine.users.MyServlet - - - users - / - - diff --git a/appengine/users/src/test/java/com/example/appengine/users/UsersServletTest.java b/appengine/users/src/test/java/com/example/appengine/users/UsersServletTest.java index 752ff314485..b710ae737d0 100644 --- a/appengine/users/src/test/java/com/example/appengine/users/UsersServletTest.java +++ b/appengine/users/src/test/java/com/example/appengine/users/UsersServletTest.java @@ -32,17 +32,17 @@ import java.io.PrintWriter; import java.io.StringWriter; +import javax.management.remote.JMXPrincipal; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -import javax.management.remote.JMXPrincipal; /** * Unit tests for {@link UsersServlet}. */ @RunWith(JUnit4.class) public class UsersServletTest { - private final String fakeURL = "fakey.fake.fak"; - private final String FAKE_NAME = "Fake"; + private static final String FAKE_URL = "fakey.fake.fak"; + private static final String FAKE_NAME = "Fake"; // Set up a helper so that the ApiProxy returns a valid environment for local testing. private final LocalServiceTestHelper helper = new LocalServiceTestHelper(); @@ -59,14 +59,14 @@ public void setUp() throws Exception { // Set up some fake HTTP requests // If the user isn't logged in, use this request - when (mockRequestNotLoggedIn.getRequestURI()).thenReturn(fakeURL); - when (mockRequestNotLoggedIn.getUserPrincipal()).thenReturn(null); + when(mockRequestNotLoggedIn.getRequestURI()).thenReturn(FAKE_URL); + when(mockRequestNotLoggedIn.getUserPrincipal()).thenReturn(null); // If the user is logged in, use this request - when (mockRequestLoggedIn.getRequestURI()).thenReturn(fakeURL); + when(mockRequestLoggedIn.getRequestURI()).thenReturn(FAKE_URL); // Most of the classes that implement Principal have been // deprecated. JMXPrincipal seems like a safe choice. - when (mockRequestLoggedIn.getUserPrincipal()).thenReturn(new JMXPrincipal(FAKE_NAME)); + when(mockRequestLoggedIn.getUserPrincipal()).thenReturn(new JMXPrincipal(FAKE_NAME)); // Set up a fake HTTP response. responseWriter = new StringWriter(); @@ -92,7 +92,8 @@ public void doGet_userNotLoggedIn_writesResponse() throws Exception { .named("UsersServlet response") .contains("sign in.

"); } - @Test + + @Test public void doGet_userLoggedIn_writesResponse() throws Exception { servletUnderTest.doGet(mockRequestLoggedIn, mockResponse); From fe0aad8597c4f5e6f93baa618f00f276c09f2f9c Mon Sep 17 00:00:00 2001 From: Laurie White Date: Tue, 19 Apr 2016 10:13:11 -0700 Subject: [PATCH 3/4] Found and removed one last gcloud reference --- appengine/users/pom.xml | 5 ----- 1 file changed, 5 deletions(-) diff --git a/appengine/users/pom.xml b/appengine/users/pom.xml index c81b522746b..415bdcd793b 100644 --- a/appengine/users/pom.xml +++ b/appengine/users/pom.xml @@ -94,11 +94,6 @@ Copyright 2015 Google Inc. All Rights Reserved. ${project.build.directory}/${project.build.finalName}/WEB-INF/classes - - com.google.appengine - gcloud-maven-plugin - 2.0.9.101.v20160316 - org.apache.maven.plugins 3.3 From 46e05f15933048d1b4bd82028e71777c371924cb Mon Sep 17 00:00:00 2001 From: Laurie White Date: Tue, 19 Apr 2016 11:11:36 -0700 Subject: [PATCH 4/4] Updated pom.xml of java-docs-samples to add this sample --- pom.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/pom.xml b/pom.xml index d35d36bc8a0..cb178bd6ae5 100644 --- a/pom.xml +++ b/pom.xml @@ -53,6 +53,7 @@ appengine/static-files appengine/twilio appengine/urlfetch + appengine/users bigquery datastore logging