You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tomee.apache.org by rm...@apache.org on 2015/03/14 23:46:11 UTC
tomee git commit: trying to use the right classloader for ejbs in web
modules of ears - mainly for arquillian case
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 <rm...@apache.org>
Authored: Sat Mar 14 23:45:51 2015 +0100
Committer: Romain Manni-Bucau <rm...@apache.org>
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>