Author: rmannibucau
Date: Wed Oct 26 11:46:23 2011
New Revision: 1189142

URL: http://svn.apache.org/viewvc?rev=1189142&view=rev
Log:
TOMEE-42 TOMEE-43 adding a custom Loader to the standardcontext to be able to 
override the classloader used. In the tomcat deployement the classloader used 
by openejb is the stadnardcontext one so it is ok but in TomEE container (used 
by arquillian, DeployerEjb, tomee-embedded and TomEE EJBContainer) the 
classloader used is a classloader created by OpenEJB. So Class.isAssignable 
returns false when Foo.class.isAssignable(Foo.class) is called because 
classloaders are differents. - still to validate

Added:
    
openejb/trunk/openejb/assembly/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomEEWebappLoader.java
Modified:
    
openejb/trunk/openejb/assembly/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatWebAppBuilder.java

Added: 
openejb/trunk/openejb/assembly/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomEEWebappLoader.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb/assembly/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomEEWebappLoader.java?rev=1189142&view=auto
==============================================================================
--- 
openejb/trunk/openejb/assembly/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomEEWebappLoader.java
 (added)
+++ 
openejb/trunk/openejb/assembly/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomEEWebappLoader.java
 Wed Oct 26 11:46:23 2011
@@ -0,0 +1,36 @@
+package org.apache.tomee.catalina;
+
+import org.apache.catalina.LifecycleException;
+import org.apache.catalina.loader.WebappLoader;
+import org.apache.naming.resources.DirContextURLStreamHandler;
+import org.apache.tomcat.util.ExceptionUtils;
+
+/**
+ * simply override getClassLoader().
+ *
+ * Note: internally it still uses a webappclassloader.
+ *
+ * @author rmannibucau
+ */
+public class TomEEWebappLoader extends WebappLoader {
+    private ClassLoader appClassLoader;
+
+    public TomEEWebappLoader(ClassLoader classLoader) {
+        appClassLoader = classLoader;
+    }
+
+    @Override public ClassLoader getClassLoader() {
+        return appClassLoader;
+    }
+
+    @Override protected void startInternal() throws LifecycleException {
+        super.startInternal();
+        try {
+            // override the webappclassloader by the app classloader
+            DirContextURLStreamHandler.bind(appClassLoader, 
getContainer().getResources());
+        } catch (Throwable t) {
+            ExceptionUtils.handleThrowable(t);
+            throw new LifecycleException("start: ", t);
+        }
+    }
+}

Modified: 
openejb/trunk/openejb/assembly/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatWebAppBuilder.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb/assembly/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatWebAppBuilder.java?rev=1189142&r1=1189141&r2=1189142&view=diff
==============================================================================
--- 
openejb/trunk/openejb/assembly/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatWebAppBuilder.java
 (original)
+++ 
openejb/trunk/openejb/assembly/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatWebAppBuilder.java
 Wed Oct 26 11:46:23 2011
@@ -19,7 +19,10 @@ package org.apache.tomee.catalina;
 import org.apache.catalina.Container;
 import org.apache.catalina.Engine;
 import org.apache.catalina.Host;
+import org.apache.catalina.Lifecycle;
+import org.apache.catalina.LifecycleException;
 import org.apache.catalina.LifecycleListener;
+import org.apache.catalina.LifecycleState;
 import org.apache.catalina.Pipeline;
 import org.apache.catalina.Service;
 import org.apache.catalina.Valve;
@@ -35,12 +38,16 @@ import org.apache.catalina.deploy.Contex
 import org.apache.catalina.deploy.ContextResourceLink;
 import org.apache.catalina.deploy.ContextTransaction;
 import org.apache.catalina.deploy.NamingResources;
+import org.apache.catalina.loader.WebappLoader;
+import org.apache.catalina.mbeans.MBeanUtils;
 import org.apache.catalina.startup.Constants;
 import org.apache.catalina.startup.ContextConfig;
 import org.apache.catalina.startup.HostConfig;
 import org.apache.catalina.startup.RealmRuleSet;
 import org.apache.naming.ContextAccessController;
 import org.apache.naming.ContextBindings;
+import org.apache.naming.resources.DirContextURLStreamHandler;
+import org.apache.naming.resources.DirContextURLStreamHandlerFactory;
 import org.apache.openejb.AppContext;
 import org.apache.openejb.Injection;
 import org.apache.openejb.OpenEJB;
@@ -67,7 +74,9 @@ import org.apache.openejb.util.LinkResol
 import org.apache.openejb.util.LogCategory;
 import org.apache.openejb.util.Logger;
 import org.apache.tomcat.InstanceManager;
+import org.apache.tomcat.util.ExceptionUtils;
 import org.apache.tomcat.util.digester.Digester;
+import org.apache.tomcat.util.modeler.Registry;
 import org.apache.tomee.common.LegacyAnnotationProcessor;
 import org.apache.tomee.common.TomcatVersion;
 import org.apache.tomee.common.UserTransactionFactory;
@@ -78,6 +87,7 @@ import org.omg.CORBA.ORB;
 
 import javax.ejb.spi.HandleDelegate;
 import javax.el.ELResolver;
+import javax.management.ObjectName;
 import javax.naming.Context;
 import javax.naming.NamingException;
 import javax.persistence.EntityManagerFactory;
@@ -92,6 +102,8 @@ import java.io.FileInputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.lang.reflect.Field;
+import java.net.URL;
+import java.net.URLStreamHandlerFactory;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Iterator;
@@ -245,7 +257,7 @@ public class TomcatWebAppBuilder impleme
      * {@inheritDoc}
      */
     @Override
-    public void deployWebApps(AppInfo appInfo, ClassLoader classLoader) throws 
Exception {
+    public void deployWebApps(AppInfo appInfo, final ClassLoader classLoader) 
throws Exception {
         for (WebAppInfo webApp : appInfo.webApps) {
             // look for context.xml
             File war = new File(webApp.path);
@@ -310,8 +322,7 @@ public class TomcatWebAppBuilder impleme
                 if (standardContext.getDocBase() != null && 
standardContext.getDocBase().endsWith(".war")) {
                     
standardContext.setDocBase(standardContext.getDocBase().substring(0, 
standardContext.getDocBase().length() - 4));
                 }
-                
standardContext.setParentClassLoader(OpenEJB.class.getClassLoader());
-                standardContext.setDelegate(false);
+                standardContext.setLoader(new TomEEWebappLoader(classLoader));
 
                 String host = webApp.host;
                 if (host == null) {


Reply via email to