Author: rmannibucau
Date: Thu Jul  5 20:21:15 2012
New Revision: 1357871

URL: http://svn.apache.org/viewvc?rev=1357871&view=rev
Log:
TOMEE-261 better filtering to enrich webapps to avoid to have multipe time the 
same classes

Modified:
    
openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/LazyStopWebappClassLoader.java
    
openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomEEClassLoaderHelper.java
    
openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomEEWebappLoader.java

Modified: 
openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/LazyStopWebappClassLoader.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/LazyStopWebappClassLoader.java?rev=1357871&r1=1357870&r2=1357871&view=diff
==============================================================================
--- 
openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/LazyStopWebappClassLoader.java
 (original)
+++ 
openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/LazyStopWebappClassLoader.java
 Thu Jul  5 20:21:15 2012
@@ -71,10 +71,10 @@ public class LazyStopWebappClassLoader e
     // will be in the webapp
     @Override
     public void start() throws LifecycleException {
-        for (URL url : 
TomEEClassLoaderHelper.tomEEWebappIntegrationLibraries())  {
+        super.start(); // do it first otherwise we can't use this as 
classloader
+        for (URL url : 
TomEEClassLoaderHelper.tomEEWebappIntegrationLibraries(this))  {
             addURL(url);
         }
-        super.start();
     }
 
     @Override

Modified: 
openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomEEClassLoaderHelper.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomEEClassLoaderHelper.java?rev=1357871&r1=1357870&r2=1357871&view=diff
==============================================================================
--- 
openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomEEClassLoaderHelper.java
 (original)
+++ 
openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomEEClassLoaderHelper.java
 Thu Jul  5 20:21:15 2012
@@ -49,18 +49,16 @@ public final class TomEEClassLoaderHelpe
     public static final String TOMEE_WEBAPP_CLASSLOADER_ENRICHMENT_CLASSES = 
"tomee.webapp.classloader.enrichment.classes";
     public static final String TOMEE_WEBAPP_CLASSLOADER_ENRICHMENT_PREFIXES = 
"tomee.webapp.classloader.enrichment.prefixes";
 
-    private static final String[] DEFAULT_JAR_TO_ADD_CLASS_HELPERS = new 
String[]{
+    private static final String[] DEFAULT_JAR_TO_ADD_CLASS_HELPERS = new 
String[] { // put here only classes which needs classloading check
             // openejb-jsf and openwebbeans-jsf to be able to embedded the jsf 
impl keeping CDI features
             "org.apache.openejb.jsf.CustomApplicationFactory",
-            "org.apache.webbeans.jsf.OwbApplicationFactory",
-
-            // JPA integration: mainly JTA integration
-            "org.apache.openejb.jpa.integration.MakeTxLookup",
+            "org.apache.webbeans.jsf.OwbApplicationFactory"
     };
     private static final String[] JAR_TO_ADD_CLASS_HELPERS;
 
-    private static final String[] DEFAULT_PREFIXES_TO_ADD = new String[]{
-            "tomee-mojarra"
+    private static final String[] DEFAULT_PREFIXES_TO_ADD = new String[] { // 
always added
+            "tomee-mojarra",
+            "openejb-jpa-integration"
     };
     private static final String[] PREFIXES_TO_ADD;
 
@@ -88,26 +86,61 @@ public final class TomEEClassLoaderHelpe
         PREFIXES_TO_ADD = prefixes.toArray(new String[prefixes.size()]);
     }
 
-    public static URL[] tomEEWebappIntegrationLibraries() {
+    public static URL[] tomEEWebappIntegrationLibraries(final ClassLoader 
appCl) { // TODO: refactor with an interface: isActive(), addJar(List<URL>)
         final Collection<URL> urls = new ArrayList<URL>();
 
         // from class
         final ClassLoader cl = TomEEClassLoaderHelper.class.getClassLoader(); 
// reference classloader = standardclassloader
-        for (String name : JAR_TO_ADD_CLASS_HELPERS) {
-            try {
-                final Class<?> clazz = cl.loadClass(name);
-                if 
(!clazz.getClassLoader().equals(OpenEJB.class.getClassLoader())) { // already 
provided?
-                    continue;
-                }
+        if (cl != appCl && appCl != null) {
+            for (String name : JAR_TO_ADD_CLASS_HELPERS) {
+                try {
+                    final Class<?> clazz = cl.loadClass(name);
+                    if 
(!clazz.getClassLoader().equals(OpenEJB.class.getClassLoader())) { // already 
provided?
+                        continue;
+                    }
+
+                    // don't create a list here to loop only once to avoid to 
allocate memory for nothing
+
+                    boolean add = false;
+                    for (Class<?> itf : clazz.getInterfaces()) {
+                        try {
+                            final Class<?> tcclLoaded = 
appCl.loadClass(itf.getName());
+                            if (!tcclLoaded.getClassLoader().equals(cl)) {
+                                add = true;
+                                break;
+                            }
+                        } catch (Exception e) {
+                            // ignored
+                        }
+                    }
+
+                    Class<?> current = clazz.getSuperclass();
+                    while (current != null && !Object.class.equals(current)) {
+                        try {
+                            final Class<?> tcclLoaded = 
appCl.loadClass(current.getName());
+                            if (!tcclLoaded.getClassLoader().equals(cl)) {
+                                add = true;
+                                break;
+                            }
+                        } catch (Exception cnfe) {
+                            // ignored
+                        }
+                        current = current.getSuperclass();
+                    }
+
+                    if (!add) {
+                        continue;
+                    }
+
+                    final URL url = 
JarLocation.jarLocation(clazz).toURI().toURL();
+                    if (url == null) {
+                        continue;
+                    }
 
-                final URL url = JarLocation.jarLocation(clazz).toURI().toURL();
-                if (url == null) {
-                    continue;
+                    urls.add(url);
+                } catch (Exception e) {
+                    // ignore
                 }
-
-                urls.add(url);
-            } catch (Exception e) {
-                // ignore
             }
         }
 

Modified: 
openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomEEWebappLoader.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomEEWebappLoader.java?rev=1357871&r1=1357870&r2=1357871&view=diff
==============================================================================
--- 
openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomEEWebappLoader.java
 (original)
+++ 
openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomEEWebappLoader.java
 Thu Jul  5 20:21:15 2012
@@ -123,13 +123,13 @@ public class TomEEWebappLoader extends W
         private String appPath;
 
         public TomEEClassLoader(final String appId, final ClassLoader appCl, 
final WebappClassLoader webappCl) {
-            super(enrichedUrls(webappCl.getURLs()), webappCl); // in fact this 
classloader = webappclassloader since we add nothing to this
+            super(enrichedUrls(webappCl.getURLs(), webappCl), webappCl); // in 
fact this classloader = webappclassloader since we add nothing to this
             this.appPath = appId;
             this.app = appCl; // only used to manage resources since 
webapp.getParent() should be app
             this.webapp = webappCl;
         }
 
-        private static URL[] enrichedUrls(final URL[] urLs) {
+        private static URL[] enrichedUrls(final URL[] urLs, final ClassLoader 
cl) {
             final List<Integer> skipped = new ArrayList<Integer>();
 
             // while we are here validate the urls regading tomee rules
@@ -150,7 +150,7 @@ public class TomEEWebappLoader extends W
                 }
             }
 
-            final URL[] additional = 
TomEEClassLoaderHelper.tomEEWebappIntegrationLibraries();
+            final URL[] additional = 
TomEEClassLoaderHelper.tomEEWebappIntegrationLibraries(cl);
             final URL[] urls = new URL[urLs.length + additional.length - 
skipped.size()];
             for (int i = 0; i < urLs.length; i++) {
                 if (!skipped.contains(i)) {


Reply via email to