Author: rmannibucau Date: Sat Mar 16 15:13:22 2013 New Revision: 1457261 URL: http://svn.apache.org/r1457261 Log: TOMEE-794 using classloaderconfigurer for jars.txt + small optimization on ProvisioningUtil (avoid to download N times the same http artifact)
Removed: tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/LazyStopWebappLoader.java Modified: tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/ClassLoaderUtil.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/classloader/ClassLoaderConfigurer.java tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/classloader/CompositeClassLoaderConfigurer.java tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/classloader/ProvisioningClassLoaderConfigurer.java tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentLoader.java tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/config/QuickJarsTxtParser.java tomee/tomee/trunk/container/openejb-loader/src/main/java/org/apache/openejb/loader/ProvisioningUtil.java tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/LazyStopWebappClassLoader.java tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/ProvisioningWebappLoader.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/ClassLoaderUtil.java URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/ClassLoaderUtil.java?rev=1457261&r1=1457260&r2=1457261&view=diff ============================================================================== --- tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/ClassLoaderUtil.java (original) +++ tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/ClassLoaderUtil.java Sat Mar 16 15:13:22 2013 @@ -308,35 +308,27 @@ public class ClassLoaderUtil { } } - final Collection<URL> jarsXmlUrls = QuickJarsTxtParser.parse(new File(appId, "META-INF/" + QuickJarsTxtParser.FILE_NAME)); - jarsXmlUrls.addAll(QuickJarsTxtParser.parse(new File(appId, "WEB-INF/" + QuickJarsTxtParser.FILE_NAME))); + // from the app + final ClassLoaderConfigurer configurer1 = QuickJarsTxtParser.parse(new File(appId, "META-INF/" + QuickJarsTxtParser.FILE_NAME)); + final ClassLoaderConfigurer configurer2 = QuickJarsTxtParser.parse(new File(appId, "WEB-INF/" + QuickJarsTxtParser.FILE_NAME)); + + // external config + ClassLoaderConfigurer configurer3 = ClassLoaderUtil.configurer(updatedAppId); + if (configurer3 == null) { // try the complete path + configurer3 = ClassLoaderUtil.configurer(appId); + } final URL[] urls; - ClassLoaderConfigurer configurer = ClassLoaderUtil.configurer(updatedAppId); - if (configurer == null) { // try the complete path - configurer = ClassLoaderUtil.configurer(appId); - } - if (configurer != null) { - final Collection<URL> urlList = new ArrayList<URL>(); - for (final URL rawUrl : rawUrls) { - if (configurer.accept(rawUrl)) { - urlList.add(rawUrl); - } - } - urlList.addAll(Arrays.asList(configurer.additionalURLs())); - urlList.addAll(jarsXmlUrls); - urls = urlList.toArray(new URL[urlList.size()]); - } else if (jarsXmlUrls.isEmpty()) { + if (configurer1 == null && configurer2 == null && configurer3 == null) { urls = rawUrls; } else { - final Collection<URL> urlList = new ArrayList<URL>(); - urlList.addAll(Arrays.asList(rawUrls)); - urlList.addAll(jarsXmlUrls); - urls = urlList.toArray(new URL[urlList.size()]); + final CompositeClassLoaderConfigurer configurer = new CompositeClassLoaderConfigurer(configurer1, configurer2, configurer3); + final Collection<URL> list = new ArrayList<URL>(); + list.addAll(Arrays.asList(rawUrls)); + ClassLoaderConfigurer.Helper.configure(list, configurer); + urls = list.toArray(new URL[list.size()]); } - - return new TempClassLoader(createClassLoader(appId, urls, parent)); } 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=1457261&r1=1457260&r2=1457261&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 15:13:22 2013 @@ -56,6 +56,7 @@ import org.apache.openejb.cdi.OpenEJBTra import org.apache.openejb.cdi.OptimizedLoaderService; import org.apache.openejb.cdi.ThreadSingletonServiceImpl; import org.apache.openejb.classloader.ClassLoaderConfigurer; +import org.apache.openejb.classloader.CompositeClassLoaderConfigurer; import org.apache.openejb.component.ClassLoaderEnricher; import org.apache.openejb.config.ConfigurationFactory; import org.apache.openejb.config.NewLoaderLogic; @@ -1698,24 +1699,19 @@ public class Assembler extends Assembler parent = parentFinder.getParentClassLoader(parent); } - final ClassLoaderConfigurer configurer = ClassLoaderUtil.configurer(appInfo.appId); - if (configurer != null) { - final Iterator<URL> it = jars.iterator(); - while (it.hasNext()) { - if (!configurer.accept(it.next())) { - it.remove(); - } - } - jars.addAll(Arrays.asList(configurer.additionalURLs())); - } - final String prefix; if (appInfo.webAppAlone) { prefix = "WEB-INF/"; } else { prefix = "META-INF/"; } - jars.addAll(QuickJarsTxtParser.parse(new File(appInfo.path, prefix + QuickJarsTxtParser.FILE_NAME))); + final ClassLoaderConfigurer configurer1 = QuickJarsTxtParser.parse(new File(appInfo.path, prefix + QuickJarsTxtParser.FILE_NAME)); + final ClassLoaderConfigurer configurer2 = ClassLoaderUtil.configurer(appInfo.appId); + + if (configurer1 != null || configurer2 != null) { + final ClassLoaderConfigurer configurer = new CompositeClassLoaderConfigurer(configurer1, configurer2); + ClassLoaderConfigurer.Helper.configure(jars, configurer); + } final URL[] filtered = jars.toArray(new URL[jars.size()]); Modified: tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/classloader/ClassLoaderConfigurer.java URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/classloader/ClassLoaderConfigurer.java?rev=1457261&r1=1457260&r2=1457261&view=diff ============================================================================== --- tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/classloader/ClassLoaderConfigurer.java (original) +++ tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/classloader/ClassLoaderConfigurer.java Sat Mar 16 15:13:22 2013 @@ -17,8 +17,27 @@ package org.apache.openejb.classloader; import java.net.URL; +import java.util.Arrays; +import java.util.Collection; +import java.util.Iterator; public interface ClassLoaderConfigurer { URL[] additionalURLs(); boolean accept(final URL url); + + public static class Helper { + private Helper() { + // no-op + } + + public static void configure(final Collection<URL> urls, final ClassLoaderConfigurer configurer) { + final Iterator<URL> it = urls.iterator(); + while (it.hasNext()) { + if (!configurer.accept(it.next())) { + it.remove(); + } + } + urls.addAll(Arrays.asList(configurer.additionalURLs())); + } + } } Modified: tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/classloader/CompositeClassLoaderConfigurer.java URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/classloader/CompositeClassLoaderConfigurer.java?rev=1457261&r1=1457260&r2=1457261&view=diff ============================================================================== --- tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/classloader/CompositeClassLoaderConfigurer.java (original) +++ tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/classloader/CompositeClassLoaderConfigurer.java Sat Mar 16 15:13:22 2013 @@ -25,12 +25,14 @@ public class CompositeClassLoaderConfigu private final ClassLoaderConfigurer[] composites; private final URL[] urls; - public CompositeClassLoaderConfigurer(final ClassLoaderConfigurer[] configurers) { + public CompositeClassLoaderConfigurer(final ClassLoaderConfigurer... configurers) { composites = configurers; final Set<URL> urlSet = new HashSet<URL>(); - for (ClassLoaderConfigurer configurer : configurers) { - urlSet.addAll(Arrays.asList(configurer.additionalURLs())); + for (final ClassLoaderConfigurer configurer : configurers) { + if (configurer != null) { + urlSet.addAll(Arrays.asList(configurer.additionalURLs())); + } } urls = urlSet.toArray(new URL[urlSet.size()]); } @@ -42,8 +44,8 @@ public class CompositeClassLoaderConfigu @Override public boolean accept(final URL url) { - for (ClassLoaderConfigurer configurer : composites) { - if (!configurer.accept(url)) { + for (final ClassLoaderConfigurer configurer : composites) { + if (configurer != null && !configurer.accept(url)) { return false; } } Modified: tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/classloader/ProvisioningClassLoaderConfigurer.java URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/classloader/ProvisioningClassLoaderConfigurer.java?rev=1457261&r1=1457260&r2=1457261&view=diff ============================================================================== --- tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/classloader/ProvisioningClassLoaderConfigurer.java (original) +++ tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/classloader/ProvisioningClassLoaderConfigurer.java Sat Mar 16 15:13:22 2013 @@ -16,6 +16,7 @@ */ package org.apache.openejb.classloader; +import org.apache.openejb.loader.Files; import org.apache.openejb.loader.IO; import org.apache.openejb.loader.ProvisioningUtil; import org.apache.openejb.util.LogCategory; @@ -27,7 +28,6 @@ import org.apache.xbean.finder.filter.Fi import java.io.BufferedReader; import java.io.File; import java.io.FileReader; -import java.net.MalformedURLException; import java.net.URL; import java.util.ArrayList; import java.util.Collection; @@ -39,7 +39,7 @@ import java.util.Collection; * Handled file format: * -xbean * +http://..../camel-core.jar - * +org.foo:bar:1.0 + * +mvn:org.foo:bar:1.0 * * The maven like urls needs the openejb-provisinning module * @@ -68,7 +68,7 @@ public class ProvisioningClassLoaderConf } public void setConfiguration(final String configFile) { - final Collection<String> toAdd = new ArrayList<String>(); + final Collection<URL> toAdd = new ArrayList<URL>(); final Collection<String> toExclude = new ArrayList<String>(); BufferedReader reader = null; @@ -88,7 +88,7 @@ public class ProvisioningClassLoaderConf if (line.startsWith("+")) { line = line.substring(1); } - toAdd.add(ProvisioningUtil.realLocation(line)); + toAdd.addAll(Files.listJars(ProvisioningUtil.realLocation(line))); } } @@ -98,16 +98,7 @@ public class ProvisioningClassLoaderConf IO.close(reader); } - added = new URL[toAdd.size()]; - int i = 0; - for (final String path : toAdd) { - try { - added[i++] = new File(path).toURI().toURL(); - } catch (MalformedURLException e) { - LOGGER.warning("Can't add file " + path, e); - } - } - + added = toAdd.toArray(new URL[toAdd.size()]); if (toExclude.size() > 0) { excluded = Filters.prefixes(toExclude.toArray(new String[toExclude.size()])); } Modified: tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentLoader.java URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentLoader.java?rev=1457261&r1=1457260&r2=1457261&view=diff ============================================================================== --- tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentLoader.java (original) +++ tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentLoader.java Sat Mar 16 15:13:22 2013 @@ -21,6 +21,7 @@ import org.apache.openejb.ClassLoaderUti import org.apache.openejb.OpenEJBException; import org.apache.openejb.api.LocalClient; import org.apache.openejb.api.RemoteClient; +import org.apache.openejb.classloader.ClassLoaderConfigurer; import org.apache.openejb.classloader.WebAppEnricher; import org.apache.openejb.config.event.BeforeDeploymentEvent; import org.apache.openejb.core.EmptyResourcesClassLoader; @@ -396,10 +397,10 @@ public class DeploymentLoader implements createApplicationFromFiles(appId, tmpClassLoader, ejbModules, clientModules, resouceModules, webModules, files); } - final Collection<URL> jarsXmlUrls = QuickJarsTxtParser.parse(new File(appDir, "META-INF/" + QuickJarsTxtParser.FILE_NAME)); + final ClassLoaderConfigurer configurer = QuickJarsTxtParser.parse(new File(appDir, "META-INF/" + QuickJarsTxtParser.FILE_NAME)); final Collection<URL> jarsXmlLib = new ArrayList<URL>(); - if (!jarsXmlUrls.isEmpty()) { - for (final URL url : jarsXmlUrls) { + if (configurer != null) { + for (final URL url : configurer.additionalURLs()) { try { detectAndAddModuleToApplication(appId, tmpClassLoader, ejbModules, clientModules, resouceModules, webModules, @@ -881,7 +882,10 @@ public class DeploymentLoader implements webUrls.addAll(parser.getAdditionalURLs()); } - webUrls.addAll(QuickJarsTxtParser.parse(new File(warFile, "WEB-INF/" + QuickJarsTxtParser.FILE_NAME))); + final ClassLoaderConfigurer configurer = QuickJarsTxtParser.parse(new File(warFile, "WEB-INF/" + QuickJarsTxtParser.FILE_NAME)); + if (configurer != null) { + ClassLoaderConfigurer.Helper.configure(webUrls, configurer); + } final URL[] webUrlsArray = webUrls.toArray(new URL[webUrls.size()]); @@ -1301,7 +1305,12 @@ public class DeploymentLoader implements // create the class loader final List<URL> classPath = new ArrayList<URL>(); classPath.addAll(rarLibs.values()); - classPath.addAll(QuickJarsTxtParser.parse(new File(rarFile, "META-INF/" + QuickJarsTxtParser.FILE_NAME))); + + final ClassLoaderConfigurer configurer = QuickJarsTxtParser.parse(new File(rarFile, "META-INF/" + QuickJarsTxtParser.FILE_NAME)); + if (configurer != null) { + ClassLoaderConfigurer.Helper.configure(classPath, configurer); + } + final URL[] urls = classPath.toArray(new URL[classPath.size()]); final ClassLoader appClassLoader = ClassLoaderUtil.createTempClassLoader(appId, urls, parentClassLoader); Modified: tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/config/QuickJarsTxtParser.java URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/config/QuickJarsTxtParser.java?rev=1457261&r1=1457260&r2=1457261&view=diff ============================================================================== --- tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/config/QuickJarsTxtParser.java (original) +++ tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/config/QuickJarsTxtParser.java Sat Mar 16 15:13:22 2013 @@ -16,19 +16,11 @@ */ package org.apache.openejb.config; -import org.apache.openejb.loader.Files; -import org.apache.openejb.loader.IO; -import org.apache.openejb.loader.ProvisioningUtil; +import org.apache.openejb.classloader.ClassLoaderConfigurer; +import org.apache.openejb.classloader.ProvisioningClassLoaderConfigurer; import org.apache.openejb.loader.SystemInstance; -import org.apache.openejb.util.LogCategory; -import org.apache.openejb.util.Logger; -import java.io.BufferedReader; import java.io.File; -import java.io.FileReader; -import java.net.URL; -import java.util.ArrayList; -import java.util.Collection; public final class QuickJarsTxtParser { private static final boolean ACTIVATED = SystemInstance.get().getOptions().get("openejb.jarstxt.activated", true); @@ -39,33 +31,13 @@ public final class QuickJarsTxtParser { // no-op } - public static Collection<URL> parse(final File file) { + public static ClassLoaderConfigurer parse(final File file) { if (!ACTIVATED || !file.exists()) { - return new ArrayList<URL>(); // need to be modifiable + return null; } - final Collection<URL> deps = new ArrayList<URL>(); - - BufferedReader reader = null; - try { - reader = new BufferedReader(new FileReader(file)); - - String line; - while ((line = reader.readLine()) != null) { - final String value = line.trim(); - if (line.startsWith("#") || value.isEmpty()) { - continue; - } - - deps.addAll(Files.listJars(new File(ProvisioningUtil.realLocation(value)).getAbsolutePath())); - } - } catch (final Throwable e) { - Logger.getInstance(LogCategory.OPENEJB, QuickContextXmlParser.class.getName()) - .warning("QuickJarsTxtParser#parse: Failed to read provided stream"); - } finally { - IO.close(reader); - } - - return deps; + final ProvisioningClassLoaderConfigurer configurer = new ProvisioningClassLoaderConfigurer(); + configurer.setConfiguration(file.getAbsolutePath()); + return configurer; } } Modified: tomee/tomee/trunk/container/openejb-loader/src/main/java/org/apache/openejb/loader/ProvisioningUtil.java URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-loader/src/main/java/org/apache/openejb/loader/ProvisioningUtil.java?rev=1457261&r1=1457260&r2=1457261&view=diff ============================================================================== --- tomee/tomee/trunk/container/openejb-loader/src/main/java/org/apache/openejb/loader/ProvisioningUtil.java (original) +++ tomee/tomee/trunk/container/openejb-loader/src/main/java/org/apache/openejb/loader/ProvisioningUtil.java Sat Mar 16 15:13:22 2013 @@ -51,12 +51,11 @@ public class ProvisioningUtil { } public static String cache() { - return System.getProperty(OPENEJB_DEPLOYER_CACHE_FOLDER, "temp"); + return System.getProperty(OPENEJB_DEPLOYER_CACHE_FOLDER, new File(System.getProperty("openejb.base", "."), "temp").getAbsolutePath()); } public static File cacheFile(final String path) { - return new File(SystemInstance.get().getBase().getDirectory(), - cache() + File.separator + path); + return new File(SystemInstance.get().getBase().getDirectory(), cache() + File.separator + path); } public static String copyTryingProxies(final URI source, final File destination) throws Exception { @@ -99,6 +98,9 @@ public class ProvisioningUtil { public static String realLocation(final String rawLocation) { if (rawLocation.startsWith(HTTP_PREFIX)) { final File file = cacheFile(lastPart(rawLocation)); + if (file.exists()) { + return file.getAbsolutePath(); + } String path = null; try { Modified: tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/LazyStopWebappClassLoader.java URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/LazyStopWebappClassLoader.java?rev=1457261&r1=1457260&r2=1457261&view=diff ============================================================================== --- tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/LazyStopWebappClassLoader.java (original) +++ tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/LazyStopWebappClassLoader.java Sat Mar 16 15:13:22 2013 @@ -19,7 +19,6 @@ package org.apache.tomee.catalina; import org.apache.catalina.Context; import org.apache.catalina.LifecycleException; import org.apache.catalina.loader.WebappClassLoader; -import org.apache.openejb.ClassLoaderUtil; import org.apache.openejb.OpenEJB; import org.apache.openejb.classloader.ClassLoaderConfigurer; import org.apache.openejb.classloader.WebAppEnricher; @@ -36,6 +35,7 @@ import java.util.Enumeration; public class LazyStopWebappClassLoader extends WebappClassLoader { private static final Logger LOGGER = Logger.getInstance(LogCategory.OPENEJB, LazyStopWebappClassLoader.class.getName()); + private static final ThreadLocal<ClassLoaderConfigurer> INIT_CONFIGURER = new ThreadLocal<ClassLoaderConfigurer>(); public static final String TOMEE_WEBAPP_FIRST = "tomee.webapp-first"; @@ -55,7 +55,7 @@ public class LazyStopWebappClassLoader e private void construct() { setDelegate(isDelegate()); - configurer = ClassLoaderUtil.configurer(LazyStopWebappLoader.getCurrentAppId()); + configurer = INIT_CONFIGURER.get(); } @Override @@ -137,7 +137,7 @@ public class LazyStopWebappClassLoader e if (configurer != null) { // add now we removed all we wanted final URL[] enrichment = configurer.additionalURLs(); - for (URL url : enrichment) { + for (final URL url : enrichment) { super.addURL(url); } } @@ -193,6 +193,14 @@ public class LazyStopWebappClassLoader e return "LazyStop" + super.toString(); } + public static void initContext(final ClassLoaderConfigurer configurer) { + INIT_CONFIGURER.set(configurer); + } + + public static void cleanInitContext() { + INIT_CONFIGURER.remove(); + } + private static class NoClassClassLoader extends ClassLoader { private static final NoClassClassLoader INSTANCE = new NoClassClassLoader(); Modified: tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/ProvisioningWebappLoader.java URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/ProvisioningWebappLoader.java?rev=1457261&r1=1457260&r2=1457261&view=diff ============================================================================== --- tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/ProvisioningWebappLoader.java (original) +++ tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/ProvisioningWebappLoader.java Sat Mar 16 15:13:22 2013 @@ -19,13 +19,15 @@ package org.apache.tomee.catalina; import org.apache.catalina.Context; import org.apache.catalina.LifecycleException; +import org.apache.catalina.loader.VirtualWebappLoader; +import org.apache.openejb.ClassLoaderUtil; +import org.apache.openejb.classloader.ClassLoaderConfigurer; +import org.apache.openejb.classloader.CompositeClassLoaderConfigurer; import org.apache.openejb.config.QuickJarsTxtParser; import org.apache.openejb.loader.ProvisioningUtil; -import org.apache.openejb.util.URLs; import org.apache.openejb.util.reflection.Reflections; import java.io.File; -import java.net.URL; /** * Usage example in META-INF/context.xml @@ -42,7 +44,23 @@ import java.net.URL; * */ -public class ProvisioningWebappLoader extends LazyStopWebappLoader { +public class ProvisioningWebappLoader extends VirtualWebappLoader { + @Override + public void backgroundProcess() { + final ClassLoader classloader = super.getClassLoader(); + if (classloader instanceof LazyStopWebappClassLoader) { + final LazyStopWebappClassLoader lazyStopWebappClassLoader = (LazyStopWebappClassLoader) classloader; + lazyStopWebappClassLoader.restarting(); + try { + super.backgroundProcess(); + } finally { + lazyStopWebappClassLoader.restarted(); + } + } else { + super.backgroundProcess(); + } + } + @Override protected void startInternal() throws LifecycleException { // standard tomcat part @@ -54,14 +72,15 @@ public class ProvisioningWebappLoader ex } } + ClassLoaderConfigurer configurer = ClassLoaderUtil.configurer(getContainer().getName()); + // WEB-INF/jars.xml if (Context.class.isInstance(getContainer())) { final File war = Contexts.warPath(Context.class.cast(getContainer())); final File jarsXml = new File(war, "WEB-INF/" + QuickJarsTxtParser.FILE_NAME); - if (jarsXml.exists()) { - for (final URL url : QuickJarsTxtParser.parse(jarsXml)) { - builder.append(URLs.toFile(url)).append(";"); // provisiningutil already called so simply decode url - } + final ClassLoaderConfigurer configurerTxt = QuickJarsTxtParser.parse(jarsXml); + if (configurerTxt != null) { + configurer = new CompositeClassLoaderConfigurer(configurer, configurerTxt); } } @@ -72,6 +91,16 @@ public class ProvisioningWebappLoader ex } Reflections.set(this, "virtualClasspath", cp); - super.startInternal(); + LazyStopWebappClassLoader.initContext(configurer); + try { + super.startInternal(); + } finally { + LazyStopWebappClassLoader.cleanInitContext(); + } + } + + @Override + public String toString() { + return "Provisioning" + super.toString(); } } 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=1457261&r1=1457260&r2=1457261&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 15:13:22 2013 @@ -939,7 +939,7 @@ public class TomcatWebAppBuilder impleme return; } - if (standardContextLoader != null && LazyStopWebappLoader.class.isInstance(standardContextLoader)) { + if (standardContextLoader != null && ProvisioningWebappLoader.class.isInstance(standardContextLoader)) { standardContextLoader.setContainer(standardContext); return; // no need to replace the loader }