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;