From a32aaa1e0237ab0ba47d654383d6ba1ea2dcd7c6 Mon Sep 17 00:00:00 2001 From: Arun Jacob Date: Tue, 2 Jun 2015 13:02:42 -0700 Subject: [PATCH 1/2] changed to work with MYSQL_URL variable as well --- .../java/org/hp/samples/MysqlServlet.java | 126 ++++++++++++------ target/maven-archiver/pom.properties | 5 - target/mysql-java-1.0.war | Bin 927209 -> 927834 bytes 3 files changed, 87 insertions(+), 44 deletions(-) delete mode 100644 target/maven-archiver/pom.properties diff --git a/src/main/java/org/hp/samples/MysqlServlet.java b/src/main/java/org/hp/samples/MysqlServlet.java index dccc13b..8bed93e 100644 --- a/src/main/java/org/hp/samples/MysqlServlet.java +++ b/src/main/java/org/hp/samples/MysqlServlet.java @@ -23,6 +23,7 @@ of this software and associated documentation files (the "Software"), to deal import java.io.IOException; import java.io.PrintWriter; +import java.net.URI; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; @@ -36,6 +37,7 @@ of this software and associated documentation files (the "Software"), to deal import java.sql.Connection; import java.sql.ResultSet; import java.sql.ResultSetMetaData; +import java.sql.SQLException; import java.sql.Statement; import java.sql.DriverManager; @@ -43,6 +45,7 @@ public class MysqlServlet extends HttpServlet { private static final long serialVersionUID = 1L; + protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/plain"); @@ -50,9 +53,47 @@ protected void doGet(HttpServletRequest request, PrintWriter writer = response.getWriter(); writer.println("MySQL with Java \n"); - String vcap_services = System.getenv("VCAP_SERVICES"); - + + Connection dbConnection = null; + + writer.println("Connecting to MySQL using MYSQL environment variable..."); + String mysql_url = System.getenv("MYSQL_URL"); + + + if (mysql_url != null && mysql_url.length() > 0) { + try { + URI dbUri = new URI(System.getenv("MYSQL_URL")); + + String user = dbUri.getUserInfo().split(":")[0]; + String password = dbUri.getUserInfo().split(":")[1]; + int port = dbUri.getPort(); + if( port == -1) { + port = 3306; + } + + String dbUrl = "jdbc:mysql://" + dbUri.getHost() + ':' + port + dbUri.getPath(); + + // Connect to MySQL + + + Class.forName("com.mysql.jdbc.Driver"); + dbConnection = DriverManager.getConnection(dbUrl, user, password); + executeDbCheck(writer, dbConnection); + dbConnection.close(); + } + catch (Exception e) { + System.out.println("Caught error: "); + e.printStackTrace(); + } + + } else { + writer.println("Unable to connect using MYSQL_URL environment variable. Please ensure that it has been set."); + } + + + writer.println("Connecting to MySQL using mysql settings in VCAP_SERVICES environment variable..."); + String vcap_services = System.getenv("VCAP_SERVICES"); if (vcap_services != null && vcap_services.length() > 0) { try { @@ -74,53 +115,60 @@ protected void doGet(HttpServletRequest request, String dbUrl = "jdbc:mysql://" + hostname + ":" + port + "/" + dbname; - // Connect to MySQL - writer.println("Connecting to MySQL..."); + Class.forName("com.mysql.jdbc.Driver"); dbConnection = DriverManager.getConnection(dbUrl, user, password); + + executeDbCheck(writer, dbConnection); + dbConnection.close(); } catch (Exception e) { System.out.println("Caught error: "); e.printStackTrace(); } + } else { + writer.println("Unable to connect to MySQL using VCAP_SERVICES environment variable. Please ensure that VCAP_SERVICES and mysql information is correctly configured as shown at http://docs.hpcloud.com/als/v1/user/services/data-services/#vcap-services-jumplink-span, it is required to connect to the MySQL database."); } - try { - if (dbConnection != null && !dbConnection.isClosed()) { - writer.println("Connected to MySQL!"); - - // creating a database table and populating some values - Statement statement = dbConnection.createStatement(); - - ResultSet rs = statement.executeQuery("SELECT \"Hello World!\""); - writer.println("Executed query \"SELECT \"Hello World!\"\"."); - - ResultSetMetaData rsmd = rs.getMetaData(); - int columnsNumber = rsmd.getColumnCount(); - - while (rs.next()) { - for (int i = 1; i <= columnsNumber; i++) { - if (i > 1) System.out.print(", "); - String columnValue = rs.getString(i); - - // Since we are selecting a string literal, the column - // value and column name are both the same. The values - // could be retrieved with the line commented out below. - //writer.println("Column value: " + columnValue + " column name " + rsmd.getColumnName(i)); - - writer.println("Result: " + columnValue); - } + writer.close(); + } + + /** + * simple database sanity check. + * @param writer + * @param dbConnection + * @throws SQLException + */ + public void executeDbCheck(PrintWriter writer, Connection dbConnection) throws SQLException { + if (dbConnection != null && !dbConnection.isClosed()) { + writer.println("Connected to MySQL!"); + + // creating a database table and populating some values + Statement statement = dbConnection.createStatement(); + + ResultSet rs = statement.executeQuery("SELECT \"Hello World!\""); + writer.println("Executed query \"SELECT \"Hello World!\"\"."); + + ResultSetMetaData rsmd = rs.getMetaData(); + int columnsNumber = rsmd.getColumnCount(); + + while (rs.next()) { + for (int i = 1; i <= columnsNumber; i++) { + if (i > 1) System.out.print(", "); + String columnValue = rs.getString(i); + + // Since we are selecting a string literal, the column + // value and column name are both the same. The values + // could be retrieved with the line commented out below. + //writer.println("Column value: " + columnValue + " column name " + rsmd.getColumnName(i)); + + writer.println("Result: " + columnValue); } - - statement.close(); - } else { - writer.println("Failed to connect to MySQL"); } - } - catch (Exception e) { - writer.println("Exception caught while executing DB queries."); - } - writer.close(); - } + statement.close(); + } else { + writer.println("Failed to connect to MySQL"); + } + } } diff --git a/target/maven-archiver/pom.properties b/target/maven-archiver/pom.properties deleted file mode 100644 index c779c1a..0000000 --- a/target/maven-archiver/pom.properties +++ /dev/null @@ -1,5 +0,0 @@ -#Generated by Maven -#Thu May 28 21:16:43 PDT 2015 -version=1.0 -groupId=org.hp.samples -artifactId=mysql-java diff --git a/target/mysql-java-1.0.war b/target/mysql-java-1.0.war index 20cea636ebcd234e36baa770115094bf16befed3..b24c80e247779f984d0f568be65fed46338767d4 100644 GIT binary patch delta 3542 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 SqY}!*A!$H}^`a!e$o>mrdQj*9 delta 2898 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 From c9cb218f88b84630a8008ec7fd091c9c9bf35646 Mon Sep 17 00:00:00 2001 From: Arun Jacob Date: Tue, 2 Jun 2015 13:06:58 -0700 Subject: [PATCH 2/2] updating generated war --- target/mysql-java-1.0.war | Bin 927834 -> 927852 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/target/mysql-java-1.0.war b/target/mysql-java-1.0.war index b24c80e247779f984d0f568be65fed46338767d4..abec46d7052e5263935bbfb92b7a2eedaafeb39d 100644 GIT binary patch delta 3377 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 G-T5C4;Uqo) delta 3331 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 Xrw_`-=wG>rx0C?{SpCHT+QNST^uHVq