Author: rmannibucau
Date: Wed Jun 26 07:41:45 2013
New Revision: 1496805

URL: http://svn.apache.org/r1496805
Log:
TOMEE-983 TOMEE-984 allowing to use mojarra

Modified:
    
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/cdi/OptimizedLoaderService.java
    
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/cdi/ThreadSingletonServiceImpl.java
    
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/util/classloader/URLClassLoaderFirst.java
    
tomee/tomee/trunk/container/openejb-loader/src/main/java/org/apache/openejb/loader/JarLocation.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/OpenEJBContextConfig.java
    
tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomEEClassLoaderEnricher.java
    
tomee/tomee/trunk/tomee/tomee-myfaces/src/main/java/org/apache/tomee/myfaces/TomEEMyFacesContainerInitializer.java

Modified: 
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/cdi/OptimizedLoaderService.java
URL: 
http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/cdi/OptimizedLoaderService.java?rev=1496805&r1=1496804&r2=1496805&view=diff
==============================================================================
--- 
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/cdi/OptimizedLoaderService.java
 (original)
+++ 
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/cdi/OptimizedLoaderService.java
 Wed Jun 26 07:41:45 2013
@@ -23,6 +23,9 @@ import org.apache.webbeans.spi.LoaderSer
 import org.apache.webbeans.spi.plugins.OpenWebBeansPlugin;
 
 import javax.enterprise.inject.spi.Extension;
+import java.lang.reflect.InvocationHandler;
+import java.lang.reflect.Method;
+import java.lang.reflect.Proxy;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.List;
@@ -73,29 +76,67 @@ public class OptimizedLoaderService impl
         return list;
     }
 
-    private <T> List<T> loadWebBeansPlugins(ClassLoader loader) {
-        String[] knownPlugins = {
+    private <T> List<T> loadWebBeansPlugins(final ClassLoader loader) {
+        final String[] knownPlugins = {
                 "org.apache.openejb.cdi.CdiPlugin",
-                "org.apache.geronimo.openejb.cdi.GeronimoWebBeansPlugin",
-                "org.apache.webbeans.jsf.plugin.OpenWebBeansJsfPlugin",
+                "org.apache.geronimo.openejb.cdi.GeronimoWebBeansPlugin"
+        };
+        final String[] loaderAwareKnownPlugins = {
+                "org.apache.webbeans.jsf.plugin.OpenWebBeansJsfPlugin"
         };
 
         List<T> list = new ArrayList<T>();
-        for (String name : knownPlugins) {
-            Class<T> clazz;
+        for (final String name : knownPlugins) {
+            final Class<T> clazz;
             try {
                 clazz = (Class<T>) loader.loadClass(name);
-            } catch (ClassNotFoundException e) {
+            } catch (final ClassNotFoundException e) {
                 // ignore
                 continue;
             }
 
             try {
                 list.add(clazz.newInstance());
-            } catch (Exception e) {
+            } catch (final Exception e) {
+                log.error("Unable to load OpenWebBeansPlugin: " + name);
+            }
+        }
+        for (String name : knownPlugins) {
+            final Class<T> clazz;
+            try {
+                clazz = (Class<T>) loader.loadClass(name);
+            } catch (final ClassNotFoundException e) {
+                // ignore
+                continue;
+            }
+
+            try {
+                list.add((T) Proxy.newProxyInstance(loader, new Class<?>[]{ 
OpenWebBeansPlugin.class }, new ClassLoaderAwareHandler(clazz.newInstance(), 
loader)));
+            } catch (final Exception e) {
                 log.error("Unable to load OpenWebBeansPlugin: " + name);
             }
         }
         return list;
     }
+
+    private static class ClassLoaderAwareHandler implements InvocationHandler {
+        private final Object delegate;
+        private final ClassLoader loader;
+
+        private ClassLoaderAwareHandler(final Object delegate, final 
ClassLoader loader) {
+            this.delegate = delegate;
+            this.loader = loader;
+        }
+
+        @Override
+        public Object invoke(final Object proxy, final Method method, final 
Object[] args) throws Throwable {
+            final ClassLoader old = 
Thread.currentThread().getContextClassLoader();
+            Thread.currentThread().setContextClassLoader(loader);
+            try {
+                return method.invoke(delegate, args);
+            } finally {
+                Thread.currentThread().setContextClassLoader(old);
+            }
+        }
+    }
 }

Modified: 
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/cdi/ThreadSingletonServiceImpl.java
URL: 
http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/cdi/ThreadSingletonServiceImpl.java?rev=1496805&r1=1496804&r2=1496805&view=diff
==============================================================================
--- 
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/cdi/ThreadSingletonServiceImpl.java
 (original)
+++ 
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/cdi/ThreadSingletonServiceImpl.java
 Wed Jun 26 07:41:45 2013
@@ -175,14 +175,13 @@ public class ThreadSingletonServiceImpl 
     }
 
     private <T> void optional(final Map<Class<?>, Object> services, final 
Class<T> type, final String implementation) {
-        try {
-            final Class clazz = 
this.getClass().getClassLoader().loadClass(implementation);
+        try { // use TCCL since we can use webapp enrichment for services
+            final Class clazz = 
Thread.currentThread().getContextClassLoader().loadClass(implementation);
             services.put(type, type.cast(clazz.newInstance()));
-
             logger.debug(String.format("CDI Service Installed: %s = %s", 
type.getName(), implementation));
-        } catch (ClassNotFoundException e) {
+        } catch (final ClassNotFoundException e) {
             logger.debug(String.format("CDI Service not installed: %s", 
type.getName()));
-        } catch (Exception e) {
+        } catch (final Exception e) {
             throw new IllegalStateException(e);
         }
     }
@@ -193,7 +192,7 @@ public class ThreadSingletonServiceImpl 
         //from CDI builder
         configuration.setProperty(SecurityService.class.getName(), 
ManagedSecurityService.class.getName());
         
configuration.setProperty(OpenWebBeansConfiguration.INTERCEPTOR_FORCE_NO_CHECKED_EXCEPTIONS,
 "false");
-        //        
configuration.setProperty(OpenWebBeansConfiguration.APPLICATION_IS_JSP, "true");
+        // 
configuration.setProperty(OpenWebBeansConfiguration.APPLICATION_IS_JSP, "true");
 
         
configuration.setProperty(OpenWebBeansConfiguration.CONTAINER_LIFECYCLE, 
OpenEJBLifecycle.class.getName());
         
configuration.setProperty(OpenWebBeansConfiguration.TRANSACTION_SERVICE, 
OpenEJBTransactionService.class.getName());

Modified: 
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/util/classloader/URLClassLoaderFirst.java
URL: 
http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/util/classloader/URLClassLoaderFirst.java?rev=1496805&r1=1496804&r2=1496805&view=diff
==============================================================================
--- 
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/util/classloader/URLClassLoaderFirst.java
 (original)
+++ 
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/util/classloader/URLClassLoaderFirst.java
 Wed Jun 26 07:41:45 2013
@@ -359,7 +359,7 @@ public class URLClassLoaderFirst extends
         if (thisJSf == null) {
             return true;
         }
-        final URL containerJsf = loader.getResource(classname);
+        final URL containerJsf = parentLoader.getResource(classname);
         return containerJsf != null && thisJSf.equals(containerJsf);
 
     }

Modified: 
tomee/tomee/trunk/container/openejb-loader/src/main/java/org/apache/openejb/loader/JarLocation.java
URL: 
http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-loader/src/main/java/org/apache/openejb/loader/JarLocation.java?rev=1496805&r1=1496804&r2=1496805&view=diff
==============================================================================
--- 
tomee/tomee/trunk/container/openejb-loader/src/main/java/org/apache/openejb/loader/JarLocation.java
 (original)
+++ 
tomee/tomee/trunk/container/openejb-loader/src/main/java/org/apache/openejb/loader/JarLocation.java
 Wed Jun 26 07:41:45 2013
@@ -71,7 +71,7 @@ public class JarLocation {
         }
     }
 
-    private static File toFile(String classFileName, URL url) {
+    public static File toFile(String classFileName, URL url) {
         String path = url.getFile();
         path = path.substring(0, path.length() - classFileName.length());
         return new File(decode(path));

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=1496805&r1=1496804&r2=1496805&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
 Wed Jun 26 07:41:45 2013
@@ -103,7 +103,7 @@ public class LazyStopWebappClassLoader e
 
     @Override
     protected boolean filter(final String name) {
-        return false;
+        return URLClassLoaderFirst.shouldSkip(name);
     }
 
     public void internalStop() throws LifecycleException {

Modified: 
tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/OpenEJBContextConfig.java
URL: 
http://svn.apache.org/viewvc/tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/OpenEJBContextConfig.java?rev=1496805&r1=1496804&r2=1496805&view=diff
==============================================================================
--- 
tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/OpenEJBContextConfig.java
 (original)
+++ 
tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/OpenEJBContextConfig.java
 Wed Jun 26 07:41:45 2013
@@ -339,13 +339,21 @@ public class OpenEJBContextConfig extend
         // read the real config
         super.webConfig();
 
-        // add myfaces auto-initializer
+        // add myfaces auto-initializer if mojarra is not present
+        try {
+            
context.getLoader().getClassLoader().loadClass("com.sun.faces.context.SessionMap");
+            return;
+        } catch (final Throwable ignored) {
+            // no-op
+        }
         try {
             final Class<?> myfacesInitializer = 
Class.forName(MYFACES_TOMEEM_CONTAINER_INITIALIZER, true, 
context.getLoader().getClassLoader());
             final ServletContainerInitializer instance = 
(ServletContainerInitializer) myfacesInitializer.newInstance();
             context.addServletContainerInitializer(instance, 
getJsfClasses(context));
             context.addApplicationListener(TOMEE_MYFACES_CONTEXT_LISTENER); // 
cleanup listener
-        } catch (Exception ignored) {
+        } catch (final Exception ignored) {
+            // no-op
+        } catch (final NoClassDefFoundError error) {
             // no-op
         }
     }
@@ -458,7 +466,7 @@ public class OpenEJBContextConfig extend
     }
 
     private void internalProcessAnnotations(final File currentUrlAsFile, final 
WebAppInfo webAppInfo, final WebXml fragment, final boolean  handlesTypeOnly) {
-        for (ClassListInfo webAnnotated : webAppInfo.webAnnotatedClasses) {
+        for (final ClassListInfo webAnnotated : 
webAppInfo.webAnnotatedClasses) {
             try {
                 if (!isIncludedIn(webAnnotated.name, currentUrlAsFile)) {
                     continue;
@@ -542,11 +550,7 @@ public class OpenEJBContextConfig extend
             }
         }
 
-        if (classAsFile != null && classAsFile.getName().endsWith(".jar") && 
file.getName().endsWith(".jar")) {
-            // different jars
-            return false;
-        }
+        return !(classAsFile != null && classAsFile.getName().endsWith(".jar") 
&& file.getName().endsWith(".jar")) && !webInf;
 
-        return !webInf; // not in the file but not in a war too so use it
     }
 }

Modified: 
tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomEEClassLoaderEnricher.java
URL: 
http://svn.apache.org/viewvc/tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomEEClassLoaderEnricher.java?rev=1496805&r1=1496804&r2=1496805&view=diff
==============================================================================
--- 
tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomEEClassLoaderEnricher.java
 (original)
+++ 
tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomEEClassLoaderEnricher.java
 Wed Jun 26 07:41:45 2013
@@ -16,7 +16,6 @@
  */
 package org.apache.tomee.catalina;
 
-import org.apache.openejb.OpenEJB;
 import org.apache.openejb.classloader.WebAppEnricher;
 import org.apache.openejb.component.ClassLoaderEnricher;
 import org.apache.openejb.loader.JarLocation;
@@ -48,13 +47,10 @@ public final class TomEEClassLoaderEnric
     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_CLASSES_WHICH_CAN_BE_LOADED_FROM_APP_ONLY = new String[] {
-            // openwebbeans-jsf to be able to embedded the jsf impl keeping 
CDI features
-            "org.apache.webbeans.jsf.OwbApplicationFactory"
-    };
     private static final String[] JAR_TO_ADD_CLASS_HELPERS;
 
-    private static final String[] DEFAULT_PREFIXES_TO_ADD = new String[] { // 
always added since only used with loadClass
+    private static final String[] DEFAULT_PREFIXES_TO_ADD = new String[] {
+            "openwebbeans-jsf", // to be able to provide jsf impl
             "tomee-mojarra",
             "tomee-myfaces", // to be able to embedded myfaces in the webapp
             "openejb-jpa-integration" // to be able to embedded hibernate, 
eclipselinks....
@@ -66,7 +62,6 @@ public final class TomEEClassLoaderEnric
         final Collection<String> prefixes = new ArrayList<String>();
         if 
(!SystemInstance.get().getOptions().get(TOMEE_WEBAPP_CLASSLOADER_ENRICHMENT_SKIP,
 false)) {
             final String additionalEnrichments = 
SystemInstance.get().getOptions().get(TOMEE_WEBAPP_CLASSLOADER_ENRICHMENT_CLASSES,
 "");
-            
classes.addAll(Arrays.asList(DEFAULT_CLASSES_WHICH_CAN_BE_LOADED_FROM_APP_ONLY));
             if (additionalEnrichments != null && 
!additionalEnrichments.isEmpty()) {
                 for (String name : additionalEnrichments.split(",")) {
                     classes.add(name.trim());
@@ -92,54 +87,19 @@ public final class TomEEClassLoaderEnric
         // from class
         final ClassLoader cl = 
TomEEClassLoaderEnricher.class.getClassLoader(); // reference classloader = 
standardclassloader
         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?
+            for (final String name : JAR_TO_ADD_CLASS_HELPERS) {
+                try { // don't do anything with appCl otherwise in tomcat it 
will be broken since WebAppClassLoader caches missed resources
+                    final String classFileName = name.replace(".", "/") + 
".class";
+                    final URL parentUrl = cl.getResource(classFileName);
+                    final File file = jarLocation(parentUrl, classFileName);
+                    if (file == null) {
                         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;
-                    }
-
-                    urls.add(url);
-                } catch (Exception e) {
+                    urls.add(file.toURI().toURL());
+                } catch (final Exception e) {
                     // ignore
+                } catch (final NoClassDefFoundError error) {
+                    // no-op
                 }
             }
         }
@@ -163,6 +123,16 @@ public final class TomEEClassLoaderEnric
         return urls.toArray(new URL[urls.size()]);
     }
 
+    private static File jarLocation(final URL url, final String classFileName) 
throws MalformedURLException {
+        if ("jar".equals(url.getProtocol())) {
+            final String spec = url.getFile();
+            return new File(JarLocation.decode(new URL(spec.substring(0, 
spec.indexOf('!'))).getFile()));
+        } else if ("file".equals(url.getProtocol())) {
+            return JarLocation.toFile(classFileName, url);
+        }
+        return null;
+    }
+
     /**
      * Validation part
      */

Modified: 
tomee/tomee/trunk/tomee/tomee-myfaces/src/main/java/org/apache/tomee/myfaces/TomEEMyFacesContainerInitializer.java
URL: 
http://svn.apache.org/viewvc/tomee/tomee/trunk/tomee/tomee-myfaces/src/main/java/org/apache/tomee/myfaces/TomEEMyFacesContainerInitializer.java?rev=1496805&r1=1496804&r2=1496805&view=diff
==============================================================================
--- 
tomee/tomee/trunk/tomee/tomee-myfaces/src/main/java/org/apache/tomee/myfaces/TomEEMyFacesContainerInitializer.java
 (original)
+++ 
tomee/tomee/trunk/tomee/tomee-myfaces/src/main/java/org/apache/tomee/myfaces/TomEEMyFacesContainerInitializer.java
 Wed Jun 26 07:41:45 2013
@@ -64,6 +64,16 @@ public class TomEEMyFacesContainerInitia
             return;
         }
 
+        // if mojarra is present skip myfaces startup
+        try {
+            ctx.getClassLoader().loadClass("com.sun.faces.context.SessionMap");
+            return;
+        } catch (final ClassNotFoundException cnfe) {
+            // no-op
+        } catch (final NoClassDefFoundError error) {
+            // no-op
+        }
+
         // some message filtering, not a perf killer since this class don't 
log a lot
         final Logger abstractInitializerLogger = 
Logger.getLogger(AbstractFacesInitializer.class.getName());
         abstractInitializerLogger.setFilter(new RemoveLogMessage(
@@ -135,7 +145,7 @@ public class TomEEMyFacesContainerInitia
 
     // that's the reason why we fork: we don't want to consider our internal 
faces-config.xml
     // see delegate for details
-    private boolean isFacesConfigPresent(ServletContext servletContext) {
+    private boolean isFacesConfigPresent(final ServletContext servletContext) {
         try {
             if (servletContext.getResource("/WEB-INF/faces-config.xml") != 
null) {
                 return true;


Reply via email to