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>
