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
         }


Reply via email to