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: [email protected]
For additional commands, e-mail: [email protected]