Author: markt
Date: Thu May  8 13:02:26 2014
New Revision: 1593257

URL: http://svn.apache.org/r1593257
Log:
Make naming context tokens for containers more robust by using a separate object

Modified:
    tomcat/trunk/java/org/apache/catalina/Context.java
    tomcat/trunk/java/org/apache/catalina/Server.java
    tomcat/trunk/java/org/apache/catalina/core/NamingContextListener.java
    tomcat/trunk/java/org/apache/catalina/core/StandardContext.java
    tomcat/trunk/java/org/apache/catalina/core/StandardServer.java
    tomcat/trunk/java/org/apache/catalina/startup/FailedContext.java
    tomcat/trunk/test/org/apache/catalina/core/TesterContext.java

Modified: tomcat/trunk/java/org/apache/catalina/Context.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/Context.java?rev=1593257&r1=1593256&r2=1593257&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/Context.java (original)
+++ tomcat/trunk/java/org/apache/catalina/Context.java Thu May  8 13:02:26 2014
@@ -1632,4 +1632,10 @@ public interface Context extends Contain
      *          The class loader to restore as the thread context class loader
      */
     public void unbind(boolean usePrivilegedAction, ClassLoader 
originalClassLoader);
+
+    /**
+     * Obtain the token necessary for operations on the associated JNDI naming
+     * context.
+     */
+    public Object getNamingToken();
 }

Modified: tomcat/trunk/java/org/apache/catalina/Server.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/Server.java?rev=1593257&r1=1593256&r2=1593257&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/Server.java (original)
+++ tomcat/trunk/java/org/apache/catalina/Server.java Thu May  8 13:02:26 2014
@@ -206,4 +206,11 @@ public interface Server extends Lifecycl
      * @param service The Service to be removed
      */
     public void removeService(Service service);
+
+
+    /**
+     * Obtain the token necessary for operations on the associated JNDI naming
+     * context.
+     */
+    public Object getNamingToken();
 }

Modified: tomcat/trunk/java/org/apache/catalina/core/NamingContextListener.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/core/NamingContextListener.java?rev=1593257&r1=1593256&r2=1593257&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/core/NamingContextListener.java 
(original)
+++ tomcat/trunk/java/org/apache/catalina/core/NamingContextListener.java Thu 
May  8 13:02:26 2014
@@ -100,6 +100,10 @@ public class NamingContextListener
      */
     protected Object container = null;
 
+    /**
+     * Token for configuring associated JNDI context.
+     */
+    private Object token = null;
 
     /**
      * Initialized flag.
@@ -214,8 +218,10 @@ public class NamingContextListener
         if (container instanceof Context) {
             namingResources = ((Context) container).getNamingResources();
             logger = log;
+            token = ((Context) container).getNamingToken();
         } else if (container instanceof Server) {
             namingResources = ((Server) container).getGlobalNamingResources();
+            token = ((Server) container).getNamingToken();
         } else {
             return;
         }
@@ -231,8 +237,9 @@ public class NamingContextListener
             } catch (NamingException e) {
                 // Never happens
             }
-            ContextAccessController.setSecurityToken(getName(), container);
-            ContextBindings.bindContext(container, namingContext, container);
+            ContextAccessController.setSecurityToken(getName(), token);
+            ContextAccessController.setSecurityToken(container, token);
+            ContextBindings.bindContext(container, namingContext, token);
             if( log.isDebugEnabled() ) {
                 log.debug("Bound " + container );
             }
@@ -242,7 +249,7 @@ public class NamingContextListener
                     getExceptionOnFailedWrite());
 
             // Setting the context in read/write mode
-            ContextAccessController.setWritable(getName(), container);
+            ContextAccessController.setWritable(getName(), token);
 
             try {
                 createNamingContext();
@@ -258,9 +265,8 @@ public class NamingContextListener
                 // Setting the context in read only mode
                 ContextAccessController.setReadOnly(getName());
                 try {
-                    ContextBindings.bindClassLoader
-                        (container, container,
-                         ((Context) container).getLoader().getClassLoader());
+                    ContextBindings.bindClassLoader(container, token,
+                            ((Context) 
container).getLoader().getClassLoader());
                 } catch (NamingException e) {
                     logger.error(sm.getString("naming.bindFailed", e));
                 }
@@ -270,9 +276,8 @@ public class NamingContextListener
                 org.apache.naming.factory.ResourceLinkFactory.setGlobalContext
                     (namingContext);
                 try {
-                    ContextBindings.bindClassLoader
-                        (container, container,
-                         this.getClass().getClassLoader());
+                    ContextBindings.bindClassLoader(container, token,
+                            this.getClass().getClassLoader());
                 } catch (NamingException e) {
                     logger.error(sm.getString("naming.bindFailed", e));
                 }
@@ -290,23 +295,21 @@ public class NamingContextListener
                 return;
 
             // Setting the context in read/write mode
-            ContextAccessController.setWritable(getName(), container);
-            ContextBindings.unbindContext(container, container);
+            ContextAccessController.setWritable(getName(), token);
+            ContextBindings.unbindContext(container, token);
 
             if (container instanceof Context) {
-                ContextBindings.unbindClassLoader
-                    (container, container,
-                     ((Context) container).getLoader().getClassLoader());
+                ContextBindings.unbindClassLoader(container, token,
+                        ((Context) container).getLoader().getClassLoader());
             }
 
             if (container instanceof Server) {
                 namingResources.removePropertyChangeListener(this);
-                ContextBindings.unbindClassLoader
-                    (container, container,
-                     this.getClass().getClassLoader());
+                ContextBindings.unbindClassLoader(container, token,
+                        this.getClass().getClassLoader());
             }
 
-            ContextAccessController.unsetSecurityToken(getName(), container);
+            ContextAccessController.unsetSecurityToken(getName(), token);
 
             // unregister mbeans.
             Collection<ObjectName> names = objectNames.values();
@@ -342,7 +345,7 @@ public class NamingContextListener
             return;
 
         // Setting the context in read/write mode
-        ContextAccessController.setWritable(getName(), container);
+        ContextAccessController.setWritable(getName(), token);
 
         String type = event.getType();
 
@@ -483,7 +486,7 @@ public class NamingContextListener
         if (source == namingResources) {
 
             // Setting the context in read/write mode
-            ContextAccessController.setWritable(getName(), container);
+            ContextAccessController.setWritable(getName(), token);
 
             processGlobalResourcesChange(event.getPropertyName(),
                                          event.getOldValue(),

Modified: tomcat/trunk/java/org/apache/catalina/core/StandardContext.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/core/StandardContext.java?rev=1593257&r1=1593256&r2=1593257&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/core/StandardContext.java (original)
+++ tomcat/trunk/java/org/apache/catalina/core/StandardContext.java Thu May  8 
13:02:26 2014
@@ -818,9 +818,18 @@ public class StandardContext extends Con
     });
     protected ThreadBindingListener threadBindingListener = 
DEFAULT_NAMING_LISTENER;
 
+    private final Object namingToken = new Object();
+
+
     // ----------------------------------------------------- Context Properties
 
     @Override
+    public Object getNamingToken() {
+        return namingToken;
+    }
+
+
+    @Override
     public void setContainerSciFilter(String containerSciFilter) {
         this.containerSciFilter = containerSciFilter;
     }
@@ -5718,7 +5727,7 @@ public class StandardContext extends Con
 
         if (isUseNaming()) {
             try {
-                ContextBindings.bindThread(this, this);
+                ContextBindings.bindThread(this, getNamingToken());
             } catch (NamingException e) {
                 // Silent catch, as this is a normal case during the early
                 // startup stages
@@ -5735,7 +5744,7 @@ public class StandardContext extends Con
     protected void unbindThread(ClassLoader oldContextClassLoader) {
 
         if (isUseNaming()) {
-            ContextBindings.unbindThread(this, this);
+            ContextBindings.unbindThread(this, getNamingToken());
         }
 
         unbind(false, oldContextClassLoader);

Modified: tomcat/trunk/java/org/apache/catalina/core/StandardServer.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/core/StandardServer.java?rev=1593257&r1=1593256&r2=1593257&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/core/StandardServer.java (original)
+++ tomcat/trunk/java/org/apache/catalina/core/StandardServer.java Thu May  8 
13:02:26 2014
@@ -168,9 +168,17 @@ public final class StandardServer extend
 
     private File catalinaBase = null;
 
+    private final Object namingToken = new Object();
+
 
     // ------------------------------------------------------------- Properties
 
+    @Override
+    public Object getNamingToken() {
+        return namingToken;
+    }
+
+
     /**
      * Return the global naming resources context.
      */

Modified: tomcat/trunk/java/org/apache/catalina/startup/FailedContext.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/startup/FailedContext.java?rev=1593257&r1=1593256&r2=1593257&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/startup/FailedContext.java (original)
+++ tomcat/trunk/java/org/apache/catalina/startup/FailedContext.java Thu May  8 
13:02:26 2014
@@ -752,4 +752,9 @@ public class FailedContext extends Lifec
     public void unbind(boolean usePrivilegedAction, ClassLoader 
originalClassLoader) {
         // NO-OP
     }
+
+    @Override
+    public Object getNamingToken() {
+        return null;
+    }
 }
\ No newline at end of file

Modified: tomcat/trunk/test/org/apache/catalina/core/TesterContext.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/test/org/apache/catalina/core/TesterContext.java?rev=1593257&r1=1593256&r2=1593257&view=diff
==============================================================================
--- tomcat/trunk/test/org/apache/catalina/core/TesterContext.java (original)
+++ tomcat/trunk/test/org/apache/catalina/core/TesterContext.java Thu May  8 
13:02:26 2014
@@ -1218,4 +1218,8 @@ public class TesterContext implements Co
         // NO-OP
     }
 
+    @Override
+    public Object getNamingToken() {
+        return null;
+    }
 }



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

Reply via email to