Browse Source

Merge remote-tracking branch 'upstream/master'

Lucian Pacurar 11 years ago
parent
commit
906335b080

+ 5 - 5
HttpListener/benchmark_config

@@ -13,7 +13,7 @@
       "language": "C#",
       "orm": "Raw",
       "platform": "NET",
-      "webserver": "IIS",
+      "webserver": "HTTP.sys",
       "os": "Windows",
       "database_os": "Linux",
       "display_name": "http-listener",
@@ -34,7 +34,7 @@
       "language": "C#",
       "orm": "Raw",
       "platform": "NET",
-      "webserver": "IIS",
+      "webserver": "HTTP.sys",
       "os": "Windows",
       "database_os": "Linux",
       "display_name": "http-listener",
@@ -55,7 +55,7 @@
       "language": "C#",
       "orm": "Raw",
       "platform": "NET",
-      "webserver": "IIS",
+      "webserver": "HTTP.sys",
       "os": "Windows",
       "database_os": "Linux",
       "display_name": "http-listener",
@@ -76,7 +76,7 @@
       "language": "C#",
       "orm": "Raw",
       "platform": "NET",
-      "webserver": "IIS",
+      "webserver": "HTTP.sys",
       "os": "Windows",
       "database_os": "Linux",
       "display_name": "http-listener",
@@ -97,7 +97,7 @@
       "language": "C#",
       "orm": "Raw",
       "platform": "NET",
-      "webserver": "IIS",
+      "webserver": "HTTP.sys",
       "os": "Windows",
       "database_os": "Windows",
       "display_name": "http-listener",

+ 2 - 2
config/benchmark_profile

@@ -1,12 +1,12 @@
 export JAVA_HOME=/usr/lib/jvm/java-1.7.0-openjdk-amd64
 export RESIN_HOME=~/FrameworkBenchmarks/installs/resin-4.0.36
-export GRAILS_HOME=~/FrameworkBenchmarks/installs/grails-2.1.1
+export GRAILS_HOME=~/FrameworkBenchmarks/installs/grails-2.3.1
 export VERTX_HOME=~/FrameworkBenchmarks/installs/vert.x-2.0.2-final
 export GOROOT=~/FrameworkBenchmarks/installs/go
 export GOPATH=~/FrameworkBenchmarks/go:~/FrameworkBenchmarks/webgo:~/FrameworkBenchmarks/revel
 export TOMCAT_HOME=~/FrameworkBenchmarks/installs/apache-tomcat-7.0.35
 export NODE_HOME=~/FrameworkBenchmarks/installs/node-v0.10.8-linux-x64
-export PLAY_HOME=~/FrameworkBenchmarks/installs/play-2.1.2-RC1
+export PLAY_HOME=~/FrameworkBenchmarks/installs/play-2.2.0
 export PLAY1_HOME=~/FrameworkBenchmarks/installs/play-1.2.5
 export MAVEN_HOME=~/FrameworkBenchmarks/installs/apache-maven-3.0.5
 export PERL_HOME=/opt/ActivePerl-5.16

+ 2 - 11
grails/README.md

@@ -2,18 +2,9 @@
 
 This is the Grails portion of a [benchmarking test suite](../) comparing a variety of web development platforms.
 
-### JSON Encoding Test
-
-* [JSON test controller/view](hello/grails-app/HelloController.groovy) TODO: this gives 404
-
-### Data-Store/Database Mapping Test
-
-* [DB test controller](hello/grails-app/HelloController.groovy) TODO: this gives 404
-* [DB test model](hello/grails-app/domain/hello/World.groovy) TODO: this gives 404
-
 ## Infrastructure Software Versions
 The tests were run with:
-* [Grails 2.1.1](http://grails.org/)
+* [Grails 2.3.1](http://grails.org/)
 * [Java OpenJDK 1.7.0_09](http://openjdk.java.net/)
 * [Resin 4.0.34](http://www.caucho.com/)
 * [MySQL 5.5.29](https://dev.mysql.com/)
@@ -26,4 +17,4 @@ http://localhost:8080/grails/hello/json
 
 ### Data-Store/Database Mapping Test
 
-http://localhost:8080/grails/hello/db?queries=5
+http://localhost:8080/grails/hello/db?queries=5

+ 3 - 2
grails/benchmark_config

@@ -19,7 +19,8 @@
       "database_os": "Linux",
       "display_name": "grails",
       "notes": "",
-      "versus": "servlet"
+      "versus": "servlet",
+      "skip": "true"
     }
   }]
-}
+}

+ 2 - 2
grails/hello/application.properties

@@ -1,6 +1,6 @@
 #Grails Metadata file
-#Thu Apr 19 15:23:51 PDT 2012
-app.grails.version=2.1.1
+#Sat Oct 26 13:32:20 PDT 2013
+app.grails.version=2.3.1
 app.name=hello
 app.servlet.version=2.5
 app.version=0.1

+ 2 - 3
grails/hello/grails-app/conf/BuildConfig.groovy

@@ -37,7 +37,7 @@ grails.project.dependency.resolution = {
     }
 
     plugins {
-        runtime ":hibernate:$grailsVersion"
+        compile ":hibernate:3.6.10.2"
         runtime ":jquery:1.7.1"
         runtime ":resources:1.1.6"
 
@@ -45,7 +45,6 @@ grails.project.dependency.resolution = {
         //runtime ":zipped-resources:1.0"
         //runtime ":cached-resources:1.0"
         //runtime ":yui-minify-resources:0.1.4"
-
-        build ":tomcat:$grailsVersion"
+        build ':tomcat:7.0.40.1'
     }
 }

+ 24 - 0
grails/hello/grails-app/conf/Config.groovy

@@ -91,3 +91,27 @@ log4j = {
            'org.hibernate',
            'net.sf.ehcache.hibernate'
 }
+
+// Uncomment and edit the following lines to start using Grails encoding & escaping improvements
+
+/* remove this line 
+// GSP settings
+grails {
+    views {
+        gsp {
+            encoding = 'UTF-8'
+            htmlcodec = 'xml' // use xml escaping instead of HTML4 escaping
+            codecs {
+                expression = 'html' // escapes values inside null
+                scriptlet = 'none' // escapes output from scriptlets in GSPs
+                taglib = 'none' // escapes output from taglibs
+                staticparts = 'none' // escapes output from static template parts
+            }
+        }
+        // escapes all not-encoded output at final stage of outputting
+        filteringCodecForContentType {
+            //'text/html' = 'html'
+        }
+    }
+}
+remove this line */

+ 4 - 3
grails/hello/web-app/WEB-INF/applicationContext.xml

@@ -1,8 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <beans xmlns="http://www.springframework.org/schema/beans"
-       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-       xsi:schemaLocation="
-http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
 
 	<bean id="grailsApplication" class="org.codehaus.groovy.grails.commons.GrailsApplicationFactoryBean">
 		<description>Grails application factory bean</description>
@@ -30,4 +29,6 @@ http://www.springframework.org/schema/beans http://www.springframework.org/schem
 			<value>utf-8</value>
 		</property>
 	</bean>
+
+	<bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean" />
 </beans>

+ 244 - 98
grails/hello/web-app/WEB-INF/tld/spring.tld

@@ -1,311 +1,457 @@
-<?xml version="1.0" encoding="ISO-8859-1" ?>
-<!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN" "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">
-
-<taglib>
-
-	<tlib-version>1.1.1</tlib-version>
-
-	<jsp-version>1.2</jsp-version>
-
-	<short-name>Spring</short-name>
-
+<?xml version="1.0" encoding="UTF-8"?>
+<taglib xmlns="http://java.sun.com/xml/ns/j2ee"
+		xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+		xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
+		version="2.0">
+
+	<description>Spring Framework JSP Tag Library</description>
+	<tlib-version>3.0</tlib-version>
+	<short-name>spring</short-name>
 	<uri>http://www.springframework.org/tags</uri>
 
-	<description>Spring Framework JSP Tag Library. Authors: Rod Johnson, Juergen Hoeller</description>
-
-
 	<tag>
-
-		<name>htmlEscape</name>
-		<tag-class>org.springframework.web.servlet.tags.HtmlEscapeTag</tag-class>
-		<body-content>JSP</body-content>
-
 		<description>
 			Sets default HTML escape value for the current page.
 			Overrides a "defaultHtmlEscape" context-param in web.xml, if any.
 		</description>
-
+		<name>htmlEscape</name>
+		<tag-class>org.springframework.web.servlet.tags.HtmlEscapeTag</tag-class>
+		<body-content>JSP</body-content>
 		<attribute>
+			<description>Set the default value for HTML escaping, to be put
+				into the current PageContext.</description>
 			<name>defaultHtmlEscape</name>
 			<required>true</required>
 			<rtexprvalue>true</rtexprvalue>
 		</attribute>
-
 	</tag>
 
-
 	<tag>
-
-		<name>escapeBody</name>
-		<tag-class>org.springframework.web.servlet.tags.EscapeBodyTag</tag-class>
-		<body-content>JSP</body-content>
-
 		<description>
 			Escapes its enclosed body content, applying HTML escaping and/or JavaScript escaping.
 			The HTML escaping flag participates in a page-wide or application-wide setting
 			(i.e. by HtmlEscapeTag or a "defaultHtmlEscape" context-param in web.xml).
 		</description>
-
+		<name>escapeBody</name>
+		<tag-class>org.springframework.web.servlet.tags.EscapeBodyTag</tag-class>
+		<body-content>JSP</body-content>
 		<attribute>
+			<description>Set HTML escaping for this tag, as boolean value. Overrides the
+			default HTML escaping setting for the current page.</description>
 			<name>htmlEscape</name>
 			<required>false</required>
 			<rtexprvalue>true</rtexprvalue>
 		</attribute>
-
 		<attribute>
+			<description>Set JavaScript escaping for this tag, as boolean value.
+			Default is false.</description>
 			<name>javaScriptEscape</name>
 			<required>false</required>
 			<rtexprvalue>true</rtexprvalue>
 		</attribute>
-
 	</tag>
 
-
 	<tag>
-
-		<name>message</name>
-		<tag-class>org.springframework.web.servlet.tags.MessageTag</tag-class>
-		<body-content>JSP</body-content>
-
 		<description>
 			Retrieves the message with the given code, or text if code isn't resolvable.
 			The HTML escaping flag participates in a page-wide or application-wide setting
 			(i.e. by HtmlEscapeTag or a "defaultHtmlEscape" context-param in web.xml).
 		</description>
-
+		<name>message</name>
+		<tag-class>org.springframework.web.servlet.tags.MessageTag</tag-class>
+		<body-content>JSP</body-content>
 		<attribute>
+			<description>A MessageSourceResolvable argument (direct or through JSP EL).
+				Fits nicely when used in conjunction with Spring's own validation error
+				classes which all implement the MessageSourceResolvable interface. For
+				example, this allows you to iterate over all of the errors in a form,
+				passing each error (using a runtime expression) as the value of this
+				'message' attribute, thus effecting the easy display of such error
+				messages.</description>
+			<name>message</name>
+			<required>false</required>
+			<rtexprvalue>true</rtexprvalue>
+		</attribute>
+		<attribute>
+			<description>The code (key) to use when looking up the message.
+			If code is not provided, the text attribute will be used.</description>
 			<name>code</name>
 			<required>false</required>
 			<rtexprvalue>true</rtexprvalue>
 		</attribute>
-
 		<attribute>
+			<description>Set optional message arguments for this tag, as a
+			(comma-)delimited String (each String argument can contain JSP EL),
+			an Object array (used as argument array), or a single Object (used
+			as single argument).</description>
 			<name>arguments</name>
 			<required>false</required>
 			<rtexprvalue>true</rtexprvalue>
 		</attribute>
-
 		<attribute>
+			<description>The separator character to be used for splitting the
+			arguments string value; defaults to a 'comma' (',').</description>
+			<name>argumentSeparator</name>
+			<required>false</required>
+			<rtexprvalue>true</rtexprvalue>
+		</attribute>
+		<attribute>
+			<description>Default text to output when a message for the given code
+			could not be found. If both text and code are not set, the tag will
+			output null.</description>
 			<name>text</name>
 			<required>false</required>
 			<rtexprvalue>true</rtexprvalue>
 		</attribute>
-
 		<attribute>
+			<description>The string to use when binding the result to the page,
+			request, session or application scope. If not specified, the result
+			gets outputted to the writer (i.e. typically directly to the JSP).</description>
 			<name>var</name>
 			<required>false</required>
 			<rtexprvalue>true</rtexprvalue>
 		</attribute>
-
 		<attribute>
+			<description>The scope to use when exporting the result to a variable.
+			This attribute is only used when var is also set. Possible values are
+			page, request, session and application.</description>
 			<name>scope</name>
 			<required>false</required>
 			<rtexprvalue>true</rtexprvalue>
 		</attribute>
-
 		<attribute>
+			<description>Set HTML escaping for this tag, as boolean value.
+			Overrides the default HTML escaping setting for the current page.</description>
 			<name>htmlEscape</name>
 			<required>false</required>
 			<rtexprvalue>true</rtexprvalue>
 		</attribute>
-
 		<attribute>
+			<description>Set JavaScript escaping for this tag, as boolean value. Default is false.</description>
 			<name>javaScriptEscape</name>
 			<required>false</required>
 			<rtexprvalue>true</rtexprvalue>
 		</attribute>
-
 	</tag>
 
-
 	<tag>
-
-		<name>theme</name>
-		<tag-class>org.springframework.web.servlet.tags.ThemeTag</tag-class>
-		<body-content>JSP</body-content>
-
 		<description>
 			Retrieves the theme message with the given code, or text if code isn't resolvable.
 			The HTML escaping flag participates in a page-wide or application-wide setting
 			(i.e. by HtmlEscapeTag or a "defaultHtmlEscape" context-param in web.xml).
 		</description>
-
+		<name>theme</name>
+		<tag-class>org.springframework.web.servlet.tags.ThemeTag</tag-class>
+		<body-content>JSP</body-content>
 		<attribute>
+			<description>A MessageSourceResolvable argument (direct or through JSP EL).</description>
+			<name>message</name>
+			<required>false</required>
+			<rtexprvalue>true</rtexprvalue>
+		</attribute>
+		<attribute>
+			<description>The code (key) to use when looking up the message.
+			If code is not provided, the text attribute will be used.</description>
 			<name>code</name>
 			<required>false</required>
 			<rtexprvalue>true</rtexprvalue>
 		</attribute>
-
 		<attribute>
+			<description>Set optional message arguments for this tag, as a
+			(comma-)delimited String (each String argument can contain JSP EL),
+			an Object array (used as argument array), or a single Object (used
+			as single argument).</description>
 			<name>arguments</name>
 			<required>false</required>
 			<rtexprvalue>true</rtexprvalue>
 		</attribute>
-
 		<attribute>
+			<description>The separator character to be used for splitting the
+			arguments string value; defaults to a 'comma' (',').</description>
+			<name>argumentSeparator</name>
+			<required>false</required>
+			<rtexprvalue>true</rtexprvalue>
+		</attribute>
+		<attribute>
+			<description>Default text to output when a message for the given code
+			could not be found. If both text and code are not set, the tag will
+			output null.</description>
 			<name>text</name>
 			<required>false</required>
 			<rtexprvalue>true</rtexprvalue>
 		</attribute>
-
 		<attribute>
+			<description>The string to use when binding the result to the page,
+			request, session or application scope. If not specified, the result
+			gets outputted to the writer (i.e. typically directly to the JSP).</description>
 			<name>var</name>
 			<required>false</required>
 			<rtexprvalue>true</rtexprvalue>
 		</attribute>
-
 		<attribute>
+			<description>The scope to use when exporting the result to a variable.
+			This attribute is only used when var is also set. Possible values are
+			page, request, session and application.</description>
 			<name>scope</name>
 			<required>false</required>
 			<rtexprvalue>true</rtexprvalue>
 		</attribute>
-
 		<attribute>
+			<description>Set HTML escaping for this tag, as boolean value.
+			Overrides the default HTML escaping setting for the current page.</description>
 			<name>htmlEscape</name>
 			<required>false</required>
 			<rtexprvalue>true</rtexprvalue>
 		</attribute>
-
 		<attribute>
+			<description>Set JavaScript escaping for this tag, as boolean value. Default is false.</description>
 			<name>javaScriptEscape</name>
 			<required>false</required>
 			<rtexprvalue>true</rtexprvalue>
 		</attribute>
-
 	</tag>
 
-
 	<tag>
-
-		<name>hasBindErrors</name>
-		<tag-class>org.springframework.web.servlet.tags.BindErrorsTag</tag-class>
-		<body-content>JSP</body-content>
-
 		<description>
 			Provides Errors instance in case of bind errors.
 			The HTML escaping flag participates in a page-wide or application-wide setting
 			(i.e. by HtmlEscapeTag or a "defaultHtmlEscape" context-param in web.xml).
 		</description>
-
+		<name>hasBindErrors</name>
+		<tag-class>org.springframework.web.servlet.tags.BindErrorsTag</tag-class>
+		<body-content>JSP</body-content>
 		<variable>
 			<name-given>errors</name-given>
 			<variable-class>org.springframework.validation.Errors</variable-class>
 		</variable>
-
 		<attribute>
+			<description>The name of the bean in the request, that needs to be
+			inspected for errors. If errors are available for this bean, they
+			will be bound under the 'errors' key.</description>
 			<name>name</name>
 			<required>true</required>
 			<rtexprvalue>true</rtexprvalue>
 		</attribute>
-
 		<attribute>
+			<description>Set HTML escaping for this tag, as boolean value.
+			Overrides the default HTML escaping setting for the current page.</description>
 			<name>htmlEscape</name>
 			<required>false</required>
 			<rtexprvalue>true</rtexprvalue>
 		</attribute>
-
 	</tag>
 
-
 	<tag>
-
-		<name>nestedPath</name>
-		<tag-class>org.springframework.web.servlet.tags.NestedPathTag</tag-class>
-		<body-content>JSP</body-content>
-
 		<description>
 			Sets a nested path to be used by the bind tag's path.
 		</description>
-
+		<name>nestedPath</name>
+		<tag-class>org.springframework.web.servlet.tags.NestedPathTag</tag-class>
+		<body-content>JSP</body-content>
 		<variable>
 			<name-given>nestedPath</name-given>
 			<variable-class>java.lang.String</variable-class>
 		</variable>
-
 		<attribute>
+			<description>Set the path that this tag should apply. E.g. 'customer'
+			to allow bind paths like 'address.street' rather than
+			'customer.address.street'.</description>
 			<name>path</name>
 			<required>true</required>
 			<rtexprvalue>true</rtexprvalue>
 		</attribute>
-
 	</tag>
 
-
 	<tag>
-
-		<name>bind</name>
-		<tag-class>org.springframework.web.servlet.tags.BindTag</tag-class>
-		<body-content>JSP</body-content>
-
 		<description>
 			Provides BindStatus object for the given bind path.
 			The HTML escaping flag participates in a page-wide or application-wide setting
 			(i.e. by HtmlEscapeTag or a "defaultHtmlEscape" context-param in web.xml).
 		</description>
-
+		<name>bind</name>
+		<tag-class>org.springframework.web.servlet.tags.BindTag</tag-class>
+		<body-content>JSP</body-content>
 		<variable>
 			<name-given>status</name-given>
 			<variable-class>org.springframework.web.servlet.support.BindStatus</variable-class>
 		</variable>
-
 		<attribute>
+			<description>The path to the bean or bean property to bind status
+			information for. For instance account.name, company.address.zipCode
+			or just employee. The status object will exported to the page scope,
+			specifically for this bean or bean property</description>
 			<name>path</name>
 			<required>true</required>
 			<rtexprvalue>true</rtexprvalue>
 		</attribute>
-
 		<attribute>
+			<description>Set whether to ignore a nested path, if any. Default is to not ignore.</description>
 			<name>ignoreNestedPath</name>
 			<required>false</required>
 			<rtexprvalue>true</rtexprvalue>
 		</attribute>
-
 		<attribute>
+			<description>Set HTML escaping for this tag, as boolean value. Overrides
+			the default HTML escaping setting for the current page.</description>
 			<name>htmlEscape</name>
 			<required>false</required>
 			<rtexprvalue>true</rtexprvalue>
 		</attribute>
-
 	</tag>
 
-
 	<tag>
-
-		<name>transform</name>
-		<tag-class>org.springframework.web.servlet.tags.TransformTag</tag-class>
-		<body-content>JSP</body-content>
-
 		<description>
 			Provides transformation of variables to Strings, using an appropriate
 			custom PropertyEditor from BindTag (can only be used inside BindTag).
 			The HTML escaping flag participates in a page-wide or application-wide setting
-			(i.e. by HtmlEscapeTag or a "defaultHtmlEscape" context-param in web.xml).
+			(i.e. by HtmlEscapeTag or a 'defaultHtmlEscape' context-param in web.xml).
 		</description>
-
+		<name>transform</name>
+		<tag-class>org.springframework.web.servlet.tags.TransformTag</tag-class>
+		<body-content>JSP</body-content>
 		<attribute>
+			<description>The value to transform. This is the actual object you want
+			to have transformed (for instance a Date). Using the PropertyEditor that
+			is currently in use by the 'spring:bind' tag.</description>
 			<name>value</name>
 			<required>true</required>
 			<rtexprvalue>true</rtexprvalue>
 		</attribute>
-
 		<attribute>
+			<description>The string to use when binding the result to the page,
+			request, session or application scope. If not specified, the result gets
+			outputted to the writer (i.e. typically directly to the JSP).</description>
 			<name>var</name>
 			<required>false</required>
 			<rtexprvalue>true</rtexprvalue>
 		</attribute>
-
 		<attribute>
+			<description>The scope to use when exported the result to a variable.
+			This attribute is only used when var is also set. Possible values are
+			page, request, session and application.</description>
 			<name>scope</name>
 			<required>false</required>
 			<rtexprvalue>true</rtexprvalue>
 		</attribute>
+		<attribute>
+			<description>Set HTML escaping for this tag, as boolean value. Overrides
+			the default HTML escaping setting for the current page.</description>
+			<name>htmlEscape</name>
+			<required>false</required>
+			<rtexprvalue>true</rtexprvalue>
+		</attribute>
+	</tag>
 
+	<tag>
+		<description>URL tag based on the JSTL c:url tag.  This variant is fully 
+		backwards compatible with the standard tag.  Enhancements include support 
+		for URL template parameters.</description>
+		<name>url</name>
+		<tag-class>org.springframework.web.servlet.tags.UrlTag</tag-class>
+		<body-content>JSP</body-content>
+		<attribute>
+			<description>The URL to build.  This value can include template place holders 
+			that are replaced with the URL encoded value of the named parameter.  Parameters 
+			must be defined using the param tag inside the body of this tag.</description>
+			<name>value</name>
+			<required>true</required>
+			<rtexprvalue>true</rtexprvalue>
+		</attribute>
+		<attribute>
+			<description>Specifies a remote application context path.  The default is the 
+			current application context path.</description>
+			<name>context</name>
+			<required>false</required>
+			<rtexprvalue>true</rtexprvalue>
+		</attribute>
+		<attribute>
+			<description>The name of the variable to export the URL value to.</description>
+			<name>var</name>
+			<required>false</required>
+			<rtexprvalue>true</rtexprvalue>
+		</attribute>
 		<attribute>
+			<description>The scope for the var.  'application', 'session', 'request' and 
+			'page' scopes are supported.  Defaults to page scope.  This attribute has no 
+			effect unless the var attribute is also defined.</description>
+			<name>scope</name>
+			<required>false</required>
+			<rtexprvalue>true</rtexprvalue>
+		</attribute>
+		<attribute>
+			<description>Set HTML escaping for this tag, as a boolean value. Overrides the
+			default HTML escaping setting for the current page.</description>
 			<name>htmlEscape</name>
 			<required>false</required>
 			<rtexprvalue>true</rtexprvalue>
 		</attribute>
+		<attribute>
+			<description>Set JavaScript escaping for this tag, as a boolean value.
+			Default is false.</description>
+			<name>javaScriptEscape</name>
+			<required>false</required>
+			<rtexprvalue>true</rtexprvalue>
+		</attribute>
+	</tag>
+
+	<tag>
+		<description>Parameter tag based on the JSTL c:param tag.  The sole purpose is to 
+		support params inside the spring:url tag.</description>
+		<name>param</name>
+		<tag-class>org.springframework.web.servlet.tags.ParamTag</tag-class>
+		<body-content>JSP</body-content>
+		<attribute>
+			<description>The name of the parameter.</description>
+			<name>name</name>
+			<required>true</required>
+			<rtexprvalue>true</rtexprvalue>
+		</attribute>
+		<attribute>
+			<description>The value of the parameter.</description>
+			<name>value</name>
+			<required>false</required>
+			<rtexprvalue>true</rtexprvalue>
+		</attribute>
+	</tag>
 
+	<tag>
+		<description>Evaluates a Spring expression (SpEL) and either prints the result or assigns it to a variable.</description>
+		<name>eval</name>
+		<tag-class>org.springframework.web.servlet.tags.EvalTag</tag-class>
+		<body-content>JSP</body-content>
+		<attribute>
+			<description>The expression to evaluate.</description>
+			<name>expression</name>
+			<required>true</required>
+			<rtexprvalue>true</rtexprvalue>
+		</attribute>
+		<attribute>
+			<description>The name of the variable to export the evaluation result to.</description>
+			<name>var</name>
+			<required>false</required>
+			<rtexprvalue>true</rtexprvalue>
+		</attribute>
+		<attribute>
+			<description>The scope for the var.  'application', 'session', 'request' and 
+			'page' scopes are supported.  Defaults to page scope.  This attribute has no 
+			effect unless the var attribute is also defined.</description>
+			<name>scope</name>
+			<required>false</required>
+			<rtexprvalue>true</rtexprvalue>
+		</attribute>
+		<attribute>
+			<description>Set HTML escaping for this tag, as a boolean value. Overrides the
+			default HTML escaping setting for the current page.</description>
+			<name>htmlEscape</name>
+			<required>false</required>
+			<rtexprvalue>true</rtexprvalue>
+		</attribute>
+		<attribute>
+			<description>Set JavaScript escaping for this tag, as a boolean value.  Default is false.</description>
+			<name>javaScriptEscape</name>
+			<required>false</required>
+			<rtexprvalue>true</rtexprvalue>
+		</attribute>
 	</tag>
 
 </taglib>

+ 1 - 1
php-kohana/benchmark_config

@@ -1,5 +1,5 @@
 {
-  "framework": "kohana",
+  "framework": "php-kohana",
   "tests": [{
     "default": {
       "setup_file": "setup",

+ 1 - 1
php-phalcon-micro/benchmark_config

@@ -1,5 +1,5 @@
 {
-  "framework": "phalcon-micro",
+  "framework": "php-phalcon-micro",
   "tests": [{
     "default": {
       "setup_file": "setup",

+ 1 - 1
php-phalcon/benchmark_config

@@ -1,5 +1,5 @@
 {
-  "framework": "phalcon",
+  "framework": "php-phalcon",
   "tests": [{
     "default": {
       "setup_file": "setup",

+ 1 - 1
php-phpixie/benchmark_config

@@ -1,5 +1,5 @@
 {
-  "framework": "phpixie",
+  "framework": "php-phpixie",
   "tests": [{
     "default": {
       "setup_file": "setup",

BIN
plain/lib/plain-library_2.10-1.0.1-SNAPSHOT.jar


+ 2 - 2
plain/setup.py

@@ -10,8 +10,8 @@ def start(args):
     subprocess.check_call("./sbt.bat assembly", shell=True, cwd="plain")
   else:
     subprocess.check_call("./sbt assembly", shell=True, cwd="plain")
-      
-  subprocess.Popen("java -server -Xnoclassgc -XX:MaxPermSize=1g -XX:ReservedCodeCacheSize=384m -Xmx8g -Xss8m -Xmn4g -jar target/scala-2.10/plain-benchmark-assembly-1.0.1.jar", cwd="plain", shell=True)
+     
+  subprocess.Popen("java -server -Xnoclassgc -XX:MaxPermSize=1g -XX:ReservedCodeCacheSize=384m -Xmx8g -Xss8m -Xmn4g -Xms6g -XX:+AggressiveOpts -XX:+UseBiasedLocking -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -jar target/scala-2.10/plain-benchmark-assembly-1.0.1.jar", cwd="plain", shell=True)
   time.sleep(10)
   return 0
 

+ 3 - 7
plain/src/main/resources/application.conf

@@ -10,11 +10,7 @@ akka {
 
 plain {
 	logging.level = INFO
-	aio.default-buffer-size = 128k
-	aio.large-buffer-size = 256k
-	aio.huge-buffer-size = 512k
 	aio.send-receive-buffer-size = 1m
-	http.default-server.feature.max-entity-buffer-size = 128k
 	http.startup-servers = [ benchmark-server ]
 	jdbc.startup-connection-factories = [ benchmark-mysql ]
 }
@@ -36,11 +32,11 @@ benchmark-mysql {
 	name = MysqlBenchmark
 	driver = mysql-5-6-12
 	datasource-settings {	
-		setUrl = "jdbc:mysql://127.0.0.1:3306/hello_world?jdbcCompliantTruncation=false&elideSetAutoCommits=true&dontTrackOpenResources=true&enableQueryTimeouts=false&useLocalSessionState=true&cachePrepStmts=true&cacheCallableStmts=true&alwaysSendSetIsolation=false&prepStmtCacheSize=1024&cacheServerConfiguration=true&prepStmtCacheSqlLimit=2048&zeroDateTimeBehavior=convertToNull&traceProtocol=false&useUnbufferedInput=false&useReadAheadInput=true&maintainTimeStats=false&useServerPrepStmts&cacheRSMetadata=true&poolPreparedStatements=true&maxOpenPreparedStatements=100"
+        	setUrl = "jdbc:mysql://127.0.0.1:3306/hello_world?jdbcCompliantTruncation=false&elideSetAutoCommits=true&dontTrackOpenResources=true&enableQueryTimeouts=false&useLocalSessionState=true&cachePrepStmts=true&cacheCallableStmts=true&alwaysSendSetIsolation=false&prepStmtCacheSize=1024&cacheServerConfiguration=true&prepStmtCacheSqlLimit=2048&zeroDateTimeBehavior=convertToNull&traceProtocol=false&useUnbufferedInput=false&useReadAheadInput=true&maintainTimeStats=false&useServerPrepStmts&cacheRSMetadata=true&poolPreparedStatements=true&maxOpenPreparedStatements=100"
 		setUser = "benchmarkdbuser"
 		setPassword = "benchmarkdbpass"
 	}	
-	min-pool-size = 32
-	max-pool-size = 128
+	min-pool-size = 0
+	max-pool-size = 64
 }
 

+ 1 - 1
play-activate-mysql/conf/application.conf

@@ -75,7 +75,7 @@ play {
       default-dispatcher = {
         fork-join-executor {
           parallelism-factor = 4.0
-          parallelism-max = 50
+          parallelism-max = 300
         }
       }
       application = {

+ 4 - 5
play-activate-mysql/project/Build.scala

@@ -1,21 +1,20 @@
 import sbt._
 import Keys._
-import PlayProject._
+import play.Project._
 
 object ApplicationBuild extends Build {
 
   val appName         = "play-activate-mysql"
   val appVersion      = "1.0-SNAPSHOT"
 
-  val activateVersion = "1.4.3"
+  val activateVersion = "1.4.4"
   val activateCore = "net.fwbrasil" %% "activate-core" % activateVersion
   val activateJdbc = "net.fwbrasil" %% "activate-jdbc" % activateVersion
-  val activatePlay = "net.fwbrasil" %% "activate-play" % "1.4.3-PLAY-2.1.2-RC1"
+  val activatePlay = "net.fwbrasil" %% "activate-play" % activateVersion
 
   val mysql = "mysql" % "mysql-connector-java" % "5.1.16"
 
   val appDependencies = Seq(
-    jdbc,
     mysql,
     activateCore,
     activateJdbc,
@@ -23,7 +22,7 @@ object ApplicationBuild extends Build {
   )
 
   val main = play.Project(appName, appVersion, appDependencies).settings(
-	resolvers ++= Seq("fwbrasil.net" at "http://fwbrasil.net/maven/")
+	  resolvers ++= Seq("fwbrasil.net" at "http://fwbrasil.net/maven/")
   )
 
 }

+ 1 - 1
play-activate-mysql/project/build.properties

@@ -1 +1 @@
-sbt.version=0.12.3
+sbt.version=0.13.0

+ 1 - 1
play-activate-mysql/project/plugins.sbt

@@ -5,4 +5,4 @@ logLevel := Level.Warn
 resolvers += "Typesafe repository" at "http://repo.typesafe.com/typesafe/releases/"
 
 // Use the Play sbt plugin for Play projects
-addSbtPlugin("play" % "sbt-plugin" % "2.1.2-RC1")
+addSbtPlugin("com.typesafe.play" % "sbt-plugin" % "2.2.0")

+ 18 - 15
play-activate-mysql/setup.py

@@ -8,35 +8,38 @@ from zipfile import ZipFile
 def start(args):
   setup_util.replace_text("play-activate-mysql/conf/application.conf", "jdbc:mysql:\/\/.*:3306", "jdbc:mysql://" + args.database_host + ":3306")
 
-  subprocess.check_call("play dist", shell=True, cwd="play-activate-mysql")
+  subprocess.check_call("play clean dist", shell=True, cwd="play-activate-mysql")
 
   if os.name == 'nt':
-    ZipFile("./play-activate-mysql/dist/play-activate-mysql-1.0-SNAPSHOT.zip").extractall("./play-activate-mysql/dist")
-    with open("./play-activate-mysql/dist/play-activate-mysql-1.0-SNAPSHOT/start.bat", "w+") as f:
+    ZipFile("./play-activate-mysql/target/universal/play-activate-mysql-1.0-SNAPSHOT.zip").extractall("./play-activate-mysql/target/universal")
+    with open("./play-activate-mysql/target/universal/play-activate-mysql-1.0-SNAPSHOT/bin/play-activate-mysql.bat", "w+") as f:
       f.write("java %1 -cp \"./lib/*;\" play.core.server.NettyServer .")
-    subprocess.Popen("start.bat", shell=True, cwd="play-activate-mysql/dist/play-activate-mysql-1.0-SNAPSHOT")
+    subprocess.Popen("play-activate-mysql.bat", shell=True, cwd="play-activate-mysql/target/universal/play-activate-mysql-1.0-SNAPSHOT/bin")
   else:
-    subprocess.check_call("unzip play-activate-mysql-1.0-SNAPSHOT.zip", shell=True, cwd="play-activate-mysql/dist")
-    subprocess.check_call("chmod +x start", shell=True, cwd="play-activate-mysql/dist/play-activate-mysql-1.0-SNAPSHOT")
-    subprocess.Popen("./start", shell=True, cwd="play-activate-mysql/dist/play-activate-mysql-1.0-SNAPSHOT")
+    subprocess.check_call("unzip play-activate-mysql-1.0-SNAPSHOT.zip", shell=True, cwd="play-activate-mysql/target/universal")
+    subprocess.check_call("chmod +x play-activate-mysql", shell=True, cwd="play-activate-mysql/target/universal/play-activate-mysql-1.0-SNAPSHOT/bin")
+    subprocess.Popen("./play-activate-mysql", shell=True, cwd="play-activate-mysql/target/universal/play-activate-mysql-1.0-SNAPSHOT/bin")
 
   return 0
 def stop():
   if os.name == 'nt':
-    with open("./play-activate-mysql/dist/play-activate-mysql-1.0-SNAPSHOT/RUNNING_PID") as f:
+    with open("./play-activate-mysql/target/universal/play-activate-mysql-1.0-SNAPSHOT/RUNNING_PID") as f:
       pid = int(f.read())
       os.kill(pid, 9)
   else:
-    p = subprocess.Popen(['ps', 'aux'], stdout=subprocess.PIPE)
-    out, err = p.communicate()
-    for line in out.splitlines():
-      if './start' in line or ('play' in line and 'java' in line):
-        pid = int(line.split(None, 2)[1])
-        os.kill(pid, 9)
+    kill_running_process()
 
   try:
-    os.remove("play-activate-mysql/RUNNING_PID")
+    os.remove("play-activate-mysql/target/universal/play-activate-mysql-1.0-SNAPSHOT/RUNNING_PID")
   except OSError:
     pass
 
   return 0
+
+def kill_running_process():
+  try:
+    with open("./play-activate-mysql/target/universal/play-activate-mysql-1.0-SNAPSHOT/RUNNING_PID") as f:
+      pid = int(f.read())
+      os.kill(pid,9)
+  except:
+    pass

+ 13 - 13
play-scala-mongodb/setup.py

@@ -6,36 +6,36 @@ import os
 from zipfile import ZipFile
 
 def start(args):
-  setup_util.replace_text("play-scala-mongodb/conf/application.conf", "localhost:27017", "" + args.database_host + ":27017")
+  setup_util.replace_text("play-scala-mongodb/conf/application.conf", "jdbc:mysql:\/\/.*:3306", "jdbc:mysql://" + args.database_host + ":3306")
+
+  subprocess.check_call("play clean dist", shell=True, cwd="play-scala-mongodb")
 
-  subprocess.check_call("play dist", shell=True, cwd="play-scala-mongodb")
-  
   if os.name == 'nt':
-    ZipFile("./play-scala-mongodb/dist/play-scala-mongodb-1.0-SNAPSHOT.zip").extractall("./play-scala-mongodb/dist")
-    with open("./play-scala-mongodb/dist/play-scala-mongodb-1.0-SNAPSHOT/start.bat", "w+") as f:
+    ZipFile("./play-scala-mongodb/target/universal/play-scala-mongodb-1.0-SNAPSHOT.zip").extractall("./play-scala-mongodb/target/universal")
+    with open("./play-scala-mongodb/target/universal/play-scala-mongodb-1.0-SNAPSHOT/bin/play-scala-mongodb.bat", "w+") as f:
       f.write("java %1 -cp \"./lib/*;\" play.core.server.NettyServer .")
-    subprocess.Popen("start.bat", shell=True, cwd="play-scala-mongodb/dist/play-scala-mongodb-1.0-SNAPSHOT")
+    subprocess.Popen("play-scala-mongodb.bat", shell=True, cwd="play-scala-mongodb/target/universal/play-scala-mongodb-1.0-SNAPSHOT/bin")
   else:
-    subprocess.check_call("unzip play-scala-mongodb-1.0-SNAPSHOT.zip", shell=True, cwd="play-scala-mongodb/dist")
-    subprocess.check_call("chmod +x start", shell=True, cwd="play-scala-mongodb/dist/play-scala-mongodb-1.0-SNAPSHOT")
-    subprocess.Popen("./start", shell=True, cwd="play-scala-mongodb/dist/play-scala-mongodb-1.0-SNAPSHOT")
+    subprocess.check_call("unzip play-scala-mongodb-1.0-SNAPSHOT.zip", shell=True, cwd="play-scala-mongodb/target/universal")
+    subprocess.check_call("chmod +x play-scala-mongodb", shell=True, cwd="play-scala-mongodb/target/universal/play-scala-mongodb-1.0-SNAPSHOT/bin")
+    subprocess.Popen("./play-scala-mongodb", shell=True, cwd="play-scala-mongodb/target/universal/play-scala-mongodb-1.0-SNAPSHOT/bin")
 
   return 0
 def stop():
   if os.name == 'nt':
-    with open("./play-scala-mongodb/dist/play-scala-mongodb-1.0-SNAPSHOT/RUNNING_PID") as f:
+    with open("./play-scala-mongodb/target/universal/play-scala-mongodb-1.0-SNAPSHOT/RUNNING_PID") as f:
       pid = int(f.read())
       os.kill(pid, 9)
   else:
     p = subprocess.Popen(['ps', 'aux'], stdout=subprocess.PIPE)
     out, err = p.communicate()
     for line in out.splitlines():
-      if './start' in line or ('play' in line and 'java' in line):
+      if 'NettyServer' in line:
         pid = int(line.split(None, 2)[1])
         os.kill(pid, 9)
-        
+
   try:
-    os.remove("play-scala-mongodb/RUNNING_PID")
+    os.remove("play-scala-mongodb/target/universal/play-scala-mongodb-1.0-SNAPSHOT/RUNNING_PID")
   except OSError:
     pass
 

+ 11 - 11
play-slick/setup.py

@@ -8,34 +8,34 @@ from zipfile import ZipFile
 def start(args):
   setup_util.replace_text("play-slick/conf/application.conf", "jdbc:mysql:\/\/.*:3306", "jdbc:mysql://" + args.database_host + ":3306")
 
-  subprocess.check_call("play dist", shell=True, cwd="play-slick")
+  subprocess.check_call("play clean dist", shell=True, cwd="play-slick")
 
   if os.name == 'nt':
-    ZipFile("./play-slick/dist/play-slick-1.0-SNAPSHOT.zip").extractall("./play-slick/dist")
-    with open("./play-slick/dist/play-slick-1.0-SNAPSHOT/start.bat", "w+") as f:
+    ZipFile("./play-slick/target/universal/play-slick-1.0-SNAPSHOT.zip").extractall("./play-slick/target/universal")
+    with open("./play-slick/target/universal/play-slick-1.0-SNAPSHOT/bin/play-slick.bat", "w+") as f:
       f.write("java %1 -cp \"./lib/*;\" play.core.server.NettyServer .")
-    subprocess.Popen("start.bat", shell=True, cwd="play-slick/dist/play-slick-1.0-SNAPSHOT")
+    subprocess.Popen("play-slick.bat", shell=True, cwd="play-slick/target/universal/play-slick-1.0-SNAPSHOT/bin")
   else:
-    subprocess.check_call("unzip play-slick-1.0-SNAPSHOT.zip", shell=True, cwd="play-slick/dist")
-    subprocess.check_call("chmod +x start", shell=True, cwd="play-slick/dist/play-slick-1.0-SNAPSHOT")
-    subprocess.Popen("./start", shell=True, cwd="play-slick/dist/play-slick-1.0-SNAPSHOT")
+    subprocess.check_call("unzip play-slick-1.0-SNAPSHOT.zip", shell=True, cwd="play-slick/target/universal")
+    subprocess.check_call("chmod +x play-slick", shell=True, cwd="play-slick/target/universal/play-slick-1.0-SNAPSHOT/bin")
+    subprocess.Popen("./play-slick", shell=True, cwd="play-slick/target/universal/play-slick-1.0-SNAPSHOT/bin")
 
   return 0
 def stop():
   if os.name == 'nt':
-    with open("./play-slick/dist/play-slick-1.0-SNAPSHOT/RUNNING_PID") as f:
+    with open("./play-slick/target/universal/play-slick-1.0-SNAPSHOT/RUNNING_PID") as f:
       pid = int(f.read())
       os.kill(pid, 9)
   else:
-    p = subprocess.Popen(['ps', 'aux'], stdout=subprocess.PIPE)
+    p = subprocess.Popen(['ps', 'ef'], stdout=subprocess.PIPE)
     out, err = p.communicate()
     for line in out.splitlines():
-      if './start' in line or ('play' in line and 'java' in line):
+      if 'NettyServer' in line:
         pid = int(line.split(None, 2)[1])
         os.kill(pid, 9)
 
   try:
-    os.remove("play-slick/RUNNING_PID")
+    os.remove("play-slick/target/universal/play-slick-1.0-SNAPSHOT/RUNNING_PID")
   except OSError:
     pass
 

+ 10 - 6
toolset/README.md

@@ -10,7 +10,7 @@ For deployment instructions, refer to the [Benchmark Suite Deployment README fil
 
 Assuming the deployment finished without error, we're ready to start the test suite. On the Linux server host, type:
 
-	nohup toolset/run-tests.py -s server-private-ip -c client-private-ip -u username -i path-to-private-ssh-key --max-threads number-of-cores &
+	nohup toolset/run-tests.py -s server-private-ip -d database-private-ip -c client-private-ip -i path-to-private-ssh-key -u username --max-threads 8 --duration 15 &
 
 For the number-of-cores parameter, you will need to know your application server's core count. For example, Amazon EC2 large instances have 2 cores.
 
@@ -22,19 +22,23 @@ The test results are saved in the `results` directory, as described below.
 
 ## Running the test suite on Windows
 
-To run the test suite on the Windows server, log on the server, open the PowerShell command line environment and type a command like:
+To run the test suite using Windows as the application server and Linux as the database server, log on to the server, open the PowerShell command line environment and type a command like:
 
-    python toolset\run-tests.py -s server-ip -c client-ip -i path-to-ssh-key --max-threads cores --duration 30 --sleep 5 --name win --test aspnet --type all
+	python toolset/run-tests.py -s server-private-ip -d database-private-ip -c client-private-ip -i path-to-private-ssh-key -u username --max-threads 8 --duration 15 --os windows --sleep 5 --name win
+
+To run the test suite using Windows as the application server and Windows as the database server, use this instead:
+
+	python toolset/run-tests.py -s server-private-ip -d database-private-ip -c client-private-ip -i path-to-private-ssh-key -u username --max-threads 8 --duration 15 --os windows --database-os windows --name win
     
 ## Specifying the machine name
 
 If you use a different configuration than two m1.large instances, please use the --name option to name the results appropriately.
 
-	nohup toolset/run-tests.py -s server-private-ip -c client-private-ip -u username -i path-to-private-ssh-key --max-threads cores --name ec2-servertype-clienttype &
+	nohup toolset/run-tests.py -s server-private-ip -d database-private-ip -c client-private-ip -u username -i path-to-private-ssh-key --max-threads cores --name ec2-servertype-clienttype &
 
 So if you were running an m1.large and an m1.medium, it would look like this:
 
-	nohup toolset/run-tests.py -s server-private-ip -c client-private-ip -u username -i path-to-private-ssh-key --max-threads cores --name ec2-m1.large-m1.medium &
+	nohup toolset/run-tests.py -s server-private-ip -d database-private-ip -c client-private-ip -u username -i path-to-private-ssh-key --max-threads cores --name ec2-m1.large-m1.medium &
 
 This will allow us to differentiate results.
 
@@ -42,7 +46,7 @@ This will allow us to differentiate results.
 
 If you are making changes to any of the tests, or you simply want to verify a single test, you can run the script with the --test flag. For example, if you only wanted to run the JRuby tests:
 
-	nohup toolset/run-tests.py -s server-ip -c client-ip -u username -i path-to-private-ssh-key --max-threads cores --name unique-machine-name --test rack-jruby sinatra-jruby rails-jruby
+	nohup toolset/run-tests.py -s server-private-ip -d database-private-ip -c client-private-ip -u username -i path-to-private-ssh-key --max-threads cores --name unique-machine-name --test rack-jruby sinatra-jruby rails-jruby
 
 ## Result Files
 

+ 32 - 12
toolset/benchmark/framework_test.py

@@ -132,8 +132,7 @@ class FrameworkTest:
     try:
       print "VERIFYING JSON (" + self.json_url + ") ..."
       url = self.benchmarker.generate_url(self.json_url, self.port)
-      subprocess.check_call(["curl", "-f", url])
-      print ""
+      self.__curl_url(url)
       self.json_url_passed = True
     except (AttributeError, subprocess.CalledProcessError) as e:
       self.json_url_passed = False
@@ -142,8 +141,7 @@ class FrameworkTest:
     try:
       print "VERIFYING DB (" + self.db_url + ") ..."
       url = self.benchmarker.generate_url(self.db_url, self.port)
-      subprocess.check_call(["curl", "-f", url])
-      print ""
+      self.__curl_url(url)
       self.db_url_passed = True
     except (AttributeError, subprocess.CalledProcessError) as e:
       self.db_url_passed = False
@@ -152,8 +150,7 @@ class FrameworkTest:
     try:
       print "VERIFYING Query (" + self.query_url + "2) ..."
       url = self.benchmarker.generate_url(self.query_url + "2", self.port)
-      subprocess.check_call(["curl", "-f", url])
-      print ""
+      self.__curl_url(url)
       self.query_url_passed = True
     except (AttributeError, subprocess.CalledProcessError) as e:
       self.query_url_passed = False
@@ -162,8 +159,7 @@ class FrameworkTest:
     try:
       print "VERIFYING Fortune (" + self.fortune_url + ") ..."
       url = self.benchmarker.generate_url(self.fortune_url, self.port)
-      subprocess.check_call(["curl", "-f", url])
-      print ""
+      self.__curl_url(url)
       self.fortune_url_passed = True
     except (AttributeError, subprocess.CalledProcessError) as e:
       self.fortune_url_passed = False
@@ -172,8 +168,7 @@ class FrameworkTest:
     try:
       print "VERIFYING Update (" + self.update_url + "2) ..."
       url = self.benchmarker.generate_url(self.update_url + "2", self.port)
-      subprocess.check_call(["curl", "-f", url])
-      print ""
+      self.__curl_url(url)
       self.update_url_passed = True
     except (AttributeError, subprocess.CalledProcessError) as e:
       self.update_url_passed = False
@@ -182,8 +177,7 @@ class FrameworkTest:
     try:
       print "VERIFYING Plaintext (" + self.plaintext_url + ") ..."
       url = self.benchmarker.generate_url(self.plaintext_url, self.port)
-      subprocess.check_call(["curl", "-f", url])
-      print ""
+      self.__curl_url(url)
       self.plaintext_url_passed = True
     except (AttributeError, subprocess.CalledProcessError) as e:
       self.plaintext_url_passed = False
@@ -508,6 +502,32 @@ class FrameworkTest:
   # End __format_request_headers
   ############################################################
 
+  ############################################################
+  # __curl_url
+  # Dump HTTP response and headers. Throw exception if there
+  # is an HTTP error.
+  ############################################################
+  def __curl_url(self, url):
+    # Use -i to output response with headers.
+    # Don't use -f so that the HTTP response code is ignored.
+    # Use --stderr - to redirect stderr to stdout so we get
+    # error output for sure in stdout.
+    # Use -sS to hide progress bar, but show errors.
+    subprocess.check_call(["curl", "-i", "--stderr", "-", "-sS", url])
+    # HTTP output may not end in a newline, so add that here.
+    print ""
+    # In the curl invocation above we could not use -f because
+    # then the HTTP response would not be output, so use -f in
+    # an additional invocation so that if there is an HTTP error,
+    # subprocess.CalledProcessError will be thrown. Note that this
+    # uses check_output() instead of check_call() so that we can
+    # ignore the HTTP response because we already output that in
+    # the first curl invocation.
+    subprocess.check_output(["curl", "-fsS", url])
+  ##############################################################
+  # End __curl_url
+  ##############################################################
+
   ##########################################################################################
   # Constructor
   ##########################################################################################  

+ 11 - 11
toolset/setup/linux/installer.py

@@ -248,9 +248,9 @@ class Installer:
     #
     # Grails
     #
-    self.__download("http://dist.springframework.org.s3.amazonaws.com/release/GRAILS/grails-2.1.1.zip")
-    self.__run_command("unzip -o grails-2.1.1.zip")
-    self.__run_command("rm grails-2.1.1.zip")
+    self.__download("http://dist.springframework.org.s3.amazonaws.com/release/GRAILS/grails-2.3.1.zip")
+    self.__run_command("unzip -o grails-2.3.1.zip")
+    self.__run_command("rm grails-2.3.1.zip")
 
     #
     # Play 2
@@ -274,14 +274,14 @@ class Installer:
     # TreeFrog Framework
     #
     self.__run_command("sudo apt-get install qt4-qmake libqt4-dev libqt4-sql-mysql g++", True)
-    self.__download("http://downloads.sourceforge.net/project/treefrog/src/treefrog-1.7.tar.gz")
-    self.__run_command("tar xzf treefrog-1.7.tar.gz")
-    self.__run_command("rm treefrog-1.7.tar.gz")
-    self.__run_command("./configure", cwd="treefrog-1.7")
-    self.__run_command("make", cwd="treefrog-1.7/src")
-    self.__run_command("sudo make install", cwd="treefrog-1.7/src")
-    self.__run_command("make", cwd="treefrog-1.7/tools")
-    self.__run_command("sudo make install", cwd="treefrog-1.7/tools")
+    self.__download("http://downloads.sourceforge.net/project/treefrog/src/treefrog-1.7.2.tar.gz")
+    self.__run_command("tar xzf treefrog-1.7.2.tar.gz")
+    self.__run_command("rm treefrog-1.7.2.tar.gz")
+    self.__run_command("./configure", cwd="treefrog-1.7.2")
+    self.__run_command("make", cwd="treefrog-1.7.2/src")
+    self.__run_command("sudo make install", cwd="treefrog-1.7.2/src")
+    self.__run_command("make", cwd="treefrog-1.7.2/tools")
+    self.__run_command("sudo make install", cwd="treefrog-1.7.2/tools")
 
     #
     # Vert.x

+ 2 - 2
toolset/setup/windows/installer.ps1

@@ -11,8 +11,8 @@ $wincache_installer_file  = "wincache-1.3.4-5.4-nts-vc9-x86.exe"
 $wincache_installer_path  = "wincache-1.3.4/$wincache_installer_file"
 $go_installer_file        = "go1.1.1.windows-amd64.msi"
 $jre_installer_file       = "jre-7u25-windows-x64.exe"
-$jdk_installer_file       = "jdk-7u40-windows-x64.exe"
-$jdk_master_hash          = "7412ccc2ac8a0f418eb58c5f170742a3" 
+$jdk_installer_file       = "jdk-7u45-windows-x64.exe"
+$jdk_master_hash          = "943527ed9111cbb746d4ab2bb2c31cd6" 
 # http://www.oracle.com/technetwork/java/javase/downloads/java-se-binaries-checksum-1956892.html
 $resin_version            = "resin-4.0.36"
 $resin_installer_file     = "$resin_version.zip"

+ 2 - 0
treefrog/controllers/fortunecontroller.h

@@ -10,6 +10,8 @@ class T_CONTROLLER_EXPORT FortuneController : public ApplicationController
 public:
     FortuneController() { }
     FortuneController(const FortuneController &other);
+    bool sessionEnabled() const { return false; }
+    bool transactionEnabled() const { return false; }
 
 public slots:
     void index();

+ 1 - 1
undertow/pom.xml

@@ -13,7 +13,7 @@
         <dependency>
             <groupId>io.undertow</groupId>
             <artifactId>undertow-core</artifactId>
-            <version>1.0.0.Beta17</version>
+            <version>1.0.0.Beta20</version>
         </dependency>
         <dependency>
             <groupId>org.jboss.xnio</groupId>

+ 3 - 0
undertow/src/main/java/hello/HelloWebServer.java

@@ -11,6 +11,7 @@ import com.mongodb.DB;
 import com.mongodb.MongoClient;
 import io.undertow.Handlers;
 import io.undertow.Undertow;
+import io.undertow.UndertowOptions;
 import io.undertow.util.Headers;
 
 import javax.sql.DataSource;
@@ -117,6 +118,8 @@ public final class HelloWebServer {
             Integer.parseInt(properties.getProperty("web.port")),
             properties.getProperty("web.host"))
         .setBufferSize(1024 * 16)
+        .setIoThreads(Runtime.getRuntime().availableProcessors() * 2) //this seems slightly faster in some configurations
+        .setServerOption(UndertowOptions.ALWAYS_SET_KEEP_ALIVE, false) //don't send a keep-alive header for HTTP/1.1 requests, as it is not required
         .setHandler(Handlers.date(Handlers.header(Handlers.path()
             .addPath("/json",
                 new JsonHandler(objectMapper))

+ 3 - 3
undertow/src/main/resources/hello/server.properties

@@ -1,14 +1,14 @@
 web.port = 8080
 web.host = 0.0.0.0
-mysql.uri = jdbc:mysql://tfbdata:3306/hello_world?jdbcCompliantTruncation=false&elideSetAutoCommits=true&useLocalSessionState=true&cachePrepStmts=true&cacheCallableStmts=true&alwaysSendSetIsolation=false&prepStmtCacheSize=4096&cacheServerConfiguration=true&prepStmtCacheSqlLimit=2048&zeroDateTimeBehavior=convertToNull&traceProtocol=false&useUnbufferedInput=false&useReadAheadInput=false&maintainTimeStats=false&useServerPrepStmts&cacheRSMetadata=true
+mysql.uri = jdbc:mysql://DATABASE_HOST:3306/hello_world?jdbcCompliantTruncation=false&elideSetAutoCommits=true&useLocalSessionState=true&cachePrepStmts=true&cacheCallableStmts=true&alwaysSendSetIsolation=false&prepStmtCacheSize=4096&cacheServerConfiguration=true&prepStmtCacheSqlLimit=2048&zeroDateTimeBehavior=convertToNull&traceProtocol=false&useUnbufferedInput=false&useReadAheadInput=false&maintainTimeStats=false&useServerPrepStmts&cacheRSMetadata=true
 mysql.user = benchmarkdbuser
 mysql.password = benchmarkdbpass
 #
 # TODO: Audit this postgresql connection string.
 # It looks copy & pasted from MySQL.  Do these parameters even do anything?
 #
-postgresql.uri = jdbc:postgresql://tfbdata:5432/hello_world?jdbcCompliantTruncation=false&elideSetAutoCommits=true&useLocalSessionState=true&cachePrepStmts=true&cacheCallableStmts=true&alwaysSendSetIsolation=false&prepStmtCacheSize=4096&cacheServerConfiguration=true&prepStmtCacheSqlLimit=2048&zeroDateTimeBehavior=convertToNull&traceProtocol=false&useUnbufferedInput=false&useReadAheadInput=false&maintainTimeStats=false&useServerPrepStmts&cacheRSMetadata=true
+postgresql.uri = jdbc:postgresql://DATABASE_HOST:5432/hello_world?jdbcCompliantTruncation=false&elideSetAutoCommits=true&useLocalSessionState=true&cachePrepStmts=true&cacheCallableStmts=true&alwaysSendSetIsolation=false&prepStmtCacheSize=4096&cacheServerConfiguration=true&prepStmtCacheSqlLimit=2048&zeroDateTimeBehavior=convertToNull&traceProtocol=false&useUnbufferedInput=false&useReadAheadInput=false&maintainTimeStats=false&useServerPrepStmts&cacheRSMetadata=true
 postgresql.user = benchmarkdbuser
 postgresql.password = benchmarkdbpass
-mongodb.host = tfbdata:27017
+mongodb.host = DATABASE_HOST:27017
 mongodb.name = hello_world