Index: trunk/gsdl3/comms/jakarta/server.xml.in
===================================================================
--- trunk/gsdl3/comms/jakarta/server.xml.in	(revision 7971)
+++ trunk/gsdl3/comms/jakarta/server.xml.in	(revision 9874)
@@ -1,3 +1,3 @@
-<!-- Alternate Example-less Configuration File -->
+<!-- Example Server Configuration File -->
 <!-- Note that component elements are nested corresponding to their
      parent-child relationships with each other -->
@@ -11,13 +11,27 @@
  -->
 
-<Server port="8005" shutdown="SHUTDOWN" debug="0">
-
-
-  <!-- Uncomment this entry to enable JMX MBeans support -->
-<!--
-  <Listener className="org.apache.catalina.mbeans.ServerLifecycleListener"
-                debug="0" port="-1" login="admin" password="admin"/>
--->
-
+<Server port="8005" shutdown="SHUTDOWN">
+
+  <!-- Comment these entries out to disable JMX MBeans support used for the 
+       administration web application -->
+  <Listener className="org.apache.catalina.mbeans.ServerLifecycleListener" />
+  <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
+  <Listener className="org.apache.catalina.storeconfig.StoreConfigLifecycleListener"/>
+
+  <!-- Global JNDI resources -->
+  <GlobalNamingResources>
+
+    <!-- Test entry for demonstration purposes -->
+    <Environment name="simpleValue" type="java.lang.Integer" value="30"/>
+
+    <!-- Editable user database that can also be used by
+         UserDatabaseRealm to authenticate users -->
+    <Resource name="UserDatabase" auth="Container"
+              type="org.apache.catalina.UserDatabase"
+       description="User database that can be updated and saved"
+           factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
+          pathname="conf/tomcat-users.xml" />
+
+  </GlobalNamingResources>
 
   <!-- A "Service" is a collection of one or more "Connectors" that share
@@ -31,5 +45,5 @@
 
   <!-- Define the Tomcat Stand-Alone Service -->
-  <Service name="Tomcat-Standalone">
+  <Service name="Catalina">
 
     <!-- A "Connector" represents an endpoint by which requests are received
@@ -41,8 +55,8 @@
          following the instructions below and uncommenting the second Connector
          entry.  SSL support requires the following steps (see the SSL Config
-         HOWTO in the Tomcat 4.0 documentation bundle for more detailed
+         HOWTO in the Tomcat 5 documentation bundle for more detailed
          instructions):
-         * Download and install JSSE 1.0.2 or later, and put the JAR files
-           into "$JAVA_HOME/jre/lib/ext".
+         * If your JDK version 1.3 or prior, download and install JSSE 1.0.2 or
+           later, and put the JAR files into "$JAVA_HOME/jre/lib/ext".
          * Execute:
              %JAVA_HOME%\bin\keytool -genkey -alias tomcat -keyalg RSA (Windows)
@@ -60,45 +74,39 @@
 
     <!-- Define a non-SSL HTTP/1.1 Connector on port 8080 -->
-    <Connector className="org.apache.catalina.connector.http.HttpConnector"
-               port="8080" minProcessors="5" maxProcessors="75"
-               enableLookups="true" redirectPort="8443"
-               acceptCount="10" debug="0" connectionTimeout="60000"/>
-    <!-- Note : To disable connection timeouts, set connectionTimeout value 
-     to -1 -->
-
-    <!-- Define an SSL HTTP/1.1 Connector on port 8443 -->
+    <Connector port="@port@"
+               maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
+               enableLookups="false" redirectPort="8443" acceptCount="100"
+               connectionTimeout="20000" disableUploadTimeout="true" />
+    <!-- Note : To disable connection timeouts, set connectionTimeout value
+     to 0 -->
+	
+	<!-- Note : To use gzip compression you could set the following properties :
+	
+			   compression="on" 
+			   compressionMinSize="2048" 
+			   noCompressionUserAgents="gozilla, traviata" 
+			   compressableMimeType="text/html,text/xml"
+	-->
+
+    <!-- Define a SSL HTTP/1.1 Connector on port 8443 -->
     <!--
-    <Connector className="org.apache.catalina.connector.http.HttpConnector"
-               port="8443" minProcessors="5" maxProcessors="75"
-               enableLookups="true"
-	       acceptCount="10" debug="0" scheme="https" secure="true">
-      <Factory className="org.apache.catalina.net.SSLServerSocketFactory"
-               clientAuth="false" protocol="TLS"/>
-    </Connector>
+    <Connector port="8443" 
+               maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
+               enableLookups="false" disableUploadTimeout="true"
+               acceptCount="100" scheme="https" secure="true"
+               clientAuth="false" sslProtocol="TLS" />
     -->
 
     <!-- Define an AJP 1.3 Connector on port 8009 -->
-    <!--
-    <Connector className="org.apache.ajp.tomcat4.Ajp13Connector"
-               port="8009" minProcessors="5" maxProcessors="75"
-               acceptCount="10" debug="0"/>
-    -->
-
-    <!-- Define a Proxied HTTP/1.1 Connector on port 8081 -->
+    <Connector port="8009" 
+               enableLookups="false" redirectPort="8443" protocol="AJP/1.3" />
+
+    <!-- Define a Proxied HTTP/1.1 Connector on port 8082 -->
     <!-- See proxy documentation for more information about using this. -->
     <!--
-    <Connector className="org.apache.catalina.connector.http.HttpConnector"
-               port="8081" minProcessors="5" maxProcessors="75"
-               enableLookups="true"
-               acceptCount="10" debug="0" connectionTimeout="60000"
-               proxyPort="80"/>
-    -->
-
-    <!-- Define a non-SSL HTTP/1.0 Test Connector on port 8082 -->
-    <!--
-    <Connector className="org.apache.catalina.connector.http10.HttpConnector"
-               port="8082" minProcessors="5" maxProcessors="75"
-               enableLookups="true" redirectPort="8443"
-               acceptCount="10" debug="0"/>
+    <Connector port="8082" 
+               maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
+               enableLookups="false" acceptCount="100" connectionTimeout="20000"
+               proxyPort="80" disableUploadTimeout="true" />
     -->
 
@@ -108,6 +116,10 @@
          on to the appropriate Host (virtual host). -->
 
+    <!-- You should set jvmRoute to support load-balancing via AJP ie :
+    <Engine name="Standalone" defaultHost="localhost" jvmRoute="jvm1">         
+    --> 
+         
     <!-- Define the top level container in our container hierarchy -->
-    <Engine name="Standalone" defaultHost="localhost" debug="0">
+    <Engine name="Catalina" defaultHost="localhost">
 
       <!-- The request dumper valve dumps useful debugging information about
@@ -118,5 +130,5 @@
            element inside the corresponding <Host> or <Context> entry instead.
 
-           For a similar mechanism that is portable to all Servlet 2.3
+           For a similar mechanism that is portable to all Servlet 2.4
            containers, check out the "RequestDumperFilter" Filter in the
            example application (the source for this filter may be found in
@@ -129,12 +141,18 @@
       -->
 
-      <!-- Global logger unless overridden at lower levels -->
-      <Logger className="org.apache.catalina.logger.FileLogger"
-              prefix="catalina_log." suffix=".txt"
-              timestamp="true"/>
-
       <!-- Because this Realm is here, an instance will be shared globally -->
 
+      <!-- This Realm uses the UserDatabase configured in the global JNDI
+           resources under the key "UserDatabase".  Any edits
+           that are performed against this UserDatabase are immediately
+           available for use by the Realm.  -->
+      <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
+             resourceName="UserDatabase"/>
+
+      <!-- Comment out the old realm but leave here for now in case we
+           need to go back quickly -->
+      <!--
       <Realm className="org.apache.catalina.realm.MemoryRealm" />
+      -->
 
       <!-- Replace the above Realm with one of the following to get a Realm
@@ -142,5 +160,5 @@
 
       <!--
-      <Realm  className="org.apache.catalina.realm.JDBCRealm" debug="99"
+      <Realm  className="org.apache.catalina.realm.JDBCRealm"
              driverName="org.gjt.mm.mysql.Driver"
           connectionURL="jdbc:mysql://localhost/authority"
@@ -151,5 +169,5 @@
 
       <!--
-      <Realm  className="org.apache.catalina.realm.JDBCRealm" debug="99"
+      <Realm  className="org.apache.catalina.realm.JDBCRealm"
              driverName="oracle.jdbc.driver.OracleDriver"
           connectionURL="jdbc:oracle:thin:@ntserver:1521:ORCL"
@@ -160,5 +178,5 @@
 
       <!--
-      <Realm  className="org.apache.catalina.realm.JDBCRealm" debug="99"
+      <Realm  className="org.apache.catalina.realm.JDBCRealm"
              driverName="sun.jdbc.odbc.JdbcOdbcDriver"
           connectionURL="jdbc:odbc:CATALINA"
@@ -167,7 +185,139 @@
       -->
 
-      <!-- Define the default virtual host -->
-      <Host name="localhost" debug="0" appBase="webapps" 
-       unpackWARs="true" autoDeploy="true">
+      <!-- Define the default virtual host
+           Note: XML Schema validation will not work with Xerces 2.2.
+       -->
+      <Host name="localhost" appBase="webapps"
+       unpackWARs="true" autoDeploy="true"
+       xmlValidation="false" xmlNamespaceAware="false">
+
+	<!-- GSDL3 Service -->
+	<Context path="/gsdl3" docBase="@gsdl3home@/web" debug="1" reloadable="true"><Resources allowLinking='true'/></Context>
+	
+        <!-- Defines a cluster for this node,
+             By defining this element, means that every manager will be changed.
+             So when running a cluster, only make sure that you have webapps in there
+             that need to be clustered and remove the other ones.
+             A cluster has the following parameters:
+
+             className = the fully qualified name of the cluster class
+
+             name = a descriptive name for your cluster, can be anything
+
+             mcastAddr = the multicast address, has to be the same for all the nodes
+
+             mcastPort = the multicast port, has to be the same for all the nodes
+             
+             mcastBindAddr = bind the multicast socket to a specific address
+             
+             mcastTTL = the multicast TTL if you want to limit your broadcast
+             
+             mcastSoTimeout = the multicast readtimeout 
+
+             mcastFrequency = the number of milliseconds in between sending a "I'm alive" heartbeat
+
+             mcastDropTime = the number a milliseconds before a node is considered "dead" if no heartbeat is received
+
+             tcpThreadCount = the number of threads to handle incoming replication requests, optimal would be the same amount of threads as nodes 
+
+             tcpListenAddress = the listen address (bind address) for TCP cluster request on this host, 
+                                in case of multiple ethernet cards.
+                                auto means that address becomes
+                                InetAddress.getLocalHost().getHostAddress()
+
+             tcpListenPort = the tcp listen port
+
+             tcpSelectorTimeout = the timeout (ms) for the Selector.select() method in case the OS
+                                  has a wakup bug in java.nio. Set to 0 for no timeout
+
+             printToScreen = true means that managers will also print to std.out
+
+             expireSessionsOnShutdown = true means that 
+
+             useDirtyFlag = true means that we only replicate a session after setAttribute,removeAttribute has been called.
+                            false means to replicate the session after each request.
+                            false means that replication would work for the following piece of code: (only for SimpleTcpReplicationManager)
+                            <%
+                            HashMap map = (HashMap)session.getAttribute("map");
+                            map.put("key","value");
+                            %>
+             replicationMode = can be either 'pooled', 'synchronous' or 'asynchronous'.
+                               * Pooled means that the replication happens using several sockets in a synchronous way. Ie, the data gets replicated, then the request return. This is the same as the 'synchronous' setting except it uses a pool of sockets, hence it is multithreaded. This is the fastest and safest configuration. To use this, also increase the nr of tcp threads that you have dealing with replication.
+                               * Synchronous means that the thread that executes the request, is also the
+                               thread the replicates the data to the other nodes, and will not return until all
+                               nodes have received the information.
+                               * Asynchronous means that there is a specific 'sender' thread for each cluster node,
+                               so the request thread will queue the replication request into a "smart" queue,
+                               and then return to the client.
+                               The "smart" queue is a queue where when a session is added to the queue, and the same session
+                               already exists in the queue from a previous request, that session will be replaced
+                               in the queue instead of replicating two requests. This almost never happens, unless there is a 
+                               large network delay.
+        -->             
+        <!--
+            When configuring for clustering, you also add in a valve to catch all the requests
+            coming in, at the end of the request, the session may or may not be replicated.
+            A session is replicated if and only if all the conditions are met:
+            1. useDirtyFlag is true or setAttribute or removeAttribute has been called AND
+            2. a session exists (has been created)
+            3. the request is not trapped by the "filter" attribute
+
+            The filter attribute is to filter out requests that could not modify the session,
+            hence we don't replicate the session after the end of this request.
+            The filter is negative, ie, anything you put in the filter, you mean to filter out,
+            ie, no replication will be done on requests that match one of the filters.
+            The filter attribute is delimited by ;, so you can't escape out ; even if you wanted to.
+
+            filter=".*\.gif;.*\.js;" means that we will not replicate the session after requests with the URI
+            ending with .gif and .js are intercepted.
+            
+            The deployer element can be used to deploy apps cluster wide.
+            Currently the deployment only deploys/undeploys to working members in the cluster
+            so no WARs are copied upons startup of a broken node.
+            The deployer watches a directory (watchDir) for WAR files when watchEnabled="true"
+            When a new war file is added the war gets deployed to the local instance,
+            and then deployed to the other instances in the cluster.
+            When a war file is deleted from the watchDir the war is undeployed locally 
+            and cluster wide
+        -->
+        
+        <!--
+        <Cluster className="org.apache.catalina.cluster.tcp.SimpleTcpCluster"
+                 managerClassName="org.apache.catalina.cluster.session.DeltaManager"
+                 expireSessionsOnShutdown="false"
+                 useDirtyFlag="true"
+                 notifyListenersOnReplication="true">
+
+            <Membership 
+                className="org.apache.catalina.cluster.mcast.McastService"
+                mcastAddr="228.0.0.4"
+                mcastPort="45564"
+                mcastFrequency="500"
+                mcastDropTime="3000"/>
+
+            <Receiver 
+                className="org.apache.catalina.cluster.tcp.ReplicationListener"
+                tcpListenAddress="auto"
+                tcpListenPort="4001"
+                tcpSelectorTimeout="100"
+                tcpThreadCount="6"/>
+
+            <Sender
+                className="org.apache.catalina.cluster.tcp.ReplicationTransmitter"
+                replicationMode="pooled"
+                ackTimeout="15000"/>
+
+            <Valve className="org.apache.catalina.cluster.tcp.ReplicationValve"
+                   filter=".*\.gif;.*\.js;.*\.jpg;.*\.png;.*\.htm;.*\.html;.*\.css;.*\.txt;"/>
+                   
+            <Deployer className="org.apache.catalina.cluster.deploy.FarmWarDeployer"
+                      tempDir="/tmp/war-temp/"
+                      deployDir="/tmp/war-deploy/"
+                      watchDir="/tmp/war-listen/"
+                      watchEnabled="false"/>
+        </Cluster>
+        -->        
+
+
 
         <!-- Normally, users must authenticate themselves to each web app
@@ -178,6 +328,5 @@
              in this virtual host. -->
         <!--
-        <Valve className="org.apache.catalina.authenticator.SingleSignOn"
-                   debug="0"/>
+        <Valve className="org.apache.catalina.authenticator.SingleSignOn" />
         -->
 
@@ -188,35 +337,39 @@
              (to $CATALINA_HOME) or absolute path to the desired directory.
         -->
+        <!--
         <Valve className="org.apache.catalina.valves.AccessLogValve"
                  directory="logs"  prefix="localhost_access_log." suffix=".txt"
-                 pattern="common"/>
-
-        <!-- Logger shared by all Contexts related to this virtual host.  By
-             default (when using FileLogger), log files are created in the "logs"
-             directory relative to $CATALINA_HOME.  If you wish, you can specify
-             a different directory with the "directory" attribute.  Specify either a
-             relative (to $CATALINA_HOME) or absolute path to the desired
-             directory.-->
-        <Logger className="org.apache.catalina.logger.FileLogger"
-                 directory="logs"  prefix="localhost_log." suffix=".txt"
-	        timestamp="true"/>
-
-        <!-- Define properties for each web application.  This is only needed
-             if you want to set non-default properties, or have web application
-             document roots in places other than the virtual host's appBase
-             directory.  -->
-
-        <!-- Tomcat Root Context -->
-        <!--
-          <Context path="" docBase="ROOT" debug="0"/>
-        -->
-
-	<!-- GSDL3 Service -->
-        <Context path="/gsdl3" docBase="@gsdl3home@/web" debug="1" reloadable="true">
-	  <Resources allowLinking='true'/>
-        </Context>
-
-	<!-- SOAP Service -->
-	<Context path="/soap" docBase="@gsdl3home@/comms/soap/soap/webapps/soap" debug="1" reloadable="true"/>
+                 pattern="common" resolveHosts="false"/>
+        -->
+
+        <!-- Access log processes all requests for this virtual host.  By
+             default, log files are created in the "logs" directory relative to
+             $CATALINA_HOME.  If you wish, you can specify a different
+             directory with the "directory" attribute.  Specify either a relative
+             (to $CATALINA_HOME) or absolute path to the desired directory.
+             This access log implementation is optimized for maximum performance,
+             but is hardcoded to support only the "common" and "combined" patterns.
+        -->
+        <!--
+        <Valve className="org.apache.catalina.valves.FastCommonAccessLogValve"
+                 directory="logs"  prefix="localhost_access_log." suffix=".txt"
+                 pattern="common" resolveHosts="false"/>
+        -->
+        <!-- Access log processes all requests for this virtual host.  By
+             default, log files are created in the "logs" directory relative to
+             $CATALINA_HOME.  If you wish, you can specify a different
+             directory with the "directory" attribute.  Specify either a relative
+             (to $CATALINA_HOME) or absolute path to the desired directory.
+             This access log implementation is optimized for maximum performance,
+             but is hardcoded to support only the "common" and "combined" patterns.
+
+             This valve use NIO direct Byte Buffer to asynchornously store the
+             log.
+        -->
+        <!--
+        <Valve className="org.apache.catalina.valves.ByteBufferAccessLogValve"
+                 directory="logs"  prefix="localhost_access_log." suffix=".txt"
+                 pattern="common" resolveHosts="false"/>
+        -->
 
       </Host>
@@ -226,46 +379,3 @@
   </Service>
 
-  <!-- The MOD_WEBAPP connector is used to connect Apache 1.3 with Tomcat 4.0
-       as its servlet container. Please read the README.txt file coming with
-       the WebApp Module distribution on how to build it.
-       (Or check out the "jakarta-tomcat-connectors/webapp" CVS repository)
-
-       To configure the Apache side, you must ensure that you have the
-       "ServerName" and "Port" directives defined in "httpd.conf".  Then,
-       lines like these to the bottom of your "httpd.conf" file:
-
-         LoadModule webapp_module libexec/mod_webapp.so
-         WebAppConnection warpConnection warp localhost:8008
-         WebAppDeploy examples warpConnection /examples/
-
-       The next time you restart Apache (after restarting Tomcat, if needed)
-       the connection will be established, and all applications you make
-       visible via "WebAppDeploy" directives can be accessed through Apache.
-  -->
-
-  <!-- Define an Apache-Connector Service -->
-  <Service name="Tomcat-Apache">
-
-    <Connector className="org.apache.catalina.connector.warp.WarpConnector"
-     port="8008" minProcessors="5" maxProcessors="75"
-     enableLookups="true"
-     acceptCount="10" debug="0"/>
-
-    <!-- Replace "localhost" with what your Apache "ServerName" is set to -->
-    <Engine className="org.apache.catalina.connector.warp.WarpEngine"
-     name="Apache" debug="0" appBase="webapps">
-
-      <!-- Global logger unless overridden at lower levels -->
-      <Logger className="org.apache.catalina.logger.FileLogger"
-              prefix="apache_log." suffix=".txt"
-              timestamp="true"/>
-
-      <!-- Because this Realm is here, an instance will be shared globally -->
-      <Realm className="org.apache.catalina.realm.MemoryRealm" />
-
-    </Engine>
-
-  </Service>
-
 </Server>
-
Index: trunk/gsdl3/comms/jakarta/setclasspath.bat
===================================================================
--- trunk/gsdl3/comms/jakarta/setclasspath.bat	(revision 9874)
+++ trunk/gsdl3/comms/jakarta/setclasspath.bat	(revision 9874)
@@ -0,0 +1,57 @@
+rem ---------------------------------------------------------------------------
+rem Set CLASSPATH and Java options
+rem
+rem $Id$
+rem ---------------------------------------------------------------------------
+
+rem Make sure prerequisite environment variables are set
+if not "%JAVA_HOME%" == "" goto gotJavaHome
+echo The JAVA_HOME environment variable is not defined
+echo This environment variable is needed to run this program
+goto exit
+:gotJavaHome
+if not exist "%JAVA_HOME%\bin\java.exe" goto noJavaHome
+if not exist "%JAVA_HOME%\bin\javaw.exe" goto noJavaHome
+if not exist "%JAVA_HOME%\bin\jdb.exe" goto noJavaHome
+if not exist "%JAVA_HOME%\bin\javac.exe" goto noJavaHome
+goto okJavaHome
+:noJavaHome
+echo The JAVA_HOME environment variable is not defined correctly
+echo This environment variable is needed to run this program
+echo NB: JAVA_HOME should point to a JDK not a JRE
+goto exit
+:okJavaHome
+
+if not "%BASEDIR%" == "" goto gotBasedir
+echo The BASEDIR environment variable is not defined
+echo This environment variable is needed to run this program
+goto exit
+:gotBasedir
+if exist "%BASEDIR%\bin\setclasspath.bat" goto okBasedir
+echo The BASEDIR environment variable is not defined correctly
+echo This environment variable is needed to run this program
+goto exit
+:okBasedir
+
+rem Set the default -Djava.endorsed.dirs argument
+set JAVA_ENDORSED_DIRS=%BASEDIR%\common\endorsed
+
+rem Set standard CLASSPATH
+rem Note that there are no quotes as we do not want to introduce random
+rem quotes into the CLASSPATH
+set CLASSPATH=%JAVA_HOME%\lib\tools.jar;%CLASSPATH%
+
+rem Set standard command for invoking Java.
+rem Note that NT requires a window name argument when using start.
+rem Also note the quoting as JAVA_HOME may contain spaces.
+set _RUNJAVA="%JAVA_HOME%\bin\java"
+set _RUNJAVAW="%JAVA_HOME%\bin\javaw"
+set _RUNJDB="%JAVA_HOME%\bin\jdb"
+set _RUNJAVAC="%JAVA_HOME%\bin\javac"
+
+goto end
+
+:exit
+exit /b 1
+
+:end
