Repository: tomee Updated Branches: refs/heads/master 1665a38f5 -> c31f000e4
internalDestroy on th emodel of internalStop to support reloading as well Project: http://git-wip-us.apache.org/repos/asf/tomee/repo Commit: http://git-wip-us.apache.org/repos/asf/tomee/commit/c31f000e Tree: http://git-wip-us.apache.org/repos/asf/tomee/tree/c31f000e Diff: http://git-wip-us.apache.org/repos/asf/tomee/diff/c31f000e Branch: refs/heads/master Commit: c31f000e433096410e575bd0661cd339406d720f Parents: 1665a38 Author: Romain Manni-Bucau <rmannibu...@apache.org> Authored: Mon Apr 20 15:53:56 2015 +0200 Committer: Romain Manni-Bucau <rmannibu...@apache.org> Committed: Mon Apr 20 15:53:56 2015 +0200 ---------------------------------------------------------------------- .../tomee/catalina/LazyStopStandardRoot.java | 9 ++++++- .../tomee/catalina/TomEEWebappClassLoader.java | 17 +++++++----- .../tomee/catalina/TomEEWebappLoader.java | 16 ++++++++++++ .../tomee/catalina/TomcatWebAppBuilder.java | 27 +++++++++++++++++++- 4 files changed, 61 insertions(+), 8 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/tomee/blob/c31f000e/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/LazyStopStandardRoot.java ---------------------------------------------------------------------- diff --git a/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/LazyStopStandardRoot.java b/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/LazyStopStandardRoot.java index 80a49af..040fed2 100644 --- a/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/LazyStopStandardRoot.java +++ b/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/LazyStopStandardRoot.java @@ -320,8 +320,15 @@ public class LazyStopStandardRoot implements WebResourceRoot, JmxEnabled { // delegate.destroy(); } + public void internalDestroy() throws LifecycleException { + delegate.destroy(); + } + public void internalStop() throws LifecycleException { delegate.stop(); - delegate.destroy(); + } + + public WebResourceRoot getDelegate() { + return delegate; } } http://git-wip-us.apache.org/repos/asf/tomee/blob/c31f000e/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomEEWebappClassLoader.java ---------------------------------------------------------------------- diff --git a/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomEEWebappClassLoader.java b/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomEEWebappClassLoader.java index e2364e6..0c94a64 100644 --- a/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomEEWebappClassLoader.java +++ b/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomEEWebappClassLoader.java @@ -253,6 +253,14 @@ public class TomEEWebappClassLoader extends ParallelWebappClassLoader { return URLClassLoaderFirst.shouldSkip(name); } + public void internalDestroy() { + try { + super.destroy(); + } finally { + cleanUpClassLoader(); + } + } + public void internalStop() throws LifecycleException { if (stopped) { return; @@ -264,9 +272,10 @@ public class TomEEWebappClassLoader extends ParallelWebappClassLoader { thread.setContextClassLoader(this); try { super.stop(); - super.destroy(); + // super.destroy(); if (webResourceRoot != null) { webResourceRoot.internalStop(); + webResourceRoot = null; } stopped = true; } finally { @@ -445,11 +454,7 @@ public class TomEEWebappClassLoader extends ParallelWebappClassLoader { @Override public void destroy() { if (forceStopPhase) { - try { - super.destroy(); - } finally { - cleanUpClassLoader(); - } + internalDestroy(); } } http://git-wip-us.apache.org/repos/asf/tomee/blob/c31f000e/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomEEWebappLoader.java ---------------------------------------------------------------------- diff --git a/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomEEWebappLoader.java b/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomEEWebappLoader.java index 9ca2061..eee2d2a 100644 --- a/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomEEWebappLoader.java +++ b/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomEEWebappLoader.java @@ -43,6 +43,8 @@ import java.io.File; public class TomEEWebappLoader extends WebappLoader { public static final boolean SKIP_BACKGROUND_PROCESS = "true".equals(SystemInstance.get().getProperty("tomee.classloader.skip-background-process", "false")); + private volatile ClassLoader loader; + @Override public void backgroundProcess() { if (SKIP_BACKGROUND_PROCESS) { @@ -69,6 +71,20 @@ public class TomEEWebappLoader extends WebappLoader { } @Override + protected void stopInternal() throws LifecycleException { + loader = getClassLoader(); + super.stopInternal(); + } + + public void clearLoader() { + loader = null; + } + + public ClassLoader internalLoader() { + return loader; + } + + @Override protected void startInternal() throws LifecycleException { if (getClassLoader() != null) { final TomEEWebappClassLoader webappClassLoader = TomEEWebappClassLoader.class.cast(getClassLoader()); http://git-wip-us.apache.org/repos/asf/tomee/blob/c31f000e/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatWebAppBuilder.java ---------------------------------------------------------------------- diff --git a/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatWebAppBuilder.java b/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatWebAppBuilder.java index fbf604b..1f9c81a 100644 --- a/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatWebAppBuilder.java +++ b/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatWebAppBuilder.java @@ -977,6 +977,11 @@ public class TomcatWebAppBuilder implements WebAppBuilder, ContextListener, Pare */ @Override public void beforeStart(final StandardContext standardContext) { + if (standardContext.getResources() != null && LazyStopStandardRoot.class.isInstance(standardContext.getResources())) { + // reset after reload + Reflections.set(standardContext, "resources", LazyStopStandardRoot.class.cast(standardContext.getResources()).getDelegate()); + } + final ServletContext sc = standardContext.getServletContext(); if (sc != null && !SystemInstance.get().getOptions().get(OPENEJB_JSESSION_ID_SUPPORT, true)) { final Set<SessionTrackingMode> defaultTrackingModes = sc.getEffectiveSessionTrackingModes(); @@ -1932,7 +1937,27 @@ public class TomcatWebAppBuilder implements WebAppBuilder, ContextListener, Pare */ @Override public void destroy(final StandardContext standardContext) { - //No operation + final Loader standardContextLoader = standardContext.getLoader(); + if (LazyStopLoader.class.isInstance(standardContextLoader)) { + final Loader delegate = LazyStopLoader.class.cast(standardContextLoader).getDelegateLoader(); + if (TomEEWebappLoader.class.isInstance(delegate)) { + final TomEEWebappLoader webappLoader = TomEEWebappLoader.class.cast(delegate); + final ClassLoader loader = webappLoader.internalLoader(); + webappLoader.clearLoader(); + if (TomEEWebappClassLoader.class.isInstance(loader)) { + TomEEWebappClassLoader.class.cast(loader).internalDestroy(); + } + } + } + + final WebResourceRoot root = standardContext.getResources(); + if (LazyStopStandardRoot.class.isInstance(root)) { + try { + LazyStopStandardRoot.class.cast(root).internalDestroy(); + } catch (final LifecycleException e) { + throw new IllegalStateException(e); + } + } } /**