Author: rmannibucau
Date: Sun Jul 1 16:53:09 2012
New Revision: 1355952
URL: http://svn.apache.org/viewvc?rev=1355952&view=rev
Log:
TOMEE-261 enriching webapp classloaders with jpa integration and jsf jars
Added:
openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomEEClassLoaderHelper.java
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/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=1355952&r1=1355951&r2=1355952&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 16:53:09 2012
@@ -20,6 +20,8 @@ import org.apache.catalina.LifecycleExce
import org.apache.catalina.loader.WebappClassLoader;
import org.apache.openejb.loader.SystemInstance;
+import java.net.URL;
+
public class LazyStopWebappClassLoader extends WebappClassLoader {
public static final String TOMEE_WEBAPP_FIRST = "tomee.webapp-first";
@@ -59,4 +61,17 @@ public class LazyStopWebappClassLoader e
public boolean isRestarting() {
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 {
+ for (URL url :
TomEEClassLoaderHelper.tomEEWebappIntegrationLibraries()) {
+ addURL(url);
+ }
+ super.start();
+ }
}
Added:
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=1355952&view=auto
==============================================================================
---
openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomEEClassLoaderHelper.java
(added)
+++
openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomEEClassLoaderHelper.java
Sun Jul 1 16:53:09 2012
@@ -0,0 +1,66 @@
+package org.apache.tomee.catalina;
+
+import org.apache.openejb.OpenEJB;
+import org.apache.openejb.loader.SystemInstance;
+
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+
+public final class TomEEClassLoaderHelper {
+ public static final String TOMEE_WEBAPP_CLASSLOADER_ENRICHMENT_SKIP =
"tomee.webapp.classloader.enrichment.skip";
+ public static final String TOMEE_WEBAPP_CLASSLOADER_ENRICHMENT =
"tomee.webapp.classloader.enrichment";
+
+ 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",
+
+ // JPA integration: mainly JTA integration
+ "org.apache.openejb.jpa.integration.MakeTxLookup"
+ };
+ private static final String[] JAR_TO_ADD_CLASS_HELPERS;
+
+ static {
+ final Collection<String> classes = new ArrayList<String>();
+ if
(!SystemInstance.get().getOptions().get(TOMEE_WEBAPP_CLASSLOADER_ENRICHMENT_SKIP,
false)) {
+ classes.addAll(Arrays.asList(DEFAULT_JAR_TO_ADD_CLASS_HELPERS));
+
+ final String additionalEnrichments =
SystemInstance.get().getOptions().get(TOMEE_WEBAPP_CLASSLOADER_ENRICHMENT, "");
+ if (additionalEnrichments != null &&
!additionalEnrichments.isEmpty()) {
+ for (String name : additionalEnrichments.split(",")) {
+ classes.add(name.trim());
+ }
+ }
+ }
+ JAR_TO_ADD_CLASS_HELPERS = classes.toArray(new String[classes.size()]);
+ }
+
+ private TomEEClassLoaderHelper() {
+ // no-op
+ }
+
+ public static URL[] tomEEWebappIntegrationLibraries() {
+ final ClassLoader cl = TomEEClassLoaderHelper.class.getClassLoader();
// reference classloader = standardclassloader
+ final Collection<URL> urls = new ArrayList<URL>();
+ 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;
+ }
+
+ final URL url =
clazz.getProtectionDomain().getCodeSource().getLocation();
+ if (url == null) {
+ continue;
+ }
+
+ urls.add(url);
+ } catch (Exception e) {
+ // ignore
+ }
+ }
+ return urls.toArray(new URL[urls.size()]);
+ }
+}
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=1355952&r1=1355951&r2=1355952&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 16:53:09 2012
@@ -126,12 +126,24 @@ public class TomEEWebappLoader extends W
private final HashMap<Class, Object> components = new HashMap<Class,
Object>();
public TomEEClassLoader(final String appId, final ClassLoader appCl,
final WebappClassLoader webappCl) {
- super(webappCl.getURLs(), webappCl); // in fact this classloader =
webappclassloader since we add nothing to this
+ super(enrichedUrls(webappCl.getURLs()), 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) {
+ final URL[] additional =
TomEEClassLoaderHelper.tomEEWebappIntegrationLibraries();
+ final URL[] urls = new URL[urLs.length + additional.length];
+ for (int i = 0; i < urLs.length; i++) {
+ urls[i] = urLs[i];
+ }
+ for (int i = 0; i < additional.length; i++) {
+ urls[urLs.length + i] = additional[i];
+ }
+ return urls;
+ }
+
public <T> T getComponent(final Class<T> type) {
return (T) components.get(type);
}