Browse Source

`comsat-webactors`

circlespainter 10 years ago
parent
commit
1bb06d6d56
40 changed files with 1286 additions and 0 deletions
  1. 2 0
      .travis.yml
  2. 4 0
      frameworks/Java/comsat-servlet/.gitignore
  3. 27 0
      frameworks/Java/comsat-servlet/README.md
  4. 64 0
      frameworks/Java/comsat-servlet/benchmark_config.json
  5. 63 0
      frameworks/Java/comsat-servlet/build.gradle
  6. BIN
      frameworks/Java/comsat-servlet/gradle/wrapper/gradle-wrapper.jar
  7. 6 0
      frameworks/Java/comsat-servlet/gradle/wrapper/gradle-wrapper.properties
  8. 164 0
      frameworks/Java/comsat-servlet/gradlew
  9. 90 0
      frameworks/Java/comsat-servlet/gradlew.bat
  10. 8 0
      frameworks/Java/comsat-servlet/setup-generic.sh
  11. 5 0
      frameworks/Java/comsat-servlet/setup-jetty.sh
  12. 5 0
      frameworks/Java/comsat-servlet/setup-tomcat.sh
  13. 5 0
      frameworks/Java/comsat-servlet/setup-undertow.sh
  14. 1 0
      frameworks/Java/comsat-servlet/setup.sh
  15. 4 0
      frameworks/Java/comsat-servlet/source_code
  16. 48 0
      frameworks/Java/comsat-servlet/src/main/java/hello/HelloWebServer.java
  17. 28 0
      frameworks/Java/comsat-servlet/src/main/java/hello/JsonServlet.java
  18. 22 0
      frameworks/Java/comsat-servlet/src/main/java/hello/PlaintextServlet.java
  19. 4 0
      frameworks/Java/comsat-webactors/.gitignore
  20. 27 0
      frameworks/Java/comsat-webactors/README.md
  21. 102 0
      frameworks/Java/comsat-webactors/benchmark_config.json
  22. 77 0
      frameworks/Java/comsat-webactors/build.gradle
  23. BIN
      frameworks/Java/comsat-webactors/gradle/wrapper/gradle-wrapper.jar
  24. 6 0
      frameworks/Java/comsat-webactors/gradle/wrapper/gradle-wrapper.properties
  25. 164 0
      frameworks/Java/comsat-webactors/gradlew
  26. 90 0
      frameworks/Java/comsat-webactors/gradlew.bat
  27. 9 0
      frameworks/Java/comsat-webactors/setup-generic.sh
  28. 5 0
      frameworks/Java/comsat-webactors/setup-netty.sh
  29. 5 0
      frameworks/Java/comsat-webactors/setup-servlet-jetty.sh
  30. 5 0
      frameworks/Java/comsat-webactors/setup-servlet-tomcat.sh
  31. 5 0
      frameworks/Java/comsat-webactors/setup-servlet-undertow.sh
  32. 5 0
      frameworks/Java/comsat-webactors/setup-undertow.sh
  33. 1 0
      frameworks/Java/comsat-webactors/setup.sh
  34. 8 0
      frameworks/Java/comsat-webactors/source_code
  35. 68 0
      frameworks/Java/comsat-webactors/src/main/java/hello/HelloWebActor.java
  36. 37 0
      frameworks/Java/comsat-webactors/src/main/java/servers/Main.java
  37. 60 0
      frameworks/Java/comsat-webactors/src/main/java/servers/NettyServer.java
  38. 6 0
      frameworks/Java/comsat-webactors/src/main/java/servers/Server.java
  39. 29 0
      frameworks/Java/comsat-webactors/src/main/java/servers/ServletServer.java
  40. 27 0
      frameworks/Java/comsat-webactors/src/main/java/servers/UndertowServer.java

+ 2 - 0
.travis.yml

@@ -64,6 +64,8 @@ env:
     - "TESTDIR=Haskell/wai"
     - "TESTDIR=Haskell/wai"
     - "TESTDIR=Haskell/yesod"
     - "TESTDIR=Haskell/yesod"
     - "TESTDIR=Java/activeweb"
     - "TESTDIR=Java/activeweb"
+    - "TESTDIR=Java/comsat-servlet"
+    - "TESTDIR=Java/comsat-webactors"
     - "TESTDIR=Java/curacao"
     - "TESTDIR=Java/curacao"
     - "TESTDIR=Java/dropwizard"
     - "TESTDIR=Java/dropwizard"
     - "TESTDIR=Java/gemini"
     - "TESTDIR=Java/gemini"

+ 4 - 0
frameworks/Java/comsat-servlet/.gitignore

@@ -0,0 +1,4 @@
+.gradle
+build/
+gradle-app.setting
+!gradle-wrapper.jar

+ 27 - 0
frameworks/Java/comsat-servlet/README.md

@@ -0,0 +1,27 @@
+# Parallel Universe Comsat Servlet Benchmarking Test
+
+This is the [Parallel Universe Comsat Servlet](http://docs.paralleluniverse.co/comsat/#servlets) version of a [benchmarking test suite](../) comparing a variety of web development platforms. It serves requests in lightweight [Quasar fibers](http://docs.paralleluniverse.co/quasar/#fibers) rather than heavyweight Java threads and it any servlet containers. Configurations are provided for Jetty, Tomcat and Undertow (default).
+
+### JSON Encoding and Plaintext Tests
+
+* [JSON test source](src/main/java/hello/JsonServlet.java)
+* [Plaintext test source](src/main/java/hello/PlaintextServlet.java)
+
+## Versions
+
+* Jackson JSON 2.5.4 (https://github.com/FasterXML/jackson)
+* Quasar 0.7.3 (http://docs.paralleluniverse.co/quasar)
+* Comsat 0.5.0 (http://docs.paralleluniverse.co/comsat)
+* Undertow 1.2.10-final (http://undertow.io)
+* Tomcat 8.0.26 (http://tomcat.apache.org)
+* Jetty 9.2.13.v20150730 (http://eclipse.org/jetty)
+
+## Test URLs
+
+### JSON Encoding Test
+
+    http://localhost:8080/json
+
+### Plaintest
+
+    http://localhost:8080/plaintest

+ 64 - 0
frameworks/Java/comsat-servlet/benchmark_config.json

@@ -0,0 +1,64 @@
+{
+  "framework": "comsat-servlet",
+  "tests": [
+    {
+      "default": {
+        "setup_file": "setup",
+        "json_url": "/json",
+        "plaintext_url": "/plaintext",
+        "port": 8080,
+        "approach": "Realistic",
+        "classification": "Platform",
+        "database": "None",
+        "framework": "comsat-servlet",
+        "language": "Java",
+        "orm": "Raw",
+        "platform": "Comsat Servlet",
+        "webserver": "Undertow",
+        "os": "Linux",
+        "database_os": "Linux",
+        "display_name": "comsat-servlet-undertow",
+        "notes": "Comsat servlet on embedded Undertow",
+        "versus": ""
+      },
+      "jetty": {
+        "setup_file": "setup-jetty",
+        "json_url": "/json",
+        "plaintext_url": "/plaintext",
+        "port": 8080,
+        "approach": "Realistic",
+        "classification": "Platform",
+        "database": "None",
+        "framework": "comsat-servlet",
+        "language": "Java",
+        "orm": "Raw",
+        "platform": "Comsat Servlet",
+        "webserver": "Jetty",
+        "os": "Linux",
+        "database_os": "Linux",
+        "display_name": "comsat-servlet-jetty",
+        "notes": "Comsat servlet on embedded Jetty",
+        "versus": ""
+      },
+      "tomcat": {
+        "setup_file": "setup-tomcat",
+        "json_url": "/json",
+        "plaintext_url": "/plaintext",
+        "port": 8080,
+        "approach": "Realistic",
+        "classification": "Platform",
+        "database": "None",
+        "framework": "comsat-servlet",
+        "language": "Java",
+        "orm": "Raw",
+        "platform": "Comsat Servlet",
+        "webserver": "Tomcat",
+        "os": "Linux",
+        "database_os": "Linux",
+        "display_name": "comsat-servlet-jetty",
+        "notes": "Comsat servlet on embedded Tomcat",
+        "versus": ""
+      }
+    }
+  ]
+}

+ 63 - 0
frameworks/Java/comsat-servlet/build.gradle

@@ -0,0 +1,63 @@
+// Capsule plugin
+plugins {
+    id "us.kirchmeier.capsule" version "1.0.0"
+}
+
+apply plugin: 'java'
+
+sourceCompatibility = 1.8
+targetCompatibility = 1.8
+
+version = '1.0'
+
+ext.jacksonVer = '2.5.4'
+ext.quasarVer  = '0.7.3'
+ext.comsatVer  = '0.5.0'
+
+[compileJava, compileTestJava]*.options*.encoding = "UTF-8"
+
+repositories {
+    // mavenLocal()
+    mavenCentral()
+}
+
+configurations {
+    quasar
+}
+
+configurations.capsule.dependencies.clear()
+
+dependencies {
+    compile "co.paralleluniverse:quasar-core:$quasarVer:jdk8"
+    compile "com.fasterxml.jackson.core:jackson-databind:$jacksonVer"
+    compile "co.paralleluniverse:comsat-servlet:$comsatVer"
+    compile "co.paralleluniverse:comsat-test-utils:$comsatVer"
+
+    capsule "co.paralleluniverse:capsule:1.0"
+
+    quasar "co.paralleluniverse:quasar-core:$quasarVer:jdk8"
+}
+
+task capsule(type: FatCapsule) {
+    applicationClass "hello.HelloWebServer"
+
+    capsuleManifest {
+        javaAgents = [configurations.quasar.iterator().next().getName()]
+
+        mode('undertow') {
+            systemProperties['serverClass'] = 'co.paralleluniverse.embedded.containers.UndertowServer'
+        }
+
+        mode('jetty') {
+            systemProperties['serverClass'] = 'co.paralleluniverse.embedded.containers.JettyServer'
+        }
+
+        mode('tomcat') {
+            systemProperties['serverClass'] = 'co.paralleluniverse.embedded.containers.TomcatServer'
+        }
+    }
+}
+
+task wrapper(type: Wrapper) {
+    gradleVersion = '2.7'
+}

BIN
frameworks/Java/comsat-servlet/gradle/wrapper/gradle-wrapper.jar


+ 6 - 0
frameworks/Java/comsat-servlet/gradle/wrapper/gradle-wrapper.properties

@@ -0,0 +1,6 @@
+#Fri Sep 18 14:31:37 IDT 2015
+distributionBase=GRADLE_USER_HOME
+distributionPath=wrapper/dists
+zipStoreBase=GRADLE_USER_HOME
+zipStorePath=wrapper/dists
+distributionUrl=https\://services.gradle.org/distributions/gradle-2.7-bin.zip

+ 164 - 0
frameworks/Java/comsat-servlet/gradlew

@@ -0,0 +1,164 @@
+#!/usr/bin/env bash
+
+##############################################################################
+##
+##  Gradle start up script for UN*X
+##
+##############################################################################
+
+# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+DEFAULT_JVM_OPTS=""
+
+APP_NAME="Gradle"
+APP_BASE_NAME=`basename "$0"`
+
+# Use the maximum available, or set MAX_FD != -1 to use that value.
+MAX_FD="maximum"
+
+warn ( ) {
+    echo "$*"
+}
+
+die ( ) {
+    echo
+    echo "$*"
+    echo
+    exit 1
+}
+
+# OS specific support (must be 'true' or 'false').
+cygwin=false
+msys=false
+darwin=false
+case "`uname`" in
+  CYGWIN* )
+    cygwin=true
+    ;;
+  Darwin* )
+    darwin=true
+    ;;
+  MINGW* )
+    msys=true
+    ;;
+esac
+
+# For Cygwin, ensure paths are in UNIX format before anything is touched.
+if $cygwin ; then
+    [ -n "$JAVA_HOME" ] && JAVA_HOME=`cygpath --unix "$JAVA_HOME"`
+fi
+
+# Attempt to set APP_HOME
+# Resolve links: $0 may be a link
+PRG="$0"
+# Need this for relative symlinks.
+while [ -h "$PRG" ] ; do
+    ls=`ls -ld "$PRG"`
+    link=`expr "$ls" : '.*-> \(.*\)$'`
+    if expr "$link" : '/.*' > /dev/null; then
+        PRG="$link"
+    else
+        PRG=`dirname "$PRG"`"/$link"
+    fi
+done
+SAVED="`pwd`"
+cd "`dirname \"$PRG\"`/" >&-
+APP_HOME="`pwd -P`"
+cd "$SAVED" >&-
+
+CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
+
+# Determine the Java command to use to start the JVM.
+if [ -n "$JAVA_HOME" ] ; then
+    if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
+        # IBM's JDK on AIX uses strange locations for the executables
+        JAVACMD="$JAVA_HOME/jre/sh/java"
+    else
+        JAVACMD="$JAVA_HOME/bin/java"
+    fi
+    if [ ! -x "$JAVACMD" ] ; then
+        die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+    fi
+else
+    JAVACMD="java"
+    which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+fi
+
+# Increase the maximum file descriptors if we can.
+if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then
+    MAX_FD_LIMIT=`ulimit -H -n`
+    if [ $? -eq 0 ] ; then
+        if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
+            MAX_FD="$MAX_FD_LIMIT"
+        fi
+        ulimit -n $MAX_FD
+        if [ $? -ne 0 ] ; then
+            warn "Could not set maximum file descriptor limit: $MAX_FD"
+        fi
+    else
+        warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
+    fi
+fi
+
+# For Darwin, add options to specify how the application appears in the dock
+if $darwin; then
+    GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
+fi
+
+# For Cygwin, switch paths to Windows format before running java
+if $cygwin ; then
+    APP_HOME=`cygpath --path --mixed "$APP_HOME"`
+    CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
+
+    # We build the pattern for arguments to be converted via cygpath
+    ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
+    SEP=""
+    for dir in $ROOTDIRSRAW ; do
+        ROOTDIRS="$ROOTDIRS$SEP$dir"
+        SEP="|"
+    done
+    OURCYGPATTERN="(^($ROOTDIRS))"
+    # Add a user-defined pattern to the cygpath arguments
+    if [ "$GRADLE_CYGPATTERN" != "" ] ; then
+        OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
+    fi
+    # Now convert the arguments - kludge to limit ourselves to /bin/sh
+    i=0
+    for arg in "$@" ; do
+        CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
+        CHECK2=`echo "$arg"|egrep -c "^-"`                                 ### Determine if an option
+
+        if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then                    ### Added a condition
+            eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
+        else
+            eval `echo args$i`="\"$arg\""
+        fi
+        i=$((i+1))
+    done
+    case $i in
+        (0) set -- ;;
+        (1) set -- "$args0" ;;
+        (2) set -- "$args0" "$args1" ;;
+        (3) set -- "$args0" "$args1" "$args2" ;;
+        (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
+        (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
+        (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
+        (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
+        (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
+        (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
+    esac
+fi
+
+# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules
+function splitJvmOpts() {
+    JVM_OPTS=("$@")
+}
+eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS
+JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME"
+
+exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@"

+ 90 - 0
frameworks/Java/comsat-servlet/gradlew.bat

@@ -0,0 +1,90 @@
+@if "%DEBUG%" == "" @echo off
+@rem ##########################################################################
+@rem
+@rem  Gradle startup script for Windows
+@rem
+@rem ##########################################################################
+
+@rem Set local scope for the variables with windows NT shell
+if "%OS%"=="Windows_NT" setlocal
+
+@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+set DEFAULT_JVM_OPTS=
+
+set DIRNAME=%~dp0
+if "%DIRNAME%" == "" set DIRNAME=.
+set APP_BASE_NAME=%~n0
+set APP_HOME=%DIRNAME%
+
+@rem Find java.exe
+if defined JAVA_HOME goto findJavaFromJavaHome
+
+set JAVA_EXE=java.exe
+%JAVA_EXE% -version >NUL 2>&1
+if "%ERRORLEVEL%" == "0" goto init
+
+echo.
+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:findJavaFromJavaHome
+set JAVA_HOME=%JAVA_HOME:"=%
+set JAVA_EXE=%JAVA_HOME%/bin/java.exe
+
+if exist "%JAVA_EXE%" goto init
+
+echo.
+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:init
+@rem Get command-line arguments, handling Windowz variants
+
+if not "%OS%" == "Windows_NT" goto win9xME_args
+if "%@eval[2+2]" == "4" goto 4NT_args
+
+:win9xME_args
+@rem Slurp the command line arguments.
+set CMD_LINE_ARGS=
+set _SKIP=2
+
+:win9xME_args_slurp
+if "x%~1" == "x" goto execute
+
+set CMD_LINE_ARGS=%*
+goto execute
+
+:4NT_args
+@rem Get arguments from the 4NT Shell from JP Software
+set CMD_LINE_ARGS=%$
+
+:execute
+@rem Setup the command line
+
+set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
+
+@rem Execute Gradle
+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
+
+:end
+@rem End local scope for the variables with windows NT shell
+if "%ERRORLEVEL%"=="0" goto mainEnd
+
+:fail
+rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
+rem the _cmd.exe /c_ return code!
+if  not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
+exit /b 1
+
+:mainEnd
+if "%OS%"=="Windows_NT" endlocal
+
+:omega

+ 8 - 0
frameworks/Java/comsat-servlet/setup-generic.sh

@@ -0,0 +1,8 @@
+#!/bin/bash
+
+fw_depends java8
+
+$TROOT/gradlew clean capsule
+
+CAPSULE=`ls build/libs/comsat-servlet-*-capsule.jar`
+java -Dcapsule.mode=$MODE -jar $CAPSULE

+ 5 - 0
frameworks/Java/comsat-servlet/setup-jetty.sh

@@ -0,0 +1,5 @@
+#!/bin/bash
+
+MODE="jetty"
+
+. $TROOT/setup-generic.sh

+ 5 - 0
frameworks/Java/comsat-servlet/setup-tomcat.sh

@@ -0,0 +1,5 @@
+#!/bin/bash
+
+MODE="tomcat"
+
+. $TROOT/setup-generic.sh

+ 5 - 0
frameworks/Java/comsat-servlet/setup-undertow.sh

@@ -0,0 +1,5 @@
+#!/bin/bash
+
+MODE="undertow"
+
+. $TROOT/setup-generic.sh

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

@@ -0,0 +1 @@
+setup-undertow.sh

+ 4 - 0
frameworks/Java/comsat-servlet/source_code

@@ -0,0 +1,4 @@
+./jetty-servlet/src/main/java/hello/
+./jetty-servlet/src/main/java/hello/HelloWebServer.java
+./jetty-servlet/src/main/java/hello/JsonServlet.java
+./jetty-servlet/src/main/java/hello/PlaintextServlet.java

+ 48 - 0
frameworks/Java/comsat-servlet/src/main/java/hello/HelloWebServer.java

@@ -0,0 +1,48 @@
+package hello;
+
+import co.paralleluniverse.embedded.containers.AbstractEmbeddedServer;
+import co.paralleluniverse.embedded.containers.EmbeddedServer;
+
+import java.io.IOException;
+
+/**
+ * An implementation of the TechEmpower benchmark tests using Comsat servlets and the Undertow web server.
+ */
+public final class HelloWebServer {
+	public static void main(String[] args) throws Exception {
+		final EmbeddedServer server = (EmbeddedServer) Class.forName(System.getProperty("serverClass")).newInstance();
+		server.addServlet("plaintext", PlaintextServlet.class, "/plaintext");
+		server.addServlet("json", JsonServlet.class, "/json");
+
+		Runtime.getRuntime().addShutdownHook(new Thread() {
+			@Override
+			public void run() {
+				try {
+					server.stop();
+
+					System.err.println("Server is down.");
+				} catch (Exception e) {
+					throw new RuntimeException(e);
+				}
+			}
+		});
+
+		new Thread() {
+			@Override
+			public void run() {
+				try {
+					AbstractEmbeddedServer.waitUrlAvailable("http://localhost:8080/plaintext");
+					AbstractEmbeddedServer.waitUrlAvailable("http://localhost:8080/json");
+
+					System.err.println("Server test cases are instrumented and bootstrapped.");
+				} catch (InterruptedException | IOException e) {
+					throw new RuntimeException(e);
+				}
+			}
+		}.start();
+
+		server.start();
+
+		System.err.println("Server is up.");
+	}
+}

+ 28 - 0
frameworks/Java/comsat-servlet/src/main/java/hello/JsonServlet.java

@@ -0,0 +1,28 @@
+package hello;
+
+import co.paralleluniverse.fibers.Suspendable;
+import co.paralleluniverse.fibers.servlet.FiberHttpServlet;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+import java.io.IOException;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+public final class JsonServlet extends FiberHttpServlet {
+	private static final class HelloWorldData {
+		@SuppressWarnings("unused")
+		public final String message = "Hello, World!";
+	}
+
+	private static final ObjectMapper mapper = new ObjectMapper();
+
+	@Override
+	@Suspendable
+	protected final void doGet(final HttpServletRequest req, final HttpServletResponse resp) throws ServletException, IOException {
+		resp.setContentType("application/json");
+		resp.setHeader("Server", "comsat-servlet");
+		mapper.writeValue(resp.getOutputStream(), new HelloWorldData());
+	}
+}

+ 22 - 0
frameworks/Java/comsat-servlet/src/main/java/hello/PlaintextServlet.java

@@ -0,0 +1,22 @@
+package hello;
+
+import co.paralleluniverse.fibers.Suspendable;
+import co.paralleluniverse.fibers.servlet.FiberHttpServlet;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.nio.charset.StandardCharsets;
+
+public final class PlaintextServlet extends FiberHttpServlet {
+	private static final byte[] helloWorld = "Hello, World!".getBytes(StandardCharsets.ISO_8859_1);
+
+	@Override
+	@Suspendable
+	protected final void doGet(final HttpServletRequest req, final HttpServletResponse resp) throws ServletException, IOException {
+		resp.setContentType("text/plain");
+		resp.setHeader("Server", "comsat-servlet");
+		resp.getOutputStream().write(helloWorld);
+	}
+}

+ 4 - 0
frameworks/Java/comsat-webactors/.gitignore

@@ -0,0 +1,4 @@
+.gradle
+build/
+gradle-app.setting
+!gradle-wrapper.jar

+ 27 - 0
frameworks/Java/comsat-webactors/README.md

@@ -0,0 +1,27 @@
+# Parallel Universe Comsat Web Actors Benchmarking Test
+
+This is the [Parallel Universe Comsat Web Actors](http://docs.paralleluniverse.co/comsat/#servlets) version of a [benchmarking test suite](../) comparing a variety of web development platforms. It serves requests in Erlang-like actors running on lightweight [Quasar fibers](http://docs.paralleluniverse.co/quasar/#fibers) rather than heavyweight Java threads and it can run on any servlet container (configurations provided for embedded Undertow, Jetty and Tomcat) as well as a Netty and Undertow handler (default configuration).
+
+### JSON and Plaintest Encoding Tests
+
+* [JSON test source](src/main/java/hello/HelloWebActor.java)
+
+## Versions
+
+* Jackson JSON 2.5.4 (https://github.com/FasterXML/jackson)
+* Quasar 0.7.3 (http://docs.paralleluniverse.co/quasar)
+* Comsat 0.5.0 (http://docs.paralleluniverse.co/comsat)
+* Undertow 1.2.10-final (http://undertow.io)
+* Netty 4.0.30.Final (http://undertow.io)
+* Tomcat 8.0.26 (http://tomcat.apache.org)
+* Jetty 9.2.13.v20150730 (http://www.eclipse.org/jetty/)
+
+## Test URLs
+
+### JSON Encoding Test
+
+    http://localhost:8080/json
+
+### Plaintest
+
+    http://localhost:8080/plaintest

+ 102 - 0
frameworks/Java/comsat-webactors/benchmark_config.json

@@ -0,0 +1,102 @@
+{
+  "framework": "comsat-webactors",
+  "tests": [
+    {
+      "default": {
+        "setup_file": "setup",
+        "json_url": "/json",
+        "plaintext_url": "/plaintext",
+        "port": 8080,
+        "approach": "Realistic",
+        "classification": "Platform",
+        "database": "None",
+        "framework": "comsat-webactors",
+        "language": "Java",
+        "orm": "Raw",
+        "platform": "Comsat Web Actors",
+        "webserver": "Undertow",
+        "os": "Linux",
+        "database_os": "Linux",
+        "display_name": "comsat-actors-undertow",
+        "notes": "Comsat Web Actors run as an Undertow handler",
+        "versus": ""
+      },
+      "netty": {
+        "setup_file": "setup-netty",
+        "json_url": "/json",
+        "plaintext_url": "/plaintext",
+        "port": 8080,
+        "approach": "Realistic",
+        "classification": "Platform",
+        "database": "None",
+        "framework": "comsat-webactors",
+        "language": "Java",
+        "orm": "Raw",
+        "platform": "Comsat Web Actors",
+        "webserver": "Netty",
+        "os": "Linux",
+        "database_os": "Linux",
+        "display_name": "comsat-actors-netty",
+        "notes": "Comsat Web Actors run as a Netty handler",
+        "versus": ""
+      },
+      "servlet-undertow": {
+        "setup_file": "setup-servlet-undertow",
+        "json_url": "/json",
+        "plaintext_url": "/plaintext",
+        "port": 8080,
+        "approach": "Realistic",
+        "classification": "Platform",
+        "database": "None",
+        "framework": "comsat-webactors",
+        "language": "Java",
+        "orm": "Raw",
+        "platform": "Comsat Web Actors",
+        "webserver": "Undertow",
+        "os": "Linux",
+        "database_os": "Linux",
+        "display_name": "comsat-actors-servlet-undertow",
+        "notes": "Comsat Web Actors run as a servlet on embedded Undertow",
+        "versus": ""
+      },
+      "servlet-jetty": {
+        "setup_file": "setup-servlet-jetty",
+        "json_url": "/json",
+        "plaintext_url": "/plaintext",
+        "port": 8080,
+        "approach": "Realistic",
+        "classification": "Platform",
+        "database": "None",
+        "framework": "comsat-webactors",
+        "language": "Java",
+        "orm": "Raw",
+        "platform": "Comsat Web Actors",
+        "webserver": "Jetty",
+        "os": "Linux",
+        "database_os": "Linux",
+        "display_name": "comsat-actors-servlet-jetty",
+        "notes": "Comsat Web Actors run as a servlet on embedded Jetty",
+        "versus": ""
+      },
+      "servlet-tomcat": {
+        "setup_file": "setup-servlet-tomcat",
+        "json_url": "/json",
+        "plaintext_url": "/plaintext",
+        "port": 8080,
+        "approach": "Realistic",
+        "classification": "Platform",
+        "database": "None",
+        "framework": "comsat-webactors",
+        "language": "Java",
+        "orm": "Raw",
+        "platform": "Comsat Web Actors",
+        "webserver": "Tomcat",
+        "os": "Linux",
+        "database_os": "Linux",
+        "display_name": "comsat-actors-servlet-tomcat",
+        "notes": "Comsat Web Actors run as a servlet on embedded Tomcat",
+        "versus": ""
+      }
+    }
+  ]
+}

+ 77 - 0
frameworks/Java/comsat-webactors/build.gradle

@@ -0,0 +1,77 @@
+// Capsule plugin
+plugins {
+    id "us.kirchmeier.capsule" version "1.0.0"
+}
+
+apply plugin: 'java'
+
+sourceCompatibility = 1.8
+targetCompatibility = 1.8
+
+version = '1.0'
+
+ext.jacksonVer = '2.5.4'
+ext.quasarVer  = '0.7.3'
+ext.comsatVer  = '0.5.0'
+
+[compileJava, compileTestJava]*.options*.encoding = "UTF-8"
+
+repositories {
+    // mavenLocal()
+    mavenCentral()
+}
+
+configurations {
+    quasar
+}
+
+configurations.capsule.dependencies.clear()
+
+dependencies {
+    compile "co.paralleluniverse:quasar-core:$quasarVer:jdk8"
+    compile "com.fasterxml.jackson.core:jackson-databind:$jacksonVer"
+    compile "co.paralleluniverse:comsat-actors-api:$comsatVer"
+    compile "co.paralleluniverse:comsat-actors-servlet:$comsatVer"
+    compile "co.paralleluniverse:comsat-actors-undertow:$comsatVer"
+    compile "co.paralleluniverse:comsat-actors-netty:$comsatVer"
+    compile "co.paralleluniverse:comsat-test-utils:$comsatVer"
+
+    capsule "co.paralleluniverse:capsule:1.0"
+
+    quasar "co.paralleluniverse:quasar-core:$quasarVer:jdk8"
+}
+
+task capsule(type: FatCapsule) {
+    applicationClass "servers.Main"
+
+    capsuleManifest {
+        javaAgents = [configurations.quasar.iterator().next().getName()]
+
+        mode('undertow') {
+            systemProperties['serverClass'] = 'servers.UndertowServer'
+        }
+
+        mode('netty') {
+            systemProperties['serverClass'] = 'servers.NettyServer'
+        }
+
+        mode('servlet-undertow') {
+            systemProperties['serverClass'] = 'servers.ServletServer'
+            systemProperties['servletServerClass'] = 'co.paralleluniverse.embedded.containers.UndertowServer'
+        }
+
+        mode('servlet-jetty') {
+            systemProperties['serverClass'] = 'servers.ServletServer'
+            systemProperties['servletServerClass'] = 'co.paralleluniverse.embedded.containers.JettyServer'
+        }
+
+        mode('servlet-tomcat') {
+            systemProperties['serverClass'] = 'servers.ServletServer'
+            systemProperties['servletServerClass'] = 'co.paralleluniverse.embedded.containers.TomcatServer'
+        }
+    }
+}
+
+task wrapper(type: Wrapper) {
+    gradleVersion = '2.7'
+}

BIN
frameworks/Java/comsat-webactors/gradle/wrapper/gradle-wrapper.jar


+ 6 - 0
frameworks/Java/comsat-webactors/gradle/wrapper/gradle-wrapper.properties

@@ -0,0 +1,6 @@
+#Fri Sep 18 13:54:26 IDT 2015
+distributionBase=GRADLE_USER_HOME
+distributionPath=wrapper/dists
+zipStoreBase=GRADLE_USER_HOME
+zipStorePath=wrapper/dists
+distributionUrl=https\://services.gradle.org/distributions/gradle-2.7-bin.zip

+ 164 - 0
frameworks/Java/comsat-webactors/gradlew

@@ -0,0 +1,164 @@
+#!/usr/bin/env bash
+
+##############################################################################
+##
+##  Gradle start up script for UN*X
+##
+##############################################################################
+
+# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+DEFAULT_JVM_OPTS=""
+
+APP_NAME="Gradle"
+APP_BASE_NAME=`basename "$0"`
+
+# Use the maximum available, or set MAX_FD != -1 to use that value.
+MAX_FD="maximum"
+
+warn ( ) {
+    echo "$*"
+}
+
+die ( ) {
+    echo
+    echo "$*"
+    echo
+    exit 1
+}
+
+# OS specific support (must be 'true' or 'false').
+cygwin=false
+msys=false
+darwin=false
+case "`uname`" in
+  CYGWIN* )
+    cygwin=true
+    ;;
+  Darwin* )
+    darwin=true
+    ;;
+  MINGW* )
+    msys=true
+    ;;
+esac
+
+# For Cygwin, ensure paths are in UNIX format before anything is touched.
+if $cygwin ; then
+    [ -n "$JAVA_HOME" ] && JAVA_HOME=`cygpath --unix "$JAVA_HOME"`
+fi
+
+# Attempt to set APP_HOME
+# Resolve links: $0 may be a link
+PRG="$0"
+# Need this for relative symlinks.
+while [ -h "$PRG" ] ; do
+    ls=`ls -ld "$PRG"`
+    link=`expr "$ls" : '.*-> \(.*\)$'`
+    if expr "$link" : '/.*' > /dev/null; then
+        PRG="$link"
+    else
+        PRG=`dirname "$PRG"`"/$link"
+    fi
+done
+SAVED="`pwd`"
+cd "`dirname \"$PRG\"`/" >&-
+APP_HOME="`pwd -P`"
+cd "$SAVED" >&-
+
+CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
+
+# Determine the Java command to use to start the JVM.
+if [ -n "$JAVA_HOME" ] ; then
+    if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
+        # IBM's JDK on AIX uses strange locations for the executables
+        JAVACMD="$JAVA_HOME/jre/sh/java"
+    else
+        JAVACMD="$JAVA_HOME/bin/java"
+    fi
+    if [ ! -x "$JAVACMD" ] ; then
+        die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+    fi
+else
+    JAVACMD="java"
+    which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+fi
+
+# Increase the maximum file descriptors if we can.
+if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then
+    MAX_FD_LIMIT=`ulimit -H -n`
+    if [ $? -eq 0 ] ; then
+        if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
+            MAX_FD="$MAX_FD_LIMIT"
+        fi
+        ulimit -n $MAX_FD
+        if [ $? -ne 0 ] ; then
+            warn "Could not set maximum file descriptor limit: $MAX_FD"
+        fi
+    else
+        warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
+    fi
+fi
+
+# For Darwin, add options to specify how the application appears in the dock
+if $darwin; then
+    GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
+fi
+
+# For Cygwin, switch paths to Windows format before running java
+if $cygwin ; then
+    APP_HOME=`cygpath --path --mixed "$APP_HOME"`
+    CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
+
+    # We build the pattern for arguments to be converted via cygpath
+    ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
+    SEP=""
+    for dir in $ROOTDIRSRAW ; do
+        ROOTDIRS="$ROOTDIRS$SEP$dir"
+        SEP="|"
+    done
+    OURCYGPATTERN="(^($ROOTDIRS))"
+    # Add a user-defined pattern to the cygpath arguments
+    if [ "$GRADLE_CYGPATTERN" != "" ] ; then
+        OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
+    fi
+    # Now convert the arguments - kludge to limit ourselves to /bin/sh
+    i=0
+    for arg in "$@" ; do
+        CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
+        CHECK2=`echo "$arg"|egrep -c "^-"`                                 ### Determine if an option
+
+        if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then                    ### Added a condition
+            eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
+        else
+            eval `echo args$i`="\"$arg\""
+        fi
+        i=$((i+1))
+    done
+    case $i in
+        (0) set -- ;;
+        (1) set -- "$args0" ;;
+        (2) set -- "$args0" "$args1" ;;
+        (3) set -- "$args0" "$args1" "$args2" ;;
+        (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
+        (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
+        (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
+        (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
+        (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
+        (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
+    esac
+fi
+
+# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules
+function splitJvmOpts() {
+    JVM_OPTS=("$@")
+}
+eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS
+JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME"
+
+exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@"

+ 90 - 0
frameworks/Java/comsat-webactors/gradlew.bat

@@ -0,0 +1,90 @@
+@if "%DEBUG%" == "" @echo off
+@rem ##########################################################################
+@rem
+@rem  Gradle startup script for Windows
+@rem
+@rem ##########################################################################
+
+@rem Set local scope for the variables with windows NT shell
+if "%OS%"=="Windows_NT" setlocal
+
+@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+set DEFAULT_JVM_OPTS=
+
+set DIRNAME=%~dp0
+if "%DIRNAME%" == "" set DIRNAME=.
+set APP_BASE_NAME=%~n0
+set APP_HOME=%DIRNAME%
+
+@rem Find java.exe
+if defined JAVA_HOME goto findJavaFromJavaHome
+
+set JAVA_EXE=java.exe
+%JAVA_EXE% -version >NUL 2>&1
+if "%ERRORLEVEL%" == "0" goto init
+
+echo.
+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:findJavaFromJavaHome
+set JAVA_HOME=%JAVA_HOME:"=%
+set JAVA_EXE=%JAVA_HOME%/bin/java.exe
+
+if exist "%JAVA_EXE%" goto init
+
+echo.
+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:init
+@rem Get command-line arguments, handling Windowz variants
+
+if not "%OS%" == "Windows_NT" goto win9xME_args
+if "%@eval[2+2]" == "4" goto 4NT_args
+
+:win9xME_args
+@rem Slurp the command line arguments.
+set CMD_LINE_ARGS=
+set _SKIP=2
+
+:win9xME_args_slurp
+if "x%~1" == "x" goto execute
+
+set CMD_LINE_ARGS=%*
+goto execute
+
+:4NT_args
+@rem Get arguments from the 4NT Shell from JP Software
+set CMD_LINE_ARGS=%$
+
+:execute
+@rem Setup the command line
+
+set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
+
+@rem Execute Gradle
+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
+
+:end
+@rem End local scope for the variables with windows NT shell
+if "%ERRORLEVEL%"=="0" goto mainEnd
+
+:fail
+rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
+rem the _cmd.exe /c_ return code!
+if  not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
+exit /b 1
+
+:mainEnd
+if "%OS%"=="Windows_NT" endlocal
+
+:omega

+ 9 - 0
frameworks/Java/comsat-webactors/setup-generic.sh

@@ -0,0 +1,9 @@
+#!/bin/bash
+
+fw_depends java8
+
+$TROOT/gradlew capsule
+
+CAPSULE=`ls build/libs/comsat-webactors-*-capsule.jar`
+
+java -Dcapsule.mode=$MODE -jar $CAPSULE

+ 5 - 0
frameworks/Java/comsat-webactors/setup-netty.sh

@@ -0,0 +1,5 @@
+#!/bin/bash
+
+MODE="netty"
+
+. $TROOT/setup-generic.sh

+ 5 - 0
frameworks/Java/comsat-webactors/setup-servlet-jetty.sh

@@ -0,0 +1,5 @@
+#!/bin/bash
+
+MODE="servlet-jetty"
+
+. $TROOT/setup-generic.sh

+ 5 - 0
frameworks/Java/comsat-webactors/setup-servlet-tomcat.sh

@@ -0,0 +1,5 @@
+#!/bin/bash
+
+MODE="servlet-tomcat"
+
+. $TROOT/setup-generic.sh

+ 5 - 0
frameworks/Java/comsat-webactors/setup-servlet-undertow.sh

@@ -0,0 +1,5 @@
+#!/bin/bash
+
+MODE="servlet-undertow"
+
+. $TROOT/setup-generic.sh

+ 5 - 0
frameworks/Java/comsat-webactors/setup-undertow.sh

@@ -0,0 +1,5 @@
+#!/bin/bash
+
+MODE="undertow"
+
+. $TROOT/setup-generic.sh

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

@@ -0,0 +1 @@
+setup-undertow.sh

+ 8 - 0
frameworks/Java/comsat-webactors/source_code

@@ -0,0 +1,8 @@
+./src/main/java/hello/
+./src/main/java/hello/HelloWebActor
+./src/main/java/server/
+./src/main/java/server/Server
+./src/main/java/server/ServletServer
+./src/main/java/server/UndertowServer
+./src/main/java/server/NettyServer
+./src/main/java/server/Main

+ 68 - 0
frameworks/Java/comsat-webactors/src/main/java/hello/HelloWebActor.java

@@ -0,0 +1,68 @@
+package hello;
+
+import co.paralleluniverse.actors.BasicActor;
+import co.paralleluniverse.comsat.webactors.HttpRequest;
+import co.paralleluniverse.comsat.webactors.HttpResponse;
+import co.paralleluniverse.comsat.webactors.WebActor;
+import co.paralleluniverse.fibers.SuspendExecution;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+import java.text.SimpleDateFormat;
+import java.util.Calendar;
+import java.util.Locale;
+import java.util.TimeZone;
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.concurrent.atomic.AtomicInteger;
+
+import static co.paralleluniverse.comsat.webactors.HttpResponse.error;
+import static co.paralleluniverse.comsat.webactors.HttpResponse.ok;
+
+@WebActor(httpUrlPatterns = {"/plaintext", "/json"})
+public class HelloWebActor extends BasicActor<Object, Void> {
+	private static final class HelloWorldData {
+		@SuppressWarnings("unused")
+		public final String message = "Hello, World!";
+	}
+
+	private static final ObjectMapper mapper = new ObjectMapper();
+
+	private static final Calendar calendar = Calendar.getInstance();
+	private static final SimpleDateFormat dateFormat = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss z", Locale.US);
+	static {
+		dateFormat.setTimeZone(TimeZone.getTimeZone("GMT"));
+	}
+
+	@Override
+	protected Void doRun() throws InterruptedException, SuspendExecution {
+		//noinspection InfiniteLoopStatement
+		for (;;) {
+			final Object message = receive();
+			if (message instanceof HttpRequest) {
+				final HttpRequest req = (HttpRequest) message;
+				HttpResponse.Builder res;
+				switch (req.getRequestURI()) {
+					case "/plaintext":
+						res = ok(self(), req, "Hello, World!").setContentType("text/plain");
+						break;
+					case "/json":
+						try {
+							res = ok(self(), req, mapper.writeValueAsString(new HelloWorldData())).setContentType("application/json");
+						} catch (JsonProcessingException e) {
+							throw new RuntimeException(e);
+						}
+						break;
+					default:
+						res = error(self(), req, 404, "Not found");
+						break;
+				}
+				req.getFrom().send (
+					res
+						.addHeader("Server", "comsat-webactors")
+						.addHeader("Date", dateFormat.format(calendar.getTime()))
+						.build()
+				);
+			}
+		}
+	}
+}

+ 37 - 0
frameworks/Java/comsat-webactors/src/main/java/servers/Main.java

@@ -0,0 +1,37 @@
+package servers;
+
+import co.paralleluniverse.embedded.containers.AbstractEmbeddedServer;
+
+import java.io.IOException;
+
+public class Main {
+	public static void main(String[] args) throws Exception {
+		final Server server = (Server) Class.forName(System.getProperty("serverClass")).newInstance();
+
+		Runtime.getRuntime().addShutdownHook(new Thread() {
+			@Override
+			public void run() {
+				try {
+					server.stop();
+				} catch (Exception ignored) {
+				}
+			}
+		});
+
+		new Thread() {
+			@Override
+			public void run() {
+				try {
+					AbstractEmbeddedServer.waitUrlAvailable("http://localhost:8080/plaintext");
+					AbstractEmbeddedServer.waitUrlAvailable("http://localhost:8080/json");
+
+					System.err.println("Server test cases are instrumented and bootstrapped.");
+				} catch (InterruptedException | IOException e) {
+					throw new RuntimeException(e);
+				}
+			}
+		}.start();
+
+		server.start();
+	}
+}

+ 60 - 0
frameworks/Java/comsat-webactors/src/main/java/servers/NettyServer.java

@@ -0,0 +1,60 @@
+package servers;
+
+import co.paralleluniverse.comsat.webactors.netty.AutoWebActorHandler;
+import io.netty.bootstrap.ServerBootstrap;
+import io.netty.buffer.PooledByteBufAllocator;
+import io.netty.channel.*;
+import io.netty.channel.nio.NioEventLoopGroup;
+import io.netty.channel.socket.SocketChannel;
+import io.netty.channel.socket.nio.NioServerSocketChannel;
+import io.netty.handler.codec.http.HttpObjectAggregator;
+import io.netty.handler.codec.http.HttpRequestDecoder;
+import io.netty.handler.codec.http.HttpResponseEncoder;
+
+public class NettyServer implements Server {
+	private NioEventLoopGroup group = new NioEventLoopGroup();
+	private ChannelFuture ch;
+
+	@Override
+	public void start() throws Exception {
+		final ServerBootstrap b = new ServerBootstrap();
+		b.option(ChannelOption.SO_BACKLOG, 65535);
+		b.childOption(ChannelOption.CONNECT_TIMEOUT_MILLIS, 0);
+		b.childOption(ChannelOption.TCP_NODELAY, true);
+		b.childOption(ChannelOption.SO_REUSEADDR, true);
+		b.childOption(ChannelOption.SO_LINGER, 0);
+		b.childOption(ChannelOption.WRITE_BUFFER_HIGH_WATER_MARK, 32 * 1024);
+		b.childOption(ChannelOption.WRITE_BUFFER_LOW_WATER_MARK, 8 * 1024);
+		b.childOption(ChannelOption.ALLOCATOR, PooledByteBufAllocator.DEFAULT);
+
+		final ChannelInitializer<SocketChannel> childHandler = new SocketChannelChannelInitializer();
+		b.group(group)
+			.channel(NioServerSocketChannel.class)
+			.childHandler(childHandler);
+
+		ch = b.bind(8080).sync();
+
+		System.err.println("Server is up.");
+	}
+
+	@Override
+	public void stop() throws Exception {
+		if (ch != null && ch.channel().isOpen())
+			ch.channel().close();
+		if (group != null)
+			group.shutdownGracefully().sync();
+
+		System.err.println("Server is down.");
+	}
+
+	private static class SocketChannelChannelInitializer extends ChannelInitializer<SocketChannel> {
+		@Override
+		public void initChannel(SocketChannel ch) throws Exception {
+			final ChannelPipeline pipeline = ch.pipeline();
+			pipeline.addLast(new HttpRequestDecoder());
+			pipeline.addLast(new HttpResponseEncoder());
+			pipeline.addLast(new HttpObjectAggregator(65536));
+			pipeline.addLast(new AutoWebActorHandler());
+		}
+	}
+}

+ 6 - 0
frameworks/Java/comsat-webactors/src/main/java/servers/Server.java

@@ -0,0 +1,6 @@
+package servers;
+
+public interface Server {
+	void start() throws Exception;
+	void stop() throws Exception;
+}

+ 29 - 0
frameworks/Java/comsat-webactors/src/main/java/servers/ServletServer.java

@@ -0,0 +1,29 @@
+package servers;
+
+import co.paralleluniverse.comsat.webactors.servlet.WebActorInitializer;
+import co.paralleluniverse.embedded.containers.AbstractEmbeddedServer;
+import co.paralleluniverse.embedded.containers.EmbeddedServer;
+
+public class ServletServer implements Server {
+	private EmbeddedServer server;
+
+	@Override
+	public void start() throws Exception {
+		server = (EmbeddedServer) Class.forName(System.getProperty("servletServerClass")).newInstance();
+		WebActorInitializer.setUserClassLoader(ClassLoader.getSystemClassLoader());
+		server.addServletContextListener(WebActorInitializer.class);
+		server.enableWebsockets();
+		server.start();
+
+		System.err.println("Server is up.");
+	}
+
+	@Override
+	public void stop() throws Exception {
+		if (server != null) {
+			server.stop();
+
+			System.err.println("Server is down.");
+		}
+	}
+}

+ 27 - 0
frameworks/Java/comsat-webactors/src/main/java/servers/UndertowServer.java

@@ -0,0 +1,27 @@
+package servers;
+
+import co.paralleluniverse.comsat.webactors.undertow.AutoWebActorHandler;
+import io.undertow.Undertow;
+
+public class UndertowServer implements Server {
+	private Undertow server;
+
+	@Override
+	public void start() throws Exception {
+		server = Undertow.builder()
+			.addHttpListener(8080, "localhost")
+			.setHandler(new AutoWebActorHandler()).build();
+		server.start();
+
+		System.err.println("Server is up.");
+	}
+
+	@Override
+	public void stop() throws Exception {
+		if (server != null) {
+			server.stop();
+
+			System.err.println("Server is down.");
+		}
+	}
+}