Repository: tomee Updated Branches: refs/heads/tomee-1.7.x 863c1ac11 -> b901386f0
TOMEE-1587 light merge of 7.x ear support for arquillian tomee adapter Project: http://git-wip-us.apache.org/repos/asf/tomee/repo Commit: http://git-wip-us.apache.org/repos/asf/tomee/commit/b901386f Tree: http://git-wip-us.apache.org/repos/asf/tomee/tree/b901386f Diff: http://git-wip-us.apache.org/repos/asf/tomee/diff/b901386f Branch: refs/heads/tomee-1.7.x Commit: b901386f0e02f3f1d325195e20a9ddd8858c9e47 Parents: 863c1ac Author: Romain Manni-Bucau <[email protected]> Authored: Mon May 18 14:30:14 2015 +0200 Committer: Romain Manni-Bucau <[email protected]> Committed: Mon May 18 14:30:14 2015 +0200 ---------------------------------------------------------------------- .../common/enrichment/OpenEJBEnricher.java | 54 +++++++++++++------- .../arquillian/common/TestClassDiscoverer.java | 22 ++++++-- .../openejb/assembler/classic/Assembler.java | 3 +- 3 files changed, 57 insertions(+), 22 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/tomee/blob/b901386f/arquillian/arquillian-common/src/main/java/org/apache/openejb/arquillian/common/enrichment/OpenEJBEnricher.java ---------------------------------------------------------------------- diff --git a/arquillian/arquillian-common/src/main/java/org/apache/openejb/arquillian/common/enrichment/OpenEJBEnricher.java b/arquillian/arquillian-common/src/main/java/org/apache/openejb/arquillian/common/enrichment/OpenEJBEnricher.java index c606858..d5e3bbc 100644 --- a/arquillian/arquillian-common/src/main/java/org/apache/openejb/arquillian/common/enrichment/OpenEJBEnricher.java +++ b/arquillian/arquillian-common/src/main/java/org/apache/openejb/arquillian/common/enrichment/OpenEJBEnricher.java @@ -24,6 +24,7 @@ import org.apache.openejb.OpenEJBRuntimeException; import org.apache.openejb.arquillian.common.mockito.MockitoEnricher; import org.apache.openejb.core.Operation; import org.apache.openejb.core.ThreadContext; +import org.apache.openejb.core.WebContext; import org.apache.openejb.loader.SystemInstance; import org.apache.openejb.spi.ContainerSystem; import org.apache.openejb.util.AppFinder; @@ -65,25 +66,32 @@ public final class OpenEJBEnricher { final BeanContext context = SystemInstance.get().getComponent(ContainerSystem.class).getBeanContext(ctx.getId() + "_" + testInstance.getClass().getName()); - final BeanManagerImpl bm = findBeanManager(ctx); - if (bm != null && bm.isInUse()) { - try { - final Set<Bean<?>> beans = bm.getBeans(testInstance.getClass()); - final Bean<?> bean = bm.resolve(beans); - final CreationalContext<?> cc = bm.createCreationalContext(bean); - if (context != null) { - context.set(CreationalContext.class, cc); - } - OWBInjector.inject(bm, testInstance, cc); - } catch (final Throwable t) { - LOGGER.log(Level.SEVERE, "Failed injection on: " + testInstance.getClass(), t); - if (RuntimeException.class.isInstance(t)) { - throw RuntimeException.class.cast(t); + final WebBeansContext appWBC = ctx.getWebBeansContext(); + final BeanManagerImpl bm = appWBC.getBeanManagerImpl(); + + boolean ok = false; + for (final WebContext web : ctx.getWebContexts()) { + final WebBeansContext webBeansContext = web.getWebBeansContext(); + final BeanManagerImpl webAppBm = webBeansContext.getBeanManagerImpl(); + if (webBeansContext != appWBC && webAppBm.isInUse()) { + try { + doInject(testInstance, context, webAppBm); + ok = true; + break; + } catch (final Exception e) { + // no-op, try next } - if (Exception.class.isInstance(t)) { - throw new OpenEJBRuntimeException(Exception.class.cast(t)); + } + } + if (bm != null && bm.isInUse() && !ok) { + try { + doInject(testInstance, context, bm); + } catch (final Exception e) { + LOGGER.log(Level.SEVERE, "Failed injection on: " + testInstance.getClass(), e); + if (RuntimeException.class.isInstance(e)) { + throw RuntimeException.class.cast(e); } - // ignoring other cases for the moment, let manage some OWB API change without making all tests failing + throw new OpenEJBRuntimeException(e); } } @@ -91,7 +99,7 @@ public final class OpenEJBEnricher { final ThreadContext callContext = new ThreadContext(context, null, Operation.INJECTION); final ThreadContext oldContext = ThreadContext.enter(callContext); try { - final InjectionProcessor processor = new InjectionProcessor<Object>(testInstance, context.getInjections(), context.getJndiContext()); + final InjectionProcessor processor = new InjectionProcessor(testInstance, context.getInjections(), context.getJndiContext()); processor.createInstance(); } catch (final OpenEJBException e) { // ignored @@ -101,6 +109,16 @@ public final class OpenEJBEnricher { } } + private static void doInject(final Object testInstance, final BeanContext context, final BeanManagerImpl bm) throws Exception { + final Set<Bean<?>> beans = bm.getBeans(testInstance.getClass()); + final Bean<?> bean = bm.resolve(beans); + final CreationalContext<?> cc = bm.createCreationalContext(bean); + if (context != null) { + context.set(CreationalContext.class, cc); + } + OWBInjector.inject(bm, testInstance, cc); + } + private static BeanManagerImpl findBeanManager(final AppContext ctx) { if (ctx != null) { return ctx.getWebBeansContext().getBeanManagerImpl(); http://git-wip-us.apache.org/repos/asf/tomee/blob/b901386f/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 a9e06d0..45566fd 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 @@ -75,6 +75,8 @@ public class TestClassDiscoverer implements AdditionalBeanDiscoverer { // keep it since CukeSpace doesn't rely on JUnit or TestNG @Test so it stays mandatory final File file = module.getFile(); final String line = findTestName(file, module.getClassLoader()); + String moduleId = null; + ClassLoader loader = null; if (line != null) { String name; final int endIndex = line.indexOf('#'); @@ -89,10 +91,18 @@ public class TestClassDiscoverer implements AdditionalBeanDiscoverer { if (name != null) { try { - // call some reflection methods to make it fail if some dep are missing... testClasses.add(module.getClassLoader().loadClass(name)); } catch (final Throwable e) { - // no-op + for (final WebModule web : module.getWebModules()) { + try { + testClasses.add(web.getClassLoader().loadClass(name)); + moduleId = web.getModuleId(); + loader = web.getClassLoader(); + break; + } catch (final Throwable e2) { + // no-op + } + } } } } @@ -130,7 +140,13 @@ 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); + if (moduleId != null) { + ejbModule.setWebapp(true); + ejbModule.getProperties().put("openejb.ejbmodule.webappId", moduleId); + ejbModule.setClassLoader(loader); // can be a web module so set it + } + module.getEjbModules().add(ejbModule); } return module; http://git-wip-us.apache.org/repos/asf/tomee/blob/b901386f/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 9c3243f..e5c1899 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 @@ -1195,7 +1195,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 } }
