Browse Source

Merge branch 'master' into hikaricp-grizzly-jersey

Keith R. Gustafson 9 years ago
parent
commit
08b8ac3f87
100 changed files with 2057 additions and 99 deletions
  1. 3 0
      .travis.yml
  2. 2 0
      benchmark.cfg.example
  3. 1 1
      config/postgresql.conf
  4. 1 1
      frameworks/Clojure/aleph/setup.sh
  5. 1 1
      frameworks/Clojure/compojure/setup.sh
  6. 1 1
      frameworks/Clojure/http-kit/setup.sh
  7. 8 5
      frameworks/Clojure/luminus/hello/src/hello/routes/home.clj
  8. 1 1
      frameworks/Clojure/luminus/setup.sh
  9. 1 1
      frameworks/Clojure/pedestal/setup.sh
  10. 0 2
      frameworks/Go/go-raw/setup.sh
  11. 0 2
      frameworks/Go/go-raw/setup_prefork.sh
  12. 0 3
      frameworks/Go/go-raw/source_code
  13. 31 5
      frameworks/Go/go-raw/src/hello/hello.go
  14. 0 14
      frameworks/Go/go-raw/templates/fortune.html
  15. 0 9
      frameworks/Go/go-raw/templates/layout.html
  16. 1 1
      frameworks/Groovy/grails/setup.sh
  17. 1 9
      frameworks/Java/README.md
  18. 1 1
      frameworks/Java/activeweb/setup.sh
  19. 1 1
      frameworks/Java/comsat-servlet/setup-generic.sh
  20. 1 1
      frameworks/Java/comsat-webactors/setup-generic.sh
  21. 1 1
      frameworks/Java/curacao/setup.sh
  22. 2 3
      frameworks/Java/dropwizard/setup_mongo.sh
  23. 2 2
      frameworks/Java/dropwizard/setup_mysql.sh
  24. 2 3
      frameworks/Java/dropwizard/setup_postgres.sh
  25. 1 1
      frameworks/Java/gemini/start.sh
  26. 1 1
      frameworks/Java/gemini/start_postgres.sh
  27. 1 1
      frameworks/Java/grizzly-bm/setup.sh
  28. 1 1
      frameworks/Java/grizzly-jersey/setup.sh
  29. 1 1
      frameworks/Java/jawn/setup.sh
  30. 1 1
      frameworks/Java/jetty-servlet/setup.sh
  31. 1 1
      frameworks/Java/jetty/setup.sh
  32. 1 1
      frameworks/Java/jooby/setup.sh
  33. 1 1
      frameworks/Java/netty/setup.sh
  34. 1 1
      frameworks/Java/ninja-standalone/setup.sh
  35. 1 1
      frameworks/Java/play1/setup.sh
  36. 1 1
      frameworks/Java/play1siena/setup.sh
  37. 1 1
      frameworks/Java/play2-java/setup_java.sh
  38. 1 1
      frameworks/Java/play2-java/setup_java_ebean_bonecp.sh
  39. 1 1
      frameworks/Java/play2-java/setup_java_ebean_hikaricp.sh
  40. 1 1
      frameworks/Java/play2-java/setup_java_jpa_bonecp.sh
  41. 1 1
      frameworks/Java/play2-java/setup_java_jpa_hikaricp.sh
  42. 1 1
      frameworks/Java/rapidoid/setup.sh
  43. 1 1
      frameworks/Java/restexpress/setup.sh
  44. 1 1
      frameworks/Java/sabina/jetty-mongodb.sh
  45. 1 1
      frameworks/Java/sabina/jetty.sh
  46. 1 1
      frameworks/Java/sabina/undertow-mongodb.sh
  47. 1 1
      frameworks/Java/sabina/undertow.sh
  48. 1 1
      frameworks/Java/servlet-dsl/setup.sh
  49. 1 1
      frameworks/Java/servlet/setup.sh
  50. 1 1
      frameworks/Java/servlet3-cass/setup.sh
  51. 1 1
      frameworks/Java/spark/setup.sh
  52. 1 1
      frameworks/Java/spring/setup.sh
  53. 1 1
      frameworks/Java/tapestry/setup.sh
  54. 1 1
      frameworks/Java/undertow-edge/setup.sh
  55. 29 0
      frameworks/Java/undertow-jersey-c3p0/README.md
  56. 26 0
      frameworks/Java/undertow-jersey-c3p0/benchmark_config.json
  57. 125 0
      frameworks/Java/undertow-jersey-c3p0/pom.xml
  58. 7 0
      frameworks/Java/undertow-jersey-c3p0/setup.sh
  59. 18 0
      frameworks/Java/undertow-jersey-c3p0/src/main/java/hello/Common.java
  60. 80 0
      frameworks/Java/undertow-jersey-c3p0/src/main/java/hello/DbResource.java
  61. 44 0
      frameworks/Java/undertow-jersey-c3p0/src/main/java/hello/FortunesResource.java
  62. 79 0
      frameworks/Java/undertow-jersey-c3p0/src/main/java/hello/JerseyWebServer.java
  63. 50 0
      frameworks/Java/undertow-jersey-c3p0/src/main/java/hello/JsonMessageBodyWriter.java
  64. 22 0
      frameworks/Java/undertow-jersey-c3p0/src/main/java/hello/JsonResource.java
  65. 20 0
      frameworks/Java/undertow-jersey-c3p0/src/main/java/hello/RequestExceptionMapper.java
  66. 19 0
      frameworks/Java/undertow-jersey-c3p0/src/main/java/hello/ServerResponseFilter.java
  67. 45 0
      frameworks/Java/undertow-jersey-c3p0/src/main/java/hello/SessionFactoryProvider.java
  68. 30 0
      frameworks/Java/undertow-jersey-c3p0/src/main/java/hello/domain/Fortune.java
  69. 14 0
      frameworks/Java/undertow-jersey-c3p0/src/main/java/hello/domain/World.java
  70. 75 0
      frameworks/Java/undertow-jersey-c3p0/src/main/java/hello/undertow/UndertowContainerResponseWriter.java
  71. 112 0
      frameworks/Java/undertow-jersey-c3p0/src/main/java/hello/undertow/UndertowJerseyContainer.java
  72. 20 0
      frameworks/Java/undertow-jersey-c3p0/src/main/resources/fortunes.mustache
  73. 17 0
      frameworks/Java/undertow-jersey-c3p0/src/main/resources/hibernate.cfg.xml
  74. 29 0
      frameworks/Java/undertow-jersey-hikaricp/README.md
  75. 26 0
      frameworks/Java/undertow-jersey-hikaricp/benchmark_config.json
  76. 125 0
      frameworks/Java/undertow-jersey-hikaricp/pom.xml
  77. 7 0
      frameworks/Java/undertow-jersey-hikaricp/setup.sh
  78. 18 0
      frameworks/Java/undertow-jersey-hikaricp/src/main/java/hello/Common.java
  79. 80 0
      frameworks/Java/undertow-jersey-hikaricp/src/main/java/hello/DbResource.java
  80. 44 0
      frameworks/Java/undertow-jersey-hikaricp/src/main/java/hello/FortunesResource.java
  81. 79 0
      frameworks/Java/undertow-jersey-hikaricp/src/main/java/hello/JerseyWebServer.java
  82. 50 0
      frameworks/Java/undertow-jersey-hikaricp/src/main/java/hello/JsonMessageBodyWriter.java
  83. 22 0
      frameworks/Java/undertow-jersey-hikaricp/src/main/java/hello/JsonResource.java
  84. 20 0
      frameworks/Java/undertow-jersey-hikaricp/src/main/java/hello/RequestExceptionMapper.java
  85. 19 0
      frameworks/Java/undertow-jersey-hikaricp/src/main/java/hello/ServerResponseFilter.java
  86. 45 0
      frameworks/Java/undertow-jersey-hikaricp/src/main/java/hello/SessionFactoryProvider.java
  87. 30 0
      frameworks/Java/undertow-jersey-hikaricp/src/main/java/hello/domain/Fortune.java
  88. 14 0
      frameworks/Java/undertow-jersey-hikaricp/src/main/java/hello/domain/World.java
  89. 75 0
      frameworks/Java/undertow-jersey-hikaricp/src/main/java/hello/undertow/UndertowContainerResponseWriter.java
  90. 112 0
      frameworks/Java/undertow-jersey-hikaricp/src/main/java/hello/undertow/UndertowJerseyContainer.java
  91. 20 0
      frameworks/Java/undertow-jersey-hikaricp/src/main/resources/fortunes.mustache
  92. 16 0
      frameworks/Java/undertow-jersey-hikaricp/src/main/resources/hibernate.cfg.xml
  93. 1 1
      frameworks/Java/undertow/setup.sh
  94. 4 0
      frameworks/Java/vertx-web/.gitignore
  95. 63 0
      frameworks/Java/vertx-web/Readme.md
  96. 66 0
      frameworks/Java/vertx-web/benchmark_config.json
  97. 110 0
      frameworks/Java/vertx-web/pom.xml
  98. 34 0
      frameworks/Java/vertx-web/scripts/pipeline.lua
  99. 9 0
      frameworks/Java/vertx-web/setup.sh
  100. 15 0
      frameworks/Java/vertx-web/source_code

+ 3 - 0
.travis.yml

@@ -95,7 +95,10 @@ env:
     - "TESTDIR=Java/tapestry"
     - "TESTDIR=Java/tapestry"
     - "TESTDIR=Java/undertow"
     - "TESTDIR=Java/undertow"
     - "TESTDIR=Java/undertow-edge"
     - "TESTDIR=Java/undertow-edge"
+    - "TESTDIR=Java/undertow-jersey-c3p0"
+    - "TESTDIR=Java/undertow-jersey-hikaricp"
     - "TESTDIR=Java/vertx"
     - "TESTDIR=Java/vertx"
+    - "TESTDIR=Java/vertx-web"
     - "TESTDIR=Java/wicket"
     - "TESTDIR=Java/wicket"
     - "TESTDIR=Java/wildfly-ee7"
     - "TESTDIR=Java/wildfly-ee7"
     - "TESTDIR=JavaScript/express"
     - "TESTDIR=JavaScript/express"

+ 2 - 0
benchmark.cfg.example

@@ -28,3 +28,5 @@ sleep=60
 test=None
 test=None
 type=all
 type=all
 verbose=True
 verbose=True
+clean=False
+clean_all=False

+ 1 - 1
config/postgresql.conf

@@ -109,7 +109,7 @@ ssl = false                             # (change requires restart)
 # details: http://www.postgresql.org/docs/9.4/static/runtime-config-resource.html
 # details: http://www.postgresql.org/docs/9.4/static/runtime-config-resource.html
 # http://www.postgresql.org/docs/9.4/static/runtime-config-wal.html
 # http://www.postgresql.org/docs/9.4/static/runtime-config-wal.html
 # http://www.postgresql.org/docs/9.4/static/runtime-config-query.html
 # http://www.postgresql.org/docs/9.4/static/runtime-config-query.html
-shared_buffers = 2GB                    # min 128kB
+shared_buffers = 256MB                    # min 128kB
 work_mem = 64MB                                # min 64kB
 work_mem = 64MB                                # min 64kB
 maintenance_work_mem = 512MB            # min 1MB
 maintenance_work_mem = 512MB            # min 1MB
 checkpoint_segments = 64
 checkpoint_segments = 64

+ 1 - 1
frameworks/Clojure/aleph/setup.sh

@@ -1,6 +1,6 @@
 #!/bin/bash
 #!/bin/bash
 
 
-fw_depends java7 leiningen
+fw_depends java leiningen
 
 
 cd hello
 cd hello
 lein clean
 lein clean

+ 1 - 1
frameworks/Clojure/compojure/setup.sh

@@ -1,6 +1,6 @@
 #!/bin/bash
 #!/bin/bash
 
 
-fw_depends java8 resin leiningen
+fw_depends java resin leiningen
 
 
 sed -i 's|:subname "//.*:3306|:subname "//'"${DBHOST}"':3306|g' hello/src/hello/handler.clj
 sed -i 's|:subname "//.*:3306|:subname "//'"${DBHOST}"':3306|g' hello/src/hello/handler.clj
 
 

+ 1 - 1
frameworks/Clojure/http-kit/setup.sh

@@ -1,6 +1,6 @@
 #!/bin/bash
 #!/bin/bash
 
 
-fw_depends leiningen java8
+fw_depends leiningen java
 
 
 sed -i 's|:subname "//.*:3306|:subname "//'"${DBHOST}"':3306|g' hello/src/hello/handler.clj
 sed -i 's|:subname "//.*:3306|:subname "//'"${DBHOST}"':3306|g' hello/src/hello/handler.clj
 
 

+ 8 - 5
frameworks/Clojure/luminus/hello/src/hello/routes/home.clj

@@ -2,7 +2,7 @@
   (:require [hello.layout :as layout]
   (:require [hello.layout :as layout]
             [hello.db.core :as db]
             [hello.db.core :as db]
             [compojure.core :refer [defroutes GET]]
             [compojure.core :refer [defroutes GET]]
-            [ring.util.response :refer [response]]
+            [ring.util.response :refer [response content-type]]
             [clojure.java.io :as io]))
             [clojure.java.io :as io]))
 
 
 (def json-serialization
 (def json-serialization
@@ -35,15 +35,18 @@
 
 
 (def plaintext
 (def plaintext
   "Test 6: Plaintext"
   "Test 6: Plaintext"
-  {:status 200
-   :headers {"Content-Type" "text/plain"}
-   :body "Hello, World!"})
+  (->
+    (response "Hello, World!")
+    (content-type "text/plain")))
+
 
 
 (defroutes home-routes
 (defroutes home-routes
   (GET "/"                 [] "Hello, World!")
   (GET "/"                 [] "Hello, World!")
   (GET "/plaintext"        [] plaintext)
   (GET "/plaintext"        [] plaintext)
   (GET "/json"             [] json-serialization)
   (GET "/json"             [] json-serialization)
   (GET "/db"               [] (single-query-test))
   (GET "/db"               [] (single-query-test))
+  (GET "/queries/"         [] (multiple-query-test 1))
   (GET "/queries/:queries" [queries] (multiple-query-test queries))
   (GET "/queries/:queries" [queries] (multiple-query-test queries))
   (GET "/fortunes"         [] (fortunes))
   (GET "/fortunes"         [] (fortunes))
-  (GET "/updates/:queries"  [queries] (db-update queries)))
+  (GET "/updates/"         [] (db-update 1))
+  (GET "/updates/:queries" [queries] (db-update queries)))

+ 1 - 1
frameworks/Clojure/luminus/setup.sh

@@ -1,6 +1,6 @@
 #!/bin/bash
 #!/bin/bash
 
 
-fw_depends java7 resin leiningen 
+fw_depends java resin leiningen 
 
 
 # Update db host in the source file
 # Update db host in the source file
 sed -i 's|:subname "//.*:3306|:subname "//'"${DBHOST}"':3306|g' hello/src/hello/db/core.clj
 sed -i 's|:subname "//.*:3306|:subname "//'"${DBHOST}"':3306|g' hello/src/hello/db/core.clj

+ 1 - 1
frameworks/Clojure/pedestal/setup.sh

@@ -1,6 +1,6 @@
 #!/bin/bash
 #!/bin/bash
 
 
-fw_depends java7 leiningen
+fw_depends java leiningen
 
 
 sed -i 's|127.0.0.1:3306|'${DBHOST}':3306|g' src/pedestal/service.clj
 sed -i 's|127.0.0.1:3306|'${DBHOST}':3306|g' src/pedestal/service.clj
 
 

+ 0 - 2
frameworks/Go/go-raw/setup.sh

@@ -1,7 +1,5 @@
 #!/bin/bash
 #!/bin/bash
 
 
-sed -i 's|tcp(.*:3306)|tcp('"${DBHOST}"':3306)|g' src/hello/hello.go
-
 fw_depends go
 fw_depends go
 
 
 go get ./...
 go get ./...

+ 0 - 2
frameworks/Go/go-raw/setup_prefork.sh

@@ -1,7 +1,5 @@
 #!/bin/bash
 #!/bin/bash
 
 
-sed -i 's|tcp(.*:3306)|tcp('"${DBHOST}"':3306)|g' src/hello/hello.go
-
 fw_depends go
 fw_depends go
 
 
 go get ./...
 go get ./...

+ 0 - 3
frameworks/Go/go-raw/source_code

@@ -1,6 +1,3 @@
 ./go/src/
 ./go/src/
 ./go/src/hello
 ./go/src/hello
 ./go/src/hello/hello.go
 ./go/src/hello/hello.go
-./go/templates/
-./go/templates/fortune.html
-./go/templates/layout.html

+ 31 - 5
frameworks/Go/go-raw/src/hello/hello.go

@@ -4,6 +4,7 @@ import (
 	"database/sql"
 	"database/sql"
 	"encoding/json"
 	"encoding/json"
 	"flag"
 	"flag"
+	"fmt"
 	"html/template"
 	"html/template"
 	"log"
 	"log"
 	"math/rand"
 	"math/rand"
@@ -33,7 +34,28 @@ type Fortune struct {
 }
 }
 
 
 const (
 const (
+	// Content
 	helloWorldString = "Hello, World!"
 	helloWorldString = "Hello, World!"
+	fortuneHTML      = `<!DOCTYPE html>
+<html>
+<head>
+<title>Fortunes</title>
+</head>
+<body>
+<table>
+<tr>
+<th>id</th>
+<th>message</th>
+</tr>
+{{range .}}
+<tr>
+<td>{{.Id}}</td>
+<td>{{.Message}}</td>
+</tr>
+{{end}}
+</table>
+</body>
+</html>`
 
 
 	// Databases
 	// Databases
 	//
 	//
@@ -41,7 +63,7 @@ const (
 	// It reduces round trips without prepared statement.
 	// It reduces round trips without prepared statement.
 	//
 	//
 	// We can see difference between prepared statement and interpolation by comparing go-raw and go-raw-interpolate
 	// We can see difference between prepared statement and interpolation by comparing go-raw and go-raw-interpolate
-	connectionString = "benchmarkdbuser:benchmarkdbpass@tcp(localhost:3306)/hello_world?interpolateParams=true"
+	connectionString = "benchmarkdbuser:benchmarkdbpass@tcp(%s:3306)/hello_world?interpolateParams=true"
 	worldSelect      = "SELECT id, randomNumber FROM World WHERE id = ?"
 	worldSelect      = "SELECT id, randomNumber FROM World WHERE id = ?"
 	worldUpdate      = "UPDATE World SET randomNumber = ? WHERE id = ?"
 	worldUpdate      = "UPDATE World SET randomNumber = ? WHERE id = ?"
 	fortuneSelect    = "SELECT id, message FROM Fortune"
 	fortuneSelect    = "SELECT id, message FROM Fortune"
@@ -53,7 +75,7 @@ var (
 	helloWorldBytes = []byte(helloWorldString)
 	helloWorldBytes = []byte(helloWorldString)
 
 
 	// Templates
 	// Templates
-	tmpl = template.Must(template.ParseFiles("templates/layout.html", "templates/fortune.html"))
+	tmpl = template.Must(template.New("fortune.html").Parse(fortuneHTML))
 
 
 	// Database
 	// Database
 	db                    *sql.DB
 	db                    *sql.DB
@@ -67,7 +89,11 @@ var child = flag.Bool("child", false, "is child proc")
 
 
 func initDB() {
 func initDB() {
 	var err error
 	var err error
-	db, err = sql.Open("mysql", connectionString)
+	var dbhost = os.Getenv("DBHOST")
+	if dbhost == "" {
+		dbhost = "localhost"
+	}
+	db, err = sql.Open("mysql", fmt.Sprintf(connectionString, dbhost))
 	if err != nil {
 	if err != nil {
 		log.Fatalf("Error opening database: %v", err)
 		log.Fatalf("Error opening database: %v", err)
 	}
 	}
@@ -254,7 +280,7 @@ func fortuneHandler(w http.ResponseWriter, r *http.Request) {
 
 
 	sort.Sort(ByMessage{fortunes})
 	sort.Sort(ByMessage{fortunes})
 	w.Header().Set("Server", "Go")
 	w.Header().Set("Server", "Go")
-	w.Header().Set("Content-Type", "text/html")
+	w.Header().Set("Content-Type", "text/html; charset=utf-8")
 	if err := tmpl.Execute(w, fortunes); err != nil {
 	if err := tmpl.Execute(w, fortunes); err != nil {
 		http.Error(w, err.Error(), http.StatusInternalServerError)
 		http.Error(w, err.Error(), http.StatusInternalServerError)
 	}
 	}
@@ -271,7 +297,7 @@ func fortuneInterpolateHandler(w http.ResponseWriter, r *http.Request) {
 
 
 	sort.Sort(ByMessage{fortunes})
 	sort.Sort(ByMessage{fortunes})
 	w.Header().Set("Server", "Go")
 	w.Header().Set("Server", "Go")
-	w.Header().Set("Content-Type", "text/html")
+	w.Header().Set("Content-Type", "text/html; charset=utf-8")
 	if err := tmpl.Execute(w, fortunes); err != nil {
 	if err := tmpl.Execute(w, fortunes); err != nil {
 		http.Error(w, err.Error(), http.StatusInternalServerError)
 		http.Error(w, err.Error(), http.StatusInternalServerError)
 	}
 	}

+ 0 - 14
frameworks/Go/go-raw/templates/fortune.html

@@ -1,14 +0,0 @@
-{{define "content"}}
-<table>
-<tr>
-<th>id</th>
-<th>message</th>
-</tr>
-{{range .}}
-<tr>
-<td>{{.Id}}</td>
-<td>{{.Message}}</td>
-</tr>
-{{end}}
-</table>
-{{end}}

+ 0 - 9
frameworks/Go/go-raw/templates/layout.html

@@ -1,9 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
-<title>Fortunes</title>
-</head>
-<body>
-{{template "content" .}}
-</body>
-</html>

+ 1 - 1
frameworks/Groovy/grails/setup.sh

@@ -2,7 +2,7 @@
 
 
 sed -i 's|jdbc:mysql://.*:3306|jdbc:mysql://'"${DBHOST}"':3306|g' hello/grails-app/conf/DataSource.groovy
 sed -i 's|jdbc:mysql://.*:3306|jdbc:mysql://'"${DBHOST}"':3306|g' hello/grails-app/conf/DataSource.groovy
 
 
-fw_depends java7 grails resin 
+fw_depends java grails resin 
 
 
 cd hello
 cd hello
 grails -Dgrails.work.dir=${IROOT}/.grails -non-interactive -plain-output refresh-dependencies
 grails -Dgrails.work.dir=${IROOT}/.grails -non-interactive -plain-output refresh-dependencies

+ 1 - 9
frameworks/Java/README.md

@@ -6,7 +6,6 @@ For further guidance, review the
 
 
 ## Infrastructure Software Versions
 ## Infrastructure Software Versions
 
 
-* Java 7
 * Java 8
 * Java 8
 
 
 ## Adding a New Java Framework
 ## Adding a New Java Framework
@@ -20,14 +19,7 @@ should have an `install.sh` that contains at least
 
 
     fw_depends java
     fw_depends java
 
 
-This installs the OpenJDK 7 JVM.
-
-Frameworks can also choose to install Oracle Java 8 JVM by 
-declaring a dependency on "java8" instead of java. In order 
-to use Java 8 JVM frameworks need to add the following line 
-in their "setup.sh" file:
-
-    export JAVA_HOME=/opt/java8
+This installs the Oracle Java 8 JDK.
 
 
 ## Get Help
 ## Get Help
 
 

+ 1 - 1
frameworks/Java/activeweb/setup.sh

@@ -3,7 +3,7 @@
 sed -i 's|localhost|'"${DBHOST}"'|g' src/main/webapp/WEB-INF/resin-web.xml
 sed -i 's|localhost|'"${DBHOST}"'|g' src/main/webapp/WEB-INF/resin-web.xml
 sed -i 's|localhost|'"${DBHOST}"'|g' src/main/java/app/config/DbConfig.java
 sed -i 's|localhost|'"${DBHOST}"'|g' src/main/java/app/config/DbConfig.java
 
 
-fw_depends java7 resin maven
+fw_depends java resin maven
 
 
 mvn clean package
 mvn clean package
 rm -rf $RESIN_HOME/webapps/*
 rm -rf $RESIN_HOME/webapps/*

+ 1 - 1
frameworks/Java/comsat-servlet/setup-generic.sh

@@ -1,6 +1,6 @@
 #!/bin/bash
 #!/bin/bash
 
 
-fw_depends java8
+fw_depends java
 
 
 $TROOT/gradlew clean capsule
 $TROOT/gradlew clean capsule
 
 

+ 1 - 1
frameworks/Java/comsat-webactors/setup-generic.sh

@@ -1,6 +1,6 @@
 #!/bin/bash
 #!/bin/bash
 
 
-fw_depends java8
+fw_depends java
 
 
 $TROOT/gradlew capsule
 $TROOT/gradlew capsule
 
 

+ 1 - 1
frameworks/Java/curacao/setup.sh

@@ -1,6 +1,6 @@
 #!/bin/bash
 #!/bin/bash
 
 
-fw_depends java7 sbt
+fw_depends java sbt
 
 
 sbt assembly
 sbt assembly
 
 

+ 2 - 3
frameworks/Java/dropwizard/setup_mongo.sh

@@ -1,10 +1,9 @@
 #!/bin/bash
 #!/bin/bash
 
 
-# load java environment variables
-source $IROOT/java7.installed
+fw_depends java maven
 
 
 sed -i 's|host: 127.0.0.1|host: '"${DBHOST}"'|g' hello-world-mongo.yml
 sed -i 's|host: 127.0.0.1|host: '"${DBHOST}"'|g' hello-world-mongo.yml
 
 
 mvn -P mongo clean package
 mvn -P mongo clean package
 
 
-java -jar target/hello-world-0.0.1-SNAPSHOT.jar server hello-world-mongo.yml &
+java -jar target/hello-world-0.0.1-SNAPSHOT.jar server hello-world-mongo.yml &

+ 2 - 2
frameworks/Java/dropwizard/setup_mysql.sh

@@ -1,8 +1,8 @@
 #!/bin/bash
 #!/bin/bash
 
 
-sed -i 's|url: jdbc:mysql://.*/hello_world|url: jdbc:mysql://'"${DBHOST}"':3306/hello_world|g' hello-world-mysql.yml
+fw_depends java maven
 
 
-fw_depends java7 maven
+sed -i 's|url: jdbc:mysql://.*/hello_world|url: jdbc:mysql://'"${DBHOST}"':3306/hello_world|g' hello-world-mysql.yml
 
 
 mvn -P mysql clean package
 mvn -P mysql clean package
 
 

+ 2 - 3
frameworks/Java/dropwizard/setup_postgres.sh

@@ -1,10 +1,9 @@
 #!/bin/bash
 #!/bin/bash
 
 
-# load java environment variables
-source $IROOT/java7.installed
+fw_depends java maven
 
 
 sed -i 's|url: jdbc:postgresql://.*/hello_world|url: jdbc:postgresql://'"${DBHOST}"':5432/hello_world|g' hello-world-postgres.yml
 sed -i 's|url: jdbc:postgresql://.*/hello_world|url: jdbc:postgresql://'"${DBHOST}"':5432/hello_world|g' hello-world-postgres.yml
 
 
 mvn -P postgres clean package
 mvn -P postgres clean package
 
 
-java -jar target/hello-world-0.0.1-SNAPSHOT.jar server hello-world-postgres.yml &
+java -jar target/hello-world-0.0.1-SNAPSHOT.jar server hello-world-postgres.yml &

+ 1 - 1
frameworks/Java/gemini/start.sh

@@ -1,6 +1,6 @@
 #!/bin/bash
 #!/bin/bash
 
 
-fw_depends java7 resin maven
+fw_depends java resin maven
 
 
 sed -i 's|db.ConnectString = .*/|db.ConnectString = '"$DBHOST"':3306/|g' Docroot/WEB-INF/GeminiHello.conf
 sed -i 's|db.ConnectString = .*/|db.ConnectString = '"$DBHOST"':3306/|g' Docroot/WEB-INF/GeminiHello.conf
 sed -i 's|root-directory=".*/FrameworkBenchmarks/frameworks/Java/gemini|root-directory="'"$TROOT"'|g' Docroot/WEB-INF/resin.xml
 sed -i 's|root-directory=".*/FrameworkBenchmarks/frameworks/Java/gemini|root-directory="'"$TROOT"'|g' Docroot/WEB-INF/resin.xml

+ 1 - 1
frameworks/Java/gemini/start_postgres.sh

@@ -1,6 +1,6 @@
 #!/bin/bash
 #!/bin/bash
 
 
-fw_depends java7 resin maven
+fw_depends java resin maven
 
 
 sed -i 's|db.ConnectString = .*/|db.ConnectString = '"$DBHOST"':5432/|g' Docroot/WEB-INF/GeminiHello.conf
 sed -i 's|db.ConnectString = .*/|db.ConnectString = '"$DBHOST"':5432/|g' Docroot/WEB-INF/GeminiHello.conf
 sed -i 's|root-directory=".*/FrameworkBenchmarks/frameworks/Java/gemini|root-directory="'"$TROOT"'|g' Docroot/WEB-INF/resin.xml
 sed -i 's|root-directory=".*/FrameworkBenchmarks/frameworks/Java/gemini|root-directory="'"$TROOT"'|g' Docroot/WEB-INF/resin.xml

+ 1 - 1
frameworks/Java/grizzly-bm/setup.sh

@@ -1,6 +1,6 @@
 #!/bin/bash
 #!/bin/bash
 
 
-fw_depends java7 maven
+fw_depends java maven
 
 
 mvn clean compile assembly:single
 mvn clean compile assembly:single
 
 

+ 1 - 1
frameworks/Java/grizzly-jersey/setup.sh

@@ -1,6 +1,6 @@
 #!/bin/bash
 #!/bin/bash
 
 
-fw_depends java7 maven
+fw_depends java maven
 
 
 mvn clean package
 mvn clean package
 
 

+ 1 - 1
frameworks/Java/jawn/setup.sh

@@ -1,6 +1,6 @@
 #!/bin/bash
 #!/bin/bash
 
 
-fw_depends java8
+fw_depends java
 
 
 ./gradlew clean
 ./gradlew clean
 
 

+ 1 - 1
frameworks/Java/jetty-servlet/setup.sh

@@ -1,6 +1,6 @@
 #!/bin/bash
 #!/bin/bash
 
 
-fw_depends java7 maven
+fw_depends java maven
 
 
 mvn clean compile assembly:single
 mvn clean compile assembly:single
 
 

+ 1 - 1
frameworks/Java/jetty/setup.sh

@@ -1,6 +1,6 @@
 #!/bin/bash
 #!/bin/bash
 
 
-fw_depends java8 maven
+fw_depends java maven
 
 
 mvn clean compile assembly:single
 mvn clean compile assembly:single
 
 

+ 1 - 1
frameworks/Java/jooby/setup.sh

@@ -1,6 +1,6 @@
 #!/bin/bash
 #!/bin/bash
 
 
-fw_depends java8 maven
+fw_depends java maven
 
 
 mvn clean package
 mvn clean package
 
 

+ 1 - 1
frameworks/Java/netty/setup.sh

@@ -1,6 +1,6 @@
 #!/bin/bash
 #!/bin/bash
 
 
-fw_depends java7 maven
+fw_depends java maven
 
 
 mvn clean compile assembly:single
 mvn clean compile assembly:single
 
 

+ 1 - 1
frameworks/Java/ninja-standalone/setup.sh

@@ -2,7 +2,7 @@
 
 
 sed -i 's|mysql://.*:3306|mysql://'"${DBHOST}"':3306|g' src/main/java/conf/application.conf
 sed -i 's|mysql://.*:3306|mysql://'"${DBHOST}"':3306|g' src/main/java/conf/application.conf
 
 
-fw_depends java7 maven
+fw_depends java maven
 
 
 mvn clean compile assembly:single
 mvn clean compile assembly:single
 
 

+ 1 - 1
frameworks/Java/play1/setup.sh

@@ -2,6 +2,6 @@
 
 
 sed -i 's|jdbc:mysql://.*:3306|jdbc:mysql://'"${DBHOST}"':3306|g' conf/application.conf
 sed -i 's|jdbc:mysql://.*:3306|jdbc:mysql://'"${DBHOST}"':3306|g' conf/application.conf
 
 
-fw_depends java7 play1 
+fw_depends java play1 
 
 
 $PLAY1_HOME/play start --%prod
 $PLAY1_HOME/play start --%prod

+ 1 - 1
frameworks/Java/play1siena/setup.sh

@@ -2,7 +2,7 @@
 
 
 sed -i 's|jdbc:mysql://.*:3306|jdbc:mysql://'"${DBHOST}"':3306|g' conf/application.conf
 sed -i 's|jdbc:mysql://.*:3306|jdbc:mysql://'"${DBHOST}"':3306|g' conf/application.conf
 
 
-fw_depends java7 play1 siena resin
+fw_depends java play1 siena resin
 
 
 rm -rf $RESIN_HOME/webapps/*
 rm -rf $RESIN_HOME/webapps/*
 play war -o $RESIN_HOME/webapps/play1 --exclude benchmark_config.json
 play war -o $RESIN_HOME/webapps/play1 --exclude benchmark_config.json

+ 1 - 1
frameworks/Java/play2-java/setup_java.sh

@@ -1,6 +1,6 @@
 #!/bin/bash
 #!/bin/bash
 
 
-fw_depends java8 sbt
+fw_depends java sbt
 
 
 cd play2-java
 cd play2-java
 
 

+ 1 - 1
frameworks/Java/play2-java/setup_java_ebean_bonecp.sh

@@ -1,6 +1,6 @@
 #!/bin/bash
 #!/bin/bash
 
 
-fw_depends java8 sbt
+fw_depends java sbt
 
 
 sed -i 's|127.0.0.1:3306|'${DBHOST}':3306|g' play2-java-ebean-bonecp/conf/application.conf
 sed -i 's|127.0.0.1:3306|'${DBHOST}':3306|g' play2-java-ebean-bonecp/conf/application.conf
 
 

+ 1 - 1
frameworks/Java/play2-java/setup_java_ebean_hikaricp.sh

@@ -1,6 +1,6 @@
 #!/bin/bash
 #!/bin/bash
 
 
-fw_depends java8 sbt
+fw_depends java sbt
 
 
 sed -i 's|127.0.0.1|'${DBHOST}'|g' play2-java-ebean-hikaricp/conf/application.conf
 sed -i 's|127.0.0.1|'${DBHOST}'|g' play2-java-ebean-hikaricp/conf/application.conf
 
 

+ 1 - 1
frameworks/Java/play2-java/setup_java_jpa_bonecp.sh

@@ -1,6 +1,6 @@
 #!/bin/bash
 #!/bin/bash
 
 
-fw_depends java8 sbt
+fw_depends java sbt
 
 
 sed -i 's|127.0.0.1|'${DBHOST}'|g' play2-java-jpa-bonecp/conf/application.conf
 sed -i 's|127.0.0.1|'${DBHOST}'|g' play2-java-jpa-bonecp/conf/application.conf
 
 

+ 1 - 1
frameworks/Java/play2-java/setup_java_jpa_hikaricp.sh

@@ -1,6 +1,6 @@
 #!/bin/bash
 #!/bin/bash
 
 
-fw_depends java8 sbt
+fw_depends java sbt
 
 
 sed -i 's|127.0.0.1|'${DBHOST}'|g' play2-java-jpa-hikaricp/conf/application.conf
 sed -i 's|127.0.0.1|'${DBHOST}'|g' play2-java-jpa-hikaricp/conf/application.conf
 
 

+ 1 - 1
frameworks/Java/rapidoid/setup.sh

@@ -1,6 +1,6 @@
 #!/bin/bash
 #!/bin/bash
 
 
-fw_depends java7 maven
+fw_depends java maven
 
 
 mvn clean compile assembly:single
 mvn clean compile assembly:single
 
 

+ 1 - 1
frameworks/Java/restexpress/setup.sh

@@ -3,7 +3,7 @@
 sed -i 's|mongodb://.*/hello_world|mongodb://'"${DBHOST}"'/hello_world|g' config/dev/environment.properties
 sed -i 's|mongodb://.*/hello_world|mongodb://'"${DBHOST}"'/hello_world|g' config/dev/environment.properties
 sed -i 's|mysql://.*:3306|mysql://'"${DBHOST}"':3306|g' config/dev/environment.properties
 sed -i 's|mysql://.*:3306|mysql://'"${DBHOST}"':3306|g' config/dev/environment.properties
 
 
-fw_depends java7 maven
+fw_depends java maven
 
 
 mvn clean package
 mvn clean package
 mvn assembly:single
 mvn assembly:single

+ 1 - 1
frameworks/Java/sabina/jetty-mongodb.sh

@@ -1,5 +1,5 @@
 #!/bin/bash
 #!/bin/bash
 
 
-fw_depends java8 maven
+fw_depends java maven
 
 
 ./setup.sh -Dsabina.backend=jetty -Dsabina.benchmark.repository=mongodb
 ./setup.sh -Dsabina.backend=jetty -Dsabina.benchmark.repository=mongodb

+ 1 - 1
frameworks/Java/sabina/jetty.sh

@@ -1,5 +1,5 @@
 #!/bin/bash
 #!/bin/bash
 
 
-fw_depends java8 maven
+fw_depends java maven
 
 
 ./setup.sh -Dsabina.backend=jetty -Dsabina.benchmark.repository=mysql
 ./setup.sh -Dsabina.backend=jetty -Dsabina.benchmark.repository=mysql

+ 1 - 1
frameworks/Java/sabina/undertow-mongodb.sh

@@ -1,5 +1,5 @@
 #!/bin/bash
 #!/bin/bash
 
 
-fw_depends java8 maven
+fw_depends java maven
 
 
 ./setup.sh -Dsabina.backend=undertow -Dsabina.benchmark.repository=mongodb
 ./setup.sh -Dsabina.backend=undertow -Dsabina.benchmark.repository=mongodb

+ 1 - 1
frameworks/Java/sabina/undertow.sh

@@ -1,5 +1,5 @@
 #!/bin/bash
 #!/bin/bash
 
 
-fw_depends java8 maven
+fw_depends java maven
 
 
 ./setup.sh -Dsabina.backend=undertow -Dsabina.benchmark.repository=mysql
 ./setup.sh -Dsabina.backend=undertow -Dsabina.benchmark.repository=mysql

+ 1 - 1
frameworks/Java/servlet-dsl/setup.sh

@@ -1,6 +1,6 @@
 #!/bin/bash
 #!/bin/bash
 
 
-fw_depends java7 resin maven
+fw_depends java resin maven
 
 
 mvn clean compile war:war
 mvn clean compile war:war
 rm -rf $RESIN_HOME/webapps/*
 rm -rf $RESIN_HOME/webapps/*

+ 1 - 1
frameworks/Java/servlet/setup.sh

@@ -2,7 +2,7 @@
 
 
 sed -i 's|localhost|'"${DBHOST}"'|g' src/main/webapp/WEB-INF/resin-web.xml
 sed -i 's|localhost|'"${DBHOST}"'|g' src/main/webapp/WEB-INF/resin-web.xml
 
 
-fw_depends java7 resin maven
+fw_depends java resin maven
 
 
 mvn clean compile war:war
 mvn clean compile war:war
 rm -rf $RESIN_HOME/webapps/*
 rm -rf $RESIN_HOME/webapps/*

+ 1 - 1
frameworks/Java/servlet3-cass/setup.sh

@@ -2,7 +2,7 @@
 
 
 sed -i 's|localhost|'"${DBHOST}"'|g' src/main/resources/application.properties
 sed -i 's|localhost|'"${DBHOST}"'|g' src/main/resources/application.properties
 
 
-fw_depends java8 resin maven
+fw_depends java resin maven
 
 
 mvn clean compile war:war
 mvn clean compile war:war
 rm -rf $RESIN_HOME/webapps/*
 rm -rf $RESIN_HOME/webapps/*

+ 1 - 1
frameworks/Java/spark/setup.sh

@@ -2,7 +2,7 @@
 
 
 sed -i 's|mysql://.*:3306|mysql://'"${DBHOST}"':3306|g' src/main/webapp/WEB-INF/resin-web.xml
 sed -i 's|mysql://.*:3306|mysql://'"${DBHOST}"':3306|g' src/main/webapp/WEB-INF/resin-web.xml
 
 
-fw_depends java7 resin maven
+fw_depends java resin maven
 
 
 mvn clean package -Ddb-host=${DBHOST}
 mvn clean package -Ddb-host=${DBHOST}
 rm -rf $RESIN_HOME/webapps/*
 rm -rf $RESIN_HOME/webapps/*

+ 1 - 1
frameworks/Java/spring/setup.sh

@@ -1,6 +1,6 @@
 #!/bin/bash
 #!/bin/bash
 
 
-fw_depends java7 maven
+fw_depends java maven
 
 
 mvn clean package
 mvn clean package
 cd target
 cd target

+ 1 - 1
frameworks/Java/tapestry/setup.sh

@@ -2,7 +2,7 @@
 
 
 sed -i 's|mysql://.*:3306|mysql://'"${DBHOST}"':3306|g' hello/src/main/webapp/WEB-INF/resin-web.xml
 sed -i 's|mysql://.*:3306|mysql://'"${DBHOST}"':3306|g' hello/src/main/webapp/WEB-INF/resin-web.xml
 
 
-fw_depends java7 resin maven
+fw_depends java resin maven
 
 
 cd hello
 cd hello
 mvn clean compile war:war
 mvn clean compile war:war

+ 1 - 1
frameworks/Java/undertow-edge/setup.sh

@@ -2,7 +2,7 @@
 
 
 sed -i 's|127.0.0.1|'${DBHOST}'|g' src/main/resources/hello/server.properties
 sed -i 's|127.0.0.1|'${DBHOST}'|g' src/main/resources/hello/server.properties
 
 
-fw_depends java7 maven
+fw_depends java maven
 
 
 mvn clean package
 mvn clean package
 java -Djava.library.path=target/ -jar target/undertow-edge-0.1-jar-with-dependencies.jar &
 java -Djava.library.path=target/ -jar target/undertow-edge-0.1-jar-with-dependencies.jar &

+ 29 - 0
frameworks/Java/undertow-jersey-c3p0/README.md

@@ -0,0 +1,29 @@
+# Undertow + Jersey + c3p0 Benchmarking Test
+### Heavily borrowed from the grizzly-jersey test
+
+This is the Undertow+Jersey portion of a [benchmarking test suite](../) comparing a variety of web development platforms.
+
+### JSON serialization test
+* [JSON test resource](src/main/java/hello/JsonResource.java)
+
+### Database tests
+* [Database tests resource](src/main/java/hello/DbResource.java)
+
+### Fortunes test
+* [Fortunes test resource](src/main/java/hello/FortunesResource.java)
+
+## Test URLs
+
+### JSON serialization test
+
+    http://localhost:8080/json
+
+### Database tests
+
+    http://localhost:8080/db
+
+    http://localhost:8080/db?queries=10
+
+### Fortunes test
+
+    http://localhost:8080/fortunes

+ 26 - 0
frameworks/Java/undertow-jersey-c3p0/benchmark_config.json

@@ -0,0 +1,26 @@
+{
+  "framework": "undertow-jersey-c3p0",
+  "tests": [{
+    "default": {
+      "setup_file": "setup",
+      "json_url": "/json",
+      "db_url": "/db?single=true",
+      "query_url": "/db?queries=",
+      "fortune_url": "/fortunes",
+      "port": 8080,
+      "approach": "Realistic",
+      "classification": "Micro",
+      "database": "MySQL",
+      "framework": "undertow-jersey",
+      "language": "Java",
+      "orm": "Full",
+      "platform": "Servlet",
+      "webserver": "Undertow",
+      "os": "Linux",
+      "database_os": "Linux",
+      "display_name": "undertow-jersey-c3p0",
+      "notes": "",
+      "versus": "undertow-jersey-hikaricp"
+    }
+  }]
+}

+ 125 - 0
frameworks/Java/undertow-jersey-c3p0/pom.xml

@@ -0,0 +1,125 @@
+<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">
+
+  <modelVersion>4.0.0</modelVersion>
+
+  <groupId>com.techempower</groupId>
+  <artifactId>undertow-jersey</artifactId>
+  <version>0.1</version>
+
+  <packaging>jar</packaging>
+
+  <prerequisites>
+    <maven>3.0</maven>
+  </prerequisites>
+
+
+  <properties>
+    <jersey.version>2.22.1</jersey.version>
+    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+  </properties>
+
+  <dependencyManagement>
+    <dependencies>
+      <dependency>
+        <groupId>org.glassfish.jersey</groupId>
+        <artifactId>jersey-bom</artifactId>
+        <version>${jersey.version}</version>
+        <type>pom</type>
+        <scope>import</scope>
+      </dependency>
+    </dependencies>
+  </dependencyManagement>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.glassfish.jersey.core</groupId>
+      <artifactId>jersey-server</artifactId>
+      <version>${jersey.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>org.glassfish.jersey.core</groupId>
+      <artifactId>jersey-server</artifactId>
+      <version>${jersey.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>org.glassfish.jersey.ext</groupId>
+      <artifactId>jersey-mvc-mustache</artifactId>
+      <version>${jersey.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>org.glassfish.jersey.media</groupId>
+      <artifactId>jersey-media-json-jackson</artifactId>
+      <version>${jersey.version}</version>
+    </dependency>
+
+    <dependency>
+      <groupId>org.hibernate</groupId>
+      <artifactId>hibernate-core</artifactId>
+      <version>4.3.11.Final</version>
+    </dependency>
+    <dependency>
+      <groupId>org.hibernate</groupId>
+      <artifactId>hibernate-c3p0</artifactId>
+      <version>4.3.11.Final</version>
+    </dependency>
+
+    <dependency>
+      <groupId>commons-cli</groupId>
+      <artifactId>commons-cli</artifactId>
+      <version>1.2</version>
+    </dependency>
+
+    <dependency>
+      <groupId>mysql</groupId>
+      <artifactId>mysql-connector-java</artifactId>
+      <version>5.1.25</version>
+    </dependency>
+
+    <dependency>
+      <groupId>io.undertow</groupId>
+      <artifactId>undertow-core</artifactId>
+      <version>1.3.11.Final</version>
+    </dependency>
+
+  </dependencies>
+
+  <build>
+    <finalName>${project.artifactId}</finalName>
+    <plugins>
+      <plugin>
+        <inherited>true</inherited>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-compiler-plugin</artifactId>
+        <version>3.1</version>
+        <configuration>
+          <source>1.7</source>
+          <target>1.7</target>
+          <optimize>true</optimize>
+          <debug>false</debug>
+        </configuration>
+      </plugin>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-shade-plugin</artifactId>
+        <version>2.1</version>
+        <executions>
+          <execution>
+            <phase>package</phase>
+            <goals>
+              <goal>shade</goal>
+            </goals>
+            <configuration>
+              <transformers>
+                <transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/>
+                <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
+                  <mainClass>hello.JerseyWebServer</mainClass>
+                </transformer>
+              </transformers>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
+</project>

+ 7 - 0
frameworks/Java/undertow-jersey-c3p0/setup.sh

@@ -0,0 +1,7 @@
+#!/bin/bash
+
+fw_depends java8 maven
+
+mvn clean package
+
+java -jar target/undertow-jersey.jar -dbhost ${DBHOST} &

+ 18 - 0
frameworks/Java/undertow-jersey-c3p0/src/main/java/hello/Common.java

@@ -0,0 +1,18 @@
+package hello;
+
+import java.util.concurrent.*;
+
+/**
+ * @author denkab
+ */
+public class Common
+{
+
+  private static final int cpuCount = Runtime.getRuntime().availableProcessors();
+
+  public static ExecutorService EXECUTOR = new ThreadPoolExecutor(
+      cpuCount * 2, cpuCount * 25, 200, TimeUnit.MILLISECONDS,
+      new LinkedBlockingQueue<Runnable>(cpuCount * 100),
+      new ThreadPoolExecutor.CallerRunsPolicy());
+
+}

+ 80 - 0
frameworks/Java/undertow-jersey-c3p0/src/main/java/hello/DbResource.java

@@ -0,0 +1,80 @@
+package hello;
+
+import hello.domain.*;
+import org.hibernate.*;
+
+import javax.inject.*;
+import javax.ws.rs.*;
+import java.util.*;
+import java.util.concurrent.*;
+
+import static javax.ws.rs.core.MediaType.APPLICATION_JSON;
+
+@Singleton
+@Path("/db")
+public class DbResource
+{
+
+  private static final int DB_ROWS = 10000;
+
+  @Inject
+  private SessionFactory sessionFactory;
+
+  @GET
+  @Produces(APPLICATION_JSON)
+  public Object db(@QueryParam("queries") String queryParam,
+      @QueryParam("single") boolean isSingle)
+      throws ExecutionException, InterruptedException
+  {
+
+    final int queries = getQueries(queryParam);
+    final World[] worlds = new World[queries];
+    final Random random = ThreadLocalRandom.current();
+
+    Map<Integer, Future<World>> futureWorlds = new ConcurrentHashMap<>();
+    for (int i = 0; i < queries; i++)
+    {
+      futureWorlds.put(i, Common.EXECUTOR.submit(new Callable<World>()
+      {
+        @Override
+        public World call() throws Exception
+        {
+          Session session = sessionFactory.openSession();
+          session.setDefaultReadOnly(true);
+
+          try
+          {
+            return (World)session.byId(World.class).load(
+                random.nextInt(DB_ROWS) + 1);
+          }
+          finally
+          {
+            session.close();
+          }
+        }
+      }));
+    }
+
+    for (int i = 0; i < queries; i++)
+    {
+      worlds[i] = futureWorlds.get(i).get();
+    }
+    return isSingle ? worlds[0] : worlds;
+  }
+
+  private int getQueries(String proto)
+  {
+    int result = 1;
+    try
+    {
+      if (proto != null && !proto.trim().isEmpty())
+      {
+        result = Integer.parseInt(proto);
+      }
+    }
+    catch (NumberFormatException e)
+    {/* by test contract */}
+
+    return Math.min(500, Math.max(1, result));
+  }
+}

+ 44 - 0
frameworks/Java/undertow-jersey-c3p0/src/main/java/hello/FortunesResource.java

@@ -0,0 +1,44 @@
+package hello;
+
+import hello.domain.*;
+import org.glassfish.jersey.server.mvc.*;
+import org.hibernate.*;
+
+import javax.inject.*;
+import javax.ws.rs.*;
+import java.util.*;
+
+import static javax.ws.rs.core.MediaType.TEXT_HTML;
+
+@Singleton
+@Path("/fortunes")
+public class FortunesResource
+{
+
+  @Inject
+  private SessionFactory sessionFactory;
+
+  @GET
+  @Produces(TEXT_HTML + "; charset=utf-8")
+  public Viewable fortunes()
+  {
+    final Session session = sessionFactory.openSession();
+    final List<Fortune> fortunes = new ArrayList<>(
+        session.createCriteria(Fortune.class).list());
+    fortunes.add(new Fortune(0, "Additional fortune added at request time."));
+    Collections.sort(fortunes);
+
+    session.close();
+    return new Viewable("/fortunes.mustache", new Scope(fortunes));
+  }
+
+  public static class Scope
+  {
+    public List fortunes;
+
+    public Scope(final List fortunes)
+    {
+      this.fortunes = fortunes;
+    }
+  }
+}

+ 79 - 0
frameworks/Java/undertow-jersey-c3p0/src/main/java/hello/JerseyWebServer.java

@@ -0,0 +1,79 @@
+package hello;
+
+import hello.undertow.*;
+import io.undertow.*;
+import io.undertow.server.handlers.*;
+import org.apache.commons.cli.*;
+import org.glassfish.hk2.utilities.binding.*;
+import org.glassfish.jersey.process.internal.*;
+import org.glassfish.jersey.server.*;
+import org.hibernate.*;
+
+import java.util.*;
+
+public class JerseyWebServer
+{
+  private final int    port;
+  private final String dbHost;
+  private final int    dbPort;
+
+  public JerseyWebServer(final int port, final String dbHost,
+      final int dbPort)
+  {
+    this.port = port;
+    this.dbHost = dbHost;
+    this.dbPort = dbPort;
+  }
+
+  public static void main(final String[] args) throws Exception
+  {
+    CommandLineParser parser = new BasicParser();
+    CommandLine cmd = parser.parse(options(), args);
+
+    final int port = Integer.parseInt(cmd.getOptionValue("port", "8080"));
+    final String dbHost = cmd.getOptionValue("dbhost", "localhost");
+    final int dbPort = Integer.parseInt(cmd.getOptionValue("dbport", "3306"));
+
+    ResourceConfig config = new ResourceConfig(DbResource.class,
+        FortunesResource.class, JsonResource.class,
+        JsonMessageBodyWriter.class, ServerResponseFilter.class, RequestExceptionMapper.class);
+
+    config.setProperties(new HashMap<String, Object>()
+    {{
+      put("dbhost", dbHost);
+
+      put("dbport", dbPort);
+    }});
+
+    config.register(org.glassfish.jersey.server.mvc.MvcFeature.class);
+    config.register(
+        org.glassfish.jersey.server.mvc.mustache.MustacheMvcFeature.class);
+
+    config.register(new AbstractBinder()
+    {
+      @Override
+      protected void configure()
+      {
+        bindFactory(SessionFactoryProvider.class).to(SessionFactory.class).in(
+            RequestScoped.class);
+      }
+    });
+
+    UndertowJerseyContainer container = new UndertowJerseyContainer(config);
+
+    BlockingHandler bh = new BlockingHandler(container);
+
+    Undertow server = Undertow.builder().addHttpListener(port,
+        "0.0.0.0").setHandler(bh).build();
+    server.start();
+  }
+
+  private static Options options()
+  {
+    Options options = new Options();
+    options.addOption("port", true, "server port");
+    options.addOption("dbhost", true, "database host");
+    options.addOption("dbport", true, "database port");
+    return options;
+  }
+}

+ 50 - 0
frameworks/Java/undertow-jersey-c3p0/src/main/java/hello/JsonMessageBodyWriter.java

@@ -0,0 +1,50 @@
+package hello;
+
+import com.fasterxml.jackson.databind.*;
+
+import javax.inject.*;
+import javax.ws.rs.*;
+import javax.ws.rs.core.*;
+import javax.ws.rs.ext.*;
+import javax.ws.rs.ext.Provider;
+import java.io.*;
+import java.lang.annotation.*;
+import java.lang.reflect.*;
+
+import static javax.ws.rs.core.MediaType.APPLICATION_JSON;
+
+@Provider
+@Singleton
+@Produces(APPLICATION_JSON)
+public class JsonMessageBodyWriter
+    implements MessageBodyWriter<Object>
+{
+
+  private final ObjectMapper mapper = new ObjectMapper();
+
+  @Override
+  public boolean isWriteable(final Class<?> type, final Type genericType,
+      final Annotation[] annotations, final MediaType mediaType)
+  {
+    return "json".equals(mediaType.getSubtype());
+  }
+
+  @Override
+  public long getSize(final Object t, final Class<?> type,
+      final Type genericType, final Annotation[] annotations,
+      final MediaType mediaType)
+  {
+    return -1; // We can't predict the output size at this point
+  }
+
+  @Override
+  public void writeTo(final Object t, final Class<?> type,
+      final Type genericType, final Annotation[] annotations,
+      final MediaType mediaType,
+      final MultivaluedMap<String, Object> httpHeaders,
+      final OutputStream entityStream)
+      throws IOException, WebApplicationException
+  {
+    mapper.writeValue(entityStream, t);
+  }
+}

+ 22 - 0
frameworks/Java/undertow-jersey-c3p0/src/main/java/hello/JsonResource.java

@@ -0,0 +1,22 @@
+package hello;
+
+import javax.inject.*;
+import javax.ws.rs.*;
+import java.util.*;
+
+import static javax.ws.rs.core.MediaType.APPLICATION_JSON;
+
+@Singleton
+@Path("/json")
+public class JsonResource
+{
+
+  @GET
+  @Produces(APPLICATION_JSON)
+  public Object json()
+  {
+    Map<String, String> data = new HashMap<String, String>(1);
+    data.put("message", "Hello, World!");
+    return data;
+  }
+}

+ 20 - 0
frameworks/Java/undertow-jersey-c3p0/src/main/java/hello/RequestExceptionMapper.java

@@ -0,0 +1,20 @@
+package hello;
+
+import javax.ws.rs.core.*;
+import javax.ws.rs.core.Response.*;
+import javax.ws.rs.ext.*;
+
+public class RequestExceptionMapper
+    implements ExceptionMapper<Exception>
+{
+//  private static final Logger LOGGER = LoggerFactory.getLogger(
+//      RequestExceptionMapper.class);
+
+  @Override
+  public Response toResponse(Exception exception)
+  {
+    exception.printStackTrace();
+    System.err.println(exception.toString());
+    return Response.status(Status.NOT_FOUND).build();
+  }
+}

+ 19 - 0
frameworks/Java/undertow-jersey-c3p0/src/main/java/hello/ServerResponseFilter.java

@@ -0,0 +1,19 @@
+package hello;
+
+import javax.ws.rs.container.*;
+import java.io.*;
+
+public class ServerResponseFilter
+    implements ContainerResponseFilter
+{
+
+  private static final String SERVER_HEADER = "Server";
+  private static final String SERVER_VALUE  = "Undertow";
+
+  @Override
+  public void filter(ContainerRequestContext requestContext,
+      ContainerResponseContext responseContext) throws IOException
+  {
+    responseContext.getHeaders().add(SERVER_HEADER, SERVER_VALUE);
+  }
+}

+ 45 - 0
frameworks/Java/undertow-jersey-c3p0/src/main/java/hello/SessionFactoryProvider.java

@@ -0,0 +1,45 @@
+package hello;
+
+import hello.domain.*;
+import org.glassfish.hk2.api.*;
+import org.hibernate.*;
+import org.hibernate.cfg.Configuration;
+import org.hibernate.service.*;
+
+import javax.ws.rs.core.*;
+import javax.ws.rs.core.Context;
+
+public class SessionFactoryProvider
+    implements Factory<SessionFactory>
+{
+
+  @Context
+  Application application;
+
+  public SessionFactoryProvider()
+  {
+  }
+
+  @Override
+  public SessionFactory provide()
+  {
+    Configuration configuration = new Configuration().configure();
+    String url = configuration.getProperty("hibernate.connection.url");
+    url = url.replace("//localhost:3306/",
+        "//" + this.application.getProperties().get("dbhost") + ":"
+            + this.application.getProperties().get("dbport") + "/");
+    configuration.setProperty("hibernate.connection.url", url);
+    configuration.addAnnotatedClass(World.class);
+    configuration.addAnnotatedClass(Fortune.class);
+    ServiceRegistryBuilder serviceRegistryBuilder = new ServiceRegistryBuilder().applySettings(
+        configuration.getProperties());
+    return configuration.buildSessionFactory(
+        serviceRegistryBuilder.buildServiceRegistry());
+  }
+
+  @Override
+  public void dispose(SessionFactory instance)
+  {
+
+  }
+}

+ 30 - 0
frameworks/Java/undertow-jersey-c3p0/src/main/java/hello/domain/Fortune.java

@@ -0,0 +1,30 @@
+package hello.domain;
+
+import javax.persistence.*;
+
+@Entity
+public class Fortune
+    implements Comparable<Fortune>
+{
+
+  @Id
+  @GeneratedValue(strategy = GenerationType.IDENTITY)
+  public int    id;
+  public String message;
+
+  public Fortune()
+  {
+  }
+
+  public Fortune(final int id, final String message)
+  {
+    this.id = id;
+    this.message = message;
+  }
+
+  @Override
+  public int compareTo(final Fortune other)
+  {
+    return message.compareTo(other.message);
+  }
+}

+ 14 - 0
frameworks/Java/undertow-jersey-c3p0/src/main/java/hello/domain/World.java

@@ -0,0 +1,14 @@
+package hello.domain;
+
+import javax.persistence.*;
+
+@Entity
+public class World
+{
+
+  @Id
+  @GeneratedValue(strategy = GenerationType.IDENTITY)
+  public int id;
+  public int randomNumber;
+
+}

+ 75 - 0
frameworks/Java/undertow-jersey-c3p0/src/main/java/hello/undertow/UndertowContainerResponseWriter.java

@@ -0,0 +1,75 @@
+package hello.undertow;
+
+import io.undertow.server.*;
+import io.undertow.util.*;
+import org.glassfish.jersey.server.*;
+import org.glassfish.jersey.server.spi.*;
+
+import java.io.*;
+import java.util.*;
+import java.util.concurrent.*;
+
+public class UndertowContainerResponseWriter
+    implements ContainerResponseWriter
+{
+  private HttpServerExchange httpServerExchange;
+
+  public UndertowContainerResponseWriter(
+      HttpServerExchange httpServerExchange)
+  {
+    this.httpServerExchange = httpServerExchange;
+  }
+
+  @Override
+  public OutputStream writeResponseStatusAndHeaders(long contentLength,
+      ContainerResponse responseContext) throws ContainerException
+  {
+    httpServerExchange.setStatusCode(responseContext.getStatus());
+
+    for (Map.Entry<String, List<String>> mapEntry : responseContext.getStringHeaders().entrySet())
+    {
+      httpServerExchange.getResponseHeaders().putAll(
+          new HttpString(mapEntry.getKey()), mapEntry.getValue());
+    }
+
+    httpServerExchange.setResponseContentLength(contentLength);
+    return httpServerExchange.getOutputStream();
+  }
+
+  @Override
+  public boolean suspend(long timeOut, TimeUnit timeUnit,
+      TimeoutHandler timeoutHandler)
+  {
+    // TODO implement
+    return false;
+  }
+
+  @Override
+  public void setSuspendTimeout(long timeOut, TimeUnit timeUnit)
+      throws IllegalStateException
+  {
+    //TODO implement
+  }
+
+  @Override
+  public void commit()
+  {
+    httpServerExchange.endExchange();
+  }
+
+  @Override
+  public void failure(Throwable error)
+  {
+    // TODO don't print out
+    httpServerExchange.setStatusCode(500);
+    httpServerExchange.endExchange();
+    error.printStackTrace();
+  }
+
+  @Override
+  public boolean enableResponseBuffering()
+  {
+    // TODO not sure
+    return false;
+  }
+}

+ 112 - 0
frameworks/Java/undertow-jersey-c3p0/src/main/java/hello/undertow/UndertowJerseyContainer.java

@@ -0,0 +1,112 @@
+package hello.undertow;
+
+import io.undertow.server.*;
+import io.undertow.util.*;
+import org.glassfish.jersey.internal.*;
+import org.glassfish.jersey.server.*;
+import org.glassfish.jersey.server.spi.*;
+
+import javax.ws.rs.core.*;
+import java.net.*;
+import java.security.*;
+
+public class UndertowJerseyContainer
+    implements Container, HttpHandler
+{
+
+  /**
+   * Default dummy security context.
+   * Taken from Jersey's ApplicationHandler class
+   */
+  private static final SecurityContext DEFAULT_SECURITY_CONTEXT = new SecurityContext()
+  {
+
+    @Override
+    public boolean isUserInRole(final String role)
+    {
+      return false;
+    }
+
+    @Override
+    public boolean isSecure()
+    {
+      return false;
+    }
+
+    @Override
+    public Principal getUserPrincipal()
+    {
+      return null;
+    }
+
+    @Override
+    public String getAuthenticationScheme()
+    {
+      return null;
+    }
+  };
+  private ApplicationHandler applicationHandler;
+
+  public UndertowJerseyContainer(Application configuration)
+  {
+    this.applicationHandler = new ApplicationHandler(configuration);
+  }
+
+  @Override
+  public ResourceConfig getConfiguration()
+  {
+    return this.applicationHandler.getConfiguration();
+  }
+
+  @Override
+  public ApplicationHandler getApplicationHandler()
+  {
+    return this.applicationHandler;
+  }
+
+  @Override
+  public void reload()
+  {
+    reload(this.applicationHandler.getConfiguration());
+  }
+
+  @Override
+  public void reload(ResourceConfig configuration)
+  {
+
+    this.applicationHandler.onShutdown(this);
+
+    this.applicationHandler = new ApplicationHandler(configuration);
+
+    this.applicationHandler.onStartup(this);
+    this.applicationHandler.onReload(this);
+  }
+
+  @Override
+  public void handleRequest(final HttpServerExchange httpServerExchange)
+      throws Exception
+  {
+    String requestUri = httpServerExchange.getRequestURI();
+    if(httpServerExchange.getQueryString().length() > 0)
+    {
+      requestUri = requestUri + "?" + httpServerExchange.getQueryString();
+    }
+
+    final ContainerRequest request = new ContainerRequest(null,
+        URI.create(requestUri),
+        httpServerExchange.getRequestMethod().toString(),
+        DEFAULT_SECURITY_CONTEXT, new MapPropertiesDelegate());
+
+    request.setWriter(
+        new UndertowContainerResponseWriter(httpServerExchange));
+
+    for (HeaderValues values : httpServerExchange.getRequestHeaders())
+    {
+      request.getHeaders().addAll(values.getHeaderName().toString(),
+          httpServerExchange.getRequestHeaders().get(values.getHeaderName()));
+    }
+
+    request.setEntityStream(httpServerExchange.getInputStream());
+    this.applicationHandler.handle(request);
+  }
+}

+ 20 - 0
frameworks/Java/undertow-jersey-c3p0/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>
+{{#fortunes}}
+<tr>
+<td>{{id}}</td>
+<td>{{message}}</td>
+</tr>
+{{/fortunes}}
+</table>
+</body>
+</html>

+ 17 - 0
frameworks/Java/undertow-jersey-c3p0/src/main/resources/hibernate.cfg.xml

@@ -0,0 +1,17 @@
+<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
+<hibernate-configuration>
+  <session-factory>
+    <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
+    <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hello_world?jdbcCompliantTruncation=false&amp;elideSetAutoCommits=true&amp;useLocalSessionState=true&amp;cachePrepStmts=true&amp;cacheCallableStmts=true&amp;alwaysSendSetIsolation=false&amp;prepStmtCacheSize=4096&amp;cacheServerConfiguration=true&amp;prepStmtCacheSqlLimit=2048&amp;zeroDateTimeBehavior=convertToNull&amp;traceProtocol=false&amp;useUnbufferedInput=false&amp;useReadAheadInput=false&amp;maintainTimeStats=false&amp;useServerPrepStmts&amp;cacheRSMetadata=true</property>
+    <property name="hibernate.connection.username">benchmarkdbuser</property>
+    <property name="hibernate.connection.password">benchmarkdbpass</property>
+    <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
+    <property name="hibernate.cache.use_query_cache">false</property>
+    <property name="hibernate.c3p0.min_size">256</property>
+    <property name="hibernate.c3p0.max_size">256</property>
+    <property name="hibernate.c3p0.timeout">1800</property>
+    <property name="hibernate.c3p0.max_statements">2048</property>
+    <property name="hibernate.show_sql">false</property>
+    <property name="hibernate.format_sql">false</property>
+  </session-factory>
+</hibernate-configuration>

+ 29 - 0
frameworks/Java/undertow-jersey-hikaricp/README.md

@@ -0,0 +1,29 @@
+# Undertow + Jersey + Hikaricp Benchmarking Test
+### Heavily borrowed from the grizzly-jersey test
+
+This is the Undertow+Jersey portion of a [benchmarking test suite](../) comparing a variety of web development platforms.
+
+### JSON serialization test
+* [JSON test resource](src/main/java/hello/JsonResource.java)
+
+### Database tests
+* [Database tests resource](src/main/java/hello/DbResource.java)
+
+### Fortunes test
+* [Fortunes test resource](src/main/java/hello/FortunesResource.java)
+
+## Test URLs
+
+### JSON serialization test
+
+    http://localhost:8080/json
+
+### Database tests
+
+    http://localhost:8080/db
+
+    http://localhost:8080/db?queries=10
+
+### Fortunes test
+
+    http://localhost:8080/fortunes

+ 26 - 0
frameworks/Java/undertow-jersey-hikaricp/benchmark_config.json

@@ -0,0 +1,26 @@
+{
+  "framework": "undertow-jersey-hikaricp",
+  "tests": [{
+    "default": {
+      "setup_file": "setup",
+      "json_url": "/json",
+      "db_url": "/db?single=true",
+      "query_url": "/db?queries=",
+      "fortune_url": "/fortunes",
+      "port": 8080,
+      "approach": "Realistic",
+      "classification": "Micro",
+      "database": "MySQL",
+      "framework": "undertow-jersey",
+      "language": "Java",
+      "orm": "Full",
+      "platform": "Servlet",
+      "webserver": "Undertow",
+      "os": "Linux",
+      "database_os": "Linux",
+      "display_name": "undertow-jersey-hikaricp",
+      "notes": "",
+      "versus": "undertow-jersey-c3p0"
+    }
+  }]
+}

+ 125 - 0
frameworks/Java/undertow-jersey-hikaricp/pom.xml

@@ -0,0 +1,125 @@
+<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">
+
+  <modelVersion>4.0.0</modelVersion>
+
+  <groupId>com.techempower</groupId>
+  <artifactId>undertow-jersey</artifactId>
+  <version>0.1</version>
+
+  <packaging>jar</packaging>
+
+  <prerequisites>
+    <maven>3.0</maven>
+  </prerequisites>
+
+
+  <properties>
+    <jersey.version>2.22.1</jersey.version>
+    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+  </properties>
+
+  <dependencyManagement>
+    <dependencies>
+      <dependency>
+        <groupId>org.glassfish.jersey</groupId>
+        <artifactId>jersey-bom</artifactId>
+        <version>${jersey.version}</version>
+        <type>pom</type>
+        <scope>import</scope>
+      </dependency>
+    </dependencies>
+  </dependencyManagement>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.glassfish.jersey.core</groupId>
+      <artifactId>jersey-server</artifactId>
+      <version>${jersey.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>org.glassfish.jersey.core</groupId>
+      <artifactId>jersey-server</artifactId>
+      <version>${jersey.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>org.glassfish.jersey.ext</groupId>
+      <artifactId>jersey-mvc-mustache</artifactId>
+      <version>${jersey.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>org.glassfish.jersey.media</groupId>
+      <artifactId>jersey-media-json-jackson</artifactId>
+      <version>${jersey.version}</version>
+    </dependency>
+
+    <dependency>
+      <groupId>org.hibernate</groupId>
+      <artifactId>hibernate-core</artifactId>
+      <version>4.3.11.Final</version>
+    </dependency>
+    <dependency>
+      <groupId>org.hibernate</groupId>
+      <artifactId>hibernate-hikaricp</artifactId>
+      <version>4.3.11.Final</version>
+    </dependency>
+
+    <dependency>
+      <groupId>commons-cli</groupId>
+      <artifactId>commons-cli</artifactId>
+      <version>1.2</version>
+    </dependency>
+
+    <dependency>
+      <groupId>mysql</groupId>
+      <artifactId>mysql-connector-java</artifactId>
+      <version>5.1.25</version>
+    </dependency>
+
+    <dependency>
+      <groupId>io.undertow</groupId>
+      <artifactId>undertow-core</artifactId>
+      <version>1.3.11.Final</version>
+    </dependency>
+
+  </dependencies>
+
+  <build>
+    <finalName>${project.artifactId}</finalName>
+    <plugins>
+      <plugin>
+        <inherited>true</inherited>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-compiler-plugin</artifactId>
+        <version>3.1</version>
+        <configuration>
+          <source>1.7</source>
+          <target>1.7</target>
+          <optimize>true</optimize>
+          <debug>false</debug>
+        </configuration>
+      </plugin>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-shade-plugin</artifactId>
+        <version>2.1</version>
+        <executions>
+          <execution>
+            <phase>package</phase>
+            <goals>
+              <goal>shade</goal>
+            </goals>
+            <configuration>
+              <transformers>
+                <transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/>
+                <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
+                  <mainClass>hello.JerseyWebServer</mainClass>
+                </transformer>
+              </transformers>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
+</project>

+ 7 - 0
frameworks/Java/undertow-jersey-hikaricp/setup.sh

@@ -0,0 +1,7 @@
+#!/bin/bash
+
+fw_depends java8 maven
+
+mvn clean package
+
+java -jar target/undertow-jersey.jar -dbhost ${DBHOST} &

+ 18 - 0
frameworks/Java/undertow-jersey-hikaricp/src/main/java/hello/Common.java

@@ -0,0 +1,18 @@
+package hello;
+
+import java.util.concurrent.*;
+
+/**
+ * @author denkab
+ */
+public class Common
+{
+
+  private static final int cpuCount = Runtime.getRuntime().availableProcessors();
+
+  public static ExecutorService EXECUTOR = new ThreadPoolExecutor(
+      cpuCount * 2, cpuCount * 25, 200, TimeUnit.MILLISECONDS,
+      new LinkedBlockingQueue<Runnable>(cpuCount * 100),
+      new ThreadPoolExecutor.CallerRunsPolicy());
+
+}

+ 80 - 0
frameworks/Java/undertow-jersey-hikaricp/src/main/java/hello/DbResource.java

@@ -0,0 +1,80 @@
+package hello;
+
+import hello.domain.*;
+import org.hibernate.*;
+
+import javax.inject.*;
+import javax.ws.rs.*;
+import java.util.*;
+import java.util.concurrent.*;
+
+import static javax.ws.rs.core.MediaType.APPLICATION_JSON;
+
+@Singleton
+@Path("/db")
+public class DbResource
+{
+
+  private static final int DB_ROWS = 10000;
+
+  @Inject
+  private SessionFactory sessionFactory;
+
+  @GET
+  @Produces(APPLICATION_JSON)
+  public Object db(@QueryParam("queries") String queryParam,
+      @QueryParam("single") boolean isSingle)
+      throws ExecutionException, InterruptedException
+  {
+
+    final int queries = getQueries(queryParam);
+    final World[] worlds = new World[queries];
+    final Random random = ThreadLocalRandom.current();
+
+    Map<Integer, Future<World>> futureWorlds = new ConcurrentHashMap<>();
+    for (int i = 0; i < queries; i++)
+    {
+      futureWorlds.put(i, Common.EXECUTOR.submit(new Callable<World>()
+      {
+        @Override
+        public World call() throws Exception
+        {
+          Session session = sessionFactory.openSession();
+          session.setDefaultReadOnly(true);
+
+          try
+          {
+            return (World)session.byId(World.class).load(
+                random.nextInt(DB_ROWS) + 1);
+          }
+          finally
+          {
+            session.close();
+          }
+        }
+      }));
+    }
+
+    for (int i = 0; i < queries; i++)
+    {
+      worlds[i] = futureWorlds.get(i).get();
+    }
+    return isSingle ? worlds[0] : worlds;
+  }
+
+  private int getQueries(String proto)
+  {
+    int result = 1;
+    try
+    {
+      if (proto != null && !proto.trim().isEmpty())
+      {
+        result = Integer.parseInt(proto);
+      }
+    }
+    catch (NumberFormatException e)
+    {/* by test contract */}
+
+    return Math.min(500, Math.max(1, result));
+  }
+}

+ 44 - 0
frameworks/Java/undertow-jersey-hikaricp/src/main/java/hello/FortunesResource.java

@@ -0,0 +1,44 @@
+package hello;
+
+import hello.domain.*;
+import org.glassfish.jersey.server.mvc.*;
+import org.hibernate.*;
+
+import javax.inject.*;
+import javax.ws.rs.*;
+import java.util.*;
+
+import static javax.ws.rs.core.MediaType.TEXT_HTML;
+
+@Singleton
+@Path("/fortunes")
+public class FortunesResource
+{
+
+  @Inject
+  private SessionFactory sessionFactory;
+
+  @GET
+  @Produces(TEXT_HTML + "; charset=utf-8")
+  public Viewable fortunes()
+  {
+    final Session session = sessionFactory.openSession();
+    final List<Fortune> fortunes = new ArrayList<>(
+        session.createCriteria(Fortune.class).list());
+    fortunes.add(new Fortune(0, "Additional fortune added at request time."));
+    Collections.sort(fortunes);
+
+    session.close();
+    return new Viewable("/fortunes.mustache", new Scope(fortunes));
+  }
+
+  public static class Scope
+  {
+    public List fortunes;
+
+    public Scope(final List fortunes)
+    {
+      this.fortunes = fortunes;
+    }
+  }
+}

+ 79 - 0
frameworks/Java/undertow-jersey-hikaricp/src/main/java/hello/JerseyWebServer.java

@@ -0,0 +1,79 @@
+package hello;
+
+import hello.undertow.*;
+import io.undertow.*;
+import io.undertow.server.handlers.*;
+import org.apache.commons.cli.*;
+import org.glassfish.hk2.utilities.binding.*;
+import org.glassfish.jersey.process.internal.*;
+import org.glassfish.jersey.server.*;
+import org.hibernate.*;
+
+import java.util.*;
+
+public class JerseyWebServer
+{
+  private final int    port;
+  private final String dbHost;
+  private final int    dbPort;
+
+  public JerseyWebServer(final int port, final String dbHost,
+      final int dbPort)
+  {
+    this.port = port;
+    this.dbHost = dbHost;
+    this.dbPort = dbPort;
+  }
+
+  public static void main(final String[] args) throws Exception
+  {
+    CommandLineParser parser = new BasicParser();
+    CommandLine cmd = parser.parse(options(), args);
+
+    final int port = Integer.parseInt(cmd.getOptionValue("port", "8080"));
+    final String dbHost = cmd.getOptionValue("dbhost", "localhost");
+    final int dbPort = Integer.parseInt(cmd.getOptionValue("dbport", "3306"));
+
+    ResourceConfig config = new ResourceConfig(DbResource.class,
+        FortunesResource.class, JsonResource.class,
+        JsonMessageBodyWriter.class, ServerResponseFilter.class, RequestExceptionMapper.class);
+
+    config.setProperties(new HashMap<String, Object>()
+    {{
+      put("dbhost", dbHost);
+
+      put("dbport", dbPort);
+    }});
+
+    config.register(org.glassfish.jersey.server.mvc.MvcFeature.class);
+    config.register(
+        org.glassfish.jersey.server.mvc.mustache.MustacheMvcFeature.class);
+
+    config.register(new AbstractBinder()
+    {
+      @Override
+      protected void configure()
+      {
+        bindFactory(SessionFactoryProvider.class).to(SessionFactory.class).in(
+            RequestScoped.class);
+      }
+    });
+
+    UndertowJerseyContainer container = new UndertowJerseyContainer(config);
+
+    BlockingHandler bh = new BlockingHandler(container);
+
+    Undertow server = Undertow.builder().addHttpListener(port,
+        "0.0.0.0").setHandler(bh).build();
+    server.start();
+  }
+
+  private static Options options()
+  {
+    Options options = new Options();
+    options.addOption("port", true, "server port");
+    options.addOption("dbhost", true, "database host");
+    options.addOption("dbport", true, "database port");
+    return options;
+  }
+}

+ 50 - 0
frameworks/Java/undertow-jersey-hikaricp/src/main/java/hello/JsonMessageBodyWriter.java

@@ -0,0 +1,50 @@
+package hello;
+
+import com.fasterxml.jackson.databind.*;
+
+import javax.inject.*;
+import javax.ws.rs.*;
+import javax.ws.rs.core.*;
+import javax.ws.rs.ext.*;
+import javax.ws.rs.ext.Provider;
+import java.io.*;
+import java.lang.annotation.*;
+import java.lang.reflect.*;
+
+import static javax.ws.rs.core.MediaType.APPLICATION_JSON;
+
+@Provider
+@Singleton
+@Produces(APPLICATION_JSON)
+public class JsonMessageBodyWriter
+    implements MessageBodyWriter<Object>
+{
+
+  private final ObjectMapper mapper = new ObjectMapper();
+
+  @Override
+  public boolean isWriteable(final Class<?> type, final Type genericType,
+      final Annotation[] annotations, final MediaType mediaType)
+  {
+    return "json".equals(mediaType.getSubtype());
+  }
+
+  @Override
+  public long getSize(final Object t, final Class<?> type,
+      final Type genericType, final Annotation[] annotations,
+      final MediaType mediaType)
+  {
+    return -1; // We can't predict the output size at this point
+  }
+
+  @Override
+  public void writeTo(final Object t, final Class<?> type,
+      final Type genericType, final Annotation[] annotations,
+      final MediaType mediaType,
+      final MultivaluedMap<String, Object> httpHeaders,
+      final OutputStream entityStream)
+      throws IOException, WebApplicationException
+  {
+    mapper.writeValue(entityStream, t);
+  }
+}

+ 22 - 0
frameworks/Java/undertow-jersey-hikaricp/src/main/java/hello/JsonResource.java

@@ -0,0 +1,22 @@
+package hello;
+
+import javax.inject.*;
+import javax.ws.rs.*;
+import java.util.*;
+
+import static javax.ws.rs.core.MediaType.APPLICATION_JSON;
+
+@Singleton
+@Path("/json")
+public class JsonResource
+{
+
+  @GET
+  @Produces(APPLICATION_JSON)
+  public Object json()
+  {
+    Map<String, String> data = new HashMap<String, String>(1);
+    data.put("message", "Hello, World!");
+    return data;
+  }
+}

+ 20 - 0
frameworks/Java/undertow-jersey-hikaricp/src/main/java/hello/RequestExceptionMapper.java

@@ -0,0 +1,20 @@
+package hello;
+
+import javax.ws.rs.core.*;
+import javax.ws.rs.core.Response.*;
+import javax.ws.rs.ext.*;
+
+public class RequestExceptionMapper
+    implements ExceptionMapper<Exception>
+{
+//  private static final Logger LOGGER = LoggerFactory.getLogger(
+//      RequestExceptionMapper.class);
+
+  @Override
+  public Response toResponse(Exception exception)
+  {
+    exception.printStackTrace();
+    System.err.println(exception.toString());
+    return Response.status(Status.NOT_FOUND).build();
+  }
+}

+ 19 - 0
frameworks/Java/undertow-jersey-hikaricp/src/main/java/hello/ServerResponseFilter.java

@@ -0,0 +1,19 @@
+package hello;
+
+import javax.ws.rs.container.*;
+import java.io.*;
+
+public class ServerResponseFilter
+    implements ContainerResponseFilter
+{
+
+  private static final String SERVER_HEADER = "Server";
+  private static final String SERVER_VALUE  = "Undertow";
+
+  @Override
+  public void filter(ContainerRequestContext requestContext,
+      ContainerResponseContext responseContext) throws IOException
+  {
+    responseContext.getHeaders().add(SERVER_HEADER, SERVER_VALUE);
+  }
+}

+ 45 - 0
frameworks/Java/undertow-jersey-hikaricp/src/main/java/hello/SessionFactoryProvider.java

@@ -0,0 +1,45 @@
+package hello;
+
+import hello.domain.*;
+import org.glassfish.hk2.api.*;
+import org.hibernate.*;
+import org.hibernate.cfg.Configuration;
+import org.hibernate.service.*;
+
+import javax.ws.rs.core.*;
+import javax.ws.rs.core.Context;
+
+public class SessionFactoryProvider
+    implements Factory<SessionFactory>
+{
+
+  @Context
+  Application application;
+
+  public SessionFactoryProvider()
+  {
+  }
+
+  @Override
+  public SessionFactory provide()
+  {
+    Configuration configuration = new Configuration().configure();
+    String url = configuration.getProperty("hibernate.hikari.dataSource.url");
+    url = url.replace("//localhost:3306/",
+        "//" + this.application.getProperties().get("dbhost") + ":"
+            + this.application.getProperties().get("dbport") + "/");
+    configuration.setProperty("hibernate.hikari.dataSource.url", url);
+    configuration.addAnnotatedClass(World.class);
+    configuration.addAnnotatedClass(Fortune.class);
+    ServiceRegistryBuilder serviceRegistryBuilder = new ServiceRegistryBuilder().applySettings(
+        configuration.getProperties());
+    return configuration.buildSessionFactory(
+        serviceRegistryBuilder.buildServiceRegistry());
+  }
+
+  @Override
+  public void dispose(SessionFactory instance)
+  {
+
+  }
+}

+ 30 - 0
frameworks/Java/undertow-jersey-hikaricp/src/main/java/hello/domain/Fortune.java

@@ -0,0 +1,30 @@
+package hello.domain;
+
+import javax.persistence.*;
+
+@Entity
+public class Fortune
+    implements Comparable<Fortune>
+{
+
+  @Id
+  @GeneratedValue(strategy = GenerationType.IDENTITY)
+  public int    id;
+  public String message;
+
+  public Fortune()
+  {
+  }
+
+  public Fortune(final int id, final String message)
+  {
+    this.id = id;
+    this.message = message;
+  }
+
+  @Override
+  public int compareTo(final Fortune other)
+  {
+    return message.compareTo(other.message);
+  }
+}

+ 14 - 0
frameworks/Java/undertow-jersey-hikaricp/src/main/java/hello/domain/World.java

@@ -0,0 +1,14 @@
+package hello.domain;
+
+import javax.persistence.*;
+
+@Entity
+public class World
+{
+
+  @Id
+  @GeneratedValue(strategy = GenerationType.IDENTITY)
+  public int id;
+  public int randomNumber;
+
+}

+ 75 - 0
frameworks/Java/undertow-jersey-hikaricp/src/main/java/hello/undertow/UndertowContainerResponseWriter.java

@@ -0,0 +1,75 @@
+package hello.undertow;
+
+import io.undertow.server.*;
+import io.undertow.util.*;
+import org.glassfish.jersey.server.*;
+import org.glassfish.jersey.server.spi.*;
+
+import java.io.*;
+import java.util.*;
+import java.util.concurrent.*;
+
+public class UndertowContainerResponseWriter
+    implements ContainerResponseWriter
+{
+  private HttpServerExchange httpServerExchange;
+
+  public UndertowContainerResponseWriter(
+      HttpServerExchange httpServerExchange)
+  {
+    this.httpServerExchange = httpServerExchange;
+  }
+
+  @Override
+  public OutputStream writeResponseStatusAndHeaders(long contentLength,
+      ContainerResponse responseContext) throws ContainerException
+  {
+    httpServerExchange.setStatusCode(responseContext.getStatus());
+
+    for (Map.Entry<String, List<String>> mapEntry : responseContext.getStringHeaders().entrySet())
+    {
+      httpServerExchange.getResponseHeaders().putAll(
+          new HttpString(mapEntry.getKey()), mapEntry.getValue());
+    }
+
+    httpServerExchange.setResponseContentLength(contentLength);
+    return httpServerExchange.getOutputStream();
+  }
+
+  @Override
+  public boolean suspend(long timeOut, TimeUnit timeUnit,
+      TimeoutHandler timeoutHandler)
+  {
+    // TODO implement
+    return false;
+  }
+
+  @Override
+  public void setSuspendTimeout(long timeOut, TimeUnit timeUnit)
+      throws IllegalStateException
+  {
+    //TODO implement
+  }
+
+  @Override
+  public void commit()
+  {
+    httpServerExchange.endExchange();
+  }
+
+  @Override
+  public void failure(Throwable error)
+  {
+    // TODO don't print out
+    httpServerExchange.setStatusCode(500);
+    httpServerExchange.endExchange();
+    error.printStackTrace();
+  }
+
+  @Override
+  public boolean enableResponseBuffering()
+  {
+    // TODO not sure
+    return false;
+  }
+}

+ 112 - 0
frameworks/Java/undertow-jersey-hikaricp/src/main/java/hello/undertow/UndertowJerseyContainer.java

@@ -0,0 +1,112 @@
+package hello.undertow;
+
+import io.undertow.server.*;
+import io.undertow.util.*;
+import org.glassfish.jersey.internal.*;
+import org.glassfish.jersey.server.*;
+import org.glassfish.jersey.server.spi.*;
+
+import javax.ws.rs.core.*;
+import java.net.*;
+import java.security.*;
+
+public class UndertowJerseyContainer
+    implements Container, HttpHandler
+{
+
+  /**
+   * Default dummy security context.
+   * Taken from Jersey's ApplicationHandler class
+   */
+  private static final SecurityContext DEFAULT_SECURITY_CONTEXT = new SecurityContext()
+  {
+
+    @Override
+    public boolean isUserInRole(final String role)
+    {
+      return false;
+    }
+
+    @Override
+    public boolean isSecure()
+    {
+      return false;
+    }
+
+    @Override
+    public Principal getUserPrincipal()
+    {
+      return null;
+    }
+
+    @Override
+    public String getAuthenticationScheme()
+    {
+      return null;
+    }
+  };
+  private ApplicationHandler applicationHandler;
+
+  public UndertowJerseyContainer(Application configuration)
+  {
+    this.applicationHandler = new ApplicationHandler(configuration);
+  }
+
+  @Override
+  public ResourceConfig getConfiguration()
+  {
+    return this.applicationHandler.getConfiguration();
+  }
+
+  @Override
+  public ApplicationHandler getApplicationHandler()
+  {
+    return this.applicationHandler;
+  }
+
+  @Override
+  public void reload()
+  {
+    reload(this.applicationHandler.getConfiguration());
+  }
+
+  @Override
+  public void reload(ResourceConfig configuration)
+  {
+
+    this.applicationHandler.onShutdown(this);
+
+    this.applicationHandler = new ApplicationHandler(configuration);
+
+    this.applicationHandler.onStartup(this);
+    this.applicationHandler.onReload(this);
+  }
+
+  @Override
+  public void handleRequest(final HttpServerExchange httpServerExchange)
+      throws Exception
+  {
+    String requestUri = httpServerExchange.getRequestURI();
+    if(httpServerExchange.getQueryString().length() > 0)
+    {
+      requestUri = requestUri + "?" + httpServerExchange.getQueryString();
+    }
+
+    final ContainerRequest request = new ContainerRequest(null,
+        URI.create(requestUri),
+        httpServerExchange.getRequestMethod().toString(),
+        DEFAULT_SECURITY_CONTEXT, new MapPropertiesDelegate());
+
+    request.setWriter(
+        new UndertowContainerResponseWriter(httpServerExchange));
+
+    for (HeaderValues values : httpServerExchange.getRequestHeaders())
+    {
+      request.getHeaders().addAll(values.getHeaderName().toString(),
+          httpServerExchange.getRequestHeaders().get(values.getHeaderName()));
+    }
+
+    request.setEntityStream(httpServerExchange.getInputStream());
+    this.applicationHandler.handle(request);
+  }
+}

+ 20 - 0
frameworks/Java/undertow-jersey-hikaricp/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>
+{{#fortunes}}
+<tr>
+<td>{{id}}</td>
+<td>{{message}}</td>
+</tr>
+{{/fortunes}}
+</table>
+</body>
+</html>

+ 16 - 0
frameworks/Java/undertow-jersey-hikaricp/src/main/resources/hibernate.cfg.xml

@@ -0,0 +1,16 @@
+<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
+<hibernate-configuration>
+  <session-factory>
+    <property name="hibernate.connection.provider_class">org.hibernate.hikaricp.internal.HikariCPConnectionProvider</property>
+    <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
+    <property name="hibernate.cache.use_query_cache">false</property>
+    <property name="hibernate.show_sql">false</property>
+    <property name="hibernate.hikari.minimumIdle">256</property>
+    <property name="hibernate.hikari.maximumPoolSize">256</property>
+    <property name="hibernate.hikari.idleTimeout">30000</property>
+    <property name="hibernate.hikari.dataSourceClassName">com.mysql.jdbc.jdbc2.optional.MysqlDataSource</property>
+    <property name="hibernate.hikari.dataSource.url">jdbc:mysql://localhost:3306/hello_world?jdbcCompliantTruncation=false&amp;elideSetAutoCommits=true&amp;useLocalSessionState=true&amp;cachePrepStmts=true&amp;cacheCallableStmts=true&amp;alwaysSendSetIsolation=false&amp;prepStmtCacheSize=4096&amp;cacheServerConfiguration=true&amp;prepStmtCacheSqlLimit=2048&amp;zeroDateTimeBehavior=convertToNull&amp;traceProtocol=false&amp;useUnbufferedInput=false&amp;useReadAheadInput=false&amp;maintainTimeStats=false&amp;useServerPrepStmts&amp;cacheRSMetadata=true</property>
+    <property name="hibernate.hikari.dataSource.user">benchmarkdbuser</property>
+    <property name="hibernate.hikari.dataSource.password">benchmarkdbpass</property>
+  </session-factory>
+</hibernate-configuration>

+ 1 - 1
frameworks/Java/undertow/setup.sh

@@ -2,7 +2,7 @@
 
 
 sed -i 's|DATABASE_HOST|'"${DBHOST}"'|g' src/main/resources/hello/server.properties
 sed -i 's|DATABASE_HOST|'"${DBHOST}"'|g' src/main/resources/hello/server.properties
 
 
-fw_depends java8 maven
+fw_depends java maven
 
 
 mvn clean compile assembly:single
 mvn clean compile assembly:single
 cd target
 cd target

+ 4 - 0
frameworks/Java/vertx-web/.gitignore

@@ -0,0 +1,4 @@
+.idea
+.vertx
+target
+*.iml

+ 63 - 0
frameworks/Java/vertx-web/Readme.md

@@ -0,0 +1,63 @@
+# Vert.x Web Benchmarking Test
+
+This is the Vert.x Web portion of a [benchmarking test suite](../) comparing a variety of web development platforms.
+
+## Test URLs
+
+### Plain Text Test
+
+http://localhost:8080/plaintext
+
+### JSON Encoding Test
+
+http://localhost:8080/json
+
+### Data-Store/Database Mapping Test
+
+http://localhost:8080/mongo/db
+http://localhost:8080/mongo/queries?queries=5
+
+http://localhost:8080/jdbc/db
+http://localhost:8080/jdbc/queries?queries=5
+
+### Data-Store/Database Update Test
+
+http://localhost:8080/mongo/update?queries=5
+
+http://localhost:8080/jdbc/update?queries=5
+
+### Template rendering Test
+
+http://localhost:8080/mongo/fortunes
+
+http://localhost:8080/jdbc/fortunes
+
+## Generating Load
+It's best to generate load from a completely separate machine from the server if you can, to avoid resource contention
+during the test.
+
+We use the [wrk](https://github.com/wg/wrk) load generation tool to generate the load for our benchmark runs. It's the
+best tool we've found for the job and supports HTTP pipelining (used by the plaintext scenario) via its scripting
+interface. Wrk will only run from a Linux machine however, so if you must use Windows, try using
+[ab](https://httpd.apache.org/docs/2.2/programs/ab.html) (Apache Bench).
+
+You'll need to clone the [wrk repo](https://github.com/wg/wrk) on your load generation machine and follow
+[their instructions to build it](https://github.com/wg/wrk/wiki/Installing-Wrk-on-Linux).
+
+Here's a sample wrk command to generate load for the JSON scenario. This run is using 256 connections across 32 client
+threads for a duration of 10 seconds.
+
+```
+wrk -c 256 -t 32 -d 10 http://127.0.0.1:8080/json
+```
+
+To generate pipelined load for the plaintext scenario, use the following command, assuming your CWD is the root of this
+repo and wrk is on your path. The final argument after the `--` is the desired pipeline depth. We always run the
+plaintext scenario at a pipeline depth of 16, [just like the Techempower Benchmarks](https://github.com/TechEmpower/FrameworkBenchmarks/blob/6594d32db618c6ca65e0106c5adf2671f7b63654/toolset/benchmark/framework_test.py#L640).
+
+```
+wrk -c 256 -t 32 -d 10 -s ./scripts/pipeline.lua http://127.0.0.1:8080/plaintext -- 16
+```
+
+*Note you may want to tweak the number of client threads (the `-t` arg) being used based on the specs of your load
+generation machine.*

+ 66 - 0
frameworks/Java/vertx-web/benchmark_config.json

@@ -0,0 +1,66 @@
+{
+  "framework": "vertx-web",
+  "tests": [{
+    "default": {
+      "setup_file": "setup",
+      "json_url": "/json",
+      "plaintext_url": "/plaintext",
+      "port": 8080,
+      "approach": "Realistic",
+      "classification": "Micro",
+      "database": "None",
+      "framework": "vertx-web",
+      "language": "Java",
+      "orm": "Raw",
+      "platform": "vertx",
+      "webserver": "None",
+      "os": "Linux",
+      "database_os": "Linux",
+      "display_name": "vertx-web",
+      "notes": "",
+      "versus": "vertx"
+    },
+    "mongodb": {
+      "setup_file": "setup",
+      "db_url": "/mongo/db",
+      "query_url": "/mongo/queries?queries=",
+      "fortune_url": "/mongo/fortunes",
+      "update_url": "/mongo/update?queries=",
+      "port": 8080,
+      "approach": "Realistic",
+      "classification": "Micro",
+      "database": "MongoDB",
+      "framework": "vertx-web",
+      "language": "Java",
+      "orm": "Raw",
+      "platform": "vertx",
+      "webserver": "None",
+      "os": "Linux",
+      "database_os": "Linux",
+      "display_name": "vertx-web-mongodb",
+      "notes": "",
+      "versus": ""
+    },
+    "postgres": {
+      "setup_file": "setup",
+      "db_url": "/jdbc/db",
+      "query_url": "/jdbc/queries?queries=",
+      "fortune_url": "/jdbc/fortunes",
+      "update_url": "/jdbc/update?queries=",
+      "port": 8080,
+      "approach": "Realistic",
+      "classification": "Micro",
+      "database": "Postgres",
+      "framework": "vertx-web",
+      "language": "Java",
+      "orm": "Raw",
+      "platform": "vertx",
+      "webserver": "None",
+      "os": "Linux",
+      "database_os": "Linux",
+      "display_name": "vertx-web-jdbc",
+      "notes": "",
+      "versus": ""
+    }
+  }]
+}

+ 110 - 0
frameworks/Java/vertx-web/pom.xml

@@ -0,0 +1,110 @@
+<?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/xsd/maven-4.0.0.xsd">
+
+  <modelVersion>4.0.0</modelVersion>
+
+  <groupId>io.vertx</groupId>
+  <artifactId>vertx-benchmark</artifactId>
+  <version>1.0.0-SNAPSHOT</version>
+
+  <properties>
+    <!-- the main class -->
+    <main.verticle>io.vertx.benchmark.App</main.verticle>
+    <vertx.version>3.2.0</vertx.version>
+  </properties>
+
+  <dependencies>
+    <dependency>
+      <groupId>io.vertx</groupId>
+      <artifactId>vertx-core</artifactId>
+      <version>${vertx.version}</version>
+    </dependency>
+
+    <dependency>
+      <groupId>io.vertx</groupId>
+      <artifactId>vertx-web</artifactId>
+      <version>${vertx.version}</version>
+    </dependency>
+
+    <dependency>
+      <groupId>io.vertx</groupId>
+      <artifactId>vertx-mongo-client</artifactId>
+      <version>${vertx.version}</version>
+    </dependency>
+
+    <dependency>
+      <groupId>io.vertx</groupId>
+      <artifactId>vertx-jdbc-client</artifactId>
+      <version>${vertx.version}</version>
+    </dependency>
+
+    <dependency>
+      <groupId>io.vertx</groupId>
+      <artifactId>vertx-web-templ-handlebars</artifactId>
+      <version>${vertx.version}</version>
+    </dependency>
+
+    <dependency>
+      <groupId>org.postgresql</groupId>
+      <artifactId>postgresql</artifactId>
+      <version>9.4-1206-jdbc42</version>
+    </dependency>
+
+  </dependencies>
+
+  <build>
+
+    <pluginManagement>
+      <plugins>
+        <!-- We specify the Maven compiler plugin as we need to set it to Java 1.8 -->
+        <plugin>
+          <artifactId>maven-compiler-plugin</artifactId>
+          <version>3.1</version>
+          <configuration>
+            <source>1.8</source>
+            <target>1.8</target>
+          </configuration>
+        </plugin>
+      </plugins>
+    </pluginManagement>
+
+    <!--
+    You only need the part below if you want to build your application into a fat executable jar.
+    This is a jar that contains all the dependencies required to run it, so you can just run it with
+    java -jar
+    -->
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-shade-plugin</artifactId>
+        <version>2.3</version>
+        <executions>
+          <execution>
+            <phase>package</phase>
+            <goals>
+              <goal>shade</goal>
+            </goals>
+            <configuration>
+              <transformers>
+                <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
+                  <manifestEntries>
+                    <Main-Class>io.vertx.core.Launcher</Main-Class>
+                    <Main-Verticle>${main.verticle}</Main-Verticle>
+                  </manifestEntries>
+                </transformer>
+                <transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
+                  <resource>META-INF/services/io.vertx.core.spi.VerticleFactory</resource>
+                </transformer>
+              </transformers>
+              <artifactSet>
+              </artifactSet>
+              <outputFile>${project.build.directory}/${project.artifactId}-${project.version}-fat.jar</outputFile>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
+</project>

+ 34 - 0
frameworks/Java/vertx-web/scripts/pipeline.lua

@@ -0,0 +1,34 @@
+local pipelineDepth = 1
+local counter = 0
+local maxRequests = -1
+
+function init(args)
+   if args[1] ~= nil then
+      pipelineDepth = tonumber(args[1])
+   end
+
+   local r = {}
+   for i = 1, pipelineDepth, 1 do
+      r[i] = wrk.format(nil)
+   end
+
+   print("Pipeline depth: " .. pipelineDepth)
+
+   if args[2] ~= nil then
+      maxRequests = tonumber(args[2])
+      print("Max requests: " .. maxRequests)
+   end
+
+   req = table.concat(r)
+end
+
+function request()
+   return req
+end
+
+function response()
+   if counter == maxRequests then
+     wrk.thread:stop()
+   end
+   counter = counter + 1
+end

+ 9 - 0
frameworks/Java/vertx-web/setup.sh

@@ -0,0 +1,9 @@
+#!/bin/bash
+
+sed -i 's|localhost|'"${DBHOST}"'|g' src/main/conf/config.json
+
+fw_depends java8 maven
+
+mvn clean package
+
+java -Xms2G -Xmx2G -server -XX:+UseNUMA -XX:+UseParallelGC -XX:+AggressiveOpts -Dvertx.disableWebsockets=true -Dvertx.flashPolicyHandler=false -Dvertx.threadChecks=false -Dvertx.disableContextTimings=true -Dvertx.disableTCCL=true -jar target/vertx-benchmark-1.0.0-SNAPSHOT-fat.jar --conf src/main/conf/config.json &

+ 15 - 0
frameworks/Java/vertx-web/source_code

@@ -0,0 +1,15 @@
+./vertx-web/src
+./vertx-web/src/main
+./vertx-web/src/main/resources
+./vertx-web/src/main/resources/templates
+./vertx-web/src/main/resources/templates/fortunes.hbs
+./vertx-web/src/main/java
+./vertx-web/src/main/java/io
+./vertx-web/src/main/java/io/vertx
+./vertx-web/src/main/java/io/vertx/benchmark
+./vertx-web/src/main/java/io/vertx/benchmark/App.java
+./vertx-web/src/main/java/io/vertx/benchmark/Helper.java
+./vertx-web/src/main/java/io/vertx/benchmark/model
+./vertx-web/src/main/java/io/vertx/benchmark/model/Message.java
+./vertx-web/src/main/java/io/vertx/benchmark/model/Fortune.java
+./vertx-web/src/main/java/io/vertx/benchmark/model/World.java

Some files were not shown because too many files changed in this diff