Author: rjung
Date: Wed Aug 20 09:24:21 2014
New Revision: 1619056

URL: http://svn.apache.org/r1619056
Log:
Make session id generation extensible.

1) New interface org.apache.catalina.SessionIdGenerator
   - setter and getter for jvmRoute
   - setter and getter for session id length
   - generateSessionId() (use jvmRoute if set) and
     generateSessionId(String route).
2) Renamed org.apache.catalina.util.SessionIdGenerator to
   abstract org.apache.catalina.util.SessionIdGeneratorBase.
   For consistency with similar cases.
3) Adjust visibility of getRandomBytes(byte bytes[]) in SessionIdGeneratorBase
   from private to protected to allow extension.
4) Moved generateSessionId() from SessionIdGeneratorBase
   to new org.apache.catalina.util.StandardSessionIdGenerator
   extending SessionIdGeneratorBase and implementing SessionIdGenerator.
   Make SessionIdGeneratorBase abstract.
5) Changed message keys in org.apache.catalina.util.LocalStrings.properties
   etc. from sessionIdGenerator.* to sessionIdGeneratorBase.*.
6) Add getter and setter for SessionIdGenerator to Manager interface
   and to ManagerBase. Deprecated setSessionIdLength(int) and
   getSessionIdLength() there. Use value only if explicitly set
   otherwise use value from SessionIdGenerator impl.
7) Adjust SessionIdGenerator initialization in ManagerBase:
   uses generator set in context config if present, otherwise
   uses StandardSessionIdGenerator as default.
9) Add Context/Manager/SessionIdGenerator to digester ContextRuleSet.

Method getSessionIdLength() and setSessionIdlength(int) in Manager
interface only kept for API stability (too late for removing in TC 8).

Added:
    tomcat/trunk/java/org/apache/catalina/SessionIdGenerator.java   (with props)
    tomcat/trunk/java/org/apache/catalina/util/SessionIdGeneratorBase.java
      - copied, changed from r1619040, 
tomcat/trunk/java/org/apache/catalina/util/SessionIdGenerator.java
    tomcat/trunk/java/org/apache/catalina/util/StandardSessionIdGenerator.java  
 (with props)
Removed:
    tomcat/trunk/java/org/apache/catalina/util/SessionIdGenerator.java
Modified:
    tomcat/trunk/java/org/apache/catalina/Manager.java
    tomcat/trunk/java/org/apache/catalina/authenticator/AuthenticatorBase.java
    tomcat/trunk/java/org/apache/catalina/ha/session/ClusterManagerBase.java
    tomcat/trunk/java/org/apache/catalina/session/ManagerBase.java
    tomcat/trunk/java/org/apache/catalina/startup/ContextRuleSet.java
    tomcat/trunk/java/org/apache/catalina/util/LocalStrings.properties
    tomcat/trunk/java/org/apache/catalina/util/LocalStrings_es.properties
    tomcat/trunk/java/org/apache/catalina/util/LocalStrings_fr.properties
    tomcat/trunk/java/org/apache/catalina/util/LocalStrings_ja.properties
    tomcat/trunk/webapps/docs/config/cluster-manager.xml
    tomcat/trunk/webapps/docs/config/manager.xml

Modified: tomcat/trunk/java/org/apache/catalina/Manager.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/Manager.java?rev=1619056&r1=1619055&r2=1619056&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/Manager.java (original)
+++ tomcat/trunk/java/org/apache/catalina/Manager.java Wed Aug 20 09:24:21 2014
@@ -117,11 +117,29 @@ public interface Manager {
 
 
     /**
+     * return the session id generator
+     */
+    public SessionIdGenerator getSessionIdGenerator();
+
+
+    /**
+     * Sets the session id generator
+     *
+     * @param idGenerator The session id generator
+     */
+    public void setSessionIdGenerator(SessionIdGenerator sessionIdGenerator);
+
+
+    /**
      * Gets the session id length (in bytes) of Sessions created by
      * this Manager.
      *
+     * @deprecated Use {@link SessionIdGenerator#getSessionIdLength()}.
+     *             This method will be removed in Tomcat 9 onwards.
+     *
      * @return The session id length
      */
+    @Deprecated
     public int getSessionIdLength();
 
 
@@ -129,8 +147,12 @@ public interface Manager {
      * Sets the session id length (in bytes) for Sessions created by this
      * Manager.
      *
+     * @deprecated Use {@link SessionIdGenerator#setSessionIdLength(int)}.
+     *             This method will be removed in Tomcat 9 onwards.
+     *
      * @param idLength The session id length
      */
+    @Deprecated
     public void setSessionIdLength(int idLength);
 
 

Added: tomcat/trunk/java/org/apache/catalina/SessionIdGenerator.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/SessionIdGenerator.java?rev=1619056&view=auto
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/SessionIdGenerator.java (added)
+++ tomcat/trunk/java/org/apache/catalina/SessionIdGenerator.java Wed Aug 20 
09:24:21 2014
@@ -0,0 +1,59 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.catalina;
+
+public interface SessionIdGenerator {
+
+    /**
+     * Return the node identifier associated with this node which will be
+     * included in the generated session ID.
+     */
+    public String getJvmRoute();
+
+    /**
+     * Specify the node identifier associated with this node which will be
+     * included in the generated session ID.
+     *
+     * @param jvmRoute  The node identifier
+     */
+    public void setJvmRoute(String jvmRoute);
+
+    /**
+     * Return the number of bytes for a session ID
+     */
+    public int getSessionIdLength();
+
+    /**
+     * Specify the number of bytes for a session ID
+     *
+     * @param sessionIdLength   Number of bytes
+     */
+    public void setSessionIdLength(int sessionIdLength);
+
+    /**
+     * Generate and return a new session identifier.
+     */
+    public String generateSessionId();
+
+    /**
+     * Generate and return a new session identifier.
+     *
+     * @param route   node identifier to include in generated id
+     */
+    public String generateSessionId(String route);
+
+}

Propchange: tomcat/trunk/java/org/apache/catalina/SessionIdGenerator.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: 
tomcat/trunk/java/org/apache/catalina/authenticator/AuthenticatorBase.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/authenticator/AuthenticatorBase.java?rev=1619056&r1=1619055&r2=1619056&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/authenticator/AuthenticatorBase.java 
(original)
+++ tomcat/trunk/java/org/apache/catalina/authenticator/AuthenticatorBase.java 
Wed Aug 20 09:24:21 2014
@@ -39,7 +39,8 @@ import org.apache.catalina.Valve;
 import org.apache.catalina.Wrapper;
 import org.apache.catalina.connector.Request;
 import org.apache.catalina.connector.Response;
-import org.apache.catalina.util.SessionIdGenerator;
+import org.apache.catalina.util.SessionIdGeneratorBase;
+import org.apache.catalina.util.StandardSessionIdGenerator;
 import org.apache.catalina.valves.ValveBase;
 import org.apache.coyote.ActionCode;
 import org.apache.juli.logging.Log;
@@ -166,7 +167,7 @@ public abstract class AuthenticatorBase 
      */
     protected String secureRandomProvider = null;
 
-    protected SessionIdGenerator sessionIdGenerator = null;
+    protected SessionIdGeneratorBase sessionIdGenerator = null;
 
     /**
      * The string manager for this package.
@@ -918,7 +919,7 @@ public abstract class AuthenticatorBase 
             }
         }
 
-        sessionIdGenerator = new SessionIdGenerator();
+        sessionIdGenerator = new StandardSessionIdGenerator();
         
sessionIdGenerator.setSecureRandomAlgorithm(getSecureRandomAlgorithm());
         sessionIdGenerator.setSecureRandomClass(getSecureRandomClass());
         sessionIdGenerator.setSecureRandomProvider(getSecureRandomProvider());

Modified: 
tomcat/trunk/java/org/apache/catalina/ha/session/ClusterManagerBase.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/ha/session/ClusterManagerBase.java?rev=1619056&r1=1619055&r2=1619056&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/ha/session/ClusterManagerBase.java 
(original)
+++ tomcat/trunk/java/org/apache/catalina/ha/session/ClusterManagerBase.java 
Wed Aug 20 09:24:21 2014
@@ -193,7 +193,6 @@ public abstract class ClusterManagerBase
         copy.setName("Clone-from-" + getName());
         copy.setMaxActiveSessions(getMaxActiveSessions());
         copy.setMaxInactiveInterval(getMaxInactiveInterval());
-        copy.setSessionIdLength(getSessionIdLength());
         copy.setProcessExpiresFrequency(getProcessExpiresFrequency());
         copy.setNotifyListenersOnReplication(isNotifyListenersOnReplication());
         copy.setSessionAttributeFilter(getSessionAttributeFilter());

Modified: tomcat/trunk/java/org/apache/catalina/session/ManagerBase.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/session/ManagerBase.java?rev=1619056&r1=1619055&r2=1619056&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/session/ManagerBase.java (original)
+++ tomcat/trunk/java/org/apache/catalina/session/ManagerBase.java Wed Aug 20 
09:24:21 2014
@@ -39,8 +39,10 @@ import org.apache.catalina.Engine;
 import org.apache.catalina.LifecycleException;
 import org.apache.catalina.Manager;
 import org.apache.catalina.Session;
+import org.apache.catalina.SessionIdGenerator;
 import org.apache.catalina.util.LifecycleMBeanBase;
-import org.apache.catalina.util.SessionIdGenerator;
+import org.apache.catalina.util.SessionIdGeneratorBase;
+import org.apache.catalina.util.StandardSessionIdGenerator;
 import org.apache.juli.logging.Log;
 import org.apache.juli.logging.LogFactory;
 import org.apache.tomcat.util.res.StringManager;
@@ -87,10 +89,14 @@ public abstract class ManagerBase extend
     protected int maxInactiveInterval = 30 * 60;
 
 
+    protected static final int SESSION_ID_LENGTH_UNSET = -1;
+
     /**
      * The session id length of Sessions created by this Manager.
+     * The length should be set directly on the SessionIdGenerator.
+     * Setting it here is deprecated.
      */
-    protected int sessionIdLength = 16;
+    protected int sessionIdLength = SESSION_ID_LENGTH_UNSET;
 
 
     /**
@@ -124,6 +130,7 @@ public abstract class ManagerBase extend
     protected String secureRandomProvider = null;
 
     protected SessionIdGenerator sessionIdGenerator = null;
+    protected Class sessionIdGeneratorClass = null;
 
     /**
      * The longest time (in seconds) that an expired session had been alive.
@@ -323,9 +330,13 @@ public abstract class ManagerBase extend
      * Gets the session id length (in bytes) of Sessions created by
      * this Manager.
      *
+     * @deprecated Use {@link SessionIdGenerator#getSessionIdLength()}.
+     *             This method will be removed in Tomcat 9 onwards.
+     *
      * @return The session id length
      */
     @Override
+    @Deprecated
     public int getSessionIdLength() {
 
         return (this.sessionIdLength);
@@ -337,9 +348,13 @@ public abstract class ManagerBase extend
      * Sets the session id length (in bytes) for Sessions created by this
      * Manager.
      *
+     * @deprecated Use {@link SessionIdGenerator#setSessionIdLength(int)}.
+     *             This method will be removed in Tomcat 9 onwards.
+     *
      * @param idLength The session id length
      */
     @Override
+    @Deprecated
     public void setSessionIdLength(int idLength) {
 
         int oldSessionIdLength = this.sessionIdLength;
@@ -352,6 +367,42 @@ public abstract class ManagerBase extend
 
 
     /**
+     * Gets the session id generator.
+     *
+     * @return The session id generator
+     */
+    @Override
+    public SessionIdGenerator getSessionIdGenerator() {
+        if (sessionIdGenerator != null) {
+            return sessionIdGenerator;
+        } else if (sessionIdGeneratorClass != null) {
+            try {
+                sessionIdGenerator =
+                    (SessionIdGenerator) sessionIdGeneratorClass.newInstance();
+                return sessionIdGenerator;
+            } catch(IllegalAccessException ex) {
+                // Ignore
+            } catch(InstantiationException ex) {
+                // Ignore
+            }
+        }
+        return null;
+    }
+
+
+    /**
+     * Sets the session id generator
+     *
+     * @param idGenerator The session id generator
+     */
+    @Override
+    public void setSessionIdGenerator(SessionIdGenerator sessionIdGenerator) {
+        this.sessionIdGenerator = sessionIdGenerator;
+        sessionIdGeneratorClass = sessionIdGenerator.getClass();
+    }
+
+
+    /**
      * Return the descriptive short name of this Manager implementation.
      */
     public String getName() {
@@ -547,12 +598,23 @@ public abstract class ManagerBase extend
             sessionExpirationTiming.add(null);
         }
 
-        sessionIdGenerator = new SessionIdGenerator();
+        /* Create sessionIdGenerator if not explicitly configured */
+        SessionIdGenerator sessionIdGenerator = getSessionIdGenerator();
+        if (sessionIdGenerator == null) {
+            sessionIdGenerator = new StandardSessionIdGenerator();
+            setSessionIdGenerator(sessionIdGenerator);
+        }
+
+        if (sessionIdLength != SESSION_ID_LENGTH_UNSET) {
+            sessionIdGenerator.setSessionIdLength(sessionIdLength);
+        }
         sessionIdGenerator.setJvmRoute(getJvmRoute());
-        
sessionIdGenerator.setSecureRandomAlgorithm(getSecureRandomAlgorithm());
-        sessionIdGenerator.setSecureRandomClass(getSecureRandomClass());
-        sessionIdGenerator.setSecureRandomProvider(getSecureRandomProvider());
-        sessionIdGenerator.setSessionIdLength(getSessionIdLength());
+        if (sessionIdGenerator instanceof SessionIdGeneratorBase) {
+            SessionIdGeneratorBase sig = 
(SessionIdGeneratorBase)sessionIdGenerator;
+            sig.setSecureRandomAlgorithm(getSecureRandomAlgorithm());
+            sig.setSecureRandomClass(getSecureRandomClass());
+            sig.setSecureRandomProvider(getSecureRandomProvider());
+        }
 
         // Force initialization of the random number generator
         if (log.isDebugEnabled())

Modified: tomcat/trunk/java/org/apache/catalina/startup/ContextRuleSet.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/startup/ContextRuleSet.java?rev=1619056&r1=1619055&r2=1619056&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/startup/ContextRuleSet.java (original)
+++ tomcat/trunk/java/org/apache/catalina/startup/ContextRuleSet.java Wed Aug 
20 09:24:21 2014
@@ -152,6 +152,14 @@ public class ContextRuleSet extends Rule
                             "setStore",
                             "org.apache.catalina.Store");
 
+        digester.addObjectCreate(prefix + "Context/Manager/SessionIdGenerator",
+                                 
"org.apache.catalina.util.StandardSessionIdGenerator",
+                                 "className");
+        digester.addSetProperties(prefix + 
"Context/Manager/SessionIdGenerator");
+        digester.addSetNext(prefix + "Context/Manager/SessionIdGenerator",
+                            "setSessionIdGenerator",
+                            "org.apache.catalina.SessionIdGenerator");
+
         digester.addObjectCreate(prefix + "Context/Parameter",
                                  
"org.apache.tomcat.util.descriptor.web.ApplicationParameter");
         digester.addSetProperties(prefix + "Context/Parameter");

Modified: tomcat/trunk/java/org/apache/catalina/util/LocalStrings.properties
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/util/LocalStrings.properties?rev=1619056&r1=1619055&r2=1619056&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/util/LocalStrings.properties 
(original)
+++ tomcat/trunk/java/org/apache/catalina/util/LocalStrings.properties Wed Aug 
20 09:24:21 2014
@@ -39,8 +39,7 @@ lifecycleMBeanBase.unregisterNoServer=No
 requestUtil.convertHexDigit.notHex=[{0}] is not a hexadecimal digit
 requestUtil.parseParameters.uee=Unable to parse the parameters since the 
encoding [{0}] is not supported.
 SecurityUtil.doAsPrivilege=An exception occurs when running the 
PrivilegedExceptionAction block.
-sessionIdGenerator.createRandom=Creation of SecureRandom instance for session 
ID generation using [{0}] took [{1}] milliseconds.
-sessionIdGenerator.random=Exception initializing random number generator of 
class [{0}]. Falling back to java.secure.SecureRandom
-sessionIdGenerator.randomAlgorithm=Exception initializing random number 
generator using algorithm [{0}]
-sessionIdGenerator.randomProvider=Exception initializing random number 
generator using provider [{0}]
-
+sessionIdGeneratorBase.createRandom=Creation of SecureRandom instance for 
session ID generation using [{0}] took [{1}] milliseconds.
+sessionIdGeneratorBase.random=Exception initializing random number generator 
of class [{0}]. Falling back to java.secure.SecureRandom
+sessionIdGeneratorBase.randomAlgorithm=Exception initializing random number 
generator using algorithm [{0}]
+sessionIdGeneratorBase.randomProvider=Exception initializing random number 
generator using provider [{0}]

Modified: tomcat/trunk/java/org/apache/catalina/util/LocalStrings_es.properties
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/util/LocalStrings_es.properties?rev=1619056&r1=1619055&r2=1619056&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/util/LocalStrings_es.properties 
(original)
+++ tomcat/trunk/java/org/apache/catalina/util/LocalStrings_es.properties Wed 
Aug 20 09:24:21 2014
@@ -22,4 +22,4 @@ extensionValidator.extension-not-found-e
 extensionValidator.extension-validation-error = ExtensionValidator[{0}]\: 
Imposible de hallar la(s) extension(es) {1} requerida(s).
 extensionValidator.failload = No pude cargar la extensi\u00F3n {0}
 SecurityUtil.doAsPrivilege = Una excepci\u00F3n se ha producido durante la 
ejecuci\u00F3n del bloque PrivilegedExceptionAction.
-sessionIdGenerator.random = Excepci\u00F3n inicializando generador de 
n\u00FAmeros aleatorios de clase {0}
+sessionIdGeneratorBase.random = Excepci\u00F3n inicializando generador de 
n\u00FAmeros aleatorios de clase {0}

Modified: tomcat/trunk/java/org/apache/catalina/util/LocalStrings_fr.properties
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/util/LocalStrings_fr.properties?rev=1619056&r1=1619055&r2=1619056&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/util/LocalStrings_fr.properties 
(original)
+++ tomcat/trunk/java/org/apache/catalina/util/LocalStrings_fr.properties Wed 
Aug 20 09:24:21 2014
@@ -22,4 +22,4 @@ extensionValidator.web-application-manif
 extensionValidator.extension-not-found-error=ExtensionValidator[{0}][{1}]: 
L''extension requise "{2}" est introuvable.
 extensionValidator.extension-validation-error=ExtensionValidator[{0}]: 
Impossible de trouver {1} extension(s) requise(s).
 SecurityUtil.doAsPrivilege=Une exception s''est produite lors de l''execution 
du bloc PrivilegedExceptionAction.
-sessionIdGenerator.random=Exception durant l''initialisation de la classe du 
g\u00e9n\u00e9rateur de nombre al\u00e9atoire {0}
+sessionIdGeneratorBase.random=Exception durant l''initialisation de la classe 
du g\u00e9n\u00e9rateur de nombre al\u00e9atoire {0}

Modified: tomcat/trunk/java/org/apache/catalina/util/LocalStrings_ja.properties
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/util/LocalStrings_ja.properties?rev=1619056&r1=1619055&r2=1619056&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/util/LocalStrings_ja.properties 
(original)
+++ tomcat/trunk/java/org/apache/catalina/util/LocalStrings_ja.properties Wed 
Aug 20 09:24:21 2014
@@ -23,4 +23,4 @@ extensionValidator.extension-not-found-e
 extensionValidator.extension-validation-error=ExtensionValidator[{0}]: 
\u5fc5\u8981\u306a\u62e1\u5f35 "{1}" 
\u304c\u898b\u3064\u304b\u308a\u307e\u305b\u3093\u3002
 extensionValidator.failload=\u62e1\u5f35 {0} 
\u306e\u30ed\u30fc\u30c9\u306b\u5931\u6557\u3057\u307e\u3057\u305f
 
SecurityUtil.doAsPrivilege=PrivilegedExceptionAction\u30d6\u30ed\u30c3\u30af\u3092\u5b9f\u884c\u4e2d\u306b\u4f8b\u5916\u304c\u767a\u751f\u3057\u307e\u3057\u305f\u3002
-sessionIdGenerator.random=\u30af\u30e9\u30b9 {0} 
\u306e\u4e71\u6570\u767a\u751f\u5668\u306e\u521d\u671f\u5316\u306e\u4f8b\u5916\u3067\u3059
+sessionIdGeneratorBase.random=\u30af\u30e9\u30b9 {0} 
\u306e\u4e71\u6570\u767a\u751f\u5668\u306e\u521d\u671f\u5316\u306e\u4f8b\u5916\u3067\u3059

Copied: tomcat/trunk/java/org/apache/catalina/util/SessionIdGeneratorBase.java 
(from r1619040, 
tomcat/trunk/java/org/apache/catalina/util/SessionIdGenerator.java)
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/util/SessionIdGeneratorBase.java?p2=tomcat/trunk/java/org/apache/catalina/util/SessionIdGeneratorBase.java&p1=tomcat/trunk/java/org/apache/catalina/util/SessionIdGenerator.java&r1=1619040&r2=1619056&rev=1619056&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/util/SessionIdGenerator.java 
(original)
+++ tomcat/trunk/java/org/apache/catalina/util/SessionIdGeneratorBase.java Wed 
Aug 20 09:24:21 2014
@@ -22,13 +22,14 @@ import java.security.SecureRandom;
 import java.util.Queue;
 import java.util.concurrent.ConcurrentLinkedQueue;
 
+import org.apache.catalina.SessionIdGenerator;
 import org.apache.juli.logging.Log;
 import org.apache.juli.logging.LogFactory;
 import org.apache.tomcat.util.res.StringManager;
 
-public class SessionIdGenerator {
+public abstract class SessionIdGeneratorBase implements SessionIdGenerator {
 
-    private static final Log log = LogFactory.getLog(SessionIdGenerator.class);
+    private static final Log log = 
LogFactory.getLog(SessionIdGeneratorBase.class);
 
 
     private static final StringManager sm =
@@ -116,21 +117,40 @@ public class SessionIdGenerator {
 
 
     /**
+     * Return the node identifier associated with this node which will be
+     * included in the generated session ID.
+     */
+    @Override
+    public String getJvmRoute() {
+        return jvmRoute;
+    }
+
+
+    /**
      * Specify the node identifier associated with this node which will be
      * included in the generated session ID.
      *
      * @param jvmRoute  The node identifier
      */
+    @Override
     public void setJvmRoute(String jvmRoute) {
         this.jvmRoute = jvmRoute;
     }
 
 
     /**
+     * Return the number of bytes for a session ID
+     */
+    @Override
+    public int getSessionIdLength() {
+        return sessionIdLength;
+    }
+    /**
      * Specify the number of bytes for a session ID
      *
      * @param sessionIdLength   Number of bytes
      */
+    @Override
     public void setSessionIdLength(int sessionIdLength) {
         this.sessionIdLength = sessionIdLength;
     }
@@ -139,43 +159,12 @@ public class SessionIdGenerator {
     /**
      * Generate and return a new session identifier.
      */
+    @Override
     public String generateSessionId() {
-
-        byte random[] = new byte[16];
-
-        // Render the result as a String of hexadecimal digits
-        StringBuilder buffer = new StringBuilder();
-
-        int resultLenBytes = 0;
-
-        while (resultLenBytes < sessionIdLength) {
-            getRandomBytes(random);
-            for (int j = 0;
-            j < random.length && resultLenBytes < sessionIdLength;
-            j++) {
-                byte b1 = (byte) ((random[j] & 0xf0) >> 4);
-                byte b2 = (byte) (random[j] & 0x0f);
-                if (b1 < 10)
-                    buffer.append((char) ('0' + b1));
-                else
-                    buffer.append((char) ('A' + (b1 - 10)));
-                if (b2 < 10)
-                    buffer.append((char) ('0' + b2));
-                else
-                    buffer.append((char) ('A' + (b2 - 10)));
-                resultLenBytes++;
-            }
-        }
-
-        if (jvmRoute != null && jvmRoute.length() > 0) {
-            buffer.append('.').append(jvmRoute);
-        }
-
-        return buffer.toString();
+        return generateSessionId(jvmRoute);
     }
 
-
-    private void getRandomBytes(byte bytes[]) {
+    protected void getRandomBytes(byte bytes[]) {
 
         SecureRandom random = randoms.poll();
         if (random == null) {
@@ -201,7 +190,7 @@ public class SessionIdGenerator {
                 Class<?> clazz = Class.forName(secureRandomClass);
                 result = (SecureRandom) clazz.newInstance();
             } catch (Exception e) {
-                log.error(sm.getString("sessionIdGenerator.random",
+                log.error(sm.getString("sessionIdGeneratorBase.random",
                         secureRandomClass), e);
             }
         }
@@ -218,10 +207,10 @@ public class SessionIdGenerator {
                     result = SecureRandom.getInstance(secureRandomAlgorithm);
                 }
             } catch (NoSuchAlgorithmException e) {
-                log.error(sm.getString("sessionIdGenerator.randomAlgorithm",
+                
log.error(sm.getString("sessionIdGeneratorBase.randomAlgorithm",
                         secureRandomAlgorithm), e);
             } catch (NoSuchProviderException e) {
-                log.error(sm.getString("sessionIdGenerator.randomProvider",
+                log.error(sm.getString("sessionIdGeneratorBase.randomProvider",
                         secureRandomProvider), e);
             }
         }
@@ -231,7 +220,7 @@ public class SessionIdGenerator {
             try {
                 result = SecureRandom.getInstance("SHA1PRNG");
             } catch (NoSuchAlgorithmException e) {
-                log.error(sm.getString("sessionIdGenerator.randomAlgorithm",
+                
log.error(sm.getString("sessionIdGeneratorBase.randomAlgorithm",
                         secureRandomAlgorithm), e);
             }
         }
@@ -246,7 +235,7 @@ public class SessionIdGenerator {
 
         long t2=System.currentTimeMillis();
         if( (t2-t1) > 100 )
-            log.info(sm.getString("sessionIdGenerator.createRandom",
+            log.info(sm.getString("sessionIdGeneratorBase.createRandom",
                     result.getAlgorithm(), Long.valueOf(t2-t1)));
         return result;
     }

Added: 
tomcat/trunk/java/org/apache/catalina/util/StandardSessionIdGenerator.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/util/StandardSessionIdGenerator.java?rev=1619056&view=auto
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/util/StandardSessionIdGenerator.java 
(added)
+++ tomcat/trunk/java/org/apache/catalina/util/StandardSessionIdGenerator.java 
Wed Aug 20 09:24:21 2014
@@ -0,0 +1,64 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.catalina.util;
+
+public class StandardSessionIdGenerator extends SessionIdGeneratorBase {
+
+    @Override
+    public String generateSessionId(String route) {
+
+        byte random[] = new byte[16];
+        int sessionIdLength = getSessionIdLength();
+
+        // Render the result as a String of hexadecimal digits
+        // Start with enough space for sessionIdLength and medium route size
+        StringBuilder buffer = new StringBuilder(2 * sessionIdLength + 20);
+
+        int resultLenBytes = 0;
+
+        while (resultLenBytes < sessionIdLength) {
+            getRandomBytes(random);
+            for (int j = 0;
+            j < random.length && resultLenBytes < sessionIdLength;
+            j++) {
+                byte b1 = (byte) ((random[j] & 0xf0) >> 4);
+                byte b2 = (byte) (random[j] & 0x0f);
+                if (b1 < 10)
+                    buffer.append((char) ('0' + b1));
+                else
+                    buffer.append((char) ('A' + (b1 - 10)));
+                if (b2 < 10)
+                    buffer.append((char) ('0' + b2));
+                else
+                    buffer.append((char) ('A' + (b2 - 10)));
+                resultLenBytes++;
+            }
+        }
+
+        if (route != null && route.length() > 0) {
+            buffer.append('.').append(route);
+        } else {
+            String jvmRoute = getJvmRoute();
+            if (jvmRoute != null && jvmRoute.length() > 0) {
+                buffer.append('.').append(jvmRoute);
+            }
+        }
+
+        return buffer.toString();
+    }
+
+}

Propchange: 
tomcat/trunk/java/org/apache/catalina/util/StandardSessionIdGenerator.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: tomcat/trunk/webapps/docs/config/cluster-manager.xml
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/webapps/docs/config/cluster-manager.xml?rev=1619056&r1=1619055&r2=1619056&view=diff
==============================================================================
--- tomcat/trunk/webapps/docs/config/cluster-manager.xml (original)
+++ tomcat/trunk/webapps/docs/config/cluster-manager.xml Wed Aug 20 09:24:21 
2014
@@ -101,7 +101,8 @@
        <p>The length of session ids created by this Manager, measured in bytes,
         excluding subsequent conversion to a hexadecimal string and
         excluding any JVM route information used for load balancing.
-        The default is 16.</p>
+        This attribute is deprecated. Set the length on a nested
+        <strong>SessionIdGenerator</strong> element instead.</p>
       </attribute>
       <attribute name="processExpiresFrequency" required="false">
         <p>Frequency of the session expiration, and related manager operations.

Modified: tomcat/trunk/webapps/docs/config/manager.xml
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/webapps/docs/config/manager.xml?rev=1619056&r1=1619055&r2=1619056&view=diff
==============================================================================
--- tomcat/trunk/webapps/docs/config/manager.xml (original)
+++ tomcat/trunk/webapps/docs/config/manager.xml Wed Aug 20 09:24:21 2014
@@ -104,7 +104,8 @@
        <p>The length of session ids created by this Manager, measured in bytes,
         excluding subsequent conversion to a hexadecimal string and
         excluding any JVM route information used for load balancing.
-        The default is 16.</p>
+        This attribute is deprecated. Set the length on a nested
+        <strong>SessionIdGenerator</strong> element instead.</p>
       </attribute>
 
     </attributes>
@@ -276,11 +277,24 @@
 
 <section name="Nested Components">
 
-  <h3>Standard Manager Implementation</h3>
+  <h3>All Manager Implementation</h3>
 
-  <p>If you are using the <em>Standard Manager Implementation</em>
-  as described above, no elements may be nested inside your
-  <strong>&lt;Manager&gt;</strong> element.</p>
+  <p>All Manager implementations allow nesting of a
+  <strong>&lt;SessionIdGenerator&gt;</strong> element. It defines
+  the behavior of session id generation.  All implementations
+  of the <code>&lt;SessionIdGenerator&gt;</code> element allow the
+  following attributes:
+  </p>
+
+  <attributes>
+
+    <attribute name="sessionIdLength" required="false">
+      <p>The length of the session ID may be changed with the
+      <strong>sessionIdLength</strong> attribute.
+      </p>
+    </attribute>
+
+  </attributes>
 
   <h3>Persistent Manager Implementation</h3>
 



---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org
For additional commands, e-mail: dev-h...@tomcat.apache.org

Reply via email to