Author: rmannibucau
Date: Tue Oct 16 06:26:29 2012
New Revision: 1398666
URL: http://svn.apache.org/viewvc?rev=1398666&view=rev
Log:
TOMEE-465 cleaning up NamingUtil + jsfclasses (Thanks Harald Wellmann for the
report)
Modified:
openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatWebAppBuilder.java
openejb/trunk/openejb/tomee/tomee-common/src/main/java/org/apache/tomee/common/NamingUtil.java
Modified:
openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatWebAppBuilder.java
URL:
http://svn.apache.org/viewvc/openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatWebAppBuilder.java?rev=1398666&r1=1398665&r2=1398666&view=diff
==============================================================================
---
openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatWebAppBuilder.java
(original)
+++
openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatWebAppBuilder.java
Tue Oct 16 06:26:29 2012
@@ -97,6 +97,7 @@ import org.apache.tomee.catalina.cluster
import org.apache.tomee.catalina.event.AfterApplicationCreated;
import org.apache.tomee.catalina.routing.RouterValve;
import org.apache.tomee.common.LegacyAnnotationProcessor;
+import org.apache.tomee.common.NamingUtil;
import org.apache.tomee.common.TomcatVersion;
import org.apache.tomee.common.UserTransactionFactory;
import org.apache.tomee.loader.TomcatHelper;
@@ -957,7 +958,12 @@ public class TomcatWebAppBuilder impleme
// merge OpenEJB jndi into Tomcat jndi
final TomcatJndiBuilder jndiBuilder = new
TomcatJndiBuilder(standardContext, webAppInfo, injections);
- jndiBuilder.mergeJndi();
+ NamingUtil.setCurrentContext(standardContext);
+ try {
+ jndiBuilder.mergeJndi();
+ } finally {
+ NamingUtil.setCurrentContext(null);
+ }
// add WebDeploymentInfo to ContainerSystem
final WebContext webContext = new WebContext(appContext);
@@ -1355,7 +1361,10 @@ public class TomcatWebAppBuilder impleme
*/
@Override
public void beforeStop(final StandardContext standardContext) {
- //no-op
+ // if it is not our custom loader clean up now otherwise wait afterStop
+ if (!(standardContext.getLoader() instanceof LazyStopLoader)) {
+ jsfClasses.remove(standardContext.getLoader().getClassLoader());
+ }
}
private boolean isUnDeployable(final ContextInfo contextInfo) {
@@ -1380,6 +1389,11 @@ public class TomcatWebAppBuilder impleme
return;
}
+ final LazyStopWebappClassLoader old = lazyClassLoader(standardContext);
+ if (old != null) { // should always be the case
+ jsfClasses.remove(old);
+ }
+
final ContextInfo contextInfo = getContextInfo(standardContext);
if (isUnDeployable(contextInfo)) {
try {
@@ -1389,7 +1403,8 @@ public class TomcatWebAppBuilder impleme
}
}
- final LazyStopWebappClassLoader old = lazyClassLoader(standardContext);
+ NamingUtil.cleanUpContextResource(standardContext);
+
if (old != null) {
try {
old.internalStop();
Modified:
openejb/trunk/openejb/tomee/tomee-common/src/main/java/org/apache/tomee/common/NamingUtil.java
URL:
http://svn.apache.org/viewvc/openejb/trunk/openejb/tomee/tomee-common/src/main/java/org/apache/tomee/common/NamingUtil.java?rev=1398666&r1=1398665&r2=1398666&view=diff
==============================================================================
---
openejb/trunk/openejb/tomee/tomee-common/src/main/java/org/apache/tomee/common/NamingUtil.java
(original)
+++
openejb/trunk/openejb/tomee/tomee-common/src/main/java/org/apache/tomee/common/NamingUtil.java
Tue Oct 16 06:26:29 2012
@@ -17,12 +17,16 @@
*/
package org.apache.tomee.common;
+import org.apache.catalina.core.StandardContext;
import org.apache.naming.EjbRef;
import javax.naming.RefAddr;
import javax.naming.Reference;
+import java.util.ArrayList;
+import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicInteger;
public class NamingUtil {
@@ -46,7 +50,11 @@ public class NamingUtil {
public static final String WSDL_URL = "wsdlurl";
private static final AtomicInteger id = new AtomicInteger(31);
- private static final Map<String,Object> registry = new
HashMap<String,Object>();
+ private static final Map<String,Object> registry = new
ConcurrentHashMap<String, Object>();
+
+ // these two attributes are used to be able to cleanup quickly the
registry (otherwise we need to duplicate a lot of logic)
+ private static StandardContext currentContext = null;
+ private static Map<StandardContext, Collection<String>> ID_BY_CONTEXT =
new HashMap<StandardContext, Collection<String>>();
public static String getProperty(Reference ref, String name) {
RefAddr addr = ref.get(name);
@@ -71,6 +79,14 @@ public class NamingUtil {
String token = "" + id.incrementAndGet();
registry.put(token, value);
resource.setProperty("static-token" + name, token);
+ if (currentContext != null) {
+ Collection<String> ids = ID_BY_CONTEXT.get(currentContext);
+ if (ids == null) {
+ ids = new ArrayList<String>();
+ ID_BY_CONTEXT.put(currentContext, ids);
+ }
+ ids.add(token);
+ }
}
@SuppressWarnings({"unchecked"})
@@ -114,4 +130,16 @@ public class NamingUtil {
void setProperty(String name, Object value);
}
+ public static void setCurrentContext(StandardContext currentContext) {
+ NamingUtil.currentContext = currentContext;
+ }
+
+ public static void cleanUpContextResource(final StandardContext context) {
+ final Collection<String> keys = ID_BY_CONTEXT.remove(context);
+ if (keys != null) {
+ for (String k : keys) {
+ registry.remove(k);
+ }
+ }
+ }
}