From e7e05caddc2cb8bb487c87ff6e6eee9da1b2880a Mon Sep 17 00:00:00 2001 From: Kurtis Van Gent Date: Fri, 12 Jan 2018 09:11:20 -0800 Subject: [PATCH 1/4] Updated CloudSQL samples. --- .../{postgres => cloudsql-postgres}/README.md | 2 +- .../{postgres => cloudsql-postgres}/pom.xml | 0 .../postgresql/PostgreSqlServlet.java | 56 +++++-------------- .../src/main/webapp/WEB-INF/appengine-web.xml | 0 .../src/main/webapp/WEB-INF/web.xml | 0 appengine-java8/cloudsql/pom.xml | 2 +- .../appengine/cloudsql/CloudSqlServlet.java | 37 +++++------- 7 files changed, 30 insertions(+), 67 deletions(-) rename appengine-java8/{postgres => cloudsql-postgres}/README.md (95%) rename appengine-java8/{postgres => cloudsql-postgres}/pom.xml (100%) rename appengine-java8/{postgres => cloudsql-postgres}/src/main/java/com/example/appengine/postgresql/PostgreSqlServlet.java (58%) rename appengine-java8/{postgres => cloudsql-postgres}/src/main/webapp/WEB-INF/appengine-web.xml (100%) rename appengine-java8/{postgres => cloudsql-postgres}/src/main/webapp/WEB-INF/web.xml (100%) diff --git a/appengine-java8/postgres/README.md b/appengine-java8/cloudsql-postgres/README.md similarity index 95% rename from appengine-java8/postgres/README.md rename to appengine-java8/cloudsql-postgres/README.md index a787ceeff18..82588983f11 100644 --- a/appengine-java8/postgres/README.md +++ b/appengine-java8/cloudsql-postgres/README.md @@ -1,6 +1,6 @@ # Postgre SQL sample for Google App Engine J8 - + Open in Cloud Shell This sample demonstrates how to use [PostgreSql](https://cloud.google.com/sql/) on Google App diff --git a/appengine-java8/postgres/pom.xml b/appengine-java8/cloudsql-postgres/pom.xml similarity index 100% rename from appengine-java8/postgres/pom.xml rename to appengine-java8/cloudsql-postgres/pom.xml diff --git a/appengine-java8/postgres/src/main/java/com/example/appengine/postgresql/PostgreSqlServlet.java b/appengine-java8/cloudsql-postgres/src/main/java/com/example/appengine/postgresql/PostgreSqlServlet.java similarity index 58% rename from appengine-java8/postgres/src/main/java/com/example/appengine/postgresql/PostgreSqlServlet.java rename to appengine-java8/cloudsql-postgres/src/main/java/com/example/appengine/postgresql/PostgreSqlServlet.java index ba2ac4442ff..d8a45e3e948 100644 --- a/appengine-java8/postgres/src/main/java/com/example/appengine/postgresql/PostgreSqlServlet.java +++ b/appengine-java8/cloudsql-postgres/src/main/java/com/example/appengine/postgresql/PostgreSqlServlet.java @@ -1,5 +1,5 @@ -/* - * Copyright 2016 Google Inc. +/** + * Copyright 2017 Google Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,12 +17,8 @@ package com.example.appengine.postgresql; import com.google.common.base.Stopwatch; - import java.io.IOException; import java.io.PrintWriter; -import java.net.Inet4Address; -import java.net.Inet6Address; -import java.net.InetAddress; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; @@ -31,7 +27,6 @@ import java.sql.Timestamp; import java.util.Date; import java.util.concurrent.TimeUnit; - import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; @@ -42,7 +37,7 @@ @SuppressWarnings("serial") // With @WebServlet annotation the webapp/WEB-INF/web.xml is no longer required. @WebServlet(name = "PostgreSQL", - description = "PostgreSQL: Write low order IP address to PostgreSQL", + description = "PostgreSQL: Write timestamps of visitors to PostgreSQL", urlPatterns = "/postgresql") public class PostgreSqlServlet extends HttpServlet { @@ -52,11 +47,11 @@ public class PostgreSqlServlet extends HttpServlet { public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException, ServletException { - final String createTableSql = "CREATE TABLE IF NOT EXISTS visits ( visit_id SERIAL NOT NULL, " - + "user_ip VARCHAR(46) NOT NULL, ts timestamp NOT NULL, " + final String createTableSql = "CREATE TABLE IF NOT EXISTS visits ( " + + "visit_id SERIAL NOT NULL, ts timestamp NOT NULL, " + "PRIMARY KEY (visit_id) );"; - final String createVisitSql = "INSERT INTO visits (user_ip, ts) VALUES (?, ?);"; - final String selectSql = "SELECT user_ip, ts FROM visits ORDER BY ts DESC " + final String createVisitSql = "INSERT INTO visits (ts) VALUES (?);"; + final String selectSql = "SELECT ts FROM visits ORDER BY ts DESC " + "LIMIT 10;"; String path = req.getRequestURI(); @@ -67,55 +62,34 @@ public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOExc PrintWriter out = resp.getWriter(); resp.setContentType("text/plain"); - // store only the first two octets of a users ip address - String userIp = req.getRemoteAddr(); - InetAddress address = InetAddress.getByName(userIp); - if (address instanceof Inet6Address) { - // nest indexOf calls to find the second occurrence of a character in a string - // an alternative is to use Apache Commons Lang: StringUtils.ordinalIndexOf() - userIp = userIp.substring(0, userIp.indexOf(":", userIp.indexOf(":") + 1)) + ":*:*:*:*:*:*"; - } else if (address instanceof Inet4Address) { - userIp = userIp.substring(0, userIp.indexOf(".", userIp.indexOf(".") + 1)) + ".*.*"; - } - Stopwatch stopwatch = Stopwatch.createStarted(); try (PreparedStatement statementCreateVisit = conn.prepareStatement(createVisitSql)) { conn.createStatement().executeUpdate(createTableSql); - statementCreateVisit.setString(1, userIp); - statementCreateVisit.setTimestamp(2, new Timestamp(new Date().getTime())); + statementCreateVisit.setTimestamp(1, new Timestamp(new Date().getTime())); statementCreateVisit.executeUpdate(); try (ResultSet rs = conn.prepareStatement(selectSql).executeQuery()) { stopwatch.stop(); out.print("Last 10 visits:\n"); while (rs.next()) { - String savedIp = rs.getString("user_ip"); String timeStamp = rs.getString("ts"); - out.println("Time: " + timeStamp + " Addr: " + savedIp); + out.println("Visited at time: " + timeStamp); } - out.println("Elapsed: " + stopwatch.elapsed(TimeUnit.MILLISECONDS)); } } catch (SQLException e) { throw new ServletException("SQL error", e); } + out.println("Query time (ms):" + stopwatch.elapsed(TimeUnit.MILLISECONDS)); } @Override public void init() throws ServletException { + String url = System.getProperty("postgresql"); + log("connecting to: " + url); try { - String url = System.getProperty("postgresql"); - log("connecting to: " + url); - try { - Class.forName("org.postgresql.Driver"); - conn = DriverManager.getConnection(url); - } catch (ClassNotFoundException e) { - throw new ServletException("Error loading JDBC Driver", e); - } catch (SQLException e) { - throw new ServletException("Unable to connect to PostGre", e); - } - - } finally { - // Nothing really to do here. + conn = DriverManager.getConnection(url); + } catch (SQLException e) { + throw new ServletException("Unable to connect to PostgreSQL", e); } } } diff --git a/appengine-java8/postgres/src/main/webapp/WEB-INF/appengine-web.xml b/appengine-java8/cloudsql-postgres/src/main/webapp/WEB-INF/appengine-web.xml similarity index 100% rename from appengine-java8/postgres/src/main/webapp/WEB-INF/appengine-web.xml rename to appengine-java8/cloudsql-postgres/src/main/webapp/WEB-INF/appengine-web.xml diff --git a/appengine-java8/postgres/src/main/webapp/WEB-INF/web.xml b/appengine-java8/cloudsql-postgres/src/main/webapp/WEB-INF/web.xml similarity index 100% rename from appengine-java8/postgres/src/main/webapp/WEB-INF/web.xml rename to appengine-java8/cloudsql-postgres/src/main/webapp/WEB-INF/web.xml diff --git a/appengine-java8/cloudsql/pom.xml b/appengine-java8/cloudsql/pom.xml index 4c613de18d7..0db0025810c 100644 --- a/appengine-java8/cloudsql/pom.xml +++ b/appengine-java8/cloudsql/pom.xml @@ -79,7 +79,7 @@ com.google.cloud.sql mysql-socket-factory - 1.0.4 + 1.0.5 diff --git a/appengine-java8/cloudsql/src/main/java/com/example/appengine/cloudsql/CloudSqlServlet.java b/appengine-java8/cloudsql/src/main/java/com/example/appengine/cloudsql/CloudSqlServlet.java index 5e30119ade7..09822cc0c65 100644 --- a/appengine-java8/cloudsql/src/main/java/com/example/appengine/cloudsql/CloudSqlServlet.java +++ b/appengine-java8/cloudsql/src/main/java/com/example/appengine/cloudsql/CloudSqlServlet.java @@ -44,7 +44,8 @@ // [START example] @SuppressWarnings("serial") // With @WebServlet annotation the webapp/WEB-INF/web.xml is no longer required. -@WebServlet(name = "CloudSQL", description = "CloudSQL: Write low order IP address to Cloud SQL", +@WebServlet(name = "CloudSQL", + description = "CloudSQL: Write timestamps of visitors to Cloud SQL", urlPatterns = "/cloudsql") public class CloudSqlServlet extends HttpServlet { Connection conn; @@ -52,12 +53,13 @@ public class CloudSqlServlet extends HttpServlet { @Override public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException, ServletException { - final String createTableSql = "CREATE TABLE IF NOT EXISTS visits ( visit_id INT NOT NULL " - + "AUTO_INCREMENT, user_ip VARCHAR(46) NOT NULL, timestamp DATETIME NOT NULL, " - + "PRIMARY KEY (visit_id) )"; - final String createVisitSql = "INSERT INTO visits (user_ip, timestamp) VALUES (?, ?)"; - final String selectSql = "SELECT user_ip, timestamp FROM visits ORDER BY timestamp DESC " - + "LIMIT 10"; + + final String createTableSql = "CREATE TABLE IF NOT EXISTS visits ( " + + "visit_id SERIAL NOT NULL, ts timestamp NOT NULL, " + + "PRIMARY KEY (visit_id) );"; + final String createVisitSql = "INSERT INTO visits (ts) VALUES (?);"; + final String selectSql = "SELECT ts FROM visits ORDER BY ts DESC " + + "LIMIT 10;"; String path = req.getRequestURI(); if (path.startsWith("/favicon.ico")) { @@ -67,37 +69,24 @@ public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOExc PrintWriter out = resp.getWriter(); resp.setContentType("text/plain"); - // store only the first two octets of a users ip address - String userIp = req.getRemoteAddr(); - InetAddress address = InetAddress.getByName(userIp); - if (address instanceof Inet6Address) { - // nest indexOf calls to find the second occurrence of a character in a string - // an alternative is to use Apache Commons Lang: StringUtils.ordinalIndexOf() - userIp = userIp.substring(0, userIp.indexOf(":", userIp.indexOf(":") + 1)) + ":*:*:*:*:*:*"; - } else if (address instanceof Inet4Address) { - userIp = userIp.substring(0, userIp.indexOf(".", userIp.indexOf(".") + 1)) + ".*.*"; - } - Stopwatch stopwatch = Stopwatch.createStarted(); try (PreparedStatement statementCreateVisit = conn.prepareStatement(createVisitSql)) { conn.createStatement().executeUpdate(createTableSql); - statementCreateVisit.setString(1, userIp); - statementCreateVisit.setTimestamp(2, new Timestamp(new Date().getTime())); + statementCreateVisit.setTimestamp(1, new Timestamp(new Date().getTime())); statementCreateVisit.executeUpdate(); try (ResultSet rs = conn.prepareStatement(selectSql).executeQuery()) { stopwatch.stop(); out.print("Last 10 visits:\n"); while (rs.next()) { - String savedIp = rs.getString("user_ip"); - String timeStamp = rs.getString("timestamp"); - out.print("Time: " + timeStamp + " Addr: " + savedIp + "\n"); + String timeStamp = rs.getString("ts"); + out.println("Visited at time: " + timeStamp); } - out.println("Elapsed: " + stopwatch.elapsed(TimeUnit.MILLISECONDS)); } } catch (SQLException e) { throw new ServletException("SQL error", e); } + out.println("Query time (ms):" + stopwatch.elapsed(TimeUnit.MILLISECONDS)); } @Override From 6af362a91a61f13f25e177b46d7a821e29fbc892 Mon Sep 17 00:00:00 2001 From: Kurtis Van Gent Date: Fri, 12 Jan 2018 09:22:20 -0800 Subject: [PATCH 2/4] Updated pom.xml for new postgres location. --- appengine-java8/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/appengine-java8/pom.xml b/appengine-java8/pom.xml index f626dc0da1b..3b3b23e92d4 100644 --- a/appengine-java8/pom.xml +++ b/appengine-java8/pom.xml @@ -41,6 +41,7 @@ appidentity bigtable cloudsql + cloudsql-postgres datastore datastore-indexes datastore-indexes-exploding @@ -62,7 +63,6 @@ metadata multitenancy oauth2 - postgres pubsub requests remote-client From 34b8fe2ce839d533f256399aa07e62b6b0a94504 Mon Sep 17 00:00:00 2001 From: Kurtis Van Gent Date: Fri, 12 Jan 2018 10:12:21 -0800 Subject: [PATCH 3/4] Address feedback. --- appengine-java8/cloudsql-postgres/pom.xml | 1 - .../com/example/appengine/postgresql/PostgreSqlServlet.java | 4 ++-- appengine-java8/cloudsql/pom.xml | 3 +-- 3 files changed, 3 insertions(+), 5 deletions(-) diff --git a/appengine-java8/cloudsql-postgres/pom.xml b/appengine-java8/cloudsql-postgres/pom.xml index 40d16e2af3a..b9a0eaea38a 100644 --- a/appengine-java8/cloudsql-postgres/pom.xml +++ b/appengine-java8/cloudsql-postgres/pom.xml @@ -48,7 +48,6 @@ - com.google.appengine appengine-api-1.0-sdk diff --git a/appengine-java8/cloudsql-postgres/src/main/java/com/example/appengine/postgresql/PostgreSqlServlet.java b/appengine-java8/cloudsql-postgres/src/main/java/com/example/appengine/postgresql/PostgreSqlServlet.java index d8a45e3e948..430c0894c76 100644 --- a/appengine-java8/cloudsql-postgres/src/main/java/com/example/appengine/postgresql/PostgreSqlServlet.java +++ b/appengine-java8/cloudsql-postgres/src/main/java/com/example/appengine/postgresql/PostgreSqlServlet.java @@ -1,5 +1,5 @@ -/** - * Copyright 2017 Google Inc. +/* + * Copyright 2016 Google Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/appengine-java8/cloudsql/pom.xml b/appengine-java8/cloudsql/pom.xml index 0db0025810c..b437dfc86ac 100644 --- a/appengine-java8/cloudsql/pom.xml +++ b/appengine-java8/cloudsql/pom.xml @@ -48,7 +48,6 @@ - com.google.appengine appengine-api-1.0-sdk @@ -78,7 +77,7 @@ com.google.cloud.sql - mysql-socket-factory + mysql-socket-factory 1.0.5 From fa26ee659ddf2373ff79616ca5e350e21e6df015 Mon Sep 17 00:00:00 2001 From: Kurtis Van Gent Date: Fri, 12 Jan 2018 13:58:19 -0800 Subject: [PATCH 4/4] Update comment. --- appengine-java8/cloudsql/pom.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/appengine-java8/cloudsql/pom.xml b/appengine-java8/cloudsql/pom.xml index b437dfc86ac..ccca59c0ed2 100644 --- a/appengine-java8/cloudsql/pom.xml +++ b/appengine-java8/cloudsql/pom.xml @@ -77,6 +77,7 @@ com.google.cloud.sql + mysql-socket-factory 1.0.5