Browse Source

Merge pull request #2563 from stevehu/master

Add a new microservices framework light-java
Mike Smith 8 years ago
parent
commit
1a46683bf4
55 changed files with 2668 additions and 0 deletions
  1. 1 0
      .travis.yml
  2. 21 0
      frameworks/Java/light-java/README.md
  3. 69 0
      frameworks/Java/light-java/benchmark_config.json
  4. 166 0
      frameworks/Java/light-java/dependency-reduced-pom.xml
  5. 28 0
      frameworks/Java/light-java/docker-compose.yml
  6. 376 0
      frameworks/Java/light-java/pom.xml
  7. 7 0
      frameworks/Java/light-java/setup.sh
  8. 5 0
      frameworks/Java/light-java/setup_mysql.sh
  9. 5 0
      frameworks/Java/light-java/setup_postgresql.sh
  10. 0 0
      frameworks/Java/light-java/source_code
  11. 61 0
      frameworks/Java/light-java/src/main/java/com/networknt/techempower/Helper.java
  12. 28 0
      frameworks/Java/light-java/src/main/java/com/networknt/techempower/PathHandlerProvider.java
  13. 105 0
      frameworks/Java/light-java/src/main/java/com/networknt/techempower/db/mysql/MysqlConfig.java
  14. 33 0
      frameworks/Java/light-java/src/main/java/com/networknt/techempower/db/mysql/MysqlStartupHookProvider.java
  15. 59 0
      frameworks/Java/light-java/src/main/java/com/networknt/techempower/db/postgres/PostgresConfig.java
  16. 28 0
      frameworks/Java/light-java/src/main/java/com/networknt/techempower/db/postgres/PostgresStartupHookProvider.java
  17. 125 0
      frameworks/Java/light-java/src/main/java/com/networknt/techempower/handler/DbMysqlGetHandler.java
  18. 55 0
      frameworks/Java/light-java/src/main/java/com/networknt/techempower/handler/DbPostgresqlGetHandler.java
  19. 55 0
      frameworks/Java/light-java/src/main/java/com/networknt/techempower/handler/FortunesMysqlGetHandler.java
  20. 56 0
      frameworks/Java/light-java/src/main/java/com/networknt/techempower/handler/FortunesPostgresqlGetHandler.java
  21. 43 0
      frameworks/Java/light-java/src/main/java/com/networknt/techempower/handler/JsonGetHandler.java
  22. 22 0
      frameworks/Java/light-java/src/main/java/com/networknt/techempower/handler/PlaintextGetHandler.java
  23. 82 0
      frameworks/Java/light-java/src/main/java/com/networknt/techempower/handler/QueriesMysqlGetHandler.java
  24. 83 0
      frameworks/Java/light-java/src/main/java/com/networknt/techempower/handler/QueriesPostgresqlGetHandler.java
  25. 79 0
      frameworks/Java/light-java/src/main/java/com/networknt/techempower/handler/UpdatesMysqlGetHandler.java
  26. 80 0
      frameworks/Java/light-java/src/main/java/com/networknt/techempower/handler/UpdatesPostgresqlGetHandler.java
  27. 25 0
      frameworks/Java/light-java/src/main/java/com/networknt/techempower/model/Fortune.java
  28. 35 0
      frameworks/Java/light-java/src/main/java/com/networknt/techempower/model/World.java
  29. 24 0
      frameworks/Java/light-java/src/main/resources/META-INF/services/com.networknt.handler.MiddlewareHandler
  30. 1 0
      frameworks/Java/light-java/src/main/resources/META-INF/services/com.networknt.server.HandlerProvider
  31. 3 0
      frameworks/Java/light-java/src/main/resources/META-INF/services/com.networknt.server.ShutdownHookProvider
  32. 9 0
      frameworks/Java/light-java/src/main/resources/META-INF/services/com.networknt.server.StartupHookProvider
  33. 12 0
      frameworks/Java/light-java/src/main/resources/config/mysql.json
  34. 19 0
      frameworks/Java/light-java/src/main/resources/config/oauth/primary.crt
  35. 19 0
      frameworks/Java/light-java/src/main/resources/config/oauth/secondary.crt
  36. 7 0
      frameworks/Java/light-java/src/main/resources/config/postgres.json
  37. 15 0
      frameworks/Java/light-java/src/main/resources/config/security.json
  38. 16 0
      frameworks/Java/light-java/src/main/resources/config/server.json
  39. 176 0
      frameworks/Java/light-java/src/main/resources/config/swagger.json
  40. BIN
      frameworks/Java/light-java/src/main/resources/config/tls/server.keystore
  41. BIN
      frameworks/Java/light-java/src/main/resources/config/tls/server.truststore
  42. 20 0
      frameworks/Java/light-java/src/main/resources/fortunes.mustache
  43. 74 0
      frameworks/Java/light-java/src/main/resources/logback.xml
  44. 43 0
      frameworks/Java/light-java/src/test/java/com/networknt/techempower/handler/DbMysqlGetHandlerTest.java
  45. 43 0
      frameworks/Java/light-java/src/test/java/com/networknt/techempower/handler/DbPostgresqlGetHandlerTest.java
  46. 43 0
      frameworks/Java/light-java/src/test/java/com/networknt/techempower/handler/FortunesMysqlGetHandlerTest.java
  47. 43 0
      frameworks/Java/light-java/src/test/java/com/networknt/techempower/handler/FortunesPostgresqlGetHandlerTest.java
  48. 43 0
      frameworks/Java/light-java/src/test/java/com/networknt/techempower/handler/JsonGetHandlerTest.java
  49. 43 0
      frameworks/Java/light-java/src/test/java/com/networknt/techempower/handler/PlaintextGetHandlerTest.java
  50. 43 0
      frameworks/Java/light-java/src/test/java/com/networknt/techempower/handler/QueriesMysqlGetHandlerTest.java
  51. 43 0
      frameworks/Java/light-java/src/test/java/com/networknt/techempower/handler/QueriesPostgresqlGetHandlerTest.java
  52. 44 0
      frameworks/Java/light-java/src/test/java/com/networknt/techempower/handler/TestServer.java
  53. 43 0
      frameworks/Java/light-java/src/test/java/com/networknt/techempower/handler/UpdatesMysqlGetHandlerTest.java
  54. 36 0
      frameworks/Java/light-java/src/test/java/com/networknt/techempower/handler/UpdatesPostgresqlGetHandlerTest.java
  55. 74 0
      frameworks/Java/light-java/src/test/resources/logback-test.xml

+ 1 - 0
.travis.yml

@@ -83,6 +83,7 @@ env:
     - "TESTDIR=Java/jetty"
     - "TESTDIR=Java/jlhttp"
     - "TESTDIR=Java/jooby"
+    - "TESTDIR=Java/light-java"
     - "TESTDIR=Java/netty"
     - "TESTDIR=Java/ninja-standalone"
     - "TESTDIR=Java/officefloor"

+ 21 - 0
frameworks/Java/light-java/README.md

@@ -0,0 +1,21 @@
+# Light-Java Benchmarking Test
+
+This is the light-java portion of a [benchmarking test suite](../) comparing a variety of web development platforms.
+
+### JSON Encoding Test
+* [JSON test source](src/main/java/hello/HelloWebServer.java)
+
+## Versions
+Light-Java 1.2.3 (https://github.com/networknt/light-java)
+
+## Test URLs
+
+### JSON Encoding Test
+
+    http://localhost:8080
+### Local build database
+
+start database at light-java folder
+
+docker run -it -p 5432:5432 -v $PWD/src/main/resources/script/postgres:/docker-entrypoint-initdb.d --env POSTGRES_PASSWORD=benchmarkdbpass --env POSTGRES_DB=hello_world postgres:9.6.0
+docker run -it -p 3306:3306 -v $PWD/src/main/resources/script/mysql:/docker-entrypoint-initdb.d --env MYSQL_ROOT_PASSWORD=benchmarkdbpass mysql:5.7.16

+ 69 - 0
frameworks/Java/light-java/benchmark_config.json

@@ -0,0 +1,69 @@
+{
+  "framework": "light-java",
+  "tests": [{
+    "default": {
+      "setup_file": "setup",
+      "json_url": "/json",
+      "plaintext_url": "/plaintext",
+      "port": 8080,
+      "approach": "Realistic",
+      "classification": "Platform",
+      "database": "None",
+      "framework": "None",
+      "language": "Java",
+      "flavor": "None",
+      "orm": "Raw",
+      "platform": "Light-Java",
+      "webserver": "None",
+      "os": "Linux",
+      "database_os": "Linux",
+      "display_name": "light-java",
+      "notes": "",
+      "versus": ""
+    },
+    "mysql" : {
+      "setup_file": "setup_mysql",
+      "db_url": "/db/mysql",
+      "query_url": "/queries/mysql?queries=",
+      "fortune_url": "/fortunes/mysql",
+      "update_url": "/updates/mysql?queries=",
+      "port": 8080,
+      "approach": "Realistic",
+      "classification": "Platform",
+      "database": "MySQL",
+      "framework": "None",
+      "language": "Java",
+      "flavor": "None",
+      "orm": "Raw",
+      "platform": "Light-Java",
+      "webserver": "None",
+      "os": "Linux",
+      "database_os": "Linux",
+      "display_name": "light-java",
+      "notes": "",
+      "versus": ""
+    },
+    "postgresql" : {
+      "setup_file": "setup_postgresql",
+      "db_url": "/db/postgresql",
+      "query_url": "/queries/postgresql?queries=",
+      "fortune_url": "/fortunes/postgresql",
+      "update_url": "/updates/postgresql?queries=",
+      "port": 8080,
+      "approach": "Realistic",
+      "classification": "Platform",
+      "database": "Postgres",
+      "framework": "None",
+      "language": "Java",
+      "flavor": "None",
+      "orm": "Raw",
+      "platform": "Light-Java",
+      "webserver": "None",
+      "os": "Linux",
+      "database_os": "Linux",
+      "display_name": "light-java",
+      "notes": "",
+      "versus": ""
+    }
+  }]
+}

+ 166 - 0
frameworks/Java/light-java/dependency-reduced-pom.xml

@@ -0,0 +1,166 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+  <parent>
+    <artifactId>oss-parent</artifactId>
+    <groupId>org.sonatype.oss</groupId>
+    <version>5</version>
+    <relativePath>../pom.xml/pom.xml</relativePath>
+  </parent>
+  <modelVersion>4.0.0</modelVersion>
+  <groupId>com.networknt</groupId>
+  <artifactId>techempower</artifactId>
+  <name>techempower</name>
+  <version>1.0.0</version>
+  <prerequisites>
+    <maven>2.2.0</maven>
+  </prerequisites>
+  <build>
+    <defaultGoal>install</defaultGoal>
+    <directory>target</directory>
+    <finalName>${project.artifactId}-${project.version}</finalName>
+    <pluginManagement>
+      <plugins>
+        <plugin>
+          <groupId>org.eclipse.m2e</groupId>
+          <artifactId>lifecycle-mapping</artifactId>
+          <version>1.0.0</version>
+          <configuration>
+            <lifecycleMappingMetadata>
+              <pluginExecutions>
+                <pluginExecution>
+                  <pluginExecutionFilter>
+                    <groupId>org.apache.maven.plugins</groupId>
+                    <artifactId>maven-compiler-plugin</artifactId>
+                    <versionRange>[3.3,)</versionRange>
+                    <goals>
+                      <goal>compile</goal>
+                      <goal>testCompile</goal>
+                    </goals>
+                  </pluginExecutionFilter>
+                  <action>
+                    <ignore />
+                  </action>
+                </pluginExecution>
+              </pluginExecutions>
+            </lifecycleMappingMetadata>
+          </configuration>
+        </plugin>
+      </plugins>
+    </pluginManagement>
+    <plugins>
+      <plugin>
+        <artifactId>maven-shade-plugin</artifactId>
+        <version>2.4.3</version>
+        <executions>
+          <execution>
+            <phase>package</phase>
+            <goals>
+              <goal>shade</goal>
+            </goals>
+            <configuration>
+              <transformers>
+                <transformer />
+              </transformers>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+      <plugin>
+        <artifactId>maven-jar-plugin</artifactId>
+        <version>2.6</version>
+        <configuration>
+          <archive>
+            <manifest>
+              <mainClass>com.networknt.server.Server</mainClass>
+            </manifest>
+          </archive>
+        </configuration>
+      </plugin>
+      <plugin>
+        <groupId>org.codehaus.mojo</groupId>
+        <artifactId>exec-maven-plugin</artifactId>
+        <version>1.4.0</version>
+        <configuration>
+          <executable>java</executable>
+          <arguments>
+            <argument>-jar</argument>
+            <argument>target/${project.build.finalName}.jar</argument>
+          </arguments>
+        </configuration>
+      </plugin>
+      <plugin>
+        <artifactId>maven-compiler-plugin</artifactId>
+        <version>3.3</version>
+        <dependencies>
+          <dependency>
+            <groupId>org.codehaus.plexus</groupId>
+            <artifactId>plexus-compiler-javac-errorprone</artifactId>
+            <version>2.8</version>
+          </dependency>
+          <dependency>
+            <groupId>com.google.errorprone</groupId>
+            <artifactId>error_prone_core</artifactId>
+            <version>2.0.15</version>
+          </dependency>
+        </dependencies>
+        <configuration>
+          <compilerId>javac-with-errorprone</compilerId>
+          <showWarnings>true</showWarnings>
+          <showDeprecation>true</showDeprecation>
+          <compilerArgs />
+          <forceJavacCompilerUse>true</forceJavacCompilerUse>
+          <source>${java.version}</source>
+          <target>${java.version}</target>
+        </configuration>
+      </plugin>
+    </plugins>
+  </build>
+  <repositories>
+    <repository>
+      <snapshots />
+      <id>sonatype-snapshots</id>
+      <url>https://oss.sonatype.org/content/repositories/snapshots</url>
+    </repository>
+  </repositories>
+  <dependencies>
+    <dependency>
+      <groupId>junit</groupId>
+      <artifactId>junit</artifactId>
+      <version>4.12</version>
+      <scope>test</scope>
+      <exclusions>
+        <exclusion>
+          <artifactId>hamcrest-core</artifactId>
+          <groupId>org.hamcrest</groupId>
+        </exclusion>
+      </exclusions>
+    </dependency>
+  </dependencies>
+  <properties>
+    <version.hikaricp>2.5.1</version.hikaricp>
+    <version.httpasyncclient>4.1.2</version.httpasyncclient>
+    <version.jsonpath>2.2.0</version.jsonpath>
+    <version.commons.codec>1.10</version.commons.codec>
+    <version.metrics>3.1.2</version.metrics>
+    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+    <version.encoder>1.2</version.encoder>
+    <version.httpclient>4.5.2</version.httpclient>
+    <version.undertow>1.4.10.Final</version.undertow>
+    <version.jose4j>0.5.2</version.jose4j>
+    <version.commons-lang>2.6</version.commons-lang>
+    <java.version>1.8</java.version>
+    <version.jackson>2.8.2</version.jackson>
+    <version.light-java>1.2.3</version.light-java>
+    <version.swagger>1.5.10</version.swagger>
+    <version.mockito>2.1.0-beta.124</version.mockito>
+    <version.slf4j>1.7.22</version.slf4j>
+    <version.commons.io>2.5</version.commons.io>
+    <version.logback>1.1.9</version.logback>
+    <version.junit>4.12</version.junit>
+    <version.postgres>9.4.1211</version.postgres>
+    <version.antlr4>4.5.3</version.antlr4>
+    <version.mysql>6.0.4</version.mysql>
+    <version.light-java-rest>1.2.3</version.light-java-rest>
+  </properties>
+</project>
+

+ 28 - 0
frameworks/Java/light-java/docker-compose.yml

@@ -0,0 +1,28 @@
+ version: '2'
+ services:
+   mysqldb:
+     image: mysql:5.7.16
+     volumes:
+       - ./docker/db/mysql:/var/lib/mysql
+       - ./src/main/resources/script/mysql:/docker-entrypoint-initdb.d
+     environment:
+       MYSQL_ROOT_PASSWORD: my-secret-pw
+   postgresdb:
+     image: postgres:9.6.0
+     volumes:
+       - ./docker/db/postgres:/var/lib/postgresql/data
+       - ./src/main/resources/script/postgres:/docker-entrypoint-initdb.d
+     environment:
+       POSTGRES_PASSWORD: my-secret-pw
+       POSTGRES_DB: hello_world
+
+#   light:
+#     depends_on:
+#       - mysqldb
+#       - postgresdb
+#     image: networknt/example-database:latest
+#     links:
+#       - mysqldb
+#       - postgresdb
+#     ports:
+#       - 8080:8080

+ 376 - 0
frameworks/Java/light-java/pom.xml

@@ -0,0 +1,376 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+    <parent>
+        <groupId>org.sonatype.oss</groupId>
+        <artifactId>oss-parent</artifactId>
+        <version>5</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+    <groupId>com.networknt</groupId>
+    <artifactId>techempower</artifactId>
+    <packaging>jar</packaging>
+    <name>techempower</name>
+    <version>1.0.0</version>
+    <prerequisites>
+        <maven>2.2.0</maven>
+    </prerequisites>
+
+    <properties>
+        <java.version>1.8</java.version>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+        <version.light-java>1.2.3</version.light-java>
+        <version.light-java-rest>1.2.3</version.light-java-rest>
+        <version.jackson>2.8.2</version.jackson>
+        <version.slf4j>1.7.22</version.slf4j>
+        <version.jose4j>0.5.2</version.jose4j>
+        <version.antlr4>4.5.3</version.antlr4>
+        <version.commons-lang>2.6</version.commons-lang>
+        <version.commons.io>2.5</version.commons.io>
+        <version.commons.codec>1.10</version.commons.codec>
+        <version.encoder>1.2</version.encoder>
+        <version.metrics>3.1.2</version.metrics>
+        <version.logback>1.1.9</version.logback>
+        <version.junit>4.12</version.junit>
+        <version.mockito>2.1.0-beta.124</version.mockito>
+        <version.undertow>1.4.10.Final</version.undertow>
+        <version.jsonpath>2.2.0</version.jsonpath>
+        <version.httpclient>4.5.2</version.httpclient>
+        <version.httpasyncclient>4.1.2</version.httpasyncclient>
+        <version.swagger>1.5.10</version.swagger>
+        <version.hikaricp>2.5.1</version.hikaricp>
+        <version.mysql>6.0.4</version.mysql>
+        <version.postgres>9.4.1211</version.postgres>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>com.networknt</groupId>
+            <artifactId>config</artifactId>
+            <version>${version.light-java}</version>
+        </dependency>
+        <dependency>
+            <groupId>com.networknt</groupId>
+            <artifactId>utility</artifactId>
+            <version>${version.light-java}</version>
+        </dependency>
+        <dependency>
+            <groupId>com.networknt</groupId>
+            <artifactId>security</artifactId>
+            <version>${version.light-java}</version>
+        </dependency>
+        <dependency>
+            <groupId>com.networknt</groupId>
+            <artifactId>client</artifactId>
+            <version>${version.light-java}</version>
+        </dependency>
+        <dependency>
+            <groupId>com.networknt</groupId>
+            <artifactId>audit</artifactId>
+            <version>${version.light-java}</version>
+        </dependency>
+        <dependency>
+            <groupId>com.networknt</groupId>
+            <artifactId>info</artifactId>
+            <version>${version.light-java}</version>
+        </dependency>
+        <dependency>
+            <groupId>com.networknt</groupId>
+            <artifactId>status</artifactId>
+            <version>${version.light-java}</version>
+        </dependency>
+        <dependency>
+            <groupId>com.networknt</groupId>
+            <artifactId>exception</artifactId>
+            <version>${version.light-java}</version>
+        </dependency>
+        <dependency>
+            <groupId>com.networknt</groupId>
+            <artifactId>body</artifactId>
+            <version>${version.light-java}</version>
+        </dependency>
+        <dependency>
+            <groupId>com.networknt</groupId>
+            <artifactId>mask</artifactId>
+            <version>${version.light-java}</version>
+        </dependency>
+        <dependency>
+            <groupId>com.networknt</groupId>
+            <artifactId>metrics</artifactId>
+            <version>${version.light-java}</version>
+        </dependency>
+        <dependency>
+            <groupId>com.networknt</groupId>
+            <artifactId>handler</artifactId>
+            <version>${version.light-java}</version>
+        </dependency>
+        <dependency>
+            <groupId>com.networknt</groupId>
+            <artifactId>sanitizer</artifactId>
+            <version>${version.light-java}</version>
+        </dependency>
+        <dependency>
+            <groupId>com.networknt</groupId>
+            <artifactId>traceability</artifactId>
+            <version>${version.light-java}</version>
+        </dependency>
+        <dependency>
+            <groupId>com.networknt</groupId>
+            <artifactId>correlation</artifactId>
+            <version>${version.light-java}</version>
+        </dependency>
+        <dependency>
+            <groupId>com.networknt</groupId>
+            <artifactId>service</artifactId>
+            <version>${version.light-java}</version>
+        </dependency>
+       <dependency>
+            <groupId>com.networknt</groupId>
+            <artifactId>registry</artifactId>
+            <version>${version.light-java}</version>
+        </dependency>
+        <dependency>
+            <groupId>com.networknt</groupId>
+            <artifactId>balance</artifactId>
+            <version>${version.light-java}</version>
+        </dependency>
+        <dependency>
+            <groupId>com.networknt</groupId>
+            <artifactId>cluster</artifactId>
+            <version>${version.light-java}</version>
+        </dependency>
+        <dependency>
+            <groupId>com.networknt</groupId>
+            <artifactId>consul</artifactId>
+            <version>${version.light-java}</version>
+        </dependency>
+        <dependency>
+            <groupId>com.networknt</groupId>
+            <artifactId>server</artifactId>
+            <version>${version.light-java}</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.networknt</groupId>
+            <artifactId>swagger-meta</artifactId>
+            <version>${version.light-java-rest}</version>
+        </dependency>
+        <dependency>
+            <groupId>com.networknt</groupId>
+            <artifactId>swagger-security</artifactId>
+            <version>${version.light-java-rest}</version>
+        </dependency>
+        <dependency>
+            <groupId>com.networknt</groupId>
+            <artifactId>swagger-validator</artifactId>
+            <version>${version.light-java-rest}</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.fasterxml.jackson.core</groupId>
+            <artifactId>jackson-databind</artifactId>
+            <version>${version.jackson}</version>
+        </dependency>
+        <dependency>
+            <groupId>com.fasterxml.jackson.core</groupId>
+            <artifactId>jackson-core</artifactId>
+            <version>${version.jackson}</version>
+        </dependency>
+        <dependency>
+            <groupId>com.jayway.jsonpath</groupId>
+            <artifactId>json-path</artifactId>
+            <version>${version.jsonpath}</version>
+            <exclusions>
+                <exclusion>
+                    <groupId>net.minidev</groupId>
+                    <artifactId>json-smart</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+        <dependency>
+            <groupId>ch.qos.logback</groupId>
+            <artifactId>logback-classic</artifactId>
+            <version>${version.logback}</version>
+        </dependency>
+        <dependency>
+            <groupId>io.undertow</groupId>
+            <artifactId>undertow-core</artifactId>
+            <version>${version.undertow}</version>
+        </dependency>
+        <dependency>
+            <groupId>io.swagger</groupId>
+            <artifactId>swagger-annotations</artifactId>
+            <version>${version.swagger}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.httpcomponents</groupId>
+            <artifactId>httpclient</artifactId>
+            <version>${version.httpclient}</version>
+        </dependency>
+        <dependency>
+            <groupId>com.zaxxer</groupId>
+            <artifactId>HikariCP</artifactId>
+            <version>${version.hikaricp}</version>
+        </dependency>
+        <dependency>
+            <groupId>mysql</groupId>
+            <artifactId>mysql-connector-java</artifactId>
+            <version>${version.mysql}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.postgresql</groupId>
+            <artifactId>postgresql</artifactId>
+            <version>${version.postgres}</version>
+        </dependency>
+        <dependency>
+            <groupId>com.dslplatform</groupId>
+            <artifactId>dsl-json-java8</artifactId>
+            <version>1.4.0</version>
+        </dependency>
+        <dependency>
+            <groupId>com.github.spullara.mustache.java</groupId>
+            <artifactId>compiler</artifactId>
+            <version>0.9.0</version>
+        </dependency>
+
+        <!-- Test Dependencies -->
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <version>${version.junit}</version>
+            <scope>test</scope>
+        </dependency>
+    </dependencies>
+
+
+    <build>
+        <defaultGoal>install</defaultGoal>
+        <directory>target</directory>
+        <finalName>${project.artifactId}-${project.version}</finalName>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-shade-plugin</artifactId>
+                <version>2.4.3</version>
+                <executions>
+                    <execution>
+                        <phase>package</phase>
+                        <goals>
+                            <goal>shade</goal>
+                        </goals>
+                        <configuration>
+                            <transformers>
+                                <transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/>
+                            </transformers>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-jar-plugin</artifactId>
+                <version>2.6</version>
+                <configuration>
+                    <archive>
+                        <manifest>
+                            <mainClass>com.networknt.server.Server</mainClass>
+                        </manifest>
+                    </archive>
+                </configuration>
+            </plugin>
+            <plugin>
+                <groupId>org.codehaus.mojo</groupId>
+                <artifactId>exec-maven-plugin</artifactId>
+                <version>1.4.0</version>
+                <configuration>
+                    <executable>java</executable>
+                    <arguments>
+                        <argument>-jar</argument>
+                        <argument>target/${project.build.finalName}.jar</argument>
+                    </arguments>
+                </configuration>
+            </plugin>
+            <!-- Google error-prone compiles -->
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <version>3.3</version>
+                <configuration>
+                    <compilerId>javac-with-errorprone</compilerId>
+                    <showWarnings>true</showWarnings>
+                    <showDeprecation>true</showDeprecation>
+                    <compilerArgs>
+                        <!-- add command line validation here -->
+                    </compilerArgs>
+                    <forceJavacCompilerUse>true</forceJavacCompilerUse>
+                    <!-- maven-compiler-plugin defaults to targeting Java 5, but our javac
+                         only supports >=6 -->
+                    <source>${java.version}</source>
+                    <target>${java.version}</target>
+                </configuration>
+                <dependencies>
+                    <dependency>
+                        <groupId>org.codehaus.plexus</groupId>
+                        <artifactId>plexus-compiler-javac-errorprone</artifactId>
+                        <version>2.8</version>
+                    </dependency>
+                    <!-- override plexus-compiler-javac-errorprone's dependency on
+                         Error Prone with the latest version -->
+                    <dependency>
+                        <groupId>com.google.errorprone</groupId>
+                        <artifactId>error_prone_core</artifactId>
+                        <version>2.0.15</version>
+                    </dependency>
+                </dependencies>
+            </plugin>
+
+            <!-- end Google error-proce compiles -->
+        </plugins>
+
+        <pluginManagement>
+        	<plugins>
+        		<!--This plugin's configuration is used to store Eclipse m2e settings only. It has no influence on the Maven build itself.-->
+        		<plugin>
+        			<groupId>org.eclipse.m2e</groupId>
+        			<artifactId>lifecycle-mapping</artifactId>
+        			<version>1.0.0</version>
+        			<configuration>
+        				<lifecycleMappingMetadata>
+        					<pluginExecutions>
+        						<pluginExecution>
+        							<pluginExecutionFilter>
+        								<groupId>
+        									org.apache.maven.plugins
+        								</groupId>
+        								<artifactId>
+        									maven-compiler-plugin
+        								</artifactId>
+        								<versionRange>
+        									[3.3,)
+        								</versionRange>
+        								<goals>
+        									<goal>compile</goal>
+        									<goal>testCompile</goal>
+        								</goals>
+        							</pluginExecutionFilter>
+        							<action>
+        								<ignore></ignore>
+        							</action>
+        						</pluginExecution>
+        					</pluginExecutions>
+        				</lifecycleMappingMetadata>
+        			</configuration>
+        		</plugin>
+        	</plugins>
+        </pluginManagement>
+        
+    </build>
+
+    <repositories>
+        <repository>
+            <id>sonatype-snapshots</id>
+            <url>https://oss.sonatype.org/content/repositories/snapshots</url>
+            <snapshots>
+                <enabled>true</enabled>
+            </snapshots>
+        </repository>
+    </repositories>
+</project>

+ 7 - 0
frameworks/Java/light-java/setup.sh

@@ -0,0 +1,7 @@
+#!/bin/bash
+
+fw_depends postgresql mysql java maven
+
+mvn clean package
+cd target
+java -server -Xms512m -Xmx2g -jar techempower-1.0.0.jar &

+ 5 - 0
frameworks/Java/light-java/setup_mysql.sh

@@ -0,0 +1,5 @@
+#!/bin/bash
+
+fw_depends mysql
+
+source ./setup.sh

+ 5 - 0
frameworks/Java/light-java/setup_postgresql.sh

@@ -0,0 +1,5 @@
+#!/bin/bash
+
+fw_depends postgresql
+
+source ./setup.sh

+ 0 - 0
frameworks/Java/light-java/source_code


+ 61 - 0
frameworks/Java/light-java/src/main/java/com/networknt/techempower/Helper.java

@@ -0,0 +1,61 @@
+package com.networknt.techempower;
+
+import com.google.common.net.MediaType;
+import io.undertow.server.HttpServerExchange;
+
+import java.util.Deque;
+import java.util.concurrent.*;
+
+/**
+ * Provides utility methods for the benchmark tests.
+ */
+public final class Helper {
+
+    private Helper() {
+        throw new AssertionError();
+    }
+
+    /**
+     * Returns the value of the "queries" request parameter, which is an integer
+     * bound between 1 and 500 with a default value of 1.
+     *
+     * @param exchange the current HTTP exchange
+     * @return the value of the "queries" request parameter
+     */
+    public static int getQueries(HttpServerExchange exchange) {
+        Deque<String> values = exchange.getQueryParameters().get("queries");
+        if (values == null) {
+            return 1;
+        }
+        String textValue = values.peekFirst();
+        if (textValue == null) {
+            return 1;
+        }
+        try {
+            int parsedValue = Integer.parseInt(textValue);
+            return Math.min(500, Math.max(1, parsedValue));
+        } catch (NumberFormatException e) {
+            return 1;
+        }
+    }
+
+    /**
+     * Returns a random integer that is a suitable value for both the {@code id}
+     * and {@code randomNumber} properties of a world object.
+     *
+     * @return a random world number
+     */
+    public static int randomWorld() {
+        return 1 + ThreadLocalRandom.current().nextInt(10000);
+    }
+
+    private static final int cpuCount = Runtime.getRuntime().availableProcessors();
+
+    // todo: parameterize multipliers
+    public static ExecutorService EXECUTOR =
+            new ThreadPoolExecutor(
+                    cpuCount * 2, cpuCount * 25, 200, TimeUnit.MILLISECONDS,
+                    new LinkedBlockingQueue<Runnable>(cpuCount * 100),
+                    new ThreadPoolExecutor.CallerRunsPolicy());
+
+}

+ 28 - 0
frameworks/Java/light-java/src/main/java/com/networknt/techempower/PathHandlerProvider.java

@@ -0,0 +1,28 @@
+package com.networknt.techempower;
+
+import com.networknt.config.Config;
+import com.networknt.server.HandlerProvider;
+import io.undertow.Handlers;
+import io.undertow.server.HttpHandler;
+import io.undertow.server.HttpServerExchange;
+import io.undertow.util.Methods;
+import com.networknt.techempower.handler.*;
+
+public class PathHandlerProvider implements HandlerProvider {
+    @Override
+    public HttpHandler getHandler() {
+        return Handlers.routing()
+            .add(Methods.GET, "/db/mysql", new DbMysqlGetHandler())
+            .add(Methods.GET, "/db/postgresql", new DbPostgresqlGetHandler())
+            .add(Methods.GET, "/fortunes/mysql", new FortunesMysqlGetHandler())
+            .add(Methods.GET, "/fortunes/postgresql", new FortunesPostgresqlGetHandler())
+            .add(Methods.GET, "/json", new JsonGetHandler())
+            .add(Methods.GET, "/plaintext", new PlaintextGetHandler())
+            .add(Methods.GET, "/queries/mysql", new QueriesMysqlGetHandler())
+            .add(Methods.GET, "/queries/postgresql", new QueriesPostgresqlGetHandler())
+            .add(Methods.GET, "/updates/mysql", new UpdatesMysqlGetHandler())
+            .add(Methods.GET, "/updates/postgresql", new UpdatesPostgresqlGetHandler())
+        ;
+    }
+}
+

+ 105 - 0
frameworks/Java/light-java/src/main/java/com/networknt/techempower/db/mysql/MysqlConfig.java

@@ -0,0 +1,105 @@
+package com.networknt.techempower.db.mysql;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+
+/**
+ * Created by steve on 10/02/17.
+ */
+public class MysqlConfig {
+    String jdbcUrl;
+    String username;
+    String password;
+    int maximumPoolSize;
+    boolean useServerPrepStmts;
+    boolean cachePrepStmts;
+    boolean cacheCallableStmts;
+    int prepStmtCacheSize;
+    int prepStmtCacheSqlLimit;
+
+    @JsonIgnore
+    String description;
+
+    public MysqlConfig() {
+    }
+
+    public String getJdbcUrl() {
+        return jdbcUrl;
+    }
+
+    public void setJdbcUrl(String jdbcUrl) {
+        this.jdbcUrl = jdbcUrl;
+    }
+
+    public String getUsername() {
+        return username;
+    }
+
+    public void setUsername(String username) {
+        this.username = username;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public void setPassword(String password) {
+        this.password = password;
+    }
+
+    public int getMaximumPoolSize() {
+        return maximumPoolSize;
+    }
+
+    public void setMaximumPoolSize(int maximumPoolSize) {
+        this.maximumPoolSize = maximumPoolSize;
+    }
+
+    public boolean isUseServerPrepStmts() {
+        return useServerPrepStmts;
+    }
+
+    public void setUseServerPrepStmts(boolean useServerPrepStmts) {
+        this.useServerPrepStmts = useServerPrepStmts;
+    }
+
+    public boolean isCachePrepStmts() {
+        return cachePrepStmts;
+    }
+
+    public void setCachePrepStmts(boolean cachePrepStmts) {
+        this.cachePrepStmts = cachePrepStmts;
+    }
+
+    public boolean isCacheCallableStmts() {
+        return cacheCallableStmts;
+    }
+
+    public void setCacheCallableStmts(boolean cacheCallableStmts) {
+        this.cacheCallableStmts = cacheCallableStmts;
+    }
+
+    public int getPrepStmtCacheSize() {
+        return prepStmtCacheSize;
+    }
+
+    public void setPrepStmtCacheSize(int prepStmtCacheSize) {
+        this.prepStmtCacheSize = prepStmtCacheSize;
+    }
+
+    public int getPrepStmtCacheSqlLimit() {
+        return prepStmtCacheSqlLimit;
+    }
+
+    public void setPrepStmtCacheSqlLimit(int prepStmtCacheSqlLimit) {
+        this.prepStmtCacheSqlLimit = prepStmtCacheSqlLimit;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+
+    public void setDescription(String description) {
+        this.description = description;
+    }
+}
+

+ 33 - 0
frameworks/Java/light-java/src/main/java/com/networknt/techempower/db/mysql/MysqlStartupHookProvider.java

@@ -0,0 +1,33 @@
+package com.networknt.techempower.db.mysql;
+
+import com.networknt.config.Config;
+import com.networknt.server.StartupHookProvider;
+import com.zaxxer.hikari.HikariDataSource;
+
+/**
+ * Created by steve on 10/02/17.
+ */
+public class MysqlStartupHookProvider implements StartupHookProvider {
+
+    static String CONFIG_NAME = "mysql";
+    public static HikariDataSource ds;
+
+    @Override
+    public void onStartup() {
+        initDataSource();
+    }
+
+    static void initDataSource() {
+        MysqlConfig config = (MysqlConfig) Config.getInstance().getJsonObjectConfig(CONFIG_NAME, MysqlConfig.class);
+        ds = new HikariDataSource();
+        ds.setJdbcUrl(config.getJdbcUrl());
+        ds.setUsername(config.getUsername());
+        ds.setPassword(config.getPassword());
+        ds.setMaximumPoolSize(config.getMaximumPoolSize());
+        ds.addDataSourceProperty("useServerPrepStmts", config.isUseServerPrepStmts());
+        ds.addDataSourceProperty("CachePrepStmts", config.isCachePrepStmts());
+        ds.addDataSourceProperty("CacheCallableStmts", config.isCacheCallableStmts());
+        ds.addDataSourceProperty("PrepStmtCacheSize", config.getPrepStmtCacheSize());
+        ds.addDataSourceProperty("PrepStmtCacheSqlLimit", config.getPrepStmtCacheSqlLimit());
+    }
+}

+ 59 - 0
frameworks/Java/light-java/src/main/java/com/networknt/techempower/db/postgres/PostgresConfig.java

@@ -0,0 +1,59 @@
+package com.networknt.techempower.db.postgres;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+
+/**
+ * Created by steve on 10/02/17.
+ */
+public class PostgresConfig {
+    String jdbcUrl;
+    String username;
+    String password;
+    int maximumPoolSize;
+
+    @JsonIgnore
+    String description;
+
+    public PostgresConfig() {
+    }
+
+    public String getJdbcUrl() {
+        return jdbcUrl;
+    }
+
+    public void setJdbcUrl(String jdbcUrl) {
+        this.jdbcUrl = jdbcUrl;
+    }
+
+    public String getUsername() {
+        return username;
+    }
+
+    public void setUsername(String username) {
+        this.username = username;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public void setPassword(String password) {
+        this.password = password;
+    }
+
+    public int getMaximumPoolSize() {
+        return maximumPoolSize;
+    }
+
+    public void setMaximumPoolSize(int maximumPoolSize) {
+        this.maximumPoolSize = maximumPoolSize;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+
+    public void setDescription(String description) {
+        this.description = description;
+    }
+}

+ 28 - 0
frameworks/Java/light-java/src/main/java/com/networknt/techempower/db/postgres/PostgresStartupHookProvider.java

@@ -0,0 +1,28 @@
+package com.networknt.techempower.db.postgres;
+
+import com.networknt.config.Config;
+import com.networknt.server.StartupHookProvider;
+import com.zaxxer.hikari.HikariDataSource;
+
+/**
+ * Created by steve on 10/02/17.
+ */
+public class PostgresStartupHookProvider implements StartupHookProvider {
+
+    static String CONFIG_NAME = "postgres";
+    public static HikariDataSource ds;
+
+    @Override
+    public void onStartup() {
+        initDataSource();
+    }
+
+    static void initDataSource() {
+        PostgresConfig config = (PostgresConfig) Config.getInstance().getJsonObjectConfig(CONFIG_NAME, PostgresConfig.class);
+        ds = new HikariDataSource();
+        ds.setJdbcUrl(config.getJdbcUrl());
+        ds.setUsername(config.getUsername());
+        ds.setPassword(config.getPassword());
+        ds.setMaximumPoolSize(config.getMaximumPoolSize());
+    }
+}

+ 125 - 0
frameworks/Java/light-java/src/main/java/com/networknt/techempower/handler/DbMysqlGetHandler.java

@@ -0,0 +1,125 @@
+package com.networknt.techempower.handler;
+
+import com.dslplatform.json.DslJson;
+import com.dslplatform.json.JsonWriter;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.networknt.config.Config;
+import com.networknt.techempower.Helper;
+import com.networknt.techempower.db.mysql.MysqlStartupHookProvider;
+import com.networknt.techempower.model.World;
+import io.undertow.server.HttpHandler;
+import io.undertow.server.HttpServerExchange;
+import io.undertow.util.Headers;
+import io.undertow.util.HttpString;
+
+import java.nio.ByteBuffer;
+import java.sql.Connection;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.concurrent.Callable;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.Future;
+
+import org.apache.commons.lang3.StringEscapeUtils;
+
+import javax.sql.DataSource;
+
+public class DbMysqlGetHandler implements HttpHandler {
+    private final DataSource ds = MysqlStartupHookProvider.ds;
+    private DslJson<Object> dsl = new DslJson<>();
+    private JsonWriter writer = dsl.newWriter(25000);
+
+    @Override
+    public void handleRequest(HttpServerExchange exchange) throws Exception {
+        if (exchange.isInIoThread()) {
+            exchange.dispatch(this);
+            return;
+        }
+        /*
+        // throughput 8670 latency 122
+        World[] worlds = new World[1];
+
+        try (final Connection connection = ds.getConnection()) {
+            Map<Integer, Future<World>> futureWorlds = new ConcurrentHashMap<>();
+            futureWorlds.put(0, Helper.EXECUTOR.submit(new Callable<World>(){
+                @Override
+                public World call() throws Exception {
+                    try (PreparedStatement statement = connection.prepareStatement(
+                            "SELECT * FROM world WHERE id = ?",
+                            ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY)) {
+
+                        statement.setInt(1, Helper.randomWorld());
+                        ResultSet resultSet = statement.executeQuery();
+                        resultSet.next();
+                        return new World(
+                                resultSet.getInt("id"),
+                                resultSet.getInt("randomNumber"));
+                    }
+                }
+            }));
+
+            worlds[0] = futureWorlds.get(0).get();
+        }
+
+        exchange.getResponseHeaders().put(Headers.CONTENT_TYPE, Helper.JSON_UTF8);
+        exchange.getResponseSender().send(mapper.writeValueAsString(worlds[0]));
+        */
+
+        /*
+        // throughput 11124 latency 137
+        World world;
+        try (final Connection connection = ds.getConnection()) {
+            try (PreparedStatement statement = connection.prepareStatement(
+                    "SELECT * FROM world WHERE id = ?",
+                    ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY)) {
+
+                statement.setInt(1, Helper.randomWorld());
+                ResultSet resultSet = statement.executeQuery();
+                resultSet.next();
+                world = new World(
+                        resultSet.getInt("id"),
+                        resultSet.getInt("randomNumber"));
+            }
+        }
+        exchange.getResponseHeaders().put(Headers.CONTENT_TYPE, Helper.JSON_UTF8);
+        exchange.getResponseSender().send(mapper.writeValueAsString(world));
+        */
+        /*
+        // throughput 11680 latency 111
+        String s;
+        try (final Connection connection = ds.getConnection()) {
+            try (PreparedStatement statement = connection.prepareStatement(
+                    "SELECT * FROM world WHERE id = ?",
+                    ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY)) {
+
+                statement.setInt(1, Helper.randomWorld());
+                ResultSet resultSet = statement.executeQuery();
+                resultSet.next();
+                s = "{\"id\":" + resultSet.getInt("id") + ",\"randomNumber\":" + resultSet.getInt("randomNumber") + "}";
+            }
+        }
+        exchange.getResponseHeaders().put(Headers.CONTENT_TYPE, Helper.JSON_UTF8);
+        exchange.getResponseSender().send(s);
+        */
+
+        //11731 115
+        exchange.getResponseHeaders().put(Headers.CONTENT_TYPE, "application/json");
+        World world;
+        try (final Connection connection = ds.getConnection()) {
+            try (PreparedStatement statement = connection.prepareStatement(
+                    "SELECT * FROM world WHERE id = ?",
+                    ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY)) {
+                statement.setInt(1, Helper.randomWorld());
+                try(ResultSet resultSet = statement.executeQuery()) {
+                    resultSet.next();
+                    world = new World(resultSet.getInt("id"), resultSet.getInt("randomNumber"));
+                }
+            }
+        }
+        writer.reset();
+        world.serialize(writer, true);
+        exchange.getResponseSender().send(ByteBuffer.wrap(writer.toByteArray()));
+    }
+}

+ 55 - 0
frameworks/Java/light-java/src/main/java/com/networknt/techempower/handler/DbPostgresqlGetHandler.java

@@ -0,0 +1,55 @@
+package com.networknt.techempower.handler;
+
+import com.dslplatform.json.DslJson;
+import com.dslplatform.json.JsonWriter;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.networknt.config.Config;
+import com.networknt.techempower.Helper;
+import com.networknt.techempower.db.mysql.MysqlStartupHookProvider;
+import com.networknt.techempower.db.postgres.PostgresStartupHookProvider;
+import com.networknt.techempower.model.World;
+import io.undertow.server.HttpHandler;
+import io.undertow.server.HttpServerExchange;
+import io.undertow.util.Headers;
+import io.undertow.util.HttpString;
+
+import java.nio.ByteBuffer;
+import java.sql.Connection;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.util.HashMap;
+import java.util.Map;
+import org.apache.commons.lang3.StringEscapeUtils;
+
+import javax.sql.DataSource;
+
+public class DbPostgresqlGetHandler implements HttpHandler {
+    private final DataSource ds = PostgresStartupHookProvider.ds;
+    private DslJson<Object> dsl = new DslJson<>();
+    private JsonWriter writer = dsl.newWriter(25000);
+
+    @Override
+    public void handleRequest(HttpServerExchange exchange) throws Exception {
+        if (exchange.isInIoThread()) {
+            exchange.dispatch(this);
+            return;
+        }
+        // 24682 59
+        World world;
+        exchange.getResponseHeaders().put(Headers.CONTENT_TYPE, "application/json");
+        try (final Connection connection = ds.getConnection()) {
+            try (PreparedStatement statement = connection.prepareStatement(
+                    "SELECT * FROM world WHERE id = ?",
+                    ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY)) {
+                statement.setInt(1, Helper.randomWorld());
+                try (ResultSet resultSet = statement.executeQuery()) {
+                    resultSet.next();
+                    world = new World(resultSet.getInt("id"), resultSet.getInt("randomNumber"));
+                }
+            }
+        }
+        writer.reset();
+        world.serialize(writer, true);
+        exchange.getResponseSender().send(ByteBuffer.wrap(writer.toByteArray()));
+    }
+}

+ 55 - 0
frameworks/Java/light-java/src/main/java/com/networknt/techempower/handler/FortunesMysqlGetHandler.java

@@ -0,0 +1,55 @@
+package com.networknt.techempower.handler;
+
+import com.github.mustachejava.DefaultMustacheFactory;
+import com.github.mustachejava.Mustache;
+import com.github.mustachejava.MustacheFactory;
+import com.networknt.techempower.db.mysql.MysqlStartupHookProvider;
+import com.networknt.techempower.model.Fortune;
+import io.undertow.server.HttpHandler;
+import io.undertow.server.HttpServerExchange;
+import io.undertow.util.Headers;
+import io.undertow.util.HttpString;
+
+import java.io.StringWriter;
+import java.sql.Connection;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.util.*;
+
+import org.apache.commons.lang3.StringEscapeUtils;
+
+import javax.sql.DataSource;
+
+public class FortunesMysqlGetHandler implements HttpHandler {
+    private final MustacheFactory mustacheFactory = new DefaultMustacheFactory();
+    private final DataSource ds = MysqlStartupHookProvider.ds;
+
+    @Override
+    public void handleRequest(HttpServerExchange exchange) throws Exception {
+        if (exchange.isInIoThread()) {
+            exchange.dispatch(this);
+            return;
+        }
+        List<Fortune> fortunes = new ArrayList<>();
+        try (Connection connection = ds.getConnection();
+             PreparedStatement statement = connection.prepareStatement(
+                     "SELECT * FROM fortune",
+                     ResultSet.TYPE_FORWARD_ONLY,
+                     ResultSet.CONCUR_READ_ONLY);
+             ResultSet resultSet = statement.executeQuery()) {
+                while (resultSet.next()) {
+                fortunes.add(new Fortune(
+                        resultSet.getInt("id"),
+                        resultSet.getString("message")));
+            }
+        }
+        fortunes.add(new Fortune(0, "Additional fortune added at request time."));
+        Collections.sort(fortunes);
+        Mustache mustache = mustacheFactory.compile("fortunes.mustache");
+        StringWriter writer = new StringWriter();
+        mustache.execute(writer, fortunes);
+        exchange.getResponseHeaders().put(
+                Headers.CONTENT_TYPE, "text/html");
+        exchange.getResponseSender().send(writer.toString());
+    }
+}

+ 56 - 0
frameworks/Java/light-java/src/main/java/com/networknt/techempower/handler/FortunesPostgresqlGetHandler.java

@@ -0,0 +1,56 @@
+package com.networknt.techempower.handler;
+
+import com.github.mustachejava.DefaultMustacheFactory;
+import com.github.mustachejava.Mustache;
+import com.github.mustachejava.MustacheFactory;
+import com.networknt.techempower.db.mysql.MysqlStartupHookProvider;
+import com.networknt.techempower.db.postgres.PostgresStartupHookProvider;
+import com.networknt.techempower.model.Fortune;
+import io.undertow.server.HttpHandler;
+import io.undertow.server.HttpServerExchange;
+import io.undertow.util.Headers;
+import io.undertow.util.HttpString;
+
+import java.io.StringWriter;
+import java.sql.Connection;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.util.*;
+
+import org.apache.commons.lang3.StringEscapeUtils;
+
+import javax.sql.DataSource;
+
+public class FortunesPostgresqlGetHandler implements HttpHandler {
+    private final MustacheFactory mustacheFactory = new DefaultMustacheFactory();
+    private final DataSource ds = PostgresStartupHookProvider.ds;
+
+    @Override
+    public void handleRequest(HttpServerExchange exchange) throws Exception {
+        if (exchange.isInIoThread()) {
+            exchange.dispatch(this);
+            return;
+        }
+        List<Fortune> fortunes = new ArrayList<>();
+        try (Connection connection = ds.getConnection();
+             PreparedStatement statement = connection.prepareStatement(
+                     "SELECT * FROM Fortune",
+                     ResultSet.TYPE_FORWARD_ONLY,
+                     ResultSet.CONCUR_READ_ONLY);
+             ResultSet resultSet = statement.executeQuery()) {
+            while (resultSet.next()) {
+                fortunes.add(new Fortune(
+                        resultSet.getInt("id"),
+                        resultSet.getString("message")));
+            }
+        }
+        fortunes.add(new Fortune(0, "Additional fortune added at request time."));
+        Collections.sort(fortunes);
+        Mustache mustache = mustacheFactory.compile("fortunes.mustache");
+        StringWriter writer = new StringWriter();
+        mustache.execute(writer, fortunes);
+        exchange.getResponseHeaders().put(
+                Headers.CONTENT_TYPE, "text/html");
+        exchange.getResponseSender().send(writer.toString());
+    }
+}

+ 43 - 0
frameworks/Java/light-java/src/main/java/com/networknt/techempower/handler/JsonGetHandler.java

@@ -0,0 +1,43 @@
+package com.networknt.techempower.handler;
+
+import com.dslplatform.json.DslJson;
+import com.dslplatform.json.JsonWriter;
+import com.dslplatform.json.MapConverter;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.networknt.config.Config;
+import com.networknt.techempower.Helper;
+import io.undertow.server.HttpHandler;
+import io.undertow.server.HttpServerExchange;
+import io.undertow.util.Headers;
+import io.undertow.util.HttpString;
+
+import java.nio.ByteBuffer;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Objects;
+
+import org.apache.commons.lang3.StringEscapeUtils;
+
+public class JsonGetHandler implements HttpHandler {
+    private DslJson<Object> dsl = new DslJson<>();
+    private JsonWriter writer = dsl.newWriter(25000);
+
+    @Override
+    public void handleRequest(HttpServerExchange exchange) throws Exception {
+        /*
+        // 946188.45 2.63
+        exchange.getResponseHeaders().put(
+                Headers.CONTENT_TYPE, "application/json");
+        exchange.getResponseSender().send(ByteBuffer.wrap(
+                objectMapper.writeValueAsBytes(
+                        Collections.singletonMap("message", "Hello, World!"))));
+        */
+
+        //1014821.63 3.32
+        exchange.getResponseHeaders().put(Headers.CONTENT_TYPE, "application/json");
+        writer.reset();
+        MapConverter.serialize(Collections.singletonMap("message", "Hello, World!"), writer);
+        exchange.getResponseSender().send(ByteBuffer.wrap(writer.toByteArray()));
+    }
+}

+ 22 - 0
frameworks/Java/light-java/src/main/java/com/networknt/techempower/handler/PlaintextGetHandler.java

@@ -0,0 +1,22 @@
+package com.networknt.techempower.handler;
+
+import com.networknt.techempower.Helper;
+import io.undertow.server.HttpHandler;
+import io.undertow.server.HttpServerExchange;
+import io.undertow.util.Headers;
+import io.undertow.util.HttpString;
+
+import java.nio.ByteBuffer;
+import java.util.HashMap;
+import java.util.Map;
+import org.apache.commons.lang3.StringEscapeUtils;
+
+public class PlaintextGetHandler implements HttpHandler {
+    private static final String MESSAGE = "Hello, World!";
+
+    @Override
+    public void handleRequest(HttpServerExchange exchange) throws Exception {
+        exchange.getResponseHeaders().put(Headers.CONTENT_TYPE, "text/plain");
+        exchange.getResponseSender().send(MESSAGE);
+    }
+}

+ 82 - 0
frameworks/Java/light-java/src/main/java/com/networknt/techempower/handler/QueriesMysqlGetHandler.java

@@ -0,0 +1,82 @@
+package com.networknt.techempower.handler;
+
+import com.dslplatform.json.DslJson;
+import com.dslplatform.json.JsonWriter;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.networknt.config.Config;
+import com.networknt.techempower.Helper;
+import com.networknt.techempower.db.mysql.MysqlStartupHookProvider;
+import com.networknt.techempower.model.World;
+import io.undertow.server.HttpHandler;
+import io.undertow.server.HttpServerExchange;
+import io.undertow.util.Headers;
+import io.undertow.util.HttpString;
+
+import java.nio.ByteBuffer;
+import java.sql.Connection;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.concurrent.Callable;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.Future;
+
+import org.apache.commons.lang3.StringEscapeUtils;
+
+import javax.sql.DataSource;
+
+public class QueriesMysqlGetHandler implements HttpHandler {
+    private final DataSource ds = MysqlStartupHookProvider.ds;
+    private DslJson<Object> dsl = new DslJson<>();
+    private JsonWriter writer = dsl.newWriter(25000);
+
+    @Override
+    public void handleRequest(HttpServerExchange exchange) throws Exception {
+        if (exchange.isInIoThread()) {
+            exchange.dispatch(this);
+            return;
+        }
+
+        int queries = Helper.getQueries(exchange);
+
+        World[] worlds = new World[queries];
+        try (final Connection connection = ds.getConnection()) {
+            Map<Integer, Future<World>> futureWorlds = new ConcurrentHashMap<>();
+            for (int i = 0; i < queries; i++) {
+                futureWorlds.put(i, Helper.EXECUTOR.submit(new Callable<World>(){
+                    @Override
+                    public World call() throws Exception {
+                        try (PreparedStatement statement = connection.prepareStatement(
+                                "SELECT * FROM world WHERE id = ?",
+                                ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY)) {
+
+                            statement.setInt(1, Helper.randomWorld());
+                            try (ResultSet resultSet = statement.executeQuery()) {
+                                resultSet.next();
+                                return new World(
+                                        resultSet.getInt("id"),
+                                        resultSet.getInt("randomNumber"));
+                            }
+                        }
+                    }
+                }));
+            }
+
+            for (int i = 0; i < queries; i++) {
+                worlds[i] = futureWorlds.get(i).get();
+            }
+        }
+        /*
+        // 1429 432
+        exchange.getResponseHeaders().put(Headers.CONTENT_TYPE, "application/json");
+        exchange.getResponseSender().send(mapper.writeValueAsString(worlds));
+        */
+
+        exchange.getResponseHeaders().put(Headers.CONTENT_TYPE, "application/json");
+        writer.reset();
+        writer.serialize(worlds, queries);
+        exchange.getResponseSender().send(ByteBuffer.wrap(writer.toByteArray()));
+
+    }
+}

+ 83 - 0
frameworks/Java/light-java/src/main/java/com/networknt/techempower/handler/QueriesPostgresqlGetHandler.java

@@ -0,0 +1,83 @@
+package com.networknt.techempower.handler;
+
+import com.dslplatform.json.DslJson;
+import com.dslplatform.json.JsonWriter;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.networknt.config.Config;
+import com.networknt.techempower.Helper;
+import com.networknt.techempower.db.mysql.MysqlStartupHookProvider;
+import com.networknt.techempower.db.postgres.PostgresStartupHookProvider;
+import com.networknt.techempower.model.World;
+import io.undertow.server.HttpHandler;
+import io.undertow.server.HttpServerExchange;
+import io.undertow.util.Headers;
+import io.undertow.util.HttpString;
+
+import java.nio.ByteBuffer;
+import java.sql.Connection;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.concurrent.Callable;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.Future;
+
+import org.apache.commons.lang3.StringEscapeUtils;
+
+import javax.sql.DataSource;
+
+public class QueriesPostgresqlGetHandler implements HttpHandler {
+    private final DataSource ds = PostgresStartupHookProvider.ds;
+    private DslJson<Object> dsl = new DslJson<>();
+    private JsonWriter writer = dsl.newWriter(25000);
+
+    @Override
+    public void handleRequest(HttpServerExchange exchange) throws Exception {
+        if (exchange.isInIoThread()) {
+            exchange.dispatch(this);
+            return;
+        }
+
+        int queries = Helper.getQueries(exchange);
+
+        World[] worlds = new World[queries];
+        try (final Connection connection = ds.getConnection()) {
+            Map<Integer, Future<World>> futureWorlds = new ConcurrentHashMap<>();
+            for (int i = 0; i < queries; i++) {
+                futureWorlds.put(i, Helper.EXECUTOR.submit(new Callable<World>(){
+                    @Override
+                    public World call() throws Exception {
+                        try (PreparedStatement statement = connection.prepareStatement(
+                                "SELECT * FROM world WHERE id = ?",
+                                ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY)) {
+
+                            statement.setInt(1, Helper.randomWorld());
+                            try (ResultSet resultSet = statement.executeQuery()) {
+                                resultSet.next();
+                                return new World(
+                                        resultSet.getInt("id"),
+                                        resultSet.getInt("randomNumber"));
+                            }
+                        }
+                    }
+                }));
+            }
+
+            for (int i = 0; i < queries; i++) {
+                worlds[i] = futureWorlds.get(i).get();
+            }
+        }
+
+        /*
+        // 2137
+        exchange.getResponseHeaders().put(Headers.CONTENT_TYPE, "application/json");
+        exchange.getResponseSender().send(mapper.writeValueAsString(worlds));
+        */
+
+        exchange.getResponseHeaders().put(Headers.CONTENT_TYPE, "application/json");
+        writer.reset();
+        writer.serialize(worlds, queries);
+        exchange.getResponseSender().send(ByteBuffer.wrap(writer.toByteArray()));
+    }
+}

+ 79 - 0
frameworks/Java/light-java/src/main/java/com/networknt/techempower/handler/UpdatesMysqlGetHandler.java

@@ -0,0 +1,79 @@
+package com.networknt.techempower.handler;
+
+import com.dslplatform.json.DslJson;
+import com.dslplatform.json.JsonWriter;
+import com.networknt.techempower.Helper;
+import com.networknt.techempower.db.mysql.MysqlStartupHookProvider;
+import com.networknt.techempower.model.World;
+import io.undertow.server.HttpHandler;
+import io.undertow.server.HttpServerExchange;
+import io.undertow.util.Headers;
+import io.undertow.util.HttpString;
+
+import java.nio.ByteBuffer;
+import java.sql.Connection;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.concurrent.Callable;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.Future;
+
+import org.apache.commons.lang3.StringEscapeUtils;
+
+import javax.sql.DataSource;
+
+public class UpdatesMysqlGetHandler implements HttpHandler {
+    private final DataSource ds = MysqlStartupHookProvider.ds;
+    private DslJson<Object> dsl = new DslJson<>();
+    private JsonWriter writer = dsl.newWriter(25000);
+
+    @Override
+    public void handleRequest(HttpServerExchange exchange) throws Exception {
+        if (exchange.isInIoThread()) {
+            exchange.dispatch(this);
+            return;
+        }
+        int queries = Helper.getQueries(exchange);
+        World[] worlds = new World[queries];
+        try (final Connection connection = ds.getConnection()) {
+            Map<Integer, Future<World>> futureWorlds = new ConcurrentHashMap<>();
+            for (int i = 0; i < queries; i++) {
+                futureWorlds.put(i, Helper.EXECUTOR.submit(new Callable<World>() {
+                    @Override
+                    public World call() throws Exception {
+                        World world;
+                        try (PreparedStatement update = connection.prepareStatement(
+                                "UPDATE world SET randomNumber = ? WHERE id= ?")) {
+                            try (PreparedStatement query = connection.prepareStatement(
+                                    "SELECT * FROM world WHERE id = ?",
+                                    ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY)) {
+
+                                query.setInt(1, Helper.randomWorld());
+                                try (ResultSet resultSet = query.executeQuery()) {
+                                    resultSet.next();
+                                    world = new World(
+                                            resultSet.getInt("id"),
+                                            resultSet.getInt("randomNumber"));
+                                }
+                            }
+                            world.randomNumber = Helper.randomWorld();
+                            update.setInt(1, world.randomNumber);
+                            update.setInt(2, world.id);
+                            update.executeUpdate();
+                            return world;
+                        }
+                    }
+                }));
+            }
+            for (int i = 0; i < queries; i++) {
+                worlds[i] = futureWorlds.get(i).get();
+            }
+        }
+        exchange.getResponseHeaders().put(Headers.CONTENT_TYPE, "application/json");
+        writer.reset();
+        writer.serialize(worlds, queries);
+        exchange.getResponseSender().send(ByteBuffer.wrap(writer.toByteArray()));
+    }
+}

+ 80 - 0
frameworks/Java/light-java/src/main/java/com/networknt/techempower/handler/UpdatesPostgresqlGetHandler.java

@@ -0,0 +1,80 @@
+package com.networknt.techempower.handler;
+
+import com.dslplatform.json.DslJson;
+import com.dslplatform.json.JsonWriter;
+import com.networknt.techempower.Helper;
+import com.networknt.techempower.db.mysql.MysqlStartupHookProvider;
+import com.networknt.techempower.db.postgres.PostgresStartupHookProvider;
+import com.networknt.techempower.model.World;
+import io.undertow.server.HttpHandler;
+import io.undertow.server.HttpServerExchange;
+import io.undertow.util.Headers;
+import io.undertow.util.HttpString;
+
+import java.nio.ByteBuffer;
+import java.sql.Connection;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.concurrent.Callable;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.Future;
+
+import org.apache.commons.lang3.StringEscapeUtils;
+
+import javax.sql.DataSource;
+
+public class UpdatesPostgresqlGetHandler implements HttpHandler {
+    private final DataSource ds = PostgresStartupHookProvider.ds;
+    private DslJson<Object> dsl = new DslJson<>();
+    private JsonWriter writer = dsl.newWriter(25000);
+
+    @Override
+    public void handleRequest(HttpServerExchange exchange) throws Exception {
+        if (exchange.isInIoThread()) {
+            exchange.dispatch(this);
+            return;
+        }
+        int queries = Helper.getQueries(exchange);
+        World[] worlds = new World[queries];
+        try (final Connection connection = ds.getConnection()) {
+            Map<Integer, Future<World>> futureWorlds = new ConcurrentHashMap<>();
+            for (int i = 0; i < queries; i++) {
+                futureWorlds.put(i, Helper.EXECUTOR.submit(new Callable<World>() {
+                    @Override
+                    public World call() throws Exception {
+                        World world;
+                        try (PreparedStatement update = connection.prepareStatement(
+                                "UPDATE world SET randomNumber = ? WHERE id= ?")) {
+                            try (PreparedStatement query = connection.prepareStatement(
+                                    "SELECT * FROM world WHERE id = ?",
+                                    ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY)) {
+
+                                query.setInt(1, Helper.randomWorld());
+                                try (ResultSet resultSet = query.executeQuery()) {
+                                    resultSet.next();
+                                    world = new World(
+                                            resultSet.getInt("id"),
+                                            resultSet.getInt("randomNumber"));
+                                }
+                            }
+                            world.randomNumber = Helper.randomWorld();
+                            update.setInt(1, world.randomNumber);
+                            update.setInt(2, world.id);
+                            update.executeUpdate();
+                            return world;
+                        }
+                    }
+                }));
+            }
+            for (int i = 0; i < queries; i++) {
+                worlds[i] = futureWorlds.get(i).get();
+            }
+        }
+        exchange.getResponseHeaders().put(Headers.CONTENT_TYPE, "application/json");
+        writer.reset();
+        writer.serialize(worlds, queries);
+        exchange.getResponseSender().send(ByteBuffer.wrap(writer.toByteArray()));
+    }
+}

+ 25 - 0
frameworks/Java/light-java/src/main/java/com/networknt/techempower/model/Fortune.java

@@ -0,0 +1,25 @@
+package com.networknt.techempower.model;
+
+/**
+ * The model for the "fortune" database table.
+ */
+public final class Fortune implements Comparable<Fortune> {
+    public int id;
+    public String message;
+
+    /**
+     * Constructs a new fortune object with the given parameters.
+     *
+     * @param id the ID of the fortune
+     * @param message the message of the fortune
+     */
+    public Fortune(int id, String message) {
+        this.id = id;
+        this.message = message;
+    }
+
+    @Override
+    public int compareTo(Fortune other) {
+        return message.compareTo(other.message);
+    }
+}

+ 35 - 0
frameworks/Java/light-java/src/main/java/com/networknt/techempower/model/World.java

@@ -0,0 +1,35 @@
+package com.networknt.techempower.model;
+
+import com.dslplatform.json.JsonObject;
+import com.dslplatform.json.JsonWriter;
+import com.dslplatform.json.NumberConverter;
+import com.sun.org.apache.xpath.internal.operations.Number;
+
+/**
+ * The model for the "world" database table.
+ */
+public final class World implements JsonObject {
+    public int id;
+    public int randomNumber;
+
+    /**
+     * Constructs a new world object with the given parameters.
+     *
+     * @param id the ID of the world
+     * @param randomNumber the random number of the world
+     */
+    public World(int id, int randomNumber) {
+        this.id = id;
+        this.randomNumber = randomNumber;
+    }
+
+    @Override
+    public void serialize(JsonWriter writer, boolean minimal) {
+        writer.writeByte(com.dslplatform.json.JsonWriter.OBJECT_START);
+        writer.writeAscii("\"id\":");
+        NumberConverter.serialize(this.id, writer);
+        writer.writeAscii(",\"randomNumber\":");
+        NumberConverter.serialize(this.randomNumber, writer);
+        writer.writeByte(com.dslplatform.json.JsonWriter.OBJECT_END);
+    }
+}

+ 24 - 0
frameworks/Java/light-java/src/main/resources/META-INF/services/com.networknt.handler.MiddlewareHandler

@@ -0,0 +1,24 @@
+# This file is generated and should not be changed unless you want to plug in more handlers into the handler chain
+# for cross cutting concerns. In most cases, you should replace some of the default handlers with your own implementation
+# Please note: the sequence of these handlers are very important.
+
+#Validator Validate request based on swagger specification (depending on Swagger and Body)
+#com.networknt.validator.ValidatorHandler
+#Sanitizer Encode cross site scripting
+#com.networknt.sanitizer.SanitizerHandler
+#SimpleAudit Log important info about the request into audit log
+#com.networknt.audit.AuditHandler
+#Body Parse body based on content type in the header.
+#com.networknt.body.BodyHandler
+#Security JWT token verification and scope verification (depending on SwaggerHandler)
+#com.networknt.security.JwtVerifyHandler
+#Swagger Parsing swagger specification based on request uri and method.
+#com.networknt.swagger.SwaggerHandler
+#Correlation Create correlationId if it doesn't exist in the request header and put it into the request header
+#com.networknt.correlation.CorrelationHandler
+#Traceability Put traceabilityId into response header from request header if it exists
+#com.networknt.traceability.TraceabilityHandler
+#Metrics In order to calculate response time accurately, this needs to be the second.
+#com.networknt.metrics.MetricsHandler
+#Exception Global exception handler that needs to be called first.
+#com.networknt.exception.ExceptionHandler

+ 1 - 0
frameworks/Java/light-java/src/main/resources/META-INF/services/com.networknt.server.HandlerProvider

@@ -0,0 +1 @@
+com.networknt.techempower.PathHandlerProvider

+ 3 - 0
frameworks/Java/light-java/src/main/resources/META-INF/services/com.networknt.server.ShutdownHookProvider

@@ -0,0 +1,3 @@
+# There is built in shutdown hook at the moment within the framework.
+# If you want to close database connections, release allocated resources etc. please
+# implement com.networknt.server.ShutdownHookProvider interface and put your class here.

+ 9 - 0
frameworks/Java/light-java/src/main/resources/META-INF/services/com.networknt.server.StartupHookProvider

@@ -0,0 +1,9 @@
+# This is the place to plugin your startup hooks to initialize Spring application context,
+# set up db connection pools and allocate resources.
+
+# config Json Path to use Jackson Parser
+com.networknt.server.JsonPathStartupHookProvider
+# init mysql connection pool
+com.networknt.techempower.db.mysql.MysqlStartupHookProvider
+# init postgres connection pool
+com.networknt.techempower.db.postgres.PostgresStartupHookProvider

+ 12 - 0
frameworks/Java/light-java/src/main/resources/config/mysql.json

@@ -0,0 +1,12 @@
+{
+  "description": "mysql connection",
+  "jdbcUrl": "jdbc:mysql://TFB-database:3306/hello_world",
+  "username": "benchmarkdbuser",
+  "password": "benchmarkdbpass",
+  "maximumPoolSize": 200,
+  "useServerPrepStmts": true,
+  "cachePrepStmts": true,
+  "cacheCallableStmts": true,
+  "prepStmtCacheSize": 4096,
+  "prepStmtCacheSqlLimit": 2048
+}

+ 19 - 0
frameworks/Java/light-java/src/main/resources/config/oauth/primary.crt

@@ -0,0 +1,19 @@
+-----BEGIN CERTIFICATE-----
+MIIDmzCCAoOgAwIBAgIEHnAgtDANBgkqhkiG9w0BAQsFADB+MQswCQYDVQQGEwJDQTEQMA4GA1UE
+CBMHT250YXJpbzEUMBIGA1UEBxMLTWlzc2lzc2F1Z2ExJjAkBgNVBAoTHU5ldHdvcmsgTmV3IFRl
+Y2hub2xvZ2llcyBJbmMuMQwwCgYDVQQLEwNERVYxETAPBgNVBAMTCFN0ZXZlIEh1MB4XDTE2MDkw
+MTE2MTYxNVoXDTI2MDcxMTE2MTYxNVowfjELMAkGA1UEBhMCQ0ExEDAOBgNVBAgTB09udGFyaW8x
+FDASBgNVBAcTC01pc3Npc3NhdWdhMSYwJAYDVQQKEx1OZXR3b3JrIE5ldyBUZWNobm9sb2dpZXMg
+SW5jLjEMMAoGA1UECxMDREVWMREwDwYDVQQDEwhTdGV2ZSBIdTCCASIwDQYJKoZIhvcNAQEBBQAD
+ggEPADCCAQoCggEBALrlxMtDb60DogElf4TBz504tRheZimAE0dJL/Yby4nacJdqvc5l4z+WWpDf
+rI9krQ2Yi9yvhwAP+PrR6gWcIqWP4cpNE7XIAUDgr4CtyI7CptT/lpjtbkz4DGCMmaeDn0jqHqJt
+SeSZGfwVu5zAGm8n4sHatjnnxBI/iWzkTII3V4xv0WeK37szNTEd+ly2ag7n2IV5zNnYmqZTeMQm
+J2ENS+IwAG3ENtiVtrVTx/2bGtqutJjtdxsN58/cUG/guRyMT6OPI8Yi3ZzevdvRbxadyhEl/Kaw
+6vJcdxmJI3tp4lx+p6sAxOWa7aapJe4JxutAQqzv0GKdVjoHKQ1wB60CAwEAAaMhMB8wHQYDVR0O
+BBYEFIPF9SBd06RWU1eDL73CKfy01lavMA0GCSqGSIb3DQEBCwUAA4IBAQAoaKZGOak3Upz/ordF
+slZoJuZlCu7jnKQEjYwHf3DNxcd1WmgFPtMcna6pW0VUxPIfidEA6VCMsGoK1RvshB0SjrRdCht6
+5qPXs9kV3NW0WvMiwDSYZZ9HgaZ9efTe5E9Fzc7ltKrE43L6k8NJcaEEWEdpdjFbrAqH4I+j/Vro
+K3OhIo062fXjas5ipL4gF+3ECImjWzirQP8UiAfM0/36x7rtAu3btH/qI9hSyx39LBPPE5AsDJZ4
+dSMwNTW1gqmBAZIj+zQ/RD5dyWfPwON7Q+t96YbK6WBuYo0xy+I+PjcUgrWYWP3N24hlq8ZBIei+
+BudoEVJlIlmS0aRCuP8n
+-----END CERTIFICATE-----

+ 19 - 0
frameworks/Java/light-java/src/main/resources/config/oauth/secondary.crt

@@ -0,0 +1,19 @@
+-----BEGIN CERTIFICATE-----
+MIIDkzCCAnugAwIBAgIEUBGbJDANBgkqhkiG9w0BAQsFADB6MQswCQYDVQQGEwJDQTEQMA4GA1UE
+CBMHT250YXJpbzEQMA4GA1UEBxMHVG9yb250bzEmMCQGA1UEChMdTmV0d29yayBOZXcgVGVjaG5v
+bG9naWVzIEluYy4xDDAKBgNVBAsTA0FQSTERMA8GA1UEAxMIU3RldmUgSHUwHhcNMTYwOTIyMjI1
+OTIxWhcNMjYwODAxMjI1OTIxWjB6MQswCQYDVQQGEwJDQTEQMA4GA1UECBMHT250YXJpbzEQMA4G
+A1UEBxMHVG9yb250bzEmMCQGA1UEChMdTmV0d29yayBOZXcgVGVjaG5vbG9naWVzIEluYy4xDDAK
+BgNVBAsTA0FQSTERMA8GA1UEAxMIU3RldmUgSHUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK
+AoIBAQCqYfarFwug2DwpG/mmcW77OluaHVNsKEVJ/BptLp5suJAH/Z70SS5pwM4x2QwMOVO2ke8U
+rsAws8allxcuKXrbpVt4evpO1Ly2sFwqB1bjN3+VMp6wcT+tSjzYdVGFpQAYHpeA+OLuoHtQyfpB
+0KCveTEe3KAG33zXDNfGKTGmupZ3ZfmBLINoey/X13rY71ITt67AY78VHUKb+D53MBahCcjJ9YpJ
+UHG+Sd3d4oeXiQcqJCBCVpD97awWARf8WYRIgU1xfCe06wQ3CzH3+GyfozLeu76Ni5PwE1tm7Dhg
+EDSSZo5khmzVzo4G0T2sOeshePc5weZBNRHdHlJA0L0fAgMBAAGjITAfMB0GA1UdDgQWBBT9rnek
+spnrFus5wTszjdzYgKll9TANBgkqhkiG9w0BAQsFAAOCAQEAT8udTfUGBgeWbN6ZAXRI64VsSJj5
+1sNUN1GPDADLxZF6jArKU7LjBNXn9bG5VjJqlx8hQ1SNvi/t7FqBRCUt/3MxDmGZrVZqLY1kZ2e7
+x+5RykbspA8neEUtU8sOr/NP3O5jBjU77EVec9hNNT5zwKLevZNL/Q5mfHoc4GrIAolQvi/5fEqC
+8OMdOIWS6sERgjaeI4tXxQtHDcMo5PeLW0/7t5sgEsadZ+pkdeEMVTmLfgf97bpNNI7KF5uEbYnQ
+NpwCT+NNC5ACmJmKidrfW23kml1C7vr7YzTevw9QuH/hN8l/Rh0fr+iPEVpgN6Zv00ymoKGmjuuW
+owVmdKg/0w==
+-----END CERTIFICATE-----

+ 7 - 0
frameworks/Java/light-java/src/main/resources/config/postgres.json

@@ -0,0 +1,7 @@
+{
+  "description": "postgresql connection",
+  "jdbcUrl": "jdbc:postgresql://TFB-database:5432/hello_world",
+  "username": "benchmarkdbuser",
+  "password": "benchmarkdbpass",
+  "maximumPoolSize": 200
+}

+ 15 - 0
frameworks/Java/light-java/src/main/resources/config/security.json

@@ -0,0 +1,15 @@
+{
+  "description": "security configuration",
+  "enableVerifyJwt": false,
+  "enableVerifyScope": true,
+  "enableMockJwt": false,
+  "jwt": {
+    "certificate": {
+      "100": "oauth/primary.crt",
+      "101": "oauth/secondary.crt"
+    },
+    "clockSkewInSeconds": 60
+  },
+  "logJwtToken": true,
+  "logClientUserScope": false
+}

+ 16 - 0
frameworks/Java/light-java/src/main/resources/config/server.json

@@ -0,0 +1,16 @@
+{
+  "description": "server config",
+  "ip": "0.0.0.0",
+  "httpPort": 8080,
+  "enableHttp": true,
+  "httpsPort": 8443,
+  "enableHttps": false,
+  "keystoreName": "tls/server.keystore",
+  "keystorePass": "secret",
+  "keyPass": "secret",
+  "enableTwoWayTls": false,
+  "truststoreName": "tls/server.truststore",
+  "truststorePass": "password",
+  "serviceId": "com.networknt.techempower-1.0.0",
+  "enableRegistry": false
+}

+ 176 - 0
frameworks/Java/light-java/src/main/resources/config/swagger.json

@@ -0,0 +1,176 @@
+{
+  "swagger" : "2.0",
+  "info" : {
+    "description" : "A light-java implementation of benchmark",
+    "version" : "1.0.0",
+    "title" : "Tech Empower Performance Benchmark",
+    "contact" : {
+      "email" : "[email protected]"
+    },
+    "license" : {
+      "name" : "Apache 2.0",
+      "url" : "http://www.apache.org/licenses/LICENSE-2.0.html"
+    }
+  },
+  "host" : "benchmark.networknt.com",
+  "schemes" : [ "http" ],
+  "consumes" : [ "application/json" ],
+  "produces" : [ "application/json" ],
+  "paths" : {
+    "/cache" : {
+      "get" : {
+        "description" : "cache serialization",
+        "operationId" : "getCache",
+        "parameters" : [ ],
+        "responses" : {
+          "200" : {
+            "description" : "Successful response"
+          }
+        },
+        "x-accepts" : "application/json",
+        "x-contentType" : "application/json"
+      }
+    },
+    "/db/mysql" : {
+      "get" : {
+        "description" : "mysql single query",
+        "operationId" : "getQueryMysql",
+        "parameters" : [ ],
+        "responses" : {
+          "200" : {
+            "description" : "Successful response"
+          }
+        },
+        "x-accepts" : "application/json",
+        "x-contentType" : "application/json"
+      }
+    },
+    "/db/postgresql" : {
+      "get" : {
+        "description" : "postgres single query",
+        "operationId" : "getQueryPostgres",
+        "parameters" : [ ],
+        "responses" : {
+          "200" : {
+            "description" : "Successful response"
+          }
+        },
+        "x-accepts" : "application/json",
+        "x-contentType" : "application/json"
+      }
+    },
+    "/fortunes/mysql" : {
+      "get" : {
+        "description" : "mysql fortunes",
+        "operationId" : "getFortunesMysql",
+        "parameters" : [ ],
+        "responses" : {
+          "200" : {
+            "description" : "Successful response"
+          }
+        },
+        "x-accepts" : "application/json",
+        "x-contentType" : "application/json"
+      }
+    },
+    "/fortunes/postgresql" : {
+      "get" : {
+        "description" : "postgres fortunes",
+        "operationId" : "getFortunesPostgres",
+        "parameters" : [ ],
+        "responses" : {
+          "200" : {
+            "description" : "Successful response"
+          }
+        },
+        "x-accepts" : "application/json",
+        "x-contentType" : "application/json"
+      }
+    },
+    "/json" : {
+      "get" : {
+        "description" : "json serialization",
+        "operationId" : "getJson",
+        "parameters" : [ ],
+        "responses" : {
+          "200" : {
+            "description" : "Successful response"
+          }
+        },
+        "x-accepts" : "application/json",
+        "x-contentType" : "application/json"
+      }
+    },
+    "/plaintext" : {
+      "get" : {
+        "description" : "plain text serialization",
+        "operationId" : "getPlainText",
+        "parameters" : [ ],
+        "responses" : {
+          "200" : {
+            "description" : "Successful response"
+          }
+        },
+        "x-accepts" : "application/json",
+        "x-contentType" : "application/json"
+      }
+    },
+    "/queries/mysql" : {
+      "get" : {
+        "description" : "mysql multiple query",
+        "operationId" : "getQueriesMysql",
+        "parameters" : [ ],
+        "responses" : {
+          "200" : {
+            "description" : "Successful response"
+          }
+        },
+        "x-accepts" : "application/json",
+        "x-contentType" : "application/json"
+      }
+    },
+    "/queries/postgresql" : {
+      "get" : {
+        "description" : "postgres multiple query",
+        "operationId" : "getQueriesPostgres",
+        "parameters" : [ ],
+        "responses" : {
+          "200" : {
+            "description" : "Successful response"
+          }
+        },
+        "x-accepts" : "application/json",
+        "x-contentType" : "application/json"
+      }
+    },
+    "/updates/mysql" : {
+      "get" : {
+        "description" : "mysql updates",
+        "operationId" : "getUpdatesMysql",
+        "parameters" : [ ],
+        "responses" : {
+          "200" : {
+            "description" : "Successful response"
+          }
+        },
+        "x-accepts" : "application/json",
+        "x-contentType" : "application/json"
+      }
+    },
+    "/updates/postgresql" : {
+      "get" : {
+        "description" : "postgres updates",
+        "operationId" : "getUpdatesPostgres",
+        "parameters" : [ ],
+        "responses" : {
+          "200" : {
+            "description" : "Successful response"
+          }
+        },
+        "x-accepts" : "application/json",
+        "x-contentType" : "application/json"
+      }
+    }
+  },
+  "definitions" : { }
+}

BIN
frameworks/Java/light-java/src/main/resources/config/tls/server.keystore


BIN
frameworks/Java/light-java/src/main/resources/config/tls/server.truststore


+ 20 - 0
frameworks/Java/light-java/src/main/resources/fortunes.mustache

@@ -0,0 +1,20 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <title>Fortunes</title>
+</head>
+<body>
+<table>
+    <tr>
+        <th>id</th>
+        <th>message</th>
+    </tr>
+    {{#.}}
+      <tr>
+          <td>{{id}}</td>
+          <td>{{message}}</td>
+      </tr>
+    {{/.}}
+</table>
+</body>
+</html>

+ 74 - 0
frameworks/Java/light-java/src/main/resources/logback.xml

@@ -0,0 +1,74 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ~ Copyright (c) 2016 Network New Technologies Inc.
+  ~
+  ~ 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.
+  -->
+
+<configuration>
+    TODO create logger for audit only.
+    http://stackoverflow.com/questions/2488558/logback-to-log-different-messages-to-two-files
+    <turboFilter class="ch.qos.logback.classic.turbo.MarkerFilter">
+        <Marker>PROFILER</Marker>
+        <!--<OnMatch>DENY</OnMatch>-->
+        <OnMatch>NEUTRAL</OnMatch>
+    </turboFilter>
+
+    <appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
+        <!-- encoders are assigned the type
+             ch.qos.logback.classic.encoder.PatternLayoutEncoder by default -->
+        <encoder>
+            <pattern>%d{HH:mm:ss.SSS} [%thread] %X{cId} %-5level %logger{36} - %msg%n</pattern>
+        </encoder>
+    </appender>
+
+    <appender name="log" class="ch.qos.logback.core.FileAppender">
+        <File>target/test.log</File>
+        <Append>false</Append>
+        <layout class="ch.qos.logback.classic.PatternLayout">
+            <Pattern>%d{HH:mm:ss.SSS} [%thread] %X{cId} %-5level %class{36}:%L %M - %msg%n</Pattern>
+        </layout>
+    </appender>
+
+    <!--audit log-->
+    <appender name="audit" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <file>target/audit.log</file> <!-- logfile location -->
+        <encoder>
+            <pattern>%-5level [%thread] %date{ISO8601} %F:%L - %msg%n
+            </pattern> <!-- the layout pattern used to format log entries -->
+            <immediateFlush>true</immediateFlush>
+        </encoder>
+        <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
+            <fileNamePattern>target/audit.log.%i.zip</fileNamePattern>
+            <minIndex>1</minIndex>
+            <maxIndex>5</maxIndex> <!-- max number of archived logs that are kept -->
+        </rollingPolicy>
+        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
+            <maxFileSize>200MB
+            </maxFileSize> <!-- The size of the logfile that triggers a switch to a new logfile, and the current one archived -->
+        </triggeringPolicy>
+    </appender>
+
+    <root level="error">
+        <appender-ref ref="stdout"/>
+    </root>
+
+    <logger name="com.networknt" level="error">
+        <appender-ref ref="log"/>
+    </logger>
+
+    <logger name="Audit" level="error" additivity="false">
+        <appender-ref ref="audit"/>
+    </logger>
+
+</configuration>

+ 43 - 0
frameworks/Java/light-java/src/test/java/com/networknt/techempower/handler/DbMysqlGetHandlerTest.java

@@ -0,0 +1,43 @@
+package com.networknt.techempower.handler;
+
+import com.networknt.client.Client;
+import com.networknt.server.Server;
+import com.networknt.exception.ClientException;
+import com.networknt.exception.ApiException;
+import org.apache.commons.io.IOUtils;
+import org.apache.http.HttpResponse;
+import org.apache.http.client.ClientProtocolException;
+import org.apache.http.client.ResponseHandler;
+import org.apache.http.client.methods.*;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.junit.*;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.IOException;
+
+/**
+* Generated by swagger-codegen
+*/
+public class DbMysqlGetHandlerTest {
+    @ClassRule
+    public static TestServer server = TestServer.getInstance();
+
+    static final Logger logger = LoggerFactory.getLogger(DbMysqlGetHandlerTest.class);
+
+    @Test
+    public void testDbMysqlGetHandler() throws ClientException, ApiException {
+        CloseableHttpClient client = Client.getInstance().getSyncClient();
+        HttpGet httpGet = new HttpGet("http://localhost:8080/db/mysql");
+        /*
+        Client.getInstance().addAuthorization(httpPost);
+        try {
+            CloseableHttpResponse response = client.execute(httpGet);
+            Assert.assertEquals(200, response.getStatusLine().getStatusCode());
+            Assert.assertEquals("getQueryMysql", IOUtils.toString(response.getEntity().getContent(), "utf8"));
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        */
+    }
+}

+ 43 - 0
frameworks/Java/light-java/src/test/java/com/networknt/techempower/handler/DbPostgresqlGetHandlerTest.java

@@ -0,0 +1,43 @@
+package com.networknt.techempower.handler;
+
+import com.networknt.client.Client;
+import com.networknt.server.Server;
+import com.networknt.exception.ClientException;
+import com.networknt.exception.ApiException;
+import org.apache.commons.io.IOUtils;
+import org.apache.http.HttpResponse;
+import org.apache.http.client.ClientProtocolException;
+import org.apache.http.client.ResponseHandler;
+import org.apache.http.client.methods.*;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.junit.*;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.IOException;
+
+/**
+* Generated by swagger-codegen
+*/
+public class DbPostgresqlGetHandlerTest {
+    @ClassRule
+    public static TestServer server = TestServer.getInstance();
+
+    static final Logger logger = LoggerFactory.getLogger(DbPostgresqlGetHandlerTest.class);
+
+    @Test
+    public void testDbPostgresqlGetHandler() throws ClientException, ApiException {
+        CloseableHttpClient client = Client.getInstance().getSyncClient();
+        HttpGet httpGet = new HttpGet("http://localhost:8080/db/postgresql");
+        /*
+        Client.getInstance().addAuthorization(httpPost);
+        try {
+            CloseableHttpResponse response = client.execute(httpGet);
+            Assert.assertEquals(200, response.getStatusLine().getStatusCode());
+            Assert.assertEquals("getQueryPostgres", IOUtils.toString(response.getEntity().getContent(), "utf8"));
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        */
+    }
+}

+ 43 - 0
frameworks/Java/light-java/src/test/java/com/networknt/techempower/handler/FortunesMysqlGetHandlerTest.java

@@ -0,0 +1,43 @@
+package com.networknt.techempower.handler;
+
+import com.networknt.client.Client;
+import com.networknt.server.Server;
+import com.networknt.exception.ClientException;
+import com.networknt.exception.ApiException;
+import org.apache.commons.io.IOUtils;
+import org.apache.http.HttpResponse;
+import org.apache.http.client.ClientProtocolException;
+import org.apache.http.client.ResponseHandler;
+import org.apache.http.client.methods.*;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.junit.*;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.IOException;
+
+/**
+* Generated by swagger-codegen
+*/
+public class FortunesMysqlGetHandlerTest {
+    @ClassRule
+    public static TestServer server = TestServer.getInstance();
+
+    static final Logger logger = LoggerFactory.getLogger(FortunesMysqlGetHandlerTest.class);
+
+    @Test
+    public void testFortunesMysqlGetHandler() throws ClientException, ApiException {
+        CloseableHttpClient client = Client.getInstance().getSyncClient();
+        HttpGet httpGet = new HttpGet("http://localhost:8080/fortunes/mysql");
+        /*
+        Client.getInstance().addAuthorization(httpPost);
+        try {
+            CloseableHttpResponse response = client.execute(httpGet);
+            Assert.assertEquals(200, response.getStatusLine().getStatusCode());
+            Assert.assertEquals("getFortunesMysql", IOUtils.toString(response.getEntity().getContent(), "utf8"));
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        */
+    }
+}

+ 43 - 0
frameworks/Java/light-java/src/test/java/com/networknt/techempower/handler/FortunesPostgresqlGetHandlerTest.java

@@ -0,0 +1,43 @@
+package com.networknt.techempower.handler;
+
+import com.networknt.client.Client;
+import com.networknt.server.Server;
+import com.networknt.exception.ClientException;
+import com.networknt.exception.ApiException;
+import org.apache.commons.io.IOUtils;
+import org.apache.http.HttpResponse;
+import org.apache.http.client.ClientProtocolException;
+import org.apache.http.client.ResponseHandler;
+import org.apache.http.client.methods.*;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.junit.*;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.IOException;
+
+/**
+* Generated by swagger-codegen
+*/
+public class FortunesPostgresqlGetHandlerTest {
+    @ClassRule
+    public static TestServer server = TestServer.getInstance();
+
+    static final Logger logger = LoggerFactory.getLogger(FortunesPostgresqlGetHandlerTest.class);
+
+    @Test
+    public void testFortunesPostgresqlGetHandler() throws ClientException, ApiException {
+        CloseableHttpClient client = Client.getInstance().getSyncClient();
+        HttpGet httpGet = new HttpGet("http://localhost:8080/fortunes/postgresql");
+        /*
+        Client.getInstance().addAuthorization(httpPost);
+        try {
+            CloseableHttpResponse response = client.execute(httpGet);
+            Assert.assertEquals(200, response.getStatusLine().getStatusCode());
+            Assert.assertEquals("getFortunesPostgres", IOUtils.toString(response.getEntity().getContent(), "utf8"));
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        */
+    }
+}

+ 43 - 0
frameworks/Java/light-java/src/test/java/com/networknt/techempower/handler/JsonGetHandlerTest.java

@@ -0,0 +1,43 @@
+package com.networknt.techempower.handler;
+
+import com.networknt.client.Client;
+import com.networknt.server.Server;
+import com.networknt.exception.ClientException;
+import com.networknt.exception.ApiException;
+import org.apache.commons.io.IOUtils;
+import org.apache.http.HttpResponse;
+import org.apache.http.client.ClientProtocolException;
+import org.apache.http.client.ResponseHandler;
+import org.apache.http.client.methods.*;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.junit.*;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.IOException;
+
+/**
+* Generated by swagger-codegen
+*/
+public class JsonGetHandlerTest {
+    @ClassRule
+    public static TestServer server = TestServer.getInstance();
+
+    static final Logger logger = LoggerFactory.getLogger(JsonGetHandlerTest.class);
+
+    @Test
+    public void testJsonGetHandler() throws ClientException, ApiException {
+        CloseableHttpClient client = Client.getInstance().getSyncClient();
+        HttpGet httpGet = new HttpGet("http://localhost:8080/json");
+        /*
+        Client.getInstance().addAuthorization(httpPost);
+        try {
+            CloseableHttpResponse response = client.execute(httpGet);
+            Assert.assertEquals(200, response.getStatusLine().getStatusCode());
+            Assert.assertEquals("getJson", IOUtils.toString(response.getEntity().getContent(), "utf8"));
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        */
+    }
+}

+ 43 - 0
frameworks/Java/light-java/src/test/java/com/networknt/techempower/handler/PlaintextGetHandlerTest.java

@@ -0,0 +1,43 @@
+package com.networknt.techempower.handler;
+
+import com.networknt.client.Client;
+import com.networknt.server.Server;
+import com.networknt.exception.ClientException;
+import com.networknt.exception.ApiException;
+import org.apache.commons.io.IOUtils;
+import org.apache.http.HttpResponse;
+import org.apache.http.client.ClientProtocolException;
+import org.apache.http.client.ResponseHandler;
+import org.apache.http.client.methods.*;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.junit.*;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.IOException;
+
+/**
+* Generated by swagger-codegen
+*/
+public class PlaintextGetHandlerTest {
+    @ClassRule
+    public static TestServer server = TestServer.getInstance();
+
+    static final Logger logger = LoggerFactory.getLogger(PlaintextGetHandlerTest.class);
+
+    @Test
+    public void testPlaintextGetHandler() throws ClientException, ApiException {
+        CloseableHttpClient client = Client.getInstance().getSyncClient();
+        HttpGet httpGet = new HttpGet("http://localhost:8080/plaintext");
+        /*
+        Client.getInstance().addAuthorization(httpPost);
+        try {
+            CloseableHttpResponse response = client.execute(httpGet);
+            Assert.assertEquals(200, response.getStatusLine().getStatusCode());
+            Assert.assertEquals("getPlainText", IOUtils.toString(response.getEntity().getContent(), "utf8"));
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        */
+    }
+}

+ 43 - 0
frameworks/Java/light-java/src/test/java/com/networknt/techempower/handler/QueriesMysqlGetHandlerTest.java

@@ -0,0 +1,43 @@
+package com.networknt.techempower.handler;
+
+import com.networknt.client.Client;
+import com.networknt.server.Server;
+import com.networknt.exception.ClientException;
+import com.networknt.exception.ApiException;
+import org.apache.commons.io.IOUtils;
+import org.apache.http.HttpResponse;
+import org.apache.http.client.ClientProtocolException;
+import org.apache.http.client.ResponseHandler;
+import org.apache.http.client.methods.*;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.junit.*;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.IOException;
+
+/**
+* Generated by swagger-codegen
+*/
+public class QueriesMysqlGetHandlerTest {
+    @ClassRule
+    public static TestServer server = TestServer.getInstance();
+
+    static final Logger logger = LoggerFactory.getLogger(QueriesMysqlGetHandlerTest.class);
+
+    @Test
+    public void testQueriesMysqlGetHandler() throws ClientException, ApiException {
+        CloseableHttpClient client = Client.getInstance().getSyncClient();
+        HttpGet httpGet = new HttpGet("http://localhost:8080/queries/mysql");
+        /*
+        Client.getInstance().addAuthorization(httpPost);
+        try {
+            CloseableHttpResponse response = client.execute(httpGet);
+            Assert.assertEquals(200, response.getStatusLine().getStatusCode());
+            Assert.assertEquals("getQueriesMysql", IOUtils.toString(response.getEntity().getContent(), "utf8"));
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        */
+    }
+}

+ 43 - 0
frameworks/Java/light-java/src/test/java/com/networknt/techempower/handler/QueriesPostgresqlGetHandlerTest.java

@@ -0,0 +1,43 @@
+package com.networknt.techempower.handler;
+
+import com.networknt.client.Client;
+import com.networknt.server.Server;
+import com.networknt.exception.ClientException;
+import com.networknt.exception.ApiException;
+import org.apache.commons.io.IOUtils;
+import org.apache.http.HttpResponse;
+import org.apache.http.client.ClientProtocolException;
+import org.apache.http.client.ResponseHandler;
+import org.apache.http.client.methods.*;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.junit.*;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.IOException;
+
+/**
+* Generated by swagger-codegen
+*/
+public class QueriesPostgresqlGetHandlerTest {
+    @ClassRule
+    public static TestServer server = TestServer.getInstance();
+
+    static final Logger logger = LoggerFactory.getLogger(QueriesPostgresqlGetHandlerTest.class);
+
+    @Test
+    public void testQueriesPostgresqlGetHandler() throws ClientException, ApiException {
+        CloseableHttpClient client = Client.getInstance().getSyncClient();
+        HttpGet httpGet = new HttpGet("http://localhost:8080/queries/postgresql");
+        /*
+        Client.getInstance().addAuthorization(httpPost);
+        try {
+            CloseableHttpResponse response = client.execute(httpGet);
+            Assert.assertEquals(200, response.getStatusLine().getStatusCode());
+            Assert.assertEquals("getQueriesPostgres", IOUtils.toString(response.getEntity().getContent(), "utf8"));
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        */
+    }
+}

+ 44 - 0
frameworks/Java/light-java/src/test/java/com/networknt/techempower/handler/TestServer.java

@@ -0,0 +1,44 @@
+package com.networknt.techempower.handler;
+
+import com.networknt.server.Server;
+import org.junit.rules.ExternalResource;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import java.util.concurrent.atomic.AtomicInteger;
+
+public class TestServer extends ExternalResource {
+    static final Logger logger = LoggerFactory.getLogger(TestServer.class);
+
+    private static final AtomicInteger refCount = new AtomicInteger(0);
+    private static Server server;
+
+    private static final TestServer instance  = new TestServer();
+
+    public static TestServer getInstance () {
+        return instance;
+    }
+
+    private TestServer() {
+
+    }
+
+    @Override
+    protected void before() {
+        try {
+            if (refCount.get() == 0) {
+                Server.start();
+            }
+        }
+        finally {
+            refCount.getAndIncrement();
+        }
+    }
+
+    @Override
+    protected void after() {
+        refCount.getAndDecrement();
+        if (refCount.get() == 0) {
+            Server.stop();
+        }
+    }
+}

+ 43 - 0
frameworks/Java/light-java/src/test/java/com/networknt/techempower/handler/UpdatesMysqlGetHandlerTest.java

@@ -0,0 +1,43 @@
+package com.networknt.techempower.handler;
+
+import com.networknt.client.Client;
+import com.networknt.server.Server;
+import com.networknt.exception.ClientException;
+import com.networknt.exception.ApiException;
+import org.apache.commons.io.IOUtils;
+import org.apache.http.HttpResponse;
+import org.apache.http.client.ClientProtocolException;
+import org.apache.http.client.ResponseHandler;
+import org.apache.http.client.methods.*;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.junit.*;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.IOException;
+
+/**
+* Generated by swagger-codegen
+*/
+public class UpdatesMysqlGetHandlerTest {
+    @ClassRule
+    public static TestServer server = TestServer.getInstance();
+
+    static final Logger logger = LoggerFactory.getLogger(UpdatesMysqlGetHandlerTest.class);
+
+    @Test
+    public void testUpdatesMysqlGetHandler() throws ClientException, ApiException {
+        CloseableHttpClient client = Client.getInstance().getSyncClient();
+        HttpGet httpGet = new HttpGet("http://localhost:8080/updates/mysql");
+        /*
+        Client.getInstance().addAuthorization(httpPost);
+        try {
+            CloseableHttpResponse response = client.execute(httpGet);
+            Assert.assertEquals(200, response.getStatusLine().getStatusCode());
+            Assert.assertEquals("getUpdatesMysql", IOUtils.toString(response.getEntity().getContent(), "utf8"));
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        */
+    }
+}

+ 36 - 0
frameworks/Java/light-java/src/test/java/com/networknt/techempower/handler/UpdatesPostgresqlGetHandlerTest.java

@@ -0,0 +1,36 @@
+package com.networknt.techempower.handler;
+
+import com.networknt.client.Client;
+import com.networknt.exception.ClientException;
+import com.networknt.exception.ApiException;
+import org.apache.http.client.methods.*;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.junit.*;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+* Generated by swagger-codegen
+*/
+public class UpdatesPostgresqlGetHandlerTest {
+    @ClassRule
+    public static TestServer server = TestServer.getInstance();
+
+    static final Logger logger = LoggerFactory.getLogger(UpdatesPostgresqlGetHandlerTest.class);
+
+    @Test
+    public void testUpdatesPostgresGetHandler() throws ClientException, ApiException {
+        CloseableHttpClient client = Client.getInstance().getSyncClient();
+        HttpGet httpGet = new HttpGet("http://localhost:8080/updates/postgres");
+        /*
+        Client.getInstance().addAuthorization(httpPost);
+        try {
+            CloseableHttpResponse response = client.execute(httpGet);
+            Assert.assertEquals(200, response.getStatusLine().getStatusCode());
+            Assert.assertEquals("getUpdatesPostgres", IOUtils.toString(response.getEntity().getContent(), "utf8"));
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        */
+    }
+}

+ 74 - 0
frameworks/Java/light-java/src/test/resources/logback-test.xml

@@ -0,0 +1,74 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ~ Copyright (c) 2016 Network New Technologies Inc.
+  ~
+  ~ 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.
+  -->
+
+<configuration>
+    TODO create logger for audit only.
+    http://stackoverflow.com/questions/2488558/logback-to-log-different-messages-to-two-files
+    <turboFilter class="ch.qos.logback.classic.turbo.MarkerFilter">
+        <Marker>PROFILER</Marker>
+        <!--<OnMatch>DENY</OnMatch>-->
+        <OnMatch>NEUTRAL</OnMatch>
+    </turboFilter>
+
+    <appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
+        <!-- encoders are assigned the type
+             ch.qos.logback.classic.encoder.PatternLayoutEncoder by default -->
+        <encoder>
+            <pattern>%d{HH:mm:ss.SSS} [%thread] %X{cId} %-5level %logger{36} - %msg%n</pattern>
+        </encoder>
+    </appender>
+
+    <appender name="log" class="ch.qos.logback.core.FileAppender">
+        <File>target/test.log</File>
+        <Append>false</Append>
+        <layout class="ch.qos.logback.classic.PatternLayout">
+            <Pattern>%d{HH:mm:ss.SSS} [%thread] %X{cId} %-5level %class{36}:%L %M - %msg%n</Pattern>
+        </layout>
+    </appender>
+
+    <!--audit log-->
+    <appender name="audit" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <file>target/audit.log</file> <!-- logfile location -->
+        <encoder>
+            <pattern>%-5level [%thread] %date{ISO8601} %F:%L - %msg%n
+            </pattern> <!-- the layout pattern used to format log entries -->
+            <immediateFlush>true</immediateFlush>
+        </encoder>
+        <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
+            <fileNamePattern>target/audit.log.%i.zip</fileNamePattern>
+            <minIndex>1</minIndex>
+            <maxIndex>5</maxIndex> <!-- max number of archived logs that are kept -->
+        </rollingPolicy>
+        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
+            <maxFileSize>200MB
+            </maxFileSize> <!-- The size of the logfile that triggers a switch to a new logfile, and the current one archived -->
+        </triggeringPolicy>
+    </appender>
+
+    <root level="error">
+        <appender-ref ref="stdout"/>
+    </root>
+
+    <logger name="com.networknt" level="error">
+        <appender-ref ref="log"/>
+    </logger>
+
+    <logger name="Audit" level="error" additivity="false">
+        <appender-ref ref="audit"/>
+    </logger>
+
+</configuration>