Author: rjung
Date: Sat Nov 29 22:45:21 2014
New Revision: 1642482

URL: http://svn.apache.org/r1642482
Log:
Backport extensible session id generator from trunk/tc8.
Not contained is the change to the manager interface and
the corresponding method deprecations.

Backport of r1619056, r1619106, r1619114, r1619361,
r1619362, r1619583, r1631628, r1631852, r1632411.

Original log messages:

Make session id generation extensible.

See discussion "Special requirements on session id generator"
on dev list (http://marc.info/?t=139238389300003&r=1&w=2).

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).

Add support for the SessionIdGenerator to cluster manager template.

Fix https://issues.apache.org/bugzilla/show_bug.cgi?id=57089
Ensure that configuration of a session ID generator is not lost
when a web application is reloaded.

Added:
    tomcat/tc7.0.x/trunk/java/org/apache/catalina/SessionIdGenerator.java
      - copied unchanged from r1619056, 
tomcat/trunk/java/org/apache/catalina/SessionIdGenerator.java
    
tomcat/tc7.0.x/trunk/java/org/apache/catalina/util/SessionIdGeneratorBase.java
      - copied, changed from r1619056, 
tomcat/trunk/java/org/apache/catalina/util/SessionIdGeneratorBase.java
    
tomcat/tc7.0.x/trunk/java/org/apache/catalina/util/StandardSessionIdGenerator.java
      - copied unchanged from r1619056, 
tomcat/trunk/java/org/apache/catalina/util/StandardSessionIdGenerator.java
    tomcat/tc7.0.x/trunk/webapps/docs/config/sessionidgenerator.xml
      - copied unchanged from r1619106, 
tomcat/trunk/webapps/docs/config/sessionidgenerator.xml
Removed:
    tomcat/tc7.0.x/trunk/java/org/apache/catalina/util/SessionIdGenerator.java
Modified:
    tomcat/tc7.0.x/trunk/   (props changed)
    
tomcat/tc7.0.x/trunk/java/org/apache/catalina/authenticator/AuthenticatorBase.java
    tomcat/tc7.0.x/trunk/java/org/apache/catalina/ha/ClusterRuleSet.java
    
tomcat/tc7.0.x/trunk/java/org/apache/catalina/ha/session/ClusterManagerBase.java
    tomcat/tc7.0.x/trunk/java/org/apache/catalina/session/ManagerBase.java
    tomcat/tc7.0.x/trunk/java/org/apache/catalina/startup/ContextRuleSet.java
    tomcat/tc7.0.x/trunk/java/org/apache/catalina/util/LocalStrings.properties
    
tomcat/tc7.0.x/trunk/java/org/apache/catalina/util/LocalStrings_es.properties
    
tomcat/tc7.0.x/trunk/java/org/apache/catalina/util/LocalStrings_fr.properties
    
tomcat/tc7.0.x/trunk/java/org/apache/catalina/util/LocalStrings_ja.properties
    tomcat/tc7.0.x/trunk/webapps/docs/changelog.xml
    tomcat/tc7.0.x/trunk/webapps/docs/config/cluster-manager.xml
    tomcat/tc7.0.x/trunk/webapps/docs/config/manager.xml
    tomcat/tc7.0.x/trunk/webapps/docs/config/project.xml

Propchange: tomcat/tc7.0.x/trunk/
------------------------------------------------------------------------------
  Merged 
/tomcat/trunk:r1619056,1619106,1619114,1619361-1619362,1619583,1631628,1631852,1632411

Modified: 
tomcat/tc7.0.x/trunk/java/org/apache/catalina/authenticator/AuthenticatorBase.java
URL: 
http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/java/org/apache/catalina/authenticator/AuthenticatorBase.java?rev=1642482&r1=1642481&r2=1642482&view=diff
==============================================================================
--- 
tomcat/tc7.0.x/trunk/java/org/apache/catalina/authenticator/AuthenticatorBase.java
 (original)
+++ 
tomcat/tc7.0.x/trunk/java/org/apache/catalina/authenticator/AuthenticatorBase.java
 Sat Nov 29 22:45:21 2014
@@ -46,7 +46,8 @@ import org.apache.catalina.connector.Res
 import org.apache.catalina.deploy.LoginConfig;
 import org.apache.catalina.deploy.SecurityConstraint;
 import org.apache.catalina.util.DateTool;
-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;
@@ -178,7 +179,7 @@ public abstract class AuthenticatorBase 
      */
     protected String secureRandomProvider = null;
 
-    protected SessionIdGenerator sessionIdGenerator = null;
+    protected SessionIdGeneratorBase sessionIdGenerator = null;
 
     /**
      * The string manager for this package.
@@ -921,7 +922,7 @@ public abstract class AuthenticatorBase 
                 log.debug("No SingleSignOn Valve is present");
         }
 
-        sessionIdGenerator = new SessionIdGenerator();
+        sessionIdGenerator = new StandardSessionIdGenerator();
         
sessionIdGenerator.setSecureRandomAlgorithm(getSecureRandomAlgorithm());
         sessionIdGenerator.setSecureRandomClass(getSecureRandomClass());
         sessionIdGenerator.setSecureRandomProvider(getSecureRandomProvider());

Modified: tomcat/tc7.0.x/trunk/java/org/apache/catalina/ha/ClusterRuleSet.java
URL: 
http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/java/org/apache/catalina/ha/ClusterRuleSet.java?rev=1642482&r1=1642481&r2=1642482&view=diff
==============================================================================
--- tomcat/tc7.0.x/trunk/java/org/apache/catalina/ha/ClusterRuleSet.java 
(original)
+++ tomcat/tc7.0.x/trunk/java/org/apache/catalina/ha/ClusterRuleSet.java Sat 
Nov 29 22:45:21 2014
@@ -92,7 +92,13 @@ public class ClusterRuleSet extends Rule
         digester.addSetNext(prefix + "Manager",
                             "setManagerTemplate",
                             "org.apache.catalina.ha.ClusterManager");
-
+        digester.addObjectCreate(prefix + "Manager/SessionIdGenerator",
+                "org.apache.catalina.util.StandardSessionIdGenerator",
+                "className");
+        digester.addSetProperties(prefix + "Manager/SessionIdGenerator");
+        digester.addSetNext(prefix + "Manager/SessionIdGenerator",
+               "setSessionIdGenerator",
+               "org.apache.catalina.SessionIdGenerator");
 
         digester.addObjectCreate(prefix + "Channel",
                                  null, // MUST be specified in the element

Modified: 
tomcat/tc7.0.x/trunk/java/org/apache/catalina/ha/session/ClusterManagerBase.java
URL: 
http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/java/org/apache/catalina/ha/session/ClusterManagerBase.java?rev=1642482&r1=1642481&r2=1642482&view=diff
==============================================================================
--- 
tomcat/tc7.0.x/trunk/java/org/apache/catalina/ha/session/ClusterManagerBase.java
 (original)
+++ 
tomcat/tc7.0.x/trunk/java/org/apache/catalina/ha/session/ClusterManagerBase.java
 Sat Nov 29 22:45:21 2014
@@ -25,6 +25,7 @@ import org.apache.catalina.Cluster;
 import org.apache.catalina.Container;
 import org.apache.catalina.LifecycleException;
 import org.apache.catalina.Loader;
+import org.apache.catalina.SessionIdGenerator;
 import org.apache.catalina.Valve;
 import org.apache.catalina.ha.CatalinaCluster;
 import org.apache.catalina.ha.ClusterManager;
@@ -195,13 +196,24 @@ 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());
         copy.setSecureRandomClass(getSecureRandomClass());
         copy.setSecureRandomProvider(getSecureRandomProvider());
         copy.setSecureRandomAlgorithm(getSecureRandomAlgorithm());
+        if (getSessionIdGenerator() != null) {
+            try {
+                SessionIdGenerator copyIdGenerator = 
sessionIdGeneratorClass.newInstance();
+                
copyIdGenerator.setSessionIdLength(getSessionIdGenerator().getSessionIdLength());
+                
copyIdGenerator.setJvmRoute(getSessionIdGenerator().getJvmRoute());
+                copy.setSessionIdGenerator(copyIdGenerator);
+            } catch (InstantiationException e) {
+             // Ignore
+            } catch (IllegalAccessException e) {
+             // Ignore
+            }
+        }
     }
 
     /**

Modified: tomcat/tc7.0.x/trunk/java/org/apache/catalina/session/ManagerBase.java
URL: 
http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/java/org/apache/catalina/session/ManagerBase.java?rev=1642482&r1=1642481&r2=1642482&view=diff
==============================================================================
--- tomcat/tc7.0.x/trunk/java/org/apache/catalina/session/ManagerBase.java 
(original)
+++ tomcat/tc7.0.x/trunk/java/org/apache/catalina/session/ManagerBase.java Sat 
Nov 29 22:45:21 2014
@@ -38,12 +38,15 @@ import java.util.concurrent.atomic.Atomi
 import org.apache.catalina.Container;
 import org.apache.catalina.Context;
 import org.apache.catalina.Engine;
+import org.apache.catalina.Lifecycle;
 import org.apache.catalina.LifecycleException;
 import org.apache.catalina.Manager;
 import org.apache.catalina.Session;
+import org.apache.catalina.SessionIdGenerator;
 import org.apache.catalina.mbeans.MBeanUtils;
 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;
@@ -96,10 +99,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;
 
 
     /**
@@ -133,6 +140,7 @@ public abstract class ManagerBase extend
     protected String secureRandomProvider = null;
 
     protected SessionIdGenerator sessionIdGenerator = null;
+    protected Class<? extends SessionIdGenerator> sessionIdGeneratorClass = 
null;
 
     /**
      * The longest time (in seconds) that an expired session had been alive.
@@ -336,9 +344,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);
@@ -350,9 +362,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;
@@ -365,6 +381,39 @@ public abstract class ManagerBase extend
 
 
     /**
+     * Gets the session id generator.
+     *
+     * @return The session id generator
+     */
+    public SessionIdGenerator getSessionIdGenerator() {
+        if (sessionIdGenerator != null) {
+            return sessionIdGenerator;
+        } else if (sessionIdGeneratorClass != null) {
+            try {
+                sessionIdGenerator = sessionIdGeneratorClass.newInstance();
+                return sessionIdGenerator;
+            } catch(IllegalAccessException ex) {
+                // Ignore
+            } catch(InstantiationException ex) {
+                // Ignore
+            }
+        }
+        return null;
+    }
+
+
+    /**
+     * Sets the session id generator
+     *
+     * @param sessionIdGenerator The session id generator
+     */
+    public void setSessionIdGenerator(SessionIdGenerator sessionIdGenerator) {
+        this.sessionIdGenerator = sessionIdGenerator;
+        sessionIdGeneratorClass = sessionIdGenerator.getClass();
+    }
+
+
+    /**
      * Return the descriptive short name of this Manager implementation.
      */
     public String getName() {
@@ -560,24 +609,41 @@ 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());
-
-        // Force initialization of the random number generator
-        if (log.isDebugEnabled())
-            log.debug("Force random number initialization starting");
-        sessionIdGenerator.generateSessionId();
-        if (log.isDebugEnabled())
-            log.debug("Force random number initialization completed");
+        if (sessionIdGenerator instanceof SessionIdGeneratorBase) {
+            SessionIdGeneratorBase sig = 
(SessionIdGeneratorBase)sessionIdGenerator;
+            sig.setSecureRandomAlgorithm(getSecureRandomAlgorithm());
+            sig.setSecureRandomClass(getSecureRandomClass());
+            sig.setSecureRandomProvider(getSecureRandomProvider());
+        }
+
+        if (sessionIdGenerator instanceof Lifecycle) {
+            ((Lifecycle) sessionIdGenerator).start();
+        } else {
+            // Force initialization of the random number generator
+            if (log.isDebugEnabled())
+                log.debug("Force random number initialization starting");
+            sessionIdGenerator.generateSessionId();
+            if (log.isDebugEnabled())
+                log.debug("Force random number initialization completed");
+        }
     }
 
     @Override
     protected void stopInternal() throws LifecycleException {
-        this.sessionIdGenerator = null;
+        if (sessionIdGenerator instanceof Lifecycle) {
+            ((Lifecycle) sessionIdGenerator).stop();
+        }
     }
 
 

Modified: 
tomcat/tc7.0.x/trunk/java/org/apache/catalina/startup/ContextRuleSet.java
URL: 
http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/java/org/apache/catalina/startup/ContextRuleSet.java?rev=1642482&r1=1642481&r2=1642482&view=diff
==============================================================================
--- tomcat/tc7.0.x/trunk/java/org/apache/catalina/startup/ContextRuleSet.java 
(original)
+++ tomcat/tc7.0.x/trunk/java/org/apache/catalina/startup/ContextRuleSet.java 
Sat Nov 29 22:45:21 2014
@@ -161,6 +161,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.catalina.deploy.ApplicationParameter");
         digester.addSetProperties(prefix + "Context/Parameter");

Modified: 
tomcat/tc7.0.x/trunk/java/org/apache/catalina/util/LocalStrings.properties
URL: 
http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/java/org/apache/catalina/util/LocalStrings.properties?rev=1642482&r1=1642481&r2=1642482&view=diff
==============================================================================
--- tomcat/tc7.0.x/trunk/java/org/apache/catalina/util/LocalStrings.properties 
(original)
+++ tomcat/tc7.0.x/trunk/java/org/apache/catalina/util/LocalStrings.properties 
Sat Nov 29 22:45:21 2014
@@ -42,8 +42,8 @@ requestUtil.parseParameters.uee=Unable t
 requestUtil.urlDecode.missingDigit=The % character must be followed by two 
hexademical digits
 requestUtil.urlDecode.uee=Unable to URL decode the specified input 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.randomProviderException 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/tc7.0.x/trunk/java/org/apache/catalina/util/LocalStrings_es.properties
URL: 
http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/java/org/apache/catalina/util/LocalStrings_es.properties?rev=1642482&r1=1642481&r2=1642482&view=diff
==============================================================================
--- 
tomcat/tc7.0.x/trunk/java/org/apache/catalina/util/LocalStrings_es.properties 
(original)
+++ 
tomcat/tc7.0.x/trunk/java/org/apache/catalina/util/LocalStrings_es.properties 
Sat Nov 29 22:45: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/tc7.0.x/trunk/java/org/apache/catalina/util/LocalStrings_fr.properties
URL: 
http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/java/org/apache/catalina/util/LocalStrings_fr.properties?rev=1642482&r1=1642481&r2=1642482&view=diff
==============================================================================
--- 
tomcat/tc7.0.x/trunk/java/org/apache/catalina/util/LocalStrings_fr.properties 
(original)
+++ 
tomcat/tc7.0.x/trunk/java/org/apache/catalina/util/LocalStrings_fr.properties 
Sat Nov 29 22:45: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/tc7.0.x/trunk/java/org/apache/catalina/util/LocalStrings_ja.properties
URL: 
http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/java/org/apache/catalina/util/LocalStrings_ja.properties?rev=1642482&r1=1642481&r2=1642482&view=diff
==============================================================================
--- 
tomcat/tc7.0.x/trunk/java/org/apache/catalina/util/LocalStrings_ja.properties 
(original)
+++ 
tomcat/tc7.0.x/trunk/java/org/apache/catalina/util/LocalStrings_ja.properties 
Sat Nov 29 22:45: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/tc7.0.x/trunk/java/org/apache/catalina/util/SessionIdGeneratorBase.java 
(from r1619056, 
tomcat/trunk/java/org/apache/catalina/util/SessionIdGeneratorBase.java)
URL: 
http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/java/org/apache/catalina/util/SessionIdGeneratorBase.java?p2=tomcat/tc7.0.x/trunk/java/org/apache/catalina/util/SessionIdGeneratorBase.java&p1=tomcat/trunk/java/org/apache/catalina/util/SessionIdGeneratorBase.java&r1=1619056&r2=1642482&rev=1642482&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/util/SessionIdGeneratorBase.java 
(original)
+++ 
tomcat/tc7.0.x/trunk/java/org/apache/catalina/util/SessionIdGeneratorBase.java 
Sat Nov 29 22:45:21 2014
@@ -22,12 +22,15 @@ import java.security.SecureRandom;
 import java.util.Queue;
 import java.util.concurrent.ConcurrentLinkedQueue;
 
+import org.apache.catalina.LifecycleException;
+import org.apache.catalina.LifecycleState;
 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 abstract class SessionIdGeneratorBase implements SessionIdGenerator {
+public abstract class SessionIdGeneratorBase extends LifecycleBase
+        implements SessionIdGenerator {
 
     private static final Log log = 
LogFactory.getLog(SessionIdGeneratorBase.class);
 
@@ -43,7 +46,7 @@ public abstract class SessionIdGenerator
      * designed this way since random number generators use a sync to make them
      * thread-safe and the sync makes using a a single object slow(er).
      */
-    private final Queue<SecureRandom> randoms = new ConcurrentLinkedQueue<>();
+    private final Queue<SecureRandom> randoms = new 
ConcurrentLinkedQueue<SecureRandom>();
 
 
     /**
@@ -239,4 +242,32 @@ public abstract class SessionIdGenerator
                     result.getAlgorithm(), Long.valueOf(t2-t1)));
         return result;
     }
+
+
+    @Override
+    protected void initInternal() throws LifecycleException {
+        // NO-OP
+    }
+
+
+    @Override
+    protected void startInternal() throws LifecycleException {
+        // Ensure SecureRandom has been initialised
+        generateSessionId();
+
+        setState(LifecycleState.STARTING);
+    }
+
+
+    @Override
+    protected void stopInternal() throws LifecycleException {
+        setState(LifecycleState.STOPPING);
+        randoms.clear();
+    }
+
+
+    @Override
+    protected void destroyInternal() throws LifecycleException {
+        // NO-OP
+    }
 }

Modified: tomcat/tc7.0.x/trunk/webapps/docs/changelog.xml
URL: 
http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/webapps/docs/changelog.xml?rev=1642482&r1=1642481&r2=1642482&view=diff
==============================================================================
--- tomcat/tc7.0.x/trunk/webapps/docs/changelog.xml (original)
+++ tomcat/tc7.0.x/trunk/webapps/docs/changelog.xml Sat Nov 29 22:45:21 2014
@@ -84,6 +84,11 @@
         <bug>57239</bug>: Correct several message typos. Includes patch by
         vladk. (kkolinko)
       </fix>
+      <add>
+        Make the session id generator extensible by adding a
+        <code>SessionIdGenerator</code> interface, an abstract
+        base class and a standard implementation. (rjung)
+      </add>
     </changelog>
   </subsection>
   <subsection name="Coyote">

Modified: tomcat/tc7.0.x/trunk/webapps/docs/config/cluster-manager.xml
URL: 
http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/webapps/docs/config/cluster-manager.xml?rev=1642482&r1=1642481&r2=1642482&view=diff
==============================================================================
--- tomcat/tc7.0.x/trunk/webapps/docs/config/cluster-manager.xml (original)
+++ tomcat/tc7.0.x/trunk/webapps/docs/config/cluster-manager.xml Sat Nov 29 
22:45:21 2014
@@ -106,7 +106,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>
+        The default is 16. You should 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.
@@ -230,5 +231,21 @@
     </attributes>
   </subsection>
 </section>
+<section name="Nested Components">
+  <h3>All Manager Implementations</h3>
+  <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 <a href="sessionidgenerator.html">SessionIdGenerator</a> 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>
+</section>  
 </body>
 </document>

Modified: tomcat/tc7.0.x/trunk/webapps/docs/config/manager.xml
URL: 
http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/webapps/docs/config/manager.xml?rev=1642482&r1=1642481&r2=1642482&view=diff
==============================================================================
--- tomcat/tc7.0.x/trunk/webapps/docs/config/manager.xml (original)
+++ tomcat/tc7.0.x/trunk/webapps/docs/config/manager.xml Sat Nov 29 22:45: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>
+        The default is 16. You should set the length on a nested
+        <strong>SessionIdGenerator</strong> element instead.</p>
       </attribute>
 
     </attributes>
@@ -276,11 +277,25 @@
 
 <section name="Nested Components">
 
-  <h3>Standard Manager Implementation</h3>
+  <h3>All Manager Implementations</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 bundled with Tomcat or extending
+  <code>ManagerBase</code> allow nesting of a
+  <strong>&lt;SessionIdGenerator&gt;</strong> element. It defines
+  the behavior of session id generation.  All implementations
+  of the <a href="sessionidgenerator.html">SessionIdGenerator</a> 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>
 

Modified: tomcat/tc7.0.x/trunk/webapps/docs/config/project.xml
URL: 
http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/webapps/docs/config/project.xml?rev=1642482&r1=1642481&r2=1642482&view=diff
==============================================================================
--- tomcat/tc7.0.x/trunk/webapps/docs/config/project.xml (original)
+++ tomcat/tc7.0.x/trunk/webapps/docs/config/project.xml Sat Nov 29 22:45:21 
2014
@@ -63,6 +63,7 @@
         <item name="Manager"               href="manager.html"/>
         <item name="Realm"                 href="realm.html"/>
         <item name="Resources"             href="resources.html"/>
+        <item name="SessionIdGenerator"    href="sessionidgenerator.html"/>
         <item name="Valve"                 href="valve.html"/>
     </menu>
 



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

Reply via email to