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 2013/12/29 22:06:13 UTC

svn commit: r1554067 - in /tomee/tomee/trunk/arquillian: arquillian-common/src/main/java/org/apache/openejb/arquillian/common/enrichment/ arquillian-openejb-embedded-4/src/main/java/org/apache/openejb/arquillian/openejb/ arquillian-openejb-embedded-4/s...

Author: rmannibucau
Date: Sun Dec 29 21:06:12 2013
New Revision: 1554067

URL: http://svn.apache.org/r1554067
Log:
TOMEE-1101 support enrichment of test method params

Added:
    tomee/tomee/trunk/arquillian/arquillian-openejb-embedded-4/src/test/java/org/apache/openejb/arquillian/openejb/MethodParameterEnrichmentTest.java
      - copied, changed from r1553518, tomee/tomee/trunk/arquillian/arquillian-openejb-embedded-4/src/test/java/org/apache/openejb/arquillian/openejb/AdapterArquillianStandaloneTest.java
Modified:
    tomee/tomee/trunk/arquillian/arquillian-common/src/main/java/org/apache/openejb/arquillian/common/enrichment/OpenEJBEnricher.java
    tomee/tomee/trunk/arquillian/arquillian-openejb-embedded-4/src/main/java/org/apache/openejb/arquillian/openejb/OpenEJBInjectionEnricher.java
    tomee/tomee/trunk/arquillian/arquillian-tomee-common/src/main/java/org/apache/openejb/arquillian/common/TomEEInjectionEnricher.java

Modified: tomee/tomee/trunk/arquillian/arquillian-common/src/main/java/org/apache/openejb/arquillian/common/enrichment/OpenEJBEnricher.java
URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/arquillian/arquillian-common/src/main/java/org/apache/openejb/arquillian/common/enrichment/OpenEJBEnricher.java?rev=1554067&r1=1554066&r2=1554067&view=diff
==============================================================================
--- tomee/tomee/trunk/arquillian/arquillian-common/src/main/java/org/apache/openejb/arquillian/common/enrichment/OpenEJBEnricher.java (original)
+++ tomee/tomee/trunk/arquillian/arquillian-common/src/main/java/org/apache/openejb/arquillian/common/enrichment/OpenEJBEnricher.java Sun Dec 29 21:06:12 2013
@@ -26,17 +26,26 @@ import org.apache.openejb.core.Operation
 import org.apache.openejb.core.ThreadContext;
 import org.apache.openejb.loader.SystemInstance;
 import org.apache.openejb.spi.ContainerSystem;
-import org.apache.openejb.util.LogCategory;
-import org.apache.openejb.util.Logger;
+import org.apache.webbeans.annotation.AnnotationManager;
 import org.apache.webbeans.config.WebBeansContext;
 import org.apache.webbeans.container.BeanManagerImpl;
+import org.apache.webbeans.context.creational.CreationalContextImpl;
 import org.apache.webbeans.inject.OWBInjector;
+import org.apache.webbeans.portable.AnnotatedElementFactory;
 
 import javax.enterprise.context.spi.CreationalContext;
+import javax.enterprise.inject.spi.AnnotatedMethod;
+import javax.enterprise.inject.spi.AnnotatedParameter;
 import javax.enterprise.inject.spi.Bean;
+import java.lang.reflect.Method;
+import java.lang.reflect.Type;
 import java.util.Set;
+import java.util.logging.Level;
+import java.util.logging.Logger;
 
 public final class OpenEJBEnricher {
+    private static final Logger LOGGER = Logger.getLogger(OpenEJBEnricher.class.getName());
+
     private OpenEJBEnricher() {
         // no-op
     }
@@ -59,7 +68,7 @@ public final class OpenEJBEnricher {
                 }
                 OWBInjector.inject(bm, testInstance, cc);
             } catch (Throwable t) {
-                Logger.getInstance(LogCategory.OPENEJB, OpenEJBEnricher.class).error("Can't inject in " + testInstance.getClass(), t);
+                LOGGER.log(Level.SEVERE, "Can't inject in " + testInstance.getClass(), t);
                 if (t instanceof RuntimeException) {
                     throw (RuntimeException) t;
                 }
@@ -98,4 +107,41 @@ public final class OpenEJBEnricher {
         return null;
     }
 
+    public static Object[] resolve(final AppContext appContext, final Method method) { // suppose all is a CDI bean...
+        final Object[] values = new Object[method.getParameterTypes().length];
+
+        if (appContext == null) {
+            return values;
+        }
+
+        final BeanManagerImpl beanManager = findBeanManager(appContext);
+        if (beanManager == null) {
+            return values;
+        }
+
+        final Class<?>[] parameterTypes = method.getParameterTypes();
+        for (int i = 0; i < parameterTypes.length; i++) {
+            try {
+                values[i] = getParamInstance(beanManager, i, method);
+            } catch (final Exception e) {
+                LOGGER.log(Level.WARNING, e.getMessage(), e);
+            }
+        }
+        return values;
+    }
+
+    private static <T> T getParamInstance(final BeanManagerImpl manager, final int position, final Method method) {
+        final AnnotatedElementFactory factory = manager.getWebBeansContext().getAnnotatedElementFactory();
+        final AnnotationManager annotationManager = manager.getWebBeansContext().getAnnotationManager();
+
+        final AnnotatedMethod<?> am = factory.newAnnotatedMethod(method, factory.newAnnotatedType(method.getDeclaringClass()));
+        final AnnotatedParameter<?> ap = am.getParameters().get(position);
+
+        final Type baseType = ap.getBaseType();
+        final Bean<?> bean = manager.resolve(manager.getBeans(baseType, annotationManager.getInterceptorBindingMetaAnnotations(ap.getAnnotations())));
+
+        // note: without a scope it can leak but that's what the user asked!
+        final CreationalContextImpl<?> creational = manager.createCreationalContext(null); // null since we don't want the test class be the owner
+        return (T) manager.getReference(bean, baseType, creational);
+    }
 }

Modified: tomee/tomee/trunk/arquillian/arquillian-openejb-embedded-4/src/main/java/org/apache/openejb/arquillian/openejb/OpenEJBInjectionEnricher.java
URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/arquillian/arquillian-openejb-embedded-4/src/main/java/org/apache/openejb/arquillian/openejb/OpenEJBInjectionEnricher.java?rev=1554067&r1=1554066&r2=1554067&view=diff
==============================================================================
--- tomee/tomee/trunk/arquillian/arquillian-openejb-embedded-4/src/main/java/org/apache/openejb/arquillian/openejb/OpenEJBInjectionEnricher.java (original)
+++ tomee/tomee/trunk/arquillian/arquillian-openejb-embedded-4/src/main/java/org/apache/openejb/arquillian/openejb/OpenEJBInjectionEnricher.java Sun Dec 29 21:06:12 2013
@@ -39,12 +39,12 @@ public class OpenEJBInjectionEnricher im
 
     @Override
     public void enrich(final Object testInstance) {
+        new MockitoEnricher().enrich(testInstance);
+
         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) {
@@ -64,6 +64,6 @@ public class OpenEJBInjectionEnricher im
 
     @Override
     public Object[] resolve(final Method method) {
-        return new Object[method.getParameterTypes().length];
+        return OpenEJBEnricher.resolve(appContext.get(), method);
     }
 }

Copied: tomee/tomee/trunk/arquillian/arquillian-openejb-embedded-4/src/test/java/org/apache/openejb/arquillian/openejb/MethodParameterEnrichmentTest.java (from r1553518, tomee/tomee/trunk/arquillian/arquillian-openejb-embedded-4/src/test/java/org/apache/openejb/arquillian/openejb/AdapterArquillianStandaloneTest.java)
URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/arquillian/arquillian-openejb-embedded-4/src/test/java/org/apache/openejb/arquillian/openejb/MethodParameterEnrichmentTest.java?p2=tomee/tomee/trunk/arquillian/arquillian-openejb-embedded-4/src/test/java/org/apache/openejb/arquillian/openejb/MethodParameterEnrichmentTest.java&p1=tomee/tomee/trunk/arquillian/arquillian-openejb-embedded-4/src/test/java/org/apache/openejb/arquillian/openejb/AdapterArquillianStandaloneTest.java&r1=1553518&r2=1554067&rev=1554067&view=diff
==============================================================================
--- tomee/tomee/trunk/arquillian/arquillian-openejb-embedded-4/src/test/java/org/apache/openejb/arquillian/openejb/AdapterArquillianStandaloneTest.java (original)
+++ tomee/tomee/trunk/arquillian/arquillian-openejb-embedded-4/src/test/java/org/apache/openejb/arquillian/openejb/MethodParameterEnrichmentTest.java Sun Dec 29 21:06:12 2013
@@ -16,7 +16,6 @@
  */
 package org.apache.openejb.arquillian.openejb;
 
-import org.apache.openejb.loader.SystemInstance;
 import org.jboss.arquillian.container.test.api.Deployment;
 import org.jboss.arquillian.junit.Arquillian;
 import org.jboss.shrinkwrap.api.ArchivePaths;
@@ -26,18 +25,23 @@ import org.jboss.shrinkwrap.api.spec.Jav
 import org.junit.Test;
 import org.junit.runner.RunWith;
 
-import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.assertNotNull;
 
 @RunWith(Arquillian.class)
-public class AdapterArquillianStandaloneTest {
+public class MethodParameterEnrichmentTest {
     @Deployment
     public static JavaArchive archive() {
-        return ShrinkWrap.create(JavaArchive.class, AdapterArquillianStandaloneTest.class.getSimpleName().concat(".jar"))
-                    .addAsManifestResource(EmptyAsset.INSTANCE, ArchivePaths.create("beans.xml"));
+        return ShrinkWrap.create(JavaArchive.class, MethodParameterEnrichmentTest.class.getSimpleName().concat(".jar"))
+                    .addAsManifestResource(EmptyAsset.INSTANCE, ArchivePaths.create("beans.xml"))
+                    .addClass(Foo.class);
     }
 
     @Test
-    public void checkItIsStarted() {
-        assertTrue(SystemInstance.isInitialized());
+    public void check(final Foo foo) {
+        assertNotNull(foo);
+    }
+
+    public static class Foo {
+
     }
 }

Modified: tomee/tomee/trunk/arquillian/arquillian-tomee-common/src/main/java/org/apache/openejb/arquillian/common/TomEEInjectionEnricher.java
URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/arquillian/arquillian-tomee-common/src/main/java/org/apache/openejb/arquillian/common/TomEEInjectionEnricher.java?rev=1554067&r1=1554066&r2=1554067&view=diff
==============================================================================
--- tomee/tomee/trunk/arquillian/arquillian-tomee-common/src/main/java/org/apache/openejb/arquillian/common/TomEEInjectionEnricher.java (original)
+++ tomee/tomee/trunk/arquillian/arquillian-tomee-common/src/main/java/org/apache/openejb/arquillian/common/TomEEInjectionEnricher.java Sun Dec 29 21:06:12 2013
@@ -41,6 +41,6 @@ public class TomEEInjectionEnricher impl
 
     @Override
     public Object[] resolve(final Method method) {
-        return new Object[method.getParameterTypes().length];
+        return OpenEJBEnricher.resolve(getAppContext(method.getDeclaringClass().getName()), method);
     }
 }