Author: rmannibucau
Date: Sun Jun  3 20:23:44 2012
New Revision: 1345767

URL: http://svn.apache.org/viewvc?rev=1345767&view=rev
Log:
TOMEE-213 closing lazily the webappclassloader keeping the webappp lifecycle

Added:
    
openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/LazyStopLoader.java
    
openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/LazyStopWebappClassLoader.java
Modified:
    
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java
    
openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatWebAppBuilder.java

Modified: 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java?rev=1345767&r1=1345766&r2=1345767&view=diff
==============================================================================
--- 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java
 (original)
+++ 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java
 Sun Jun  3 20:23:44 2012
@@ -1138,35 +1138,6 @@ public class Assembler extends Assembler
         destroyApplication(appInfo);
     }
 
-    public synchronized void preDestroyApplication(AppInfo appInfo, 
UndeployException ue) throws UndeployException {
-        UndeployException undeployException = ue;
-        if (undeployException == null) {
-            undeployException = new UndeployException("can't unregister 
persistence units");
-        }
-
-        final Context globalContext = containerSystem.getJNDIContext();
-        for (PersistenceUnitInfo unitInfo : appInfo.persistenceUnits) {
-            try {
-                Object object = 
globalContext.lookup(PERSISTENCE_UNIT_NAMING_CONTEXT + unitInfo.id);
-                globalContext.unbind(PERSISTENCE_UNIT_NAMING_CONTEXT + 
unitInfo.id);
-
-                // close EMF so all resources are released
-                ReloadableEntityManagerFactory remf = 
((ReloadableEntityManagerFactory) object);
-                remf.close();
-                persistenceClassLoaderHandler.destroy(unitInfo.id);
-                remf.unregister();
-            } catch (Throwable t) {
-                undeployException.getCauses().add(new 
Exception("persistence-unit: " + unitInfo.id + ": " + t.getMessage(), t));
-            }
-        }
-
-        appInfo.persistenceUnits.clear();
-
-        if (undeployException.getCauses().size() > 0) {
-            throw undeployException;
-        }
-    }
-
     public synchronized void destroyApplication(AppInfo appInfo) throws 
UndeployException {
         deployedApplications.remove(appInfo.path);
         logger.info("destroyApplication.start", appInfo.path);
@@ -1206,8 +1177,6 @@ public class Assembler extends Assembler
         Context globalContext = containerSystem.getJNDIContext();
         UndeployException undeployException = new 
UndeployException(messages.format("destroyApplication.failed", appInfo.path));
 
-        preDestroyApplication(appInfo, undeployException);
-
         WebAppBuilder webAppBuilder = 
SystemInstance.get().getComponent(WebAppBuilder.class);
         if (webAppBuilder != null) {
             try {
@@ -1371,6 +1340,21 @@ public class Assembler extends Assembler
             }
         }
 
+        for (PersistenceUnitInfo unitInfo : appInfo.persistenceUnits) {
+            try {
+                Object object = 
globalContext.lookup(PERSISTENCE_UNIT_NAMING_CONTEXT + unitInfo.id);
+                globalContext.unbind(PERSISTENCE_UNIT_NAMING_CONTEXT + 
unitInfo.id);
+
+                // close EMF so all resources are released
+                ReloadableEntityManagerFactory remf = 
((ReloadableEntityManagerFactory) object);
+                remf.close();
+                persistenceClassLoaderHandler.destroy(unitInfo.id);
+                remf.unregister();
+            } catch (Throwable t) {
+                undeployException.getCauses().add(new 
Exception("persistence-unit: " + unitInfo.id + ": " + t.getMessage(), t));
+            }
+        }
+
         containerSystem.removeAppContext(appInfo.appId);
 
         ClassLoaderUtil.destroyClassLoader(appInfo.path);

Added: 
openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/LazyStopLoader.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/LazyStopLoader.java?rev=1345767&view=auto
==============================================================================
--- 
openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/LazyStopLoader.java
 (added)
+++ 
openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/LazyStopLoader.java
 Sun Jun  3 20:23:44 2012
@@ -0,0 +1,139 @@
+package org.apache.tomee.catalina;
+
+import java.beans.PropertyChangeListener;
+import org.apache.catalina.Container;
+import org.apache.catalina.Lifecycle;
+import org.apache.catalina.LifecycleException;
+import org.apache.catalina.LifecycleListener;
+import org.apache.catalina.LifecycleState;
+import org.apache.catalina.Loader;
+import org.apache.catalina.loader.WebappLoader;
+
+public class LazyStopLoader implements Loader, Lifecycle {
+    private final WebappLoader delegate;
+    private ClassLoader classLoader;
+
+    public LazyStopLoader(WebappLoader loader) {
+        delegate = loader;
+    }
+
+    @Override
+    public void addLifecycleListener(LifecycleListener listener) {
+        delegate.addLifecycleListener(listener);
+    }
+
+    @Override
+    public LifecycleListener[] findLifecycleListeners() {
+        return delegate.findLifecycleListeners();
+    }
+
+    @Override
+    public void removeLifecycleListener(LifecycleListener listener) {
+        delegate.removeLifecycleListener(listener);
+    }
+
+    @Override
+    public void init() throws LifecycleException {
+        delegate.init();
+    }
+
+    @Override
+    public void start() throws LifecycleException {
+        delegate.start();
+    }
+
+    @Override
+    public void stop() throws LifecycleException {
+        classLoader = delegate.getClassLoader();
+        delegate.stop();
+    }
+
+    @Override
+    public void destroy() throws LifecycleException {
+        delegate.destroy();
+    }
+
+    @Override
+    public LifecycleState getState() {
+        return delegate.getState();
+    }
+
+    @Override
+    public String getStateName() {
+        return delegate.getStateName();
+    }
+
+    @Override
+    public void backgroundProcess() {
+        delegate.backgroundProcess();
+    }
+
+    @Override
+    public ClassLoader getClassLoader() {
+        return delegate.getClassLoader();
+    }
+
+    @Override
+    public Container getContainer() {
+        return delegate.getContainer();
+    }
+
+    @Override
+    public void setContainer(Container container) {
+        delegate.setContainer(container);
+    }
+
+    @Override
+    public boolean getDelegate() {
+        return delegate.getDelegate();
+    }
+
+    @Override
+    public void setDelegate(boolean delegate) {
+        this.delegate.setDelegate(delegate);
+    }
+
+    @Override
+    public String getInfo() {
+        return delegate.getInfo();
+    }
+
+    @Override
+    public boolean getReloadable() {
+        return delegate.getReloadable();
+    }
+
+    @Override
+    public void setReloadable(boolean reloadable) {
+        delegate.setReloadable(reloadable);
+    }
+
+    @Override
+    public void addPropertyChangeListener(PropertyChangeListener listener) {
+        delegate.addPropertyChangeListener(listener);
+    }
+
+    @Override
+    public void addRepository(String repository) {
+        delegate.addRepository(repository);
+    }
+
+    @Override
+    public String[] findRepositories() {
+        return delegate.findRepositories();
+    }
+
+    @Override
+    public boolean modified() {
+        return delegate.modified();
+    }
+
+    @Override
+    public void removePropertyChangeListener(PropertyChangeListener listener) {
+        delegate.removePropertyChangeListener(listener);
+    }
+
+    public ClassLoader getStopClassLoader() {
+        return classLoader;
+    }
+}

Added: 
openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/LazyStopWebappClassLoader.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/LazyStopWebappClassLoader.java?rev=1345767&view=auto
==============================================================================
--- 
openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/LazyStopWebappClassLoader.java
 (added)
+++ 
openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/LazyStopWebappClassLoader.java
 Sun Jun  3 20:23:44 2012
@@ -0,0 +1,23 @@
+package org.apache.tomee.catalina;
+
+import org.apache.catalina.LifecycleException;
+import org.apache.catalina.loader.WebappClassLoader;
+
+public class LazyStopWebappClassLoader extends WebappClassLoader {
+    public LazyStopWebappClassLoader() {
+        // no-op
+    }
+
+    public LazyStopWebappClassLoader(final ClassLoader parent) {
+        super(parent);
+    }
+
+    @Override
+    public void stop() throws LifecycleException {
+        // no-op: in our destroyapplication method we need a valid classloader 
to TomcatWebAppBuilder.afterStop()
+    }
+
+    public void internalStop() throws LifecycleException {
+        super.stop();
+    }
+}

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=1345767&r1=1345766&r2=1345767&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
 Sun Jun  3 20:23:44 2012
@@ -22,7 +22,9 @@ import java.util.List;
 import org.apache.catalina.Container;
 import org.apache.catalina.Engine;
 import org.apache.catalina.Host;
+import org.apache.catalina.LifecycleException;
 import org.apache.catalina.LifecycleListener;
+import org.apache.catalina.Loader;
 import org.apache.catalina.Manager;
 import org.apache.catalina.Pipeline;
 import org.apache.catalina.Realm;
@@ -42,6 +44,7 @@ import org.apache.catalina.deploy.Contex
 import org.apache.catalina.deploy.ContextTransaction;
 import org.apache.catalina.deploy.NamingResources;
 import org.apache.catalina.loader.WebappClassLoader;
+import org.apache.catalina.loader.WebappLoader;
 import org.apache.catalina.startup.Constants;
 import org.apache.catalina.startup.ContextConfig;
 import org.apache.catalina.startup.HostConfig;
@@ -52,7 +55,6 @@ import org.apache.openejb.AppContext;
 import org.apache.openejb.BeanContext;
 import org.apache.openejb.Injection;
 import org.apache.openejb.OpenEJBException;
-import org.apache.openejb.UndeployException;
 import org.apache.openejb.assembler.classic.*;
 import org.apache.openejb.cdi.CdiBuilder;
 import org.apache.openejb.config.AppModule;
@@ -599,6 +601,14 @@ public class TomcatWebAppBuilder impleme
                 sc.setSessionTrackingModes(newModes);
             }
         }
+
+        // we just want to wrap it to lazy stop it (afterstop)
+        // to avoid classnotfound in @PreDestoy or destroyApplication()
+        final WebappLoader loader = new 
WebappLoader(standardContext.getParentClassLoader());
+        loader.setDelegate(standardContext.getDelegate());
+        loader.setLoaderClass(LazyStopWebappClassLoader.class.getName());
+        final Loader lazyStopLoader = new LazyStopLoader(loader);
+        standardContext.setLoader(lazyStopLoader);
     }
 
     @Override
@@ -1052,14 +1062,7 @@ public class TomcatWebAppBuilder impleme
      */
     @Override
     public void beforeStop(final StandardContext standardContext) {
-        final ContextInfo contextInfo = getContextInfo(standardContext);
-        if (isUnDeployable(contextInfo)) {
-            try {
-                assembler.preDestroyApplication(contextInfo.appInfo, null);
-            } catch (UndeployException e) {
-                logger.error("can't pre deploy the app " + 
standardContext.getName(), e);
-            }
-        }
+        //no-op
     }
 
     private boolean isUnDeployable(final ContextInfo contextInfo) {
@@ -1080,7 +1083,9 @@ public class TomcatWebAppBuilder impleme
      */
     @Override
     public void afterStop(final StandardContext standardContext) {
-        if (isIgnored(standardContext)) return;
+        if (isIgnored(standardContext)) {
+            return;
+        }
 
         final ContextInfo contextInfo = getContextInfo(standardContext);
         if (isUnDeployable(contextInfo)) {
@@ -1090,6 +1095,18 @@ public class TomcatWebAppBuilder impleme
                 logger.error("Unable to stop web application " + 
standardContext.getPath() + ": Exception: " + e.getMessage(), e);
             }
         }
+
+        final Loader loader = standardContext.getLoader();
+        if (loader != null && loader instanceof LazyStopLoader) {
+            final ClassLoader old = ((LazyStopLoader) 
loader).getStopClassLoader();
+            if (old != null && old instanceof LazyStopWebappClassLoader) {
+                try {
+                    ((LazyStopWebappClassLoader) old).internalStop();
+                } catch (LifecycleException e) {
+                    logger.error("error stopping classloader of webapp " + 
standardContext.getName(), e);
+                }
+            }
+        }
         removeContextInfo(standardContext);
     }
 


Reply via email to