Repository: tomee
Updated Branches:
  refs/heads/master 668fff8be -> 6823b155b


trying to use the right classloader for ejbs in web modules of ears - mainly 
for arquillian case


Project: http://git-wip-us.apache.org/repos/asf/tomee/repo
Commit: http://git-wip-us.apache.org/repos/asf/tomee/commit/6823b155
Tree: http://git-wip-us.apache.org/repos/asf/tomee/tree/6823b155
Diff: http://git-wip-us.apache.org/repos/asf/tomee/diff/6823b155

Branch: refs/heads/master
Commit: 6823b155b92a48c2b11001dcfcda22fa040e7ce8
Parents: 668fff8
Author: Romain Manni-Bucau <[email protected]>
Authored: Sat Mar 14 23:45:51 2015 +0100
Committer: Romain Manni-Bucau <[email protected]>
Committed: Sat Mar 14 23:45:51 2015 +0100

----------------------------------------------------------------------
 .../arquillian/common/TestClassDiscoverer.java  | 68 ++++++++++++++------
 .../openejb/assembler/classic/Assembler.java    |  3 +-
 .../openejb/config/rules/CheckClasses.java      | 38 +++++------
 tck/cdi-tomee/src/test/resources/failing.xml    |  2 +-
 4 files changed, 70 insertions(+), 41 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/tomee/blob/6823b155/arquillian/arquillian-tomee-common/src/main/java/org/apache/openejb/arquillian/common/TestClassDiscoverer.java
----------------------------------------------------------------------
diff --git 
a/arquillian/arquillian-tomee-common/src/main/java/org/apache/openejb/arquillian/common/TestClassDiscoverer.java
 
b/arquillian/arquillian-tomee-common/src/main/java/org/apache/openejb/arquillian/common/TestClassDiscoverer.java
index 8d9d797..5fb3ef8 100644
--- 
a/arquillian/arquillian-tomee-common/src/main/java/org/apache/openejb/arquillian/common/TestClassDiscoverer.java
+++ 
b/arquillian/arquillian-tomee-common/src/main/java/org/apache/openejb/arquillian/common/TestClassDiscoverer.java
@@ -37,9 +37,11 @@ import java.io.IOException;
 import java.io.InputStream;
 import java.lang.annotation.Annotation;
 import java.lang.reflect.Method;
+import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Iterator;
 import java.util.List;
+import java.util.Map;
 import java.util.Set;
 
 import static java.util.Arrays.asList;
@@ -47,28 +49,34 @@ import static java.util.Arrays.asList;
 public class TestClassDiscoverer implements AdditionalBeanDiscoverer {
     @Override
     public AppModule discover(final AppModule module) {
-        final ClassLoader contextClassLoader = 
Thread.currentThread().getContextClassLoader();
-
-        final Set<Class<? extends Annotation>> testMarkers = new HashSet<>();
-        for (final String s : asList("org.junit.Test", 
"org.testng.annotations.Test")) {
-            try {
-                testMarkers.add((Class<? extends Annotation>) 
contextClassLoader.loadClass(s));
-            } catch (final Throwable e) {
-                // no-op: deployment = false
-            }
-        }
-
         final Set<Class<?>> testClasses = new HashSet<>();
-        if (!testMarkers.isEmpty()) {
-            addTests(testMarkers, module.getEarLibFinder(), testClasses);
-            for (final WebModule web : module.getWebModules()) {
-                addTests(testMarkers, web.getFinder(), testClasses);
+        final Map<Class<?>, WebModule> webTestClasses = new HashMap<>();
+        final Set<ClassLoader> saw = new HashSet<>();
+        if (module.getClassLoader() != null) {
+            addTests(findMarkers(module.getClassLoader()), 
module.getEarLibFinder(), testClasses);
+            saw.add(module.getClassLoader());
+        }
+        for (final WebModule web : module.getWebModules()) {
+            if (web.getClassLoader() != null && 
!saw.contains(web.getClassLoader())) {
+                final Set<Class<?>> classes = new HashSet<Class<?>>();
+                addTests(findMarkers(web.getClassLoader()), web.getFinder(), 
classes);
+                saw.add(web.getClassLoader());
+                for (final Class<?> c : classes) {
+                    webTestClasses.put(c, web);
+                }
+                testClasses.addAll(classes);
             }
-            for (final EjbModule ejb : module.getEjbModules()) {
-                addTests(testMarkers, ejb.getFinder(), testClasses);
+        }
+        for (final EjbModule ejb : module.getEjbModules()) {
+            if (ejb.getClassLoader() != null && 
!saw.contains(ejb.getClassLoader())) {
+                addTests(findMarkers(ejb.getClassLoader()), ejb.getFinder(), 
testClasses);
+                saw.add(ejb.getClassLoader());
             }
-            for (final ConnectorModule connector : 
module.getConnectorModules()) {
-                addTests(testMarkers, connector.getFinder(), testClasses);
+        }
+        for (final ConnectorModule connector : module.getConnectorModules()) {
+            if (connector.getClassLoader() != null && 
!saw.contains(connector.getClassLoader())) {
+                addTests(findMarkers(connector.getClassLoader()), 
connector.getFinder(), testClasses);
+                saw.add(connector.getClassLoader());
             }
         }
 
@@ -130,12 +138,32 @@ public class TestClassDiscoverer implements 
AdditionalBeanDiscoverer {
             bean.setTransactionType(TransactionType.BEAN);
             final EjbDeployment ejbDeployment = 
openejbJar.addEjbDeployment(bean);
             ejbDeployment.setDeploymentId(ejbName);
-            module.getEjbModules().add(new EjbModule(ejbJar, openejbJar));
+
+            final EjbModule ejbModule = new EjbModule(ejbJar, openejbJar);
+            ejbModule.setClassLoader(test.getClassLoader());
+            final WebModule webModule = webTestClasses.get(test);
+            if (webModule != null) {
+                ejbModule.setWebapp(true);
+                ejbModule.getProperties().put("openejb.ejbmodule.webappId", 
webModule.getModuleId());
+            }
+            module.getEjbModules().add(ejbModule);
         }
 
         return module;
     }
 
+    private Set<Class<? extends Annotation>> findMarkers(final ClassLoader 
contextClassLoader) {
+        final Set<Class<? extends Annotation>> testMarkers = new HashSet<>();
+        for (final String s : asList("org.junit.Test", 
"org.testng.annotations.Test")) {
+            try {
+                testMarkers.add((Class<? extends Annotation>) 
contextClassLoader.loadClass(s));
+            } catch (final Throwable e) {
+                // no-op: deployment = false
+            }
+        }
+        return testMarkers;
+    }
+
     private static void addTests(final Set<Class<? extends Annotation>> 
testMarkers, final IAnnotationFinder finder, final Set<Class<?>> testClasses) {
         if (finder == null) {
             return;

http://git-wip-us.apache.org/repos/asf/tomee/blob/6823b155/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java
----------------------------------------------------------------------
diff --git 
a/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java
 
b/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java
index 9bc0cc0..8df5354 100644
--- 
a/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java
+++ 
b/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java
@@ -1151,7 +1151,8 @@ public class Assembler extends AssemblerTool implements 
org.apache.openejb.spi.A
             if (!appInfo.webAppAlone) {
                 if (webappId == null) {
                     skip = ejbJar.webapp; // we look for the lib part of the 
ear so deploy only if not a webapp
-                } else if (!ejbJar.webapp || 
!ejbJar.moduleId.equals(webappId)) {
+                } else if (!ejbJar.webapp
+                        || (!ejbJar.moduleId.equals(webappId) && 
!ejbJar.properties.getProperty("openejb.ejbmodule.webappId", 
"-").equals(webappId))) {
                     skip = true; // we look for a particular webapp deployment 
so deploy only if this webapp
                 }
             }

http://git-wip-us.apache.org/repos/asf/tomee/blob/6823b155/container/openejb-core/src/main/java/org/apache/openejb/config/rules/CheckClasses.java
----------------------------------------------------------------------
diff --git 
a/container/openejb-core/src/main/java/org/apache/openejb/config/rules/CheckClasses.java
 
b/container/openejb-core/src/main/java/org/apache/openejb/config/rules/CheckClasses.java
index 383d89c..2a32a14 100644
--- 
a/container/openejb-core/src/main/java/org/apache/openejb/config/rules/CheckClasses.java
+++ 
b/container/openejb-core/src/main/java/org/apache/openejb/config/rules/CheckClasses.java
@@ -93,9 +93,10 @@ public class CheckClasses extends ValidationBase {
     }
 
     public void validate(final EjbModule ejbModule) {
+        final ClassLoader loader = ejbModule.getClassLoader();
         for (final EnterpriseBean bean : 
ejbModule.getEjbJar().getEnterpriseBeans()) {
             try {
-                final Class<?> beanClass = check_hasEjbClass(bean);
+                final Class<?> beanClass = check_hasEjbClass(loader, bean);
 
                 // All the subsequent checks require the bean class
                 if (beanClass == null) {
@@ -117,30 +118,30 @@ public class CheckClasses extends ValidationBase {
                 check_hasInterface(b);
 
                 if (b.getRemote() != null) {
-                    checkInterface(b, beanClass, "remote", b.getRemote());
+                    checkInterface(loader, b, beanClass, "remote", 
b.getRemote());
                 }
 
                 if (b.getHome() != null) {
-                    checkInterface(b, beanClass, "home", b.getHome());
+                    checkInterface(loader, b, beanClass, "home", b.getHome());
                 }
 
                 if (b.getLocal() != null) {
-                    checkInterface(b, beanClass, "local", b.getLocal());
+                    checkInterface(loader, b, beanClass, "local", 
b.getLocal());
                 }
 
                 if (b.getLocalHome() != null) {
-                    checkInterface(b, beanClass, "local-home", 
b.getLocalHome());
+                    checkInterface(loader, b, beanClass, "local-home", 
b.getLocalHome());
                 }
 
                 if (b instanceof SessionBean) {
                     final SessionBean sessionBean = (SessionBean) b;
 
                     for (final String interfce : 
sessionBean.getBusinessLocal()) {
-                        checkInterface(b, beanClass, "business-local", 
interfce);
+                        checkInterface(loader, b, beanClass, "business-local", 
interfce);
                     }
 
                     for (final String interfce : 
sessionBean.getBusinessRemote()) {
-                        checkInterface(b, beanClass, "business-remote", 
interfce);
+                        checkInterface(loader, b, beanClass, 
"business-remote", interfce);
                     }
                 }
             } catch (final RuntimeException e) {
@@ -149,12 +150,12 @@ public class CheckClasses extends ValidationBase {
         }
 
         for (final Interceptor interceptor : 
ejbModule.getEjbJar().getInterceptors()) {
-            check_hasInterceptorClass(interceptor);
+            check_hasInterceptorClass(loader, interceptor);
         }
     }
 
-    private void checkInterface(final RemoteBean b, final Class<?> beanClass, 
String tag, final String className) {
-        final Class<?> interfce = lookForClass(className, tag, b.getEjbName());
+    private void checkInterface(final ClassLoader loader, final RemoteBean b, 
final Class<?> beanClass, String tag, final String className) {
+        final Class<?> interfce = lookForClass(loader, className, tag, 
b.getEjbName());
 
         if (interfce == null) {
             return;
@@ -253,11 +254,11 @@ public class CheckClasses extends ValidationBase {
         }
     }
 
-    public Class<?> check_hasEjbClass(final EnterpriseBean b) {
+    public Class<?> check_hasEjbClass(final ClassLoader loader, final 
EnterpriseBean b) {
 
         final String ejbName = b.getEjbName();
 
-        final Class<?> beanClass = lookForClass(b.getEjbClass(), "ejb-class", 
ejbName);
+        final Class<?> beanClass = lookForClass(loader, b.getEjbClass(), 
"ejb-class", ejbName);
         final boolean isDynamicProxyImpl = 
DynamicProxyImplFactory.isKnownDynamicallyImplemented(beanClass);
 
         if (beanClass == null) {
@@ -289,9 +290,9 @@ public class CheckClasses extends ValidationBase {
         return false;
     }
 
-    private void check_hasInterceptorClass(final Interceptor i) {
+    private void check_hasInterceptorClass(final ClassLoader loader, final 
Interceptor i) {
 
-        lookForClass(i.getInterceptorClass(), "interceptor-class", 
"Interceptor");
+        lookForClass(loader, i.getInterceptorClass(), "interceptor-class", 
"Interceptor");
 
     }
 
@@ -306,9 +307,9 @@ public class CheckClasses extends ValidationBase {
         }
     }
 
-    private Class<?> lookForClass(final String clazz, final String type, final 
String ejbName) {
+    private Class<?> lookForClass(final ClassLoader loader, final String 
clazz, final String type, final String ejbName) {
         try {
-            return loadClass(clazz);
+            return loadClass(loader, clazz);
         } catch (final OpenEJBException e) {
             /*
             # 0 - Class name
@@ -414,10 +415,9 @@ public class CheckClasses extends ValidationBase {
         }
     }
 
-    protected Class<?> loadClass(final String clazz) throws OpenEJBException {
-        final ClassLoader cl = module.getClassLoader();
+    protected Class<?> loadClass(final ClassLoader cl, final String clazz) 
throws OpenEJBException {
         try {
-            return Class.forName(clazz, false, cl);
+            return Class.forName(clazz, false, cl == null ? 
module.getClassLoader() : cl);
         } catch (final ClassNotFoundException cnfe) {
             throw new OpenEJBException(SafeToolkit.messages.format("cl0007", 
clazz, module.getJarLocation()), cnfe);
         }

http://git-wip-us.apache.org/repos/asf/tomee/blob/6823b155/tck/cdi-tomee/src/test/resources/failing.xml
----------------------------------------------------------------------
diff --git a/tck/cdi-tomee/src/test/resources/failing.xml 
b/tck/cdi-tomee/src/test/resources/failing.xml
index de07cc4..01f0c82 100644
--- a/tck/cdi-tomee/src/test/resources/failing.xml
+++ b/tck/cdi-tomee/src/test/resources/failing.xml
@@ -23,7 +23,7 @@
   -->
   <test name="CDI TCK">
     <classes>
-      <class 
name="org.jboss.cdi.tck.tests.alternative.broken.incorrect.name.stereotype.NoAnnotationWithSpecifiedNameTest"
 />
+      <class 
name="org.jboss.cdi.tck.tests.lookup.modules.specialization.alternative.Specialization06Test"
 />
     </classes>
   </test>
 </suite>

Reply via email to