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) {