Author: rmannibucau Date: Thu Jan 10 23:51:29 2013 New Revision: 1431736 URL: http://svn.apache.org/viewvc?rev=1431736&view=rev Log: OPENEJB-1987 ability to inject basic cdi injections with startup deployment + ability to specify a list in a single package as value
Added: openejb/trunk/openejb/arquillian/arquillian-openejb-embedded-4/src/test/java/org/apache/openejb/arquillian/openejb/archive/ openejb/trunk/openejb/arquillian/arquillian-openejb-embedded-4/src/test/java/org/apache/openejb/arquillian/openejb/archive/SimpleArchive.java openejb/trunk/openejb/arquillian/arquillian-openejb-embedded-4/src/test/java/org/apache/openejb/arquillian/openejb/archive/SimpleArchive2.java Removed: openejb/trunk/openejb/arquillian/arquillian-openejb-embedded-4/src/main/java/org/apache/openejb/arquillian/openejb/EmptyArchive.java Modified: openejb/trunk/openejb/arquillian/arquillian-common/src/main/java/org/apache/openejb/arquillian/common/ArquillianUtil.java openejb/trunk/openejb/arquillian/arquillian-openejb-embedded-4/src/main/java/org/apache/openejb/arquillian/openejb/OpenEJBInjectionEnricher.java openejb/trunk/openejb/arquillian/arquillian-openejb-embedded-4/src/test/java/org/apache/openejb/arquillian/openejb/StartDeploymentTest.java openejb/trunk/openejb/arquillian/arquillian-openejb-embedded-4/src/test/resources/arquillian.xml Modified: openejb/trunk/openejb/arquillian/arquillian-common/src/main/java/org/apache/openejb/arquillian/common/ArquillianUtil.java URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/arquillian/arquillian-common/src/main/java/org/apache/openejb/arquillian/common/ArquillianUtil.java?rev=1431736&r1=1431735&r2=1431736&view=diff ============================================================================== --- openejb/trunk/openejb/arquillian/arquillian-common/src/main/java/org/apache/openejb/arquillian/common/ArquillianUtil.java (original) +++ openejb/trunk/openejb/arquillian/arquillian-common/src/main/java/org/apache/openejb/arquillian/common/ArquillianUtil.java Thu Jan 10 23:51:29 2013 @@ -54,31 +54,48 @@ public final class ArquillianUtil { final String toSplit = properties.getProperty(PREDEPLOYING_KEY).trim(); final ClassLoader loader = Thread.currentThread().getContextClassLoader(); for (String name : toSplit.split(",")) { - try { - final Class<?> clazz = loader.loadClass(name); - for (Method m : clazz.getMethods()) { - final int modifiers = m.getModifiers(); - if (Object.class.equals(m.getDeclaringClass()) || !Archive.class.isAssignableFrom(m.getReturnType()) - || !Modifier.isStatic(modifiers) || !Modifier.isPublic(modifiers)) { - continue; - } - - for (Annotation a : m.getAnnotations()) { - if ("org.jboss.arquillian.container.test.api.Deployment".equals(a.annotationType().getName())) { - final Archive<?> archive = (Archive<?>) m.invoke(null); - list.add(archive); - break; - } + int bracket = name.indexOf(".["); + if (bracket >= 0) { + int end = name.indexOf("]"); + if (end > bracket) { + final String pkg = name.substring(0, bracket + 1); + final String classes = name.substring(bracket + 2, end); + for (String n : classes.split("\\|")) { + addClass(list, loader, pkg + n); } + continue; } - } catch (Exception e) { - throw new OpenEJBRuntimeException(e); } + addClass(list, loader, name); } } return list; } + private static void addClass(final Collection<Archive<?>> list, final ClassLoader loader, final String classname) { + final String name = classname.trim(); + try { + final Class<?> clazz = loader.loadClass(name); + for (Method m : clazz.getMethods()) { + final int modifiers = m.getModifiers(); + if (Object.class.equals(m.getDeclaringClass()) || !Archive.class.isAssignableFrom(m.getReturnType()) + || !Modifier.isStatic(modifiers) || !Modifier.isPublic(modifiers)) { + continue; + } + + for (Annotation a : m.getAnnotations()) { + if ("org.jboss.arquillian.container.test.api.Deployment".equals(a.annotationType().getName())) { + final Archive<?> archive = (Archive<?>) m.invoke(null); + list.add(archive); + break; + } + } + } + } catch (Exception e) { + throw new OpenEJBRuntimeException(e); + } + } + public static void undeploy(DeployableContainer<?> container, final Collection<Archive<?>> containerArchives) { if (containerArchives != null) { for (Archive<?> a : containerArchives) { Modified: openejb/trunk/openejb/arquillian/arquillian-openejb-embedded-4/src/main/java/org/apache/openejb/arquillian/openejb/OpenEJBInjectionEnricher.java URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/arquillian/arquillian-openejb-embedded-4/src/main/java/org/apache/openejb/arquillian/openejb/OpenEJBInjectionEnricher.java?rev=1431736&r1=1431735&r2=1431736&view=diff ============================================================================== --- openejb/trunk/openejb/arquillian/arquillian-openejb-embedded-4/src/main/java/org/apache/openejb/arquillian/openejb/OpenEJBInjectionEnricher.java (original) +++ openejb/trunk/openejb/arquillian/arquillian-openejb-embedded-4/src/main/java/org/apache/openejb/arquillian/openejb/OpenEJBInjectionEnricher.java Thu Jan 10 23:51:29 2013 @@ -18,11 +18,21 @@ package org.apache.openejb.arquillian.op import org.apache.openejb.AppContext; import org.apache.openejb.arquillian.common.enrichment.OpenEJBEnricher; +import org.apache.openejb.arquillian.common.mockito.MockitoEnricher; +import org.apache.openejb.loader.SystemInstance; +import org.apache.openejb.spi.ContainerSystem; +import org.apache.webbeans.inject.AbstractInjectable; +import org.apache.webbeans.inject.OWBInjector; import org.jboss.arquillian.core.api.Instance; import org.jboss.arquillian.core.api.annotation.Inject; import org.jboss.arquillian.test.spi.TestEnricher; +import javax.enterprise.context.spi.CreationalContext; +import javax.enterprise.inject.spi.AnnotatedType; +import javax.enterprise.inject.spi.BeanManager; +import javax.enterprise.inject.spi.InjectionTarget; import java.lang.reflect.Method; +import java.util.List; public class OpenEJBInjectionEnricher implements TestEnricher { @Inject @@ -30,7 +40,32 @@ public class OpenEJBInjectionEnricher im @Override public void enrich(final Object testInstance) { - OpenEJBEnricher.enrich(testInstance, appContext.get()); + final AppContext context = appContext.get(); + if (context != null) { + OpenEJBEnricher.enrich(testInstance, context); + } else { // try to enrich with all for deployment at startup feature - only once context can be used in a class + new MockitoEnricher().enrich(testInstance); + + final List<AppContext> appContexts = SystemInstance.get().getComponent(ContainerSystem.class).getAppContexts(); + final Class<?> clazz = testInstance.getClass(); + for (final AppContext appContext : appContexts) { + try { + final BeanManager bm = appContext.getWebBeansContext().getBeanManagerImpl(); + final AnnotatedType<?> at = bm.createAnnotatedType(clazz); + final InjectionTarget<Object> it = (InjectionTarget<Object>) bm.createInjectionTarget(at); + final CreationalContext<Object> cc = bm.createCreationalContext(null); + AbstractInjectable.instanceUnderInjection.set(testInstance); + try { + OWBInjector.inject(bm, testInstance, cc); + } finally { + AbstractInjectable.instanceUnderInjection.remove(); + } + cc.release(); + } catch (Exception e) { + // no-op + } + } + } } @Override Modified: openejb/trunk/openejb/arquillian/arquillian-openejb-embedded-4/src/test/java/org/apache/openejb/arquillian/openejb/StartDeploymentTest.java URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/arquillian/arquillian-openejb-embedded-4/src/test/java/org/apache/openejb/arquillian/openejb/StartDeploymentTest.java?rev=1431736&r1=1431735&r2=1431736&view=diff ============================================================================== --- openejb/trunk/openejb/arquillian/arquillian-openejb-embedded-4/src/test/java/org/apache/openejb/arquillian/openejb/StartDeploymentTest.java (original) +++ openejb/trunk/openejb/arquillian/arquillian-openejb-embedded-4/src/test/java/org/apache/openejb/arquillian/openejb/StartDeploymentTest.java Thu Jan 10 23:51:29 2013 @@ -16,16 +16,38 @@ */ package org.apache.openejb.arquillian.openejb; +import org.apache.openejb.arquillian.openejb.archive.SimpleArchive; +import org.apache.openejb.arquillian.openejb.archive.SimpleArchive2; +import org.apache.openejb.loader.SystemInstance; +import org.apache.openejb.spi.ContainerSystem; import org.jboss.arquillian.junit.Arquillian; import org.junit.Test; import org.junit.runner.RunWith; +import javax.inject.Inject; + +import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; @RunWith(Arquillian.class) public class StartDeploymentTest { + @Inject + private SimpleArchive2.AnotherSingleton bean; + + @Test + public void deployment() { + final ContainerSystem containerSystem = SystemInstance.get().getComponent(ContainerSystem.class); + assertNotNull(containerSystem.getAppContext("start")); + assertNotNull(containerSystem.getAppContext("start2")); + } + @Test public void checkItIsStarted() { - assertTrue(EmptyArchive.OkFilter.ok); + assertTrue(SimpleArchive.ASingleton.ok); + } + + @Test + public void injections() { + assertNotNull(bean); } } Added: openejb/trunk/openejb/arquillian/arquillian-openejb-embedded-4/src/test/java/org/apache/openejb/arquillian/openejb/archive/SimpleArchive.java URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/arquillian/arquillian-openejb-embedded-4/src/test/java/org/apache/openejb/arquillian/openejb/archive/SimpleArchive.java?rev=1431736&view=auto ============================================================================== --- openejb/trunk/openejb/arquillian/arquillian-openejb-embedded-4/src/test/java/org/apache/openejb/arquillian/openejb/archive/SimpleArchive.java (added) +++ openejb/trunk/openejb/arquillian/arquillian-openejb-embedded-4/src/test/java/org/apache/openejb/arquillian/openejb/archive/SimpleArchive.java Thu Jan 10 23:51:29 2013 @@ -0,0 +1,50 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.openejb.arquillian.openejb.archive; + +import org.jboss.arquillian.container.test.api.Deployment; +import org.jboss.shrinkwrap.api.ShrinkWrap; +import org.jboss.shrinkwrap.api.asset.EmptyAsset; +import org.jboss.shrinkwrap.api.spec.WebArchive; + +import javax.annotation.PostConstruct; +import javax.ejb.Singleton; +import javax.ejb.Startup; + +public final class SimpleArchive { + private SimpleArchive() { + // no-op + } + + @Deployment + public static WebArchive war() { + return ShrinkWrap.create(WebArchive.class, "start.war") + .addAsWebInfResource(EmptyAsset.INSTANCE, "beans.xml") + .addClass(ASingleton.class); + } + + @Startup + @Singleton + public static class ASingleton { + public static boolean ok = false; + + @PostConstruct + public void init() { + ok = true; + } + } +} Added: openejb/trunk/openejb/arquillian/arquillian-openejb-embedded-4/src/test/java/org/apache/openejb/arquillian/openejb/archive/SimpleArchive2.java URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/arquillian/arquillian-openejb-embedded-4/src/test/java/org/apache/openejb/arquillian/openejb/archive/SimpleArchive2.java?rev=1431736&view=auto ============================================================================== --- openejb/trunk/openejb/arquillian/arquillian-openejb-embedded-4/src/test/java/org/apache/openejb/arquillian/openejb/archive/SimpleArchive2.java (added) +++ openejb/trunk/openejb/arquillian/arquillian-openejb-embedded-4/src/test/java/org/apache/openejb/arquillian/openejb/archive/SimpleArchive2.java Thu Jan 10 23:51:29 2013 @@ -0,0 +1,40 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.openejb.arquillian.openejb.archive; + +import org.jboss.arquillian.container.test.api.Deployment; +import org.jboss.shrinkwrap.api.ShrinkWrap; +import org.jboss.shrinkwrap.api.asset.EmptyAsset; +import org.jboss.shrinkwrap.api.spec.WebArchive; + +import javax.ejb.Singleton; + +public final class SimpleArchive2 { + private SimpleArchive2() { + // no-op + } + + @Deployment + public static WebArchive war() { + return ShrinkWrap.create(WebArchive.class, "start2.war") + .addAsWebInfResource(EmptyAsset.INSTANCE, "beans.xml") + .addClass(AnotherSingleton.class); + } + + @Singleton + public static class AnotherSingleton {} +} Modified: openejb/trunk/openejb/arquillian/arquillian-openejb-embedded-4/src/test/resources/arquillian.xml URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/arquillian/arquillian-openejb-embedded-4/src/test/resources/arquillian.xml?rev=1431736&r1=1431735&r2=1431736&view=diff ============================================================================== --- openejb/trunk/openejb/arquillian/arquillian-openejb-embedded-4/src/test/resources/arquillian.xml (original) +++ openejb/trunk/openejb/arquillian/arquillian-openejb-embedded-4/src/test/resources/arquillian.xml Thu Jan 10 23:51:29 2013 @@ -30,7 +30,7 @@ java\:global/db.JdbcUrl = jdbc:hsqldb:mem:global # to check startup deployment - openejb.arquillian.predeploy-archives = org.apache.openejb.arquillian.openejb.EmptyArchive + openejb.arquillian.predeploy-archives = org.apache.openejb.arquillian.openejb.archive.[SimpleArchive|SimpleArchive2] </property> </configuration> </container>