Author: rmannibucau Date: Sat Mar 16 18:42:14 2013 New Revision: 1457289 URL: http://svn.apache.org/r1457289 Log: TOMEE-833 tolerating a bit more classloader of server event
Modified: tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/AppInfo.java tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/config/ConfigurationFactory.java tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/util/EventHelper.java tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatWebAppBuilder.java Modified: tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/AppInfo.java URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/AppInfo.java?rev=1457289&r1=1457288&r2=1457289&view=diff ============================================================================== --- tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/AppInfo.java (original) +++ tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/AppInfo.java Sat Mar 16 18:42:14 2013 @@ -53,5 +53,6 @@ public class AppInfo extends InfoObject public final Properties jmx = new Properties(); public final Set<String> mbeans = new TreeSet<String>(); public final Set<String> jaxRsProviders = new TreeSet<String>(); + public final Set<String> eventClassesNeedingAppClassloader = new TreeSet<String>(); public boolean webAppAlone; } Modified: tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java?rev=1457289&r1=1457288&r2=1457289&view=diff ============================================================================== --- tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java (original) +++ tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java Sat Mar 16 18:42:14 2013 @@ -579,6 +579,8 @@ public class Assembler extends Assembler appInfo.path = appInfo.appId; } + EventHelper.addEventClasses(classLoader, appInfo.eventClassesNeedingAppClassloader); + logger.info("createApplication.start", appInfo.path); // try { Modified: tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/config/ConfigurationFactory.java URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/config/ConfigurationFactory.java?rev=1457289&r1=1457288&r2=1457289&view=diff ============================================================================== --- tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/config/ConfigurationFactory.java (original) +++ tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/config/ConfigurationFactory.java Sat Mar 16 18:42:14 2013 @@ -105,6 +105,7 @@ import java.util.Collection; import java.util.Collections; import java.util.Comparator; import java.util.HashMap; +import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Properties; @@ -866,9 +867,14 @@ public class ConfigurationFactory implem } public AppInfo configureApplication(final AppModule appModule) throws OpenEJBException { + final Collection<Class<?>> extensions = new HashSet<Class<?>>(); + final Collection<String> notLoaded = new HashSet<String>(); + final List<URL> libs = appModule.getAdditionalLibraries(); if (libs != null && libs.size() > 0) { - EventHelper.installExtensions(new ResourceFinder("META-INF", libs.toArray(new URL[libs.size()]))); + final ResourceFinder finder = new ResourceFinder("META-INF", libs.toArray(new URL[libs.size()])); + extensions.addAll(EventHelper.findExtensions(finder)); + notLoaded.addAll(finder.getResourcesNotLoaded()); } for (final EjbModule ejb : appModule.getEjbModules()) { try { @@ -876,7 +882,9 @@ public class ConfigurationFactory implem if (uri.isAbsolute()) { final URL url = uri.toURL(); if (libs != null && !libs.contains(url)) { - EventHelper.installExtensions(new ResourceFinder("META-INF", url)); + final ResourceFinder finder = new ResourceFinder("META-INF", url); + extensions.addAll(EventHelper.findExtensions(finder)); + notLoaded.addAll(finder.getResourcesNotLoaded()); } } } catch (IllegalArgumentException iae) { @@ -890,16 +898,24 @@ public class ConfigurationFactory implem for (final WebModule web : appModule.getWebModules()) { final List<URL> webLibs = web.getScannableUrls(); if (webLibs != null && webLibs.size() > 0) { - EventHelper.installExtensions(new ResourceFinder("META-INF", webLibs.toArray(new URL[webLibs.size()]))); + final ResourceFinder finder = new ResourceFinder("META-INF", webLibs.toArray(new URL[webLibs.size()])); + extensions.addAll(EventHelper.findExtensions(finder)); + notLoaded.addAll(finder.getResourcesNotLoaded()); } } + // add it as early as possible, the ones needing the app classloader will be added later + EventHelper.addEventClasses(extensions); + final String location = appModule.getJarLocation(); logger.info("config.configApp", null != location ? location : appModule.getModuleId()); deployer.deploy(appModule); final AppInfoBuilder appInfoBuilder = new AppInfoBuilder(this); - return appInfoBuilder.build(appModule); + final AppInfo info = appInfoBuilder.build(appModule); + info.eventClassesNeedingAppClassloader.addAll(notLoaded); + + return info; } private static class DefaultService { Modified: tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/util/EventHelper.java URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/util/EventHelper.java?rev=1457289&r1=1457288&r2=1457289&view=diff ============================================================================== --- tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/util/EventHelper.java (original) +++ tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/util/EventHelper.java Sat Mar 16 18:42:14 2013 @@ -20,6 +20,8 @@ import org.apache.openejb.loader.SystemI import org.apache.xbean.finder.ResourceFinder; import java.io.IOException; +import java.util.Collection; +import java.util.Collections; import java.util.List; public final class EventHelper { @@ -30,19 +32,43 @@ public final class EventHelper { // no-op } + public static Collection<Class<?>> findExtensions(final ResourceFinder finder) { + try { + return finder.findAvailableClasses("org.apache.openejb.extension"); + } catch (IOException e) { + LOGGER.error("Extension scanning of 'META-INF/org.apache.openejb.extension' files failed", e); + return Collections.emptySet(); + } + } + public static void installExtensions(final ResourceFinder finder) { try { final List<Class<?>> classes = finder.findAvailableClasses("org.apache.openejb.extension"); - for (final Class<?> clazz : classes) { - try { - final Object object = clazz.newInstance(); - SystemInstance.get().addObserver(object); - } catch (Throwable t) { - LOGGER.error("Extension construction failed" + clazz.getName(), t); - } - } + addEventClasses(classes); } catch (IOException e) { LOGGER.error("Extension scanning of 'META-INF/org.apache.openejb.extension' files failed", e); } } + + public static void addEventClasses(final ClassLoader loader, final Collection<String> classes) { + for (final String clazz : classes) { + try { + final Object object = loader.loadClass(clazz).newInstance(); + SystemInstance.get().addObserver(object); + } catch (final Throwable t) { + LOGGER.error("Extension construction failed" + clazz, t); + } + } + } + + public static void addEventClasses(final Collection<Class<?>> classes) { + for (final Class<?> clazz : classes) { + try { + final Object object = clazz.newInstance(); + SystemInstance.get().addObserver(object); + } catch (final Throwable t) { + LOGGER.error("Extension construction failed" + clazz.getName(), t); + } + } + } } Modified: tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatWebAppBuilder.java URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatWebAppBuilder.java?rev=1457289&r1=1457288&r2=1457289&view=diff ============================================================================== --- tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatWebAppBuilder.java (original) +++ tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatWebAppBuilder.java Sat Mar 16 18:42:14 2013 @@ -88,7 +88,6 @@ import org.apache.openejb.config.Configu import org.apache.openejb.config.DeploymentLoader; import org.apache.openejb.config.TldScanner; import org.apache.openejb.config.WebModule; -import org.apache.openejb.config.event.BeforeDeploymentEvent; import org.apache.openejb.config.sys.Resource; import org.apache.openejb.core.CoreContainerSystem; import org.apache.openejb.core.ParentClassLoaderFinder; @@ -739,10 +738,6 @@ public class TomcatWebAppBuilder impleme } } - if (warFile.exists()) { - SystemInstance.get().fireEvent(new BeforeDeploymentEvent(DeploymentLoader.getWebappUrls(warFile))); - } - standardContext.setCrossContext(SystemInstance.get().getOptions().get(OPENEJB_CROSSCONTEXT_PROPERTY, false)); standardContext.setNamingResources(new OpenEJBNamingResource(standardContext.getNamingResources())); @@ -1858,7 +1853,7 @@ public class TomcatWebAppBuilder impleme * * @param standardContext tomcat context instance */ - private void loadWebModule(final AppModule appModule, final StandardContext standardContext) { + private void loadWebModule(final AppModule appModule, final StandardContext standardContext) { final WebModule webModule = appModule.getWebModules().get(0); final WebApp webApp = webModule.getWebApp();