Author: rmannibucau
Date: Sun Jul  1 22:39:33 2012
New Revision: 1356039

URL: http://svn.apache.org/viewvc?rev=1356039&view=rev
Log:
TOMEE-264 adding hooks to filter spec jar from webapp. This commit filter JTA 
and JPA.

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
    
openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatWebAppBuilder.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=1356039&r1=1356038&r2=1356039&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
 Sun Jul  1 22:39:33 2012
@@ -20,6 +20,8 @@ import org.apache.catalina.LifecycleExce
 import org.apache.catalina.loader.WebappClassLoader;
 import org.apache.openejb.loader.SystemInstance;
 
+import java.io.File;
+import java.io.IOException;
 import java.net.URL;
 
 public class LazyStopWebappClassLoader extends WebappClassLoader {
@@ -74,4 +76,12 @@ public class LazyStopWebappClassLoader e
         }
         super.start();
     }
+
+    @Override
+    protected boolean validateJarFile(File file) throws IOException {
+        if (!super.validateJarFile(file)) {
+            return false;
+        }
+        return TomEEClassLoaderHelper.validateJarFile(file);
+    }
 }

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=1356039&r1=1356038&r2=1356039&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
 Sun Jul  1 22:39:33 2012
@@ -19,22 +19,37 @@ package org.apache.tomee.catalina;
 import org.apache.openejb.OpenEJB;
 import org.apache.openejb.loader.JarLocation;
 import org.apache.openejb.loader.SystemInstance;
+import org.apache.openejb.util.LogCategory;
+import org.apache.openejb.util.Logger;
 import org.apache.tomee.installer.Paths;
 
 import java.io.File;
+import java.io.IOException;
 import java.net.MalformedURLException;
 import java.net.URL;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
+import java.util.jar.JarEntry;
+import java.util.jar.JarFile;
 
 public final class TomEEClassLoaderHelper {
+    private static final Logger LOGGER = 
Logger.getInstance(LogCategory.OPENEJB, TomEEClassLoaderHelper.class);
+
+    private TomEEClassLoaderHelper() {
+        // no-op
+    }
+
+    /**
+     * Enrichement part
+     */
+
     public static final String TOMEE_WEBAPP_CLASSLOADER_ENRICHMENT_SKIP = 
"tomee.webapp.classloader.enrichment.skip";
 
     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[]{
             // 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",
@@ -44,7 +59,7 @@ public final class TomEEClassLoaderHelpe
     };
     private static final String[] JAR_TO_ADD_CLASS_HELPERS;
 
-    private static final String[] DEFAULT_PREFIXES_TO_ADD = new String[] {
+    private static final String[] DEFAULT_PREFIXES_TO_ADD = new String[]{
             "tomee-mojarra"
     };
     private static final String[] PREFIXES_TO_ADD;
@@ -73,10 +88,6 @@ public final class TomEEClassLoaderHelpe
         PREFIXES_TO_ADD = prefixes.toArray(new String[prefixes.size()]);
     }
 
-    private TomEEClassLoaderHelper() {
-        // no-op
-    }
-
     public static URL[] tomEEWebappIntegrationLibraries() {
         final Collection<URL> urls = new ArrayList<URL>();
 
@@ -115,4 +126,46 @@ public final class TomEEClassLoaderHelpe
 
         return urls.toArray(new URL[urls.size()]);
     }
+
+    /**
+     * Validation part
+     */
+    private static final String[] FORBIDDEN_CLASSES = new String[]{
+            "javax.persistence.Entity", // JPA
+            "javax.transaction.Transaction" // JTA
+    };
+
+    public static boolean validateJarFile(final File file) throws IOException {
+        final ClassLoader parent = 
TomEEClassLoaderHelper.class.getClassLoader();
+
+        JarFile jarFile = null;
+
+        try {
+            jarFile = new JarFile(file);
+            for (String name : FORBIDDEN_CLASSES) {
+                try { // if we can't load if from our classloader we'll not 
impose anything on this class
+                    parent.loadClass(name);
+                } catch (Exception e) {
+                    continue;
+                }
+
+                final String entry = name.replace('.', '/') + ".class";
+                final JarEntry jarEntry = jarFile.getJarEntry(entry);
+                if (jarEntry != null) {
+                    LOGGER.warning("jar '" + file.getAbsolutePath() + "' 
contains offending class: " + name
+                                                + ". It will be ignored.");
+                    return false;
+                }
+            }
+            return true;
+        } finally {
+            if (jarFile != null) {
+                try {
+                    jarFile.close();
+                } catch (IOException ioe) {
+                    // Ignored
+                }
+            }
+        }
+    }
 }

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=1356039&r1=1356038&r2=1356039&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
 Sun Jul  1 22:39:33 2012
@@ -30,8 +30,6 @@ import org.apache.catalina.loader.Webapp
 import org.apache.catalina.mbeans.MBeanUtils;
 import org.apache.naming.resources.DirContextURLStreamHandler;
 import org.apache.openejb.ClassLoaderUtil;
-import org.apache.openejb.loader.event.ComponentAdded;
-import org.apache.openejb.loader.event.ComponentRemoved;
 import org.apache.openejb.util.ArrayEnumeration;
 import org.apache.openejb.util.URLs;
 import org.apache.tomcat.util.ExceptionUtils;
@@ -123,7 +121,6 @@ public class TomEEWebappLoader extends W
         private ClassLoader app;
         private WebappClassLoader webapp;
         private String appPath;
-        private final HashMap<Class, Object> components = new HashMap<Class, 
Object>();
 
         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
@@ -133,10 +130,34 @@ public class TomEEWebappLoader extends W
         }
 
         private static URL[] enrichedUrls(final URL[] urLs) {
+            final List<Integer> skipped = new ArrayList<Integer>();
+
+            // while we are here validate the urls regading tomee rules
+            for (int i = 0; i < urLs.length; i++) {
+                final File file;
+                try {
+                    file = URLs.toFile(urLs[i]);
+                } catch (IllegalStateException ise) {
+                    continue;
+                }
+
+                try {
+                    if (!TomEEClassLoaderHelper.validateJarFile(file)) {
+                        skipped.add(i);
+                    }
+                } catch (IOException e) {
+                    // ignored
+                }
+            }
+
             final URL[] additional = 
TomEEClassLoaderHelper.tomEEWebappIntegrationLibraries();
-            final URL[] urls = new URL[urLs.length + additional.length];
+            final URL[] urls = new URL[urLs.length + additional.length - 
skipped.size()];
             for (int i = 0; i < urLs.length; i++) {
-                urls[i] = urLs[i];
+                if (!skipped.contains(i)) {
+                    urls[i] = urLs[i];
+                } else {
+                    i--;
+                }
             }
             for (int i = 0; i < additional.length; i++) {
                 urls[urLs.length + i] = additional[i];
@@ -144,21 +165,6 @@ public class TomEEWebappLoader extends W
             return urls;
         }
 
-        public <T> T getComponent(final Class<T> type) {
-            return (T) components.get(type);
-        }
-
-        public <T> T removeComponent(final Class<T> type) {
-            return (T) components.remove(type);
-        }
-
-        /**
-         * @param type the class type of the component required
-         */
-        public <T> T setComponent(final Class<T> type, final T value) {
-            return (T) components.put(type, value);
-        }
-
         /**
          * we totally override this method to be able to remove duplicated 
resources.
          *

Modified: 
openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatWebAppBuilder.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatWebAppBuilder.java?rev=1356039&r1=1356038&r2=1356039&view=diff
==============================================================================
--- 
openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatWebAppBuilder.java
 (original)
+++ 
openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatWebAppBuilder.java
 Sun Jul  1 22:39:33 2012
@@ -511,6 +511,9 @@ public class TomcatWebAppBuilder impleme
      */
     @Override
     public void init(final StandardContext standardContext) {
+        // just adding a carriage return to get logs more readable
+        logger.info("-------------------------\nTomcatWebAppBuilder.init " + 
standardContext.getPath());
+
         
standardContext.setCrossContext(SystemInstance.get().getOptions().get(OPENEJB_CROSSCONTEXT_PROPERTY,
 false));
         standardContext.setNamingResources(new OpenEJBNamingResource());
 
@@ -650,8 +653,6 @@ public class TomcatWebAppBuilder impleme
      */
 //    @Override
     private void startInternal(final StandardContext standardContext) {
-        // just adding a carriage return to get logs more readable
-        logger.info("-------------------------\nTomcatWebAppBuilder.start " + 
standardContext.getPath());
         if (isIgnored(standardContext)) return;
 
         final CoreContainerSystem cs = getContainerSystem();


Reply via email to