changeset 0:f4f8570d1c56

initial OTP form
author smith@nwoca.org
date Mon, 12 Nov 2012 16:29:11 +0000
parents
children dddcb6d16927
files .hgignore build.gradle gradle/wrapper/gradle-wrapper.jar gradle/wrapper/gradle-wrapper.properties gradlew gradlew.bat src/main/java/org/ssdt_ohio/devel/forms/components/Layout.java src/main/java/org/ssdt_ohio/devel/forms/pages/Index.java src/main/java/org/ssdt_ohio/devel/forms/pages/OneTwentyPayment.java src/main/java/org/ssdt_ohio/devel/forms/services/AppModule.java src/main/java/org/ssdt_ohio/devel/forms/services/DevelopmentModule.java src/main/java/org/ssdt_ohio/devel/forms/services/QaModule.java src/main/resources/log4j.properties src/main/resources/org/ssdt_ohio/devel/forms/components/Layout.tml src/main/resources/org/ssdt_ohio/devel/forms/pages/Index.properties src/main/resources/org/ssdt_ohio/devel/forms/pages/Index.tml src/main/resources/org/ssdt_ohio/devel/forms/pages/OneTwentyPayment.tml src/main/webapp/WEB-INF/app.properties src/main/webapp/WEB-INF/web.xml src/main/webapp/favicon.ico src/main/webapp/layout/images/img01.jpg src/main/webapp/layout/images/img03.jpg src/main/webapp/layout/images/img04.jpg src/main/webapp/layout/images/img08.gif src/main/webapp/layout/images/img09.gif src/main/webapp/layout/images/img10.gif src/main/webapp/layout/images/img11.gif src/main/webapp/layout/images/img12.gif src/main/webapp/layout/images/img13.gif src/main/webapp/layout/images/img14.gif src/main/webapp/layout/images/img18.gif src/main/webapp/layout/images/img19.gif src/main/webapp/layout/images/img20.gif src/main/webapp/layout/layout.css src/main/webapp/layout/license.txt src/site/apt/index.apt src/site/site.xml src/test/conf/testng.xml src/test/conf/webdefault.xml src/test/java/PLACEHOLDER src/test/resources/PLACEHOLDER
diffstat 41 files changed, 1493 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/.hgignore	Mon Nov 12 16:29:11 2012 +0000
@@ -0,0 +1,21 @@
+\.orig$
+\.orig\..*$
+\.chg\..*$
+\.rej$
+\.conflict\~$
+.*~$
+glob:out/*
+glob:lib/*
+glob:build/*
+glob:dist/*
+glob:nbproject/*
+glob:.idea/workspace.*
+glob:*.log
+glob:.gradle/*
+glob:.idea/*
+glob:*.iml
+glob:*.iws
+glob:*.ipr
+glob:gradle-app.*
+glob:build.xml
+glob:private*.*
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/build.gradle	Mon Nov 12 16:29:11 2012 +0000
@@ -0,0 +1,86 @@
+apply from: "${gradle.ext.has('ssdtDevelkitLocation') ? gradle.ssdtDevelkitLocation : 'http://hg.ssdt-ohio.org/browse/public/develkit'}/init.gradle"
+
+description = "ssdt.forms application"
+
+apply plugin: "war"
+apply plugin: "java"
+apply plugin: "groovy"
+apply plugin: "jetty"
+apply plugin: "idea"
+
+
+sourceCompatibility = "1.5"
+targetCompatibility = "1.5"
+
+group = "org.ssdt_ohio"
+version = "1.0-SNAPSHOT"
+
+/*
+repositories {
+    mavenCentral()
+
+    // All things JBoss/Hibernate
+    mavenRepo name: "JBoss", url: "http://repository.jboss.org/nexus/content/groups/public/"
+
+    // For stable versions of the tapx libraries
+    mavenRepo name: "HLS", url: "http://howardlewisship.com/repository/"
+
+    // For non-stable versions of the tapx libraries
+    mavenRepo name: "HLS Snapshots", url: "http://howardlewisship.com/snapshot-repository/"
+
+    // For access to Apache Staging (Preview) packages
+    mavenRepo name: "Apache Staging", url: "https://repository.apache.org/content/groups/staging"
+}
+*/
+
+// This simulates Maven's "provided" scope, until it is officially supported by Gradle
+// See http://jira.codehaus.org/browse/GRADLE-784
+
+configurations {
+    provided
+}
+
+sourceSets {
+    main {
+        compileClasspath += configurations.provided
+    }
+    test {
+        compileClasspath += configurations.provided
+        runtimeClasspath += configurations.provided
+    }
+}
+
+dependencies {
+
+    groovy 'org.codehaus.groovy:groovy-all:2.0.1'
+    compile "org.apache.tapestry:tapestry-core:5.3.6"
+    compile(group: 'me.davesmith', name: 'tapestry-bootstrap', version: '2.1-SNAPSHOT')
+    compile group: 'org.got5', name: 'tapestry5-jquery', version: '3.2.0'
+    compile "org.apache.tapestry:tapestry-yuicompressor:5.3.6"
+
+    // Uncomment this to add support for file uploads:
+    // compile "org.apache.tapestry:tapestry-upload:5.3.6"
+
+    provided "javax.servlet:servlet-api:2.5"
+}
+
+test {
+    useTestNG()
+
+    options.suites("src/test/conf/testng.xml")
+
+    systemProperties["tapestry.service-reloading-enabled"] = "false"
+    systemProperties["tapestry.execution-mode"] = "development"
+
+    maxHeapSize = "600M"
+
+    jvmArgs("-XX:MaxPermSize=256M")
+
+    enableAssertions = true
+}
+
+
+jettyRun {
+    webAppSourceDirectory = file("src/main/webapp")
+    httpPort = 8086
+}
Binary file gradle/wrapper/gradle-wrapper.jar has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gradle/wrapper/gradle-wrapper.properties	Mon Nov 12 16:29:11 2012 +0000
@@ -0,0 +1,6 @@
+#Fri Nov 09 14:45:30 EST 2012
+distributionBase=GRADLE_USER_HOME
+distributionPath=wrapper/dists
+zipStoreBase=GRADLE_USER_HOME
+zipStorePath=wrapper/dists
+distributionUrl=http\://services.gradle.org/distributions/gradle-1.2-bin.zip
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gradlew	Mon Nov 12 16:29:11 2012 +0000
@@ -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 "$@"
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gradlew.bat	Mon Nov 12 16:29:11 2012 +0000
@@ -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
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main/java/org/ssdt_ohio/devel/forms/components/Layout.java	Mon Nov 12 16:29:11 2012 +0000
@@ -0,0 +1,47 @@
+package org.ssdt_ohio.devel.forms.components;
+
+import com.trsvax.bootstrap.annotations.Exclude;
+import org.apache.tapestry5.*;
+import org.apache.tapestry5.annotations.*;
+import org.apache.tapestry5.ioc.annotations.*;
+import org.apache.tapestry5.BindingConstants;
+import org.apache.tapestry5.SymbolConstants;
+
+@Exclude(stylesheet = {"core"})
+@Import(stylesheet = {"classpath:/com/trsvax/bootstrap/assets/bootstrap/css/bootstrap.css",
+        "classpath:/com/trsvax/bootstrap/assets/bootstrap/css/bootstrap-responsive.css",
+        "context:layout/layout.css"},
+        library = {"classpath:/com/trsvax/bootstrap/assets/bootstrap/js/bootstrap.js"})
+public class Layout
+{
+    /**
+     * The page title, for the <title> element and the <h1> element.
+     */
+    @Property
+    @Parameter(required = true, defaultPrefix = BindingConstants.LITERAL)
+    private String title;
+
+    @Property
+    private String pageName;
+
+    @Inject
+    private ComponentResources resources;
+
+    @Property
+    @Inject
+    @Symbol(SymbolConstants.APPLICATION_VERSION)
+    private String appVersion;
+
+
+    public String getClassForPageName()
+    {
+        return resources.getPageName().equalsIgnoreCase(pageName)
+                ? "current_page_item"
+                : null;
+    }
+
+    public String[] getPageNames()
+    {
+        return new String[]{"Index", "OneTwentyPayment"};
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main/java/org/ssdt_ohio/devel/forms/pages/Index.java	Mon Nov 12 16:29:11 2012 +0000
@@ -0,0 +1,17 @@
+package org.ssdt_ohio.devel.forms.pages;
+
+import com.trsvax.bootstrap.annotations.Exclude;
+import org.apache.tapestry5.SymbolConstants;
+import org.apache.tapestry5.annotations.Import;
+import org.apache.tapestry5.annotations.Property;
+import org.apache.tapestry5.ioc.annotations.Inject;
+import org.apache.tapestry5.ioc.annotations.Symbol;
+
+
+public class Index {
+    @Property
+    @Inject
+    @Symbol(SymbolConstants.TAPESTRY_VERSION)
+    private String tapestryVersion;
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main/java/org/ssdt_ohio/devel/forms/pages/OneTwentyPayment.java	Mon Nov 12 16:29:11 2012 +0000
@@ -0,0 +1,11 @@
+package org.ssdt_ohio.devel.forms.pages;
+
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+public class OneTwentyPayment {
+
+    public String getDate() {
+       return  new SimpleDateFormat("MM/dd/yyyy").format(new Date());
+    }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main/java/org/ssdt_ohio/devel/forms/services/AppModule.java	Mon Nov 12 16:29:11 2012 +0000
@@ -0,0 +1,114 @@
+package org.ssdt_ohio.devel.forms.services;
+
+import org.apache.tapestry5.SymbolConstants;
+import org.apache.tapestry5.ioc.MappedConfiguration;
+import org.apache.tapestry5.ioc.OrderedConfiguration;
+import org.apache.tapestry5.ioc.ServiceBinder;
+import org.apache.tapestry5.ioc.annotations.Local;
+import org.apache.tapestry5.services.Request;
+import org.apache.tapestry5.services.RequestFilter;
+import org.apache.tapestry5.services.RequestHandler;
+import org.apache.tapestry5.services.Response;
+import org.slf4j.Logger;
+
+import java.io.IOException;
+
+/**
+ * This module is automatically included as part of the Tapestry IoC Registry, it's a good place to configure and extend
+ * Tapestry, or to place your own service definitions.
+ */
+public class AppModule {
+    public static void bind(ServiceBinder binder) {
+        // binder.bind(MyServiceInterface.class, MyServiceImpl.class);
+
+        // Make bind() calls on the binder object to define most IoC services.
+        // Use service builder methods (example below) when the implementation
+        // is provided inline, or requires more initialization than simply
+        // invoking the constructor.
+    }
+
+    public static void contributeFactoryDefaults(
+            MappedConfiguration<String, Object> configuration) {
+        // The application version number is incorprated into URLs for some
+        // assets. Web browsers will cache assets because of the far future expires
+        // header. If existing assets are changed, the version number should also
+        // change, to force the browser to download new versions. This overrides Tapesty's default
+        // (a random hexadecimal number), but may be further overriden by DevelopmentModule or
+        // QaModule.
+        configuration.override(SymbolConstants.APPLICATION_VERSION, "1.0-SNAPSHOT");
+    }
+
+    public static void contributeApplicationDefaults(
+            MappedConfiguration<String, Object> configuration) {
+        // Contributions to ApplicationDefaults will override any contributions to
+        // FactoryDefaults (with the same key). Here we're restricting the supported
+        // locales to just "en" (English). As you add localised message catalogs and other assets,
+        // you can extend this list of locales (it's a comma separated series of locale names;
+        // the first locale name is the default when there's no reasonable match).
+        configuration.add(SymbolConstants.SUPPORTED_LOCALES, "en");
+
+        // The factory default is true but during the early stages of an application
+        // overriding to false is a good idea. In addition, this is often overridden
+        // on the command line as -Dtapestry.production-mode=false
+        configuration.add(SymbolConstants.PRODUCTION_MODE, false);
+
+        // The application version number is incorprated into URLs for some
+        // assets. Web browsers will cache assets because of the far future expires
+        // header. If existing assets are changed, the version number should also
+        // change, to force the browser to download new versions.
+        configuration.add(SymbolConstants.APPLICATION_VERSION, "1.0-SNAPSHOT-DEV");
+    }
+
+
+    /**
+     * This is a service definition, the service will be named "TimingFilter". The interface, RequestFilter, is used
+     * within the RequestHandler service pipeline, which is built from the RequestHandler service configuration.
+     * Tapestry IoC is responsible for passing in an appropriate Logger instance. Requests for static resources are
+     * handled at a higher level, so this filter will only be invoked for Tapestry related requests.
+     * <p/>
+     * <p/>
+     * Service builder methods are useful when the implementation is inline as an inner class (as here) or require some
+     * other kind of special initialization. In most cases, use the static bind() method instead.
+     * <p/>
+     * <p/>
+     * If this method was named "build", then the service id would be taken from the service interface and would be
+     * "RequestFilter".  Since Tapestry already defines a service named "RequestFilter" we use an explicit service id
+     * that we can reference inside the contribution method.
+     */
+    public RequestFilter buildTimingFilter(final Logger log) {
+        return new RequestFilter() {
+            public boolean service(Request request, Response response, RequestHandler handler)
+                    throws IOException {
+                long startTime = System.currentTimeMillis();
+
+                try {
+                    // The responsibility of a filter is to invoke the corresponding method
+                    // in the handler. When you chain multiple filters together, each filter
+                    // received a handler that is a bridge to the next filter.
+
+                    return handler.service(request, response);
+                } finally {
+                    long elapsed = System.currentTimeMillis() - startTime;
+
+                    log.info(String.format("Request time: %d ms", elapsed));
+                }
+            }
+        };
+    }
+
+    /**
+     * This is a contribution to the RequestHandler service configuration. This is how we extend Tapestry using the
+     * timing filter. A common use for this kind of filter is transaction management or security. The @Local annotation
+     * selects the desired service by type, but only from the same module.  Without @Local, there would be an error due
+     * to the other service(s) that implement RequestFilter (defined in other modules).
+     */
+    public void contributeRequestHandler(OrderedConfiguration<RequestFilter> configuration,
+                                         @Local
+                                         RequestFilter filter) {
+        // Each contribution to an ordered configuration has a name, When necessary, you may
+        // set constraints to precisely control the invocation order of the contributed filter
+        // within the pipeline.
+
+        configuration.add("Timing", filter);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main/java/org/ssdt_ohio/devel/forms/services/DevelopmentModule.java	Mon Nov 12 16:29:11 2012 +0000
@@ -0,0 +1,36 @@
+package org.ssdt_ohio.devel.forms.services;
+
+import java.io.IOException;
+
+import org.apache.tapestry5.*;
+import org.apache.tapestry5.ioc.MappedConfiguration;
+import org.apache.tapestry5.ioc.OrderedConfiguration;
+import org.apache.tapestry5.ioc.ServiceBinder;
+import org.apache.tapestry5.ioc.annotations.Local;
+import org.apache.tapestry5.services.Request;
+import org.apache.tapestry5.services.RequestFilter;
+import org.apache.tapestry5.services.RequestHandler;
+import org.apache.tapestry5.services.Response;
+import org.slf4j.Logger;
+
+/**
+ * This module is automatically included as part of the Tapestry IoC Registry if <em>tapestry.execution-mode</em>
+ * includes <code>development</code>.
+ */
+public class DevelopmentModule
+{
+    public static void contributeApplicationDefaults(
+            MappedConfiguration<String, Object> configuration)
+    {
+        // The factory default is true but during the early stages of an application
+        // overriding to false is a good idea. In addition, this is often overridden
+        // on the command line as -Dtapestry.production-mode=false
+        configuration.add(SymbolConstants.PRODUCTION_MODE, false);
+
+        // The application version number is incorprated into URLs for some
+        // assets. Web browsers will cache assets because of the far future expires
+        // header. If existing assets are changed, the version number should also
+        // change, to force the browser to download new versions.
+        configuration.add(SymbolConstants.APPLICATION_VERSION, "1.0-SNAPSHOT-DEV");
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main/java/org/ssdt_ohio/devel/forms/services/QaModule.java	Mon Nov 12 16:29:11 2012 +0000
@@ -0,0 +1,43 @@
+package org.ssdt_ohio.devel.forms.services;
+
+import java.io.IOException;
+
+import org.apache.tapestry5.*;
+import org.apache.tapestry5.ioc.MappedConfiguration;
+import org.apache.tapestry5.ioc.OrderedConfiguration;
+import org.apache.tapestry5.ioc.ServiceBinder;
+import org.apache.tapestry5.ioc.annotations.Local;
+import org.apache.tapestry5.services.Request;
+import org.apache.tapestry5.services.RequestFilter;
+import org.apache.tapestry5.services.RequestHandler;
+import org.apache.tapestry5.services.Response;
+import org.slf4j.Logger;
+
+/**
+ * This module is automatically included as part of the Tapestry IoC Registry if <em>tapestry.execution-mode</em>
+ * includes <code>qa</code> ("quality assurance").
+ */
+public class QaModule
+{
+    public static void bind(ServiceBinder binder)
+    {
+        // Bind any services needed by the QA team to produce their reports
+        // binder.bind(MyServiceMonitorInterface.class, MyServiceMonitorImpl.class);
+    }
+
+
+    public static void contributeApplicationDefaults(
+            MappedConfiguration<String, Object> configuration)
+    {
+        // The factory default is true but during the early stages of an application
+        // overriding to false is a good idea. In addition, this is often overridden
+        // on the command line as -Dtapestry.production-mode=false
+        configuration.add(SymbolConstants.PRODUCTION_MODE, false);
+
+        // The application version number is incorprated into URLs for some
+        // assets. Web browsers will cache assets because of the far future expires
+        // header. If existing assets are changed, the version number should also
+        // change, to force the browser to download new versions.
+        configuration.add(SymbolConstants.APPLICATION_VERSION, "1.0-SNAPSHOT-QA");
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main/resources/log4j.properties	Mon Nov 12 16:29:11 2012 +0000
@@ -0,0 +1,44 @@
+# Default to info level output; this is very handy if you eventually use Hibernate as well.
+log4j.rootCategory=info, A1
+
+# A1 is set to be a ConsoleAppender.
+log4j.appender.A1=org.apache.log4j.ConsoleAppender
+
+# A1 uses PatternLayout.
+log4j.appender.A1.layout=org.apache.log4j.PatternLayout
+log4j.appender.A1.layout.ConversionPattern=[%p] %c{2} %m%n
+
+# Service category names are the name of the defining module class
+# and then the service id.
+log4j.category.org.ssdt_ohio.devel.forms.services.AppModule.TimingFilter=info
+
+# Outputs a list of pages, components and mixins at startup.
+log4j.category.org.apache.tapestry5.services.TapestryModule.ComponentClassResolver=info
+
+# Outputs startup statistics; elapsed time to setup and initialize the registry, a list of
+# available services, and a launch banner that includes the Tapestry version number.
+log4j.category.org.apache.tapestry5.TapestryFilter=info
+
+
+# Turning on debug mode for a page's or component's transformer logger
+# will show all of the code changes that occur when the
+# class is loaded.
+
+# log4j.category.tapestry.transformer.org.ssdt_ohio.devel.forms.pages.Index=debug
+
+# Turning on debug mode for a component's events logger will show all the events triggered on the
+# component, and which component methods are invoked as a result.
+
+# log4j.category.tapestry.events.org.ssdt_ohio.devel.forms.pages.Index=debug
+
+# Turning on trace mode for a page's render logger provides extended information about every step
+# in rendering (this is not generally helpful).  Turning on debug mode will add a one-line
+# summary that includes the elapsed render time, which can be useful in tracking down
+# performance issues.
+
+# log4j.category.tapestry.render.org.ssdt_ohio.devel.forms.pages.Index=debug
+
+# Turn on some verbose debugging about everything in the application. This is nice initially,
+# while getting everything set up.  You'll probably want to remove this once you are 
+# up and running, replacing it with more selective debugging output.
+log4j.category.org.ssdt_ohio.devel.forms=debug
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main/resources/org/ssdt_ohio/devel/forms/components/Layout.tml	Mon Nov 12 16:29:11 2012 +0000
@@ -0,0 +1,54 @@
+<!--
+<!DOCTYPE html>
+
+Design by Free CSS Templates
+http://www.freecsstemplates.org
+Released for free under a Creative Commons Attribution 2.5 License
+
+Title      : Concrete (modified for Tapestry)
+Version    : 1.0
+Released   : 20080825
+Description: A Web 2.0 design with fluid width suitable for blogs and small websites.
+-->
+<html xmlns="http://www.w3.org/1999/xhtml"
+      xmlns:t="http://tapestry.apache.org/schema/tapestry_5_3.xsd"
+      xmlns:p="tapestry:parameter">
+    <head>
+        <meta http-equiv="content-type" content="text/html; charset=utf-8"/>
+        <title>${title}</title>
+    </head>
+    <body>
+    <div class="container">
+        <!-- start header -->
+        <div class="row noprint">
+            <div class="span6">
+                    <t:pagelink page="index">org.ssdt_ohio:ssdt.forms</t:pagelink>
+                    &nbsp;
+                    version ${appVersion}
+            </div>
+            <div class="span6">
+                <ul class="nav nav-tabs">
+                    <li t:type="loop" source="pageNames" value="pageName" class="prop:classForPageName">
+                        <t:pagelink page="prop:pageName">${pageName}</t:pagelink>
+                    </li>
+                </ul>
+            </div>
+        </div>
+        <!-- end header -->
+        <!-- start page -->
+        <div class="page">
+            <!-- start content -->
+            <div class="content">
+                <div class="entry">
+                    <t:body/>
+                </div>
+            </div>
+        </div>
+        <!-- end page -->
+        <!-- start footer -->
+        <div class="footer noprint">
+        </div>
+        <!-- end footer -->
+    </div>
+    </body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main/resources/org/ssdt_ohio/devel/forms/pages/Index.properties	Mon Nov 12 16:29:11 2012 +0000
@@ -0,0 +1,1 @@
+greeting=Welcome to SSDT Forms
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main/resources/org/ssdt_ohio/devel/forms/pages/Index.tml	Mon Nov 12 16:29:11 2012 +0000
@@ -0,0 +1,13 @@
+<html t:type="layout" title="ssdt.forms Index"
+      xmlns:t="http://tapestry.apache.org/schema/tapestry_5_3.xsd"
+      xmlns:p="tapestry:parameter">
+
+
+    <p>${message:greeting}</p>
+
+<ul>
+    <li><t:pagelink page="onetwentypayment">One Twenty Project Payment Form </t:pagelink>  </li>
+</ul>
+
+
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main/resources/org/ssdt_ohio/devel/forms/pages/OneTwentyPayment.tml	Mon Nov 12 16:29:11 2012 +0000
@@ -0,0 +1,140 @@
+<html t:type="layout" title="ssdt.forms Index"
+      xmlns:t="http://tapestry.apache.org/schema/tapestry_5_3.xsd"
+        >
+<body>
+<h2>SSDT One Twenty Project Payment Form</h2>
+<hr/>
+
+<div class="offset1 noprint"><h3>Instructions:</h3>
+
+    <p>Complete the form below and use the browser to print it and submit to supervisor for approval.</p>
+    <p>Note: This is not a proper web application.  The values will not be recorded.</p>
+</div>
+
+<div class="row">
+    <t:form class="form-horizontal form span12">
+
+        <div class="control-group">
+            <label class="control-label label" for="developer">Date</label>
+
+            <div class="controls">${date}
+            </div>
+        </div>
+
+        <div class="control-group">
+            <label class="control-label label" for="developer">Developer</label>
+
+            <div class="controls">
+                <input class="span5 input-block-level" type="text" size="40" id="developer"/>
+            </div>
+        </div>
+
+        <div class="control-group">
+            <label class="control-label  label" for="jira">JIRA Issue</label>
+
+            <div class="controls">
+                <input class="span2 input-block-level" type="text" size="12" id="jira" style="10em"/>
+            </div>
+        </div>
+
+        <div class="control-group">
+            <label class="control-label label" for="description">Description</label>
+
+            <div class="controls">
+                <textarea class="span5 input-block-level" cols="70" rows="5" id="description"/>
+            </div>
+        </div>
+
+        <div class="control-group">
+            <label class="control-label" for="originalBid">Original Bid</label>
+
+            <div class="controls">
+                <div class="input-prepend input-append">
+                    <span class="add-on">$</span>
+                    <input class="span2  input-block-level " type="text" size="6" id="originalBid"/>
+                    <span class="add-on">.00</span>
+                </div>
+            </div>
+        </div>
+
+        <div class="control-group">
+            <label class="control-label" for="adjustmentText1">Adjustments</label>
+
+            <div class="controls">
+                <div class="input-prepend input-append">
+                    <span class="add-on">$</span>
+                    <input class="span2 input-block-level" type="text" size="6" id="adjustmentAmount1"/>
+                    <span class="add-on">.00</span>
+                </div>
+                &nbsp;
+                <input style="width: 16em;" class=" input-block-level" type="text" id="adjustmentText1"/>
+            </div>
+            <div class="controls">
+                <div class="input-prepend input-append">
+                    <span class="add-on">$</span>
+                    <input class="span2  input-block-level" type="text" size="6" id="adjustmentAmount2"/>
+                    <span class="add-on">.00</span>
+                </div>
+                &nbsp;
+                <input style="width: 16em;" class=" input-block-level" type="text" id="adjustmentText2"/>
+            </div>
+            <div class="controls">
+                <div class="input-prepend input-append">
+                    <span class="add-on">$</span>
+                    <input class="span2  input-block-level" type="text" size="6" id="adjustmentAmount3"/>
+                    <span class="add-on">.00</span>
+                </div>
+                &nbsp;
+                <input style="width: 16em;" class=" input-block-level" type="text" id="adjustmentText3"/>
+            </div>
+        </div>
+        <div class="control-group">
+            <label class="control-label" for="approvedAmount">Approved Amount</label>
+
+            <div class="controls">
+                <div class="input-prepend input-append">
+                    <span class="add-on">$</span>
+                    <input class="span2 input-block-level" type="text" size="6" id="approvedAmount"/>
+                    <span class="add-on">.00</span>
+                </div>
+            </div>
+        </div>
+
+
+        <div class="control-group">
+            <label class="control-label" for="approvedAmount">Developer</label>
+
+            <div class="controls">
+                <div>__________________________________ &nbsp; __/__/__</div>
+            </div>
+        </div>
+
+        <div class="well span9 offset1">
+            <h3>Approvals:</h3>
+
+            <div class="row">
+                <div class="span2 offset1">
+                    Supervisor:
+                </div>
+                <div class="span6">__________________________________ &nbsp; __/__/__</div>
+            </div>
+
+            <div class="row">
+                <div class="span2 offset1">
+                    Director:
+                </div>
+                <div class="span6">__________________________________ &nbsp; __/__/__</div>
+            </div>
+
+            <div class="row">
+                <div class="span2 offset1">
+                    Executive&nbsp;Director:
+                </div>
+                <div class="span6">__________________________________ &nbsp; __/__/__</div>
+            </div>
+        </div>
+
+    </t:form>
+</div>
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main/webapp/WEB-INF/app.properties	Mon Nov 12 16:29:11 2012 +0000
@@ -0,0 +1,4 @@
+# This is where global application properties go.
+# You can also have individual message catalogs for each page and each
+# component that override these defaults.
+# The name of this file is based on the <filter-name> element in web.
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main/webapp/WEB-INF/web.xml	Mon Nov 12 16:29:11 2012 +0000
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE web-app
+        PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
+        "http://java.sun.com/dtd/web-app_2_3.dtd">
+<web-app>
+    <display-name>ssdt.forms Tapestry 5 Application</display-name>
+    <context-param>
+        <!-- The only significant configuration for Tapestry 5, this informs Tapestry
+of where to look for pages, components and mixins. -->
+        <param-name>tapestry.app-package</param-name>
+        <param-value>org.ssdt_ohio.devel.forms</param-value>
+    </context-param>
+    <!--
+    Specify some additional Modules for two different execution
+    modes: development and qa.
+    Remember that the default execution mode is production
+    -->
+    <context-param>
+        <param-name>tapestry.development-modules</param-name>
+        <param-value>
+            org.ssdt_ohio.devel.forms.services.DevelopmentModule
+        </param-value>
+    </context-param>
+    <context-param>
+        <param-name>tapestry.qa-modules</param-name>
+        <param-value>
+            org.ssdt_ohio.devel.forms.services.QaModule
+        </param-value>
+    </context-param>
+    <filter>
+        <filter-name>app</filter-name>
+        <filter-class>org.apache.tapestry5.TapestryFilter</filter-class>
+    </filter>
+    <filter-mapping>
+        <filter-name>app</filter-name>
+        <url-pattern>/*</url-pattern>
+    </filter-mapping>
+</web-app>
+      
Binary file src/main/webapp/favicon.ico has changed
Binary file src/main/webapp/layout/images/img01.jpg has changed
Binary file src/main/webapp/layout/images/img03.jpg has changed
Binary file src/main/webapp/layout/images/img04.jpg has changed
Binary file src/main/webapp/layout/images/img08.gif has changed
Binary file src/main/webapp/layout/images/img09.gif has changed
Binary file src/main/webapp/layout/images/img10.gif has changed
Binary file src/main/webapp/layout/images/img11.gif has changed
Binary file src/main/webapp/layout/images/img12.gif has changed
Binary file src/main/webapp/layout/images/img13.gif has changed
Binary file src/main/webapp/layout/images/img14.gif has changed
Binary file src/main/webapp/layout/images/img18.gif has changed
Binary file src/main/webapp/layout/images/img19.gif has changed
Binary file src/main/webapp/layout/images/img20.gif has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main/webapp/layout/layout.css	Mon Nov 12 16:29:11 2012 +0000
@@ -0,0 +1,6 @@
+
+
+@media print
+{
+    .noprint {display: none}
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main/webapp/layout/license.txt	Mon Nov 12 16:29:11 2012 +0000
@@ -0,0 +1,243 @@
+Creative Commons </>
+
+Creative Commons Legal Code
+
+*Attribution 2.5*
+
+CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE
+LEGAL SERVICES. DISTRIBUTION OF THIS LICENSE DOES NOT CREATE AN
+ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS INFORMATION
+ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES REGARDING THE
+INFORMATION PROVIDED, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM
+ITS USE.
+
+/License/
+
+THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS CREATIVE
+COMMONS PUBLIC LICENSE ("CCPL" OR "LICENSE"). THE WORK IS PROTECTED BY
+COPYRIGHT AND/OR OTHER APPLICABLE LAW. ANY USE OF THE WORK OTHER THAN AS
+AUTHORIZED UNDER THIS LICENSE OR COPYRIGHT LAW IS PROHIBITED.
+
+BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HERE, YOU ACCEPT AND AGREE
+TO BE BOUND BY THE TERMS OF THIS LICENSE. THE LICENSOR GRANTS YOU THE
+RIGHTS CONTAINED HERE IN CONSIDERATION OF YOUR ACCEPTANCE OF SUCH TERMS
+AND CONDITIONS.
+
+*1. Definitions*
+
+   1. *"Collective Work"* means a work, such as a periodical issue,
+      anthology or encyclopedia, in which the Work in its entirety in
+      unmodified form, along with a number of other contributions,
+      constituting separate and independent works in themselves, are
+      assembled into a collective whole. A work that constitutes a
+      Collective Work will not be considered a Derivative Work (as
+      defined below) for the purposes of this License.
+   2. *"Derivative Work"* means a work based upon the Work or upon the
+      Work and other pre-existing works, such as a translation, musical
+      arrangement, dramatization, fictionalization, motion picture
+      version, sound recording, art reproduction, abridgment,
+      condensation, or any other form in which the Work may be recast,
+      transformed, or adapted, except that a work that constitutes a
+      Collective Work will not be considered a Derivative Work for the
+      purpose of this License. For the avoidance of doubt, where the
+      Work is a musical composition or sound recording, the
+      synchronization of the Work in timed-relation with a moving image
+      ("synching") will be considered a Derivative Work for the purpose
+      of this License.
+   3. *"Licensor"* means the individual or entity that offers the Work
+      under the terms of this License.
+   4. *"Original Author"* means the individual or entity who created the
+      Work.
+   5. *"Work"* means the copyrightable work of authorship offered under
+      the terms of this License.
+   6. *"You"* means an individual or entity exercising rights under this
+      License who has not previously violated the terms of this License
+      with respect to the Work, or who has received express permission
+      from the Licensor to exercise rights under this License despite a
+      previous violation.
+
+*2. Fair Use Rights.* Nothing in this license is intended to reduce,
+limit, or restrict any rights arising from fair use, first sale or other
+limitations on the exclusive rights of the copyright owner under
+copyright law or other applicable laws.
+
+*3. License Grant.* Subject to the terms and conditions of this License,
+Licensor hereby grants You a worldwide, royalty-free, non-exclusive,
+perpetual (for the duration of the applicable copyright) license to
+exercise the rights in the Work as stated below:
+
+   1. to reproduce the Work, to incorporate the Work into one or more
+      Collective Works, and to reproduce the Work as incorporated in the
+      Collective Works;
+   2. to create and reproduce Derivative Works;
+   3. to distribute copies or phonorecords of, display publicly, perform
+      publicly, and perform publicly by means of a digital audio
+      transmission the Work including as incorporated in Collective Works;
+   4. to distribute copies or phonorecords of, display publicly, perform
+      publicly, and perform publicly by means of a digital audio
+      transmission Derivative Works.
+   5.
+
+      For the avoidance of doubt, where the work is a musical composition:
+
+         1. *Performance Royalties Under Blanket Licenses*. Licensor
+            waives the exclusive right to collect, whether individually
+            or via a performance rights society (e.g. ASCAP, BMI,
+            SESAC), royalties for the public performance or public
+            digital performance (e.g. webcast) of the Work.
+         2. *Mechanical Rights and Statutory Royalties*. Licensor waives
+            the exclusive right to collect, whether individually or via
+            a music rights agency or designated agent (e.g. Harry Fox
+            Agency), royalties for any phonorecord You create from the
+            Work ("cover version") and distribute, subject to the
+            compulsory license created by 17 USC Section 115 of the US
+            Copyright Act (or the equivalent in other jurisdictions).
+   6. *Webcasting Rights and Statutory Royalties*. For the avoidance of
+      doubt, where the Work is a sound recording, Licensor waives the
+      exclusive right to collect, whether individually or via a
+      performance-rights society (e.g. SoundExchange), royalties for the
+      public digital performance (e.g. webcast) of the Work, subject to
+      the compulsory license created by 17 USC Section 114 of the US
+      Copyright Act (or the equivalent in other jurisdictions).
+
+The above rights may be exercised in all media and formats whether now
+known or hereafter devised. The above rights include the right to make
+such modifications as are technically necessary to exercise the rights
+in other media and formats. All rights not expressly granted by Licensor
+are hereby reserved.
+
+*4. Restrictions.*The license granted in Section 3 above is expressly
+made subject to and limited by the following restrictions:
+
+   1. You may distribute, publicly display, publicly perform, or
+      publicly digitally perform the Work only under the terms of this
+      License, and You must include a copy of, or the Uniform Resource
+      Identifier for, this License with every copy or phonorecord of the
+      Work You distribute, publicly display, publicly perform, or
+      publicly digitally perform. You may not offer or impose any terms
+      on the Work that alter or restrict the terms of this License or
+      the recipients' exercise of the rights granted hereunder. You may
+      not sublicense the Work. You must keep intact all notices that
+      refer to this License and to the disclaimer of warranties. You may
+      not distribute, publicly display, publicly perform, or publicly
+      digitally perform the Work with any technological measures that
+      control access or use of the Work in a manner inconsistent with
+      the terms of this License Agreement. The above applies to the Work
+      as incorporated in a Collective Work, but this does not require
+      the Collective Work apart from the Work itself to be made subject
+      to the terms of this License. If You create a Collective Work,
+      upon notice from any Licensor You must, to the extent practicable,
+      remove from the Collective Work any credit as required by clause
+      4(b), as requested. If You create a Derivative Work, upon notice
+      from any Licensor You must, to the extent practicable, remove from
+      the Derivative Work any credit as required by clause 4(b), as
+      requested.
+   2. If you distribute, publicly display, publicly perform, or publicly
+      digitally perform the Work or any Derivative Works or Collective
+      Works, You must keep intact all copyright notices for the Work and
+      provide, reasonable to the medium or means You are utilizing: (i)
+      the name of the Original Author (or pseudonym, if applicable) if
+      supplied, and/or (ii) if the Original Author and/or Licensor
+      designate another party or parties (e.g. a sponsor institute,
+      publishing entity, journal) for attribution in Licensor's
+      copyright notice, terms of service or by other reasonable means,
+      the name of such party or parties; the title of the Work if
+      supplied; to the extent reasonably practicable, the Uniform
+      Resource Identifier, if any, that Licensor specifies to be
+      associated with the Work, unless such URI does not refer to the
+      copyright notice or licensing information for the Work; and in the
+      case of a Derivative Work, a credit identifying the use of the
+      Work in the Derivative Work (e.g., "French translation of the Work
+      by Original Author," or "Screenplay based on original Work by
+      Original Author"). Such credit may be implemented in any
+      reasonable manner; provided, however, that in the case of a
+      Derivative Work or Collective Work, at a minimum such credit will
+      appear where any other comparable authorship credit appears and in
+      a manner at least as prominent as such other comparable authorship
+      credit.
+
+*5. Representations, Warranties and Disclaimer*
+
+UNLESS OTHERWISE MUTUALLY AGREED TO BY THE PARTIES IN WRITING, LICENSOR
+OFFERS THE WORK AS-IS AND MAKES NO REPRESENTATIONS OR WARRANTIES OF ANY
+KIND CONCERNING THE WORK, EXPRESS, IMPLIED, STATUTORY OR OTHERWISE,
+INCLUDING, WITHOUT LIMITATION, WARRANTIES OF TITLE, MERCHANTIBILITY,
+FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF
+LATENT OR OTHER DEFECTS, ACCURACY, OR THE PRESENCE OF ABSENCE OF ERRORS,
+WHETHER OR NOT DISCOVERABLE. SOME JURISDICTIONS DO NOT ALLOW THE
+EXCLUSION OF IMPLIED WARRANTIES, SO SUCH EXCLUSION MAY NOT APPLY TO YOU.
+
+*6. Limitation on Liability.* EXCEPT TO THE EXTENT REQUIRED BY
+APPLICABLE LAW, IN NO EVENT WILL LICENSOR BE LIABLE TO YOU ON ANY LEGAL
+THEORY FOR ANY SPECIAL, INCIDENTAL, CONSEQUENTIAL, PUNITIVE OR EXEMPLARY
+DAMAGES ARISING OUT OF THIS LICENSE OR THE USE OF THE WORK, EVEN IF
+LICENSOR HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+
+*7. Termination*
+
+   1. This License and the rights granted hereunder will terminate
+      automatically upon any breach by You of the terms of this License.
+      Individuals or entities who have received Derivative Works or
+      Collective Works from You under this License, however, will not
+      have their licenses terminated provided such individuals or
+      entities remain in full compliance with those licenses. Sections
+      1, 2, 5, 6, 7, and 8 will survive any termination of this License.
+   2. Subject to the above terms and conditions, the license granted
+      here is perpetual (for the duration of the applicable copyright in
+      the Work). Notwithstanding the above, Licensor reserves the right
+      to release the Work under different license terms or to stop
+      distributing the Work at any time; provided, however that any such
+      election will not serve to withdraw this License (or any other
+      license that has been, or is required to be, granted under the
+      terms of this License), and this License will continue in full
+      force and effect unless terminated as stated above.
+
+*8. Miscellaneous*
+
+   1. Each time You distribute or publicly digitally perform the Work or
+      a Collective Work, the Licensor offers to the recipient a license
+      to the Work on the same terms and conditions as the license
+      granted to You under this License.
+   2. Each time You distribute or publicly digitally perform a
+      Derivative Work, Licensor offers to the recipient a license to the
+      original Work on the same terms and conditions as the license
+      granted to You under this License.
+   3. If any provision of this License is invalid or unenforceable under
+      applicable law, it shall not affect the validity or enforceability
+      of the remainder of the terms of this License, and without further
+      action by the parties to this agreement, such provision shall be
+      reformed to the minimum extent necessary to make such provision
+      valid and enforceable.
+   4. No term or provision of this License shall be deemed waived and no
+      breach consented to unless such waiver or consent shall be in
+      writing and signed by the party to be charged with such waiver or
+      consent.
+   5. This License constitutes the entire agreement between the parties
+      with respect to the Work licensed here. There are no
+      understandings, agreements or representations with respect to the
+      Work not specified here. Licensor shall not be bound by any
+      additional provisions that may appear in any communication from
+      You. This License may not be modified without the mutual written
+      agreement of the Licensor and You.
+
+Creative Commons is not a party to this License, and makes no warranty
+whatsoever in connection with the Work. Creative Commons will not be
+liable to You or any party on any legal theory for any damages
+whatsoever, including without limitation any general, special,
+incidental or consequential damages arising in connection to this
+license. Notwithstanding the foregoing two (2) sentences, if Creative
+Commons has expressly identified itself as the Licensor hereunder, it
+shall have all rights and obligations of Licensor.
+
+Except for the limited purpose of indicating to the public that the Work
+is licensed under the CCPL, neither party will use the trademark
+"Creative Commons" or any related trademark or logo of Creative Commons
+without the prior written consent of Creative Commons. Any permitted use
+will be in compliance with Creative Commons' then-current trademark
+usage guidelines, as may be published on its website or otherwise made
+available upon request from time to time.
+
+Creative Commons may be contacted at http://creativecommons.org/
+<http://creativecommons.org>.
+
+� Back to Commons Deed <./>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/site/apt/index.apt	Mon Nov 12 16:29:11 2012 +0000
@@ -0,0 +1,9 @@
+ ----
+ Module org.ssdt_ohio:ssdt.forms
+ ----
+
+org.ssdt_ohio:ssdt.forms Documentation
+
+  This is where you can start to document your module.
+
+  Create new files in the Maven APT format, and update the site.xml file to point to them.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/site/site.xml	Mon Nov 12 16:29:11 2012 +0000
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<project name="Generated site for ssdt.forms">
+
+    <publishDate format="dd MMM yyyy"/>
+
+    <version/>
+
+    <body>
+
+        <menu name="ssdt.forms Project">
+            <item name="About" href="index.html"/>
+        </menu>
+
+        <menu ref="reports"/>
+
+    </body>
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/test/conf/testng.xml	Mon Nov 12 16:29:11 2012 +0000
@@ -0,0 +1,8 @@
+<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
+<suite name="ssdt.forms Application Test Suite" annotations="1.5">
+    <test name="Unit Tests">
+        <packages>
+            <package name="org.ssdt_ohio.devel.forms"/>
+        </packages>
+    </test>
+</suite>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/test/conf/webdefault.xml	Mon Nov 12 16:29:11 2012 +0000
@@ -0,0 +1,278 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<web-app
+        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-app_2_4.xsd"
+        version="2.4">
+
+    <description>
+        Default web.xml file.
+        This file is applied to a Web application before it's own WEB_INF/web.xml file
+    </description>
+
+
+    <!-- ==================================================================== -->
+    <!-- Context params to control Session Cookies                            -->
+    <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  -->
+    <!-- UNCOMMENT TO ACTIVATE
+    <context-param>
+      <param-name>org.mortbay.jetty.servlet.SessionDomain</param-name>
+      <param-value>127.0.0.1</param-value>
+    </context-param>
+
+    <context-param>
+      <param-name>org.mortbay.jetty.servlet.SessionPath</param-name>
+      <param-value>/</param-value>
+    </context-param>
+
+    <context-param>
+      <param-name>org.mortbay.jetty.servlet.MaxAge</param-name>
+      <param-value>-1</param-value>
+    </context-param>
+    -->
+
+
+    <!-- ==================================================================== -->
+    <!-- The default servlet.                                                 -->
+    <!-- This servlet, normally mapped to /, provides the handling for static -->
+    <!-- content, OPTIONS and TRACE methods for the context.                  -->
+    <!-- The following initParameters are supported:                          -->
+    <!--                                                                      -->
+    <!--   acceptRanges     If true, range requests and responses are         -->
+    <!--                    supported                                         -->
+    <!--                                                                      -->
+    <!--   dirAllowed       If true, directory listings are returned if no    -->
+    <!--                    welcome file is found. Else 403 Forbidden.        -->
+    <!--                                                                      -->
+    <!--   putAllowed       If true, the PUT method is allowed                -->
+    <!--                                                                      -->
+    <!--   delAllowed       If true, the DELETE method is allowed             -->
+    <!--                                                                      -->
+    <!--   redirectWelcome  If true, redirect welcome file requests           -->
+    <!--                    else use request dispatcher forwards              -->
+    <!--                                                                      -->
+    <!--   minGzipLength    If set to a positive integer, then static content -->
+    <!--                    larger than this will be served as gzip content   -->
+    <!--                    encoded if a matching resource is found ending    -->
+    <!--                    with ".gz"                                        -->
+    <!--                                                                      -->
+    <!--   resoureBase      Can be set to replace the context resource base   -->
+    <!--                                                                      -->
+    <!--   relativeResourceBase                                               -->
+    <!--                    Set with a pathname relative to the base of the   -->
+    <!--                    servlet context root. Useful for only serving     -->
+    <!--                    static content from only specific subdirectories. -->
+    <!--                                                                      -->
+    <!-- The MOVE method is allowed if PUT and DELETE are allowed             -->
+    <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  -->
+    <servlet>
+        <servlet-name>default</servlet-name>
+        <servlet-class>org.mortbay.jetty.servlet.Default</servlet-class>
+        <init-param>
+            <param-name>acceptRanges</param-name>
+            <param-value>true</param-value>
+        </init-param>
+        <init-param>
+            <param-name>dirAllowed</param-name>
+            <param-value>true</param-value>
+        </init-param>
+        <init-param>
+            <param-name>putAllowed</param-name>
+            <param-value>false</param-value>
+        </init-param>
+        <init-param>
+            <param-name>delAllowed</param-name>
+            <param-value>false</param-value>
+        </init-param>
+        <init-param>
+            <param-name>redirectWelcome</param-name>
+            <param-value>false</param-value>
+        </init-param>
+        <init-param>
+            <param-name>minGzipLength</param-name>
+            <param-value>8192</param-value>
+        </init-param>
+        <load-on-startup>0</load-on-startup>
+    </servlet>
+
+
+    <servlet-mapping>
+        <servlet-name>default</servlet-name>
+        <url-pattern>/</url-pattern>
+    </servlet-mapping>
+
+    <!-- ==================================================================== -->
+    <session-config>
+        <session-timeout>30</session-timeout>
+    </session-config>
+
+
+    <!-- ==================================================================== -->
+    <welcome-file-list>
+        <welcome-file>index.html</welcome-file>
+        <welcome-file>index.htm</welcome-file>
+    </welcome-file-list>
+
+    <!-- ==================================================================== -->
+    <locale-encoding-mapping-list>
+        <locale-encoding-mapping>
+            <locale>ar</locale>
+            <encoding>ISO-8859-6</encoding>
+        </locale-encoding-mapping>
+        <locale-encoding-mapping>
+            <locale>be</locale>
+            <encoding>ISO-8859-5</encoding>
+        </locale-encoding-mapping>
+        <locale-encoding-mapping>
+            <locale>bg</locale>
+            <encoding>ISO-8859-5</encoding>
+        </locale-encoding-mapping>
+        <locale-encoding-mapping>
+            <locale>ca</locale>
+            <encoding>ISO-8859-1</encoding>
+        </locale-encoding-mapping>
+        <locale-encoding-mapping>
+            <locale>cs</locale>
+            <encoding>ISO-8859-2</encoding>
+        </locale-encoding-mapping>
+        <locale-encoding-mapping>
+            <locale>da</locale>
+            <encoding>ISO-8859-1</encoding>
+        </locale-encoding-mapping>
+        <locale-encoding-mapping>
+            <locale>de</locale>
+            <encoding>ISO-8859-1</encoding>
+        </locale-encoding-mapping>
+        <locale-encoding-mapping>
+            <locale>el</locale>
+            <encoding>ISO-8859-7</encoding>
+        </locale-encoding-mapping>
+        <locale-encoding-mapping>
+            <locale>en</locale>
+            <encoding>ISO-8859-1</encoding>
+        </locale-encoding-mapping>
+        <locale-encoding-mapping>
+            <locale>es</locale>
+            <encoding>ISO-8859-1</encoding>
+        </locale-encoding-mapping>
+        <locale-encoding-mapping>
+            <locale>et</locale>
+            <encoding>ISO-8859-1</encoding>
+        </locale-encoding-mapping>
+        <locale-encoding-mapping>
+            <locale>fi</locale>
+            <encoding>ISO-8859-1</encoding>
+        </locale-encoding-mapping>
+        <locale-encoding-mapping>
+            <locale>fr</locale>
+            <encoding>ISO-8859-1</encoding>
+        </locale-encoding-mapping>
+        <locale-encoding-mapping>
+            <locale>hr</locale>
+            <encoding>ISO-8859-2</encoding>
+        </locale-encoding-mapping>
+        <locale-encoding-mapping>
+            <locale>hu</locale>
+            <encoding>ISO-8859-2</encoding>
+        </locale-encoding-mapping>
+        <locale-encoding-mapping>
+            <locale>is</locale>
+            <encoding>ISO-8859-1</encoding>
+        </locale-encoding-mapping>
+        <locale-encoding-mapping>
+            <locale>it</locale>
+            <encoding>ISO-8859-1</encoding>
+        </locale-encoding-mapping>
+        <locale-encoding-mapping>
+            <locale>iw</locale>
+            <encoding>ISO-8859-8</encoding>
+        </locale-encoding-mapping>
+        <locale-encoding-mapping>
+            <locale>ja</locale>
+            <encoding>Shift_JIS</encoding>
+        </locale-encoding-mapping>
+        <locale-encoding-mapping>
+            <locale>ko</locale>
+            <encoding>EUC-KR</encoding>
+        </locale-encoding-mapping>
+        <locale-encoding-mapping>
+            <locale>lt</locale>
+            <encoding>ISO-8859-2</encoding>
+        </locale-encoding-mapping>
+        <locale-encoding-mapping>
+            <locale>lv</locale>
+            <encoding>ISO-8859-2</encoding>
+        </locale-encoding-mapping>
+        <locale-encoding-mapping>
+            <locale>mk</locale>
+            <encoding>ISO-8859-5</encoding>
+        </locale-encoding-mapping>
+        <locale-encoding-mapping>
+            <locale>nl</locale>
+            <encoding>ISO-8859-1</encoding>
+        </locale-encoding-mapping>
+        <locale-encoding-mapping>
+            <locale>no</locale>
+            <encoding>ISO-8859-1</encoding>
+        </locale-encoding-mapping>
+        <locale-encoding-mapping>
+            <locale>pl</locale>
+            <encoding>ISO-8859-2</encoding>
+        </locale-encoding-mapping>
+        <locale-encoding-mapping>
+            <locale>pt</locale>
+            <encoding>ISO-8859-1</encoding>
+        </locale-encoding-mapping>
+        <locale-encoding-mapping>
+            <locale>ro</locale>
+            <encoding>ISO-8859-2</encoding>
+        </locale-encoding-mapping>
+        <locale-encoding-mapping>
+            <locale>ru</locale>
+            <encoding>ISO-8859-5</encoding>
+        </locale-encoding-mapping>
+        <locale-encoding-mapping>
+            <locale>sh</locale>
+            <encoding>ISO-8859-5</encoding>
+        </locale-encoding-mapping>
+        <locale-encoding-mapping>
+            <locale>sk</locale>
+            <encoding>ISO-8859-2</encoding>
+        </locale-encoding-mapping>
+        <locale-encoding-mapping>
+            <locale>sl</locale>
+            <encoding>ISO-8859-2</encoding>
+        </locale-encoding-mapping>
+        <locale-encoding-mapping>
+            <locale>sq</locale>
+            <encoding>ISO-8859-2</encoding>
+        </locale-encoding-mapping>
+        <locale-encoding-mapping>
+            <locale>sr</locale>
+            <encoding>ISO-8859-5</encoding>
+        </locale-encoding-mapping>
+        <locale-encoding-mapping>
+            <locale>sv</locale>
+            <encoding>ISO-8859-1</encoding>
+        </locale-encoding-mapping>
+        <locale-encoding-mapping>
+            <locale>tr</locale>
+            <encoding>ISO-8859-9</encoding>
+        </locale-encoding-mapping>
+        <locale-encoding-mapping>
+            <locale>uk</locale>
+            <encoding>ISO-8859-5</encoding>
+        </locale-encoding-mapping>
+        <locale-encoding-mapping>
+            <locale>zh</locale>
+            <encoding>GB2312</encoding>
+        </locale-encoding-mapping>
+        <locale-encoding-mapping>
+            <locale>zh_TW</locale>
+            <encoding>Big5</encoding>
+        </locale-encoding-mapping>
+    </locale-encoding-mapping-list>
+
+
+</web-app>
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/test/java/PLACEHOLDER	Mon Nov 12 16:29:11 2012 +0000
@@ -0,0 +1,1 @@
+This placeholder exists to ensure the directory is created. It may be deleted when real files are placed under src/test/java.
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/test/resources/PLACEHOLDER	Mon Nov 12 16:29:11 2012 +0000
@@ -0,0 +1,1 @@
+This placeholder exists to ensure the directory is created. It may be deleted when real files are placed under src/test/resources.
\ No newline at end of file