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);
+            }
+        }
+    }
 }


Reply via email to