You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tomee.apache.org by rm...@apache.org on 2014/07/20 15:25:07 UTC

svn commit: r1612084 - in /tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina: LazyStopWebappClassLoader.java naming/resources/EmptyDirContext.java

Author: rmannibucau
Date: Sun Jul 20 13:25:07 2014
New Revision: 1612084

URL: http://svn.apache.org/r1612084
Log:
EmptyDirContext should support scanning of @Web

Modified:
    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/naming/resources/EmptyDirContext.java

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=1612084&r1=1612083&r2=1612084&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 Sun Jul 20 13:25:07 2014
@@ -39,6 +39,7 @@ import java.util.Collection;
 import java.util.Collections;
 import java.util.Enumeration;
 import java.util.Iterator;
+import java.util.LinkedList;
 
 public class LazyStopWebappClassLoader extends WebappClassLoader {
     private static final Logger LOGGER = Logger.getInstance(LogCategory.OPENEJB, LazyStopWebappClassLoader.class.getName());
@@ -51,6 +52,7 @@ public class LazyStopWebappClassLoader e
     private boolean forceStopPhase = Boolean.parseBoolean(SystemInstance.get().getProperty("tomee.webappclassloader.force-stop-phase", "false"));
     private ClassLoaderConfigurer configurer;
     private final int hashCode;
+    private Collection<File> additionalRepos;
 
     public LazyStopWebappClassLoader() {
         j2seClassLoader = getSystemClassLoader();
@@ -77,6 +79,11 @@ public class LazyStopWebappClassLoader e
         }
     }
 
+    public Collection<File> getAdditionalRepos() {
+        initAdditionalRepos();
+        return additionalRepos;
+    }
+
     @Override
     public Class<?> loadClass(final String name) throws ClassNotFoundException {
         if ("org.apache.openejb.hibernate.OpenEJBJtaPlatform".equals(name)
@@ -158,17 +165,12 @@ public class LazyStopWebappClassLoader e
         return restarting;
     }
 
-    // embeddeding implementation of sthg (JPA, JSF) can lead to classloading issues if we don't enrich the webapp
-    // with our integration jars
-    // typically the class will try to be loaded by the common classloader
-    // but the interface implemented or the parent class
-    // will be in the webapp
-    @Override
-    public void start() throws LifecycleException {
-        super.start(); // do it first otherwise we can't use this as classloader
-
-        // mainly for tomee-maven-plugin
+    public synchronized void initAdditionalRepos() {
+        if (additionalRepos != null) {
+            return;
+        }
         if (CONTEXT.get() != null) {
+            additionalRepos = new LinkedList<>();
             final String root = CONTEXT.get().getServletContext().getRealPath("/");
             if (root != null) {
                 final String externalRepositories = SystemInstance.get().getProperty("tomee." + new File(root).getName() + ".externalRepositories");
@@ -177,16 +179,35 @@ public class LazyStopWebappClassLoader e
                     for (final String additional : externalRepositories.split(",")) {
                         final String trim = additional.trim();
                         if (!trim.isEmpty()) {
-                            try { // not addURL to look here first
-                                super.addRepository(new File(trim).toURI().toURL().toExternalForm());
-                            } catch (final MalformedURLException e) {
-                                LOGGER.error(e.getMessage());
-                            }
+                            final File file = new File(trim);
+                            additionalRepos.add(file);
                         }
                     }
                 }
             }
         }
+    }
+
+    // embeddeding implementation of sthg (JPA, JSF) can lead to classloading issues if we don't enrich the webapp
+    // with our integration jars
+    // typically the class will try to be loaded by the common classloader
+    // but the interface implemented or the parent class
+    // will be in the webapp
+    @Override
+    public void start() throws LifecycleException {
+        super.start(); // do it first otherwise we can't use this as classloader
+
+        // mainly for tomee-maven-plugin
+        initAdditionalRepos();
+        if (additionalRepos != null) {
+            for (final File f : additionalRepos) {
+                try { // not addURL to look here first
+                    super.addRepository(f.toURI().toURL().toExternalForm());
+                } catch (final MalformedURLException e) {
+                    LOGGER.error(e.getMessage());
+                }
+            }
+        }
 
         // add configurer enrichments
         if (configurer != null) {

Modified: tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/naming/resources/EmptyDirContext.java
URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/naming/resources/EmptyDirContext.java?rev=1612084&r1=1612083&r2=1612084&view=diff
==============================================================================
--- tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/naming/resources/EmptyDirContext.java (original)
+++ tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/naming/resources/EmptyDirContext.java Sun Jul 20 13:25:07 2014
@@ -18,8 +18,10 @@ package org.apache.tomee.catalina.naming
 
 import org.apache.catalina.core.StandardContext;
 import org.apache.naming.resources.FileDirContext;
+import org.apache.tomee.catalina.LazyStopWebappClassLoader;
 
 import java.io.File;
+import java.util.Collection;
 
 // we need a FileDirContext (so doesn't work with not exploded wars) for boot time
 // note lifecycle is a quick one mainly used internally, other listeners are not intended to be used
@@ -50,6 +52,14 @@ public class EmptyDirContext extends Fil
         if (shouldLookup(name)) {
             return super.file(name);
         }
+        if ("/WEB-INF/classes".equals(name)) {
+            if (context.getLoader() != null && LazyStopWebappClassLoader.class.isInstance(context.getLoader().getClassLoader())) {
+                final Collection<File> repos = LazyStopWebappClassLoader.class.cast(context.getLoader().getClassLoader()).getAdditionalRepos();
+                if (repos != null && !repos.isEmpty()) {
+                    return repos.iterator().next();
+                }
+            }
+        }
         return null;
     }