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