[jboss-svn-commits] JBoss Common SVN: r4321 - in arquillian/trunk: containers/reloaded/src/main/java/org/jboss/arquillian/container/reloaded and 10 other directories.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Thu Apr 22 16:24:27 EDT 2010


Author: aslak
Date: 2010-04-22 16:24:25 -0400 (Thu, 22 Apr 2010)
New Revision: 4321

Added:
   arquillian/trunk/testng/src/main/java/org/jboss/arquillian/testng/TestDataProviderTransformer.java
   arquillian/trunk/testng/src/main/java/org/jboss/arquillian/testng/TestEnricherDataProvider.java
Modified:
   arquillian/trunk/containers/openejb/src/main/java/org/jboss/arquillian/openejb/OpenEJBTestEnricher.java
   arquillian/trunk/containers/reloaded/src/main/java/org/jboss/arquillian/container/reloaded/ReloadedTestEnricher.java
   arquillian/trunk/examples/domain/src/main/java/com/acme/cdi/payment/AsynchronousPaymentProcessor.java
   arquillian/trunk/examples/domain/src/main/java/com/acme/cdi/payment/MockPaymentProcessor.java
   arquillian/trunk/examples/domain/src/main/java/com/acme/cdi/payment/SynchronousPaymentProcessor.java
   arquillian/trunk/examples/junit/src/test/java/com/acme/cdi/payment/SynchronousPaymentProcessorTestCase.java
   arquillian/trunk/examples/junit/src/test/java/com/acme/cdi/random/RandomTestCase.java
   arquillian/trunk/junit/src/main/java/org/jboss/arquillian/junit/Arquillian.java
   arquillian/trunk/spi/src/main/java/org/jboss/arquillian/spi/TestEnricher.java
   arquillian/trunk/spi/src/main/java/org/jboss/arquillian/spi/util/TestEnrichers.java
   arquillian/trunk/testenrichers/cdi/src/main/java/org/jboss/arquillian/testenricher/cdi/CDIInjectionEnricher.java
   arquillian/trunk/testenrichers/ejb/src/main/java/org/jboss/arquillian/testenricher/ejb/EJBInjectionEnricher.java
   arquillian/trunk/testenrichers/ejb/src/main/java/org/jboss/arquillian/testenricher/ejb/SecurityActions.java
   arquillian/trunk/testenrichers/resource/src/main/java/org/jboss/arquillian/testenricher/resource/ResourceInjectionEnricher.java
   arquillian/trunk/testenrichers/resource/src/main/java/org/jboss/arquillian/testenricher/resource/SecurityActions.java
Log:
ARQ-70 Added support for Method Argument Injection. setXX support for @EJB and @Resource and test method arguments for CDI



Modified: arquillian/trunk/containers/openejb/src/main/java/org/jboss/arquillian/openejb/OpenEJBTestEnricher.java
===================================================================
--- arquillian/trunk/containers/openejb/src/main/java/org/jboss/arquillian/openejb/OpenEJBTestEnricher.java	2010-04-22 15:29:00 UTC (rev 4320)
+++ arquillian/trunk/containers/openejb/src/main/java/org/jboss/arquillian/openejb/OpenEJBTestEnricher.java	2010-04-22 20:24:25 UTC (rev 4321)
@@ -16,7 +16,6 @@
  */
 package org.jboss.arquillian.openejb;
 
-import java.lang.reflect.Field;
 import java.util.Properties;
 
 import javax.naming.Binding;
@@ -47,13 +46,13 @@
    }
 
    @Override
-   protected Object lookupEJB(Field field) throws Exception 
+   protected Object lookupEJB(Class<?> fieldType) throws Exception
    {
       InitialContext context = createContext();
-      return lookupRecursive(field, context, context.listBindings("/"));
+      return lookupRecursive(fieldType, context, context.listBindings("/"));
    }
    
-   protected Object lookupRecursive(Field field, Context context, NamingEnumeration<Binding> contextNames) throws Exception 
+   protected Object lookupRecursive(Class<?> fieldType, Context context, NamingEnumeration<Binding> contextNames) throws Exception 
    {
       while(contextNames.hasMore())
       {
@@ -62,17 +61,17 @@
          if(Context.class.isInstance(value)) 
          {
             Context subContext = (Context)value;
-            return lookupRecursive(field, subContext, subContext.listBindings("/"));
+            return lookupRecursive(fieldType, subContext, subContext.listBindings("/"));
          }
          else 
          {
             value = context.lookup(contextName.getName());
-            if(field.getType().isInstance(value))
+            if(fieldType.isInstance(value))
             {
                return value;
             }
          }
       }
-      throw new RuntimeException("Could not lookup EJB reference for: " + field);
+      throw new RuntimeException("Could not lookup EJB reference for: " + fieldType);
    }
 }

Modified: arquillian/trunk/containers/reloaded/src/main/java/org/jboss/arquillian/container/reloaded/ReloadedTestEnricher.java
===================================================================
--- arquillian/trunk/containers/reloaded/src/main/java/org/jboss/arquillian/container/reloaded/ReloadedTestEnricher.java	2010-04-22 15:29:00 UTC (rev 4320)
+++ arquillian/trunk/containers/reloaded/src/main/java/org/jboss/arquillian/container/reloaded/ReloadedTestEnricher.java	2010-04-22 20:24:25 UTC (rev 4321)
@@ -16,6 +16,8 @@
  */
 package org.jboss.arquillian.container.reloaded;
 
+import java.lang.reflect.Method;
+
 import org.jboss.arquillian.spi.TestEnricher;
 import org.jboss.beans.metadata.plugins.builder.BeanMetaDataBuilderFactory;
 import org.jboss.beans.metadata.spi.builder.BeanMetaDataBuilder;
@@ -48,6 +50,9 @@
    // Required Implementations -----------------------------------------------------------||
    //-------------------------------------------------------------------------------------||
 
+   /* (non-Javadoc)
+    * @see org.jboss.arquillian.spi.TestEnricher#enrich(java.lang.Object)
+    */
    public void enrich(final Object testCase)
    {
       // Obtain the server as set from the container
@@ -68,6 +73,10 @@
       {
          throw new RuntimeException("Could not enrich " + testCase + " by installing the instance into MC", e);
       }
-
    }
+   
+   public Object[] resolve(Method method)
+   {
+      return new Object[method.getParameterTypes().length];
+   }
 }

Modified: arquillian/trunk/examples/domain/src/main/java/com/acme/cdi/payment/AsynchronousPaymentProcessor.java
===================================================================
--- arquillian/trunk/examples/domain/src/main/java/com/acme/cdi/payment/AsynchronousPaymentProcessor.java	2010-04-22 15:29:00 UTC (rev 4320)
+++ arquillian/trunk/examples/domain/src/main/java/com/acme/cdi/payment/AsynchronousPaymentProcessor.java	2010-04-22 20:24:25 UTC (rev 4321)
@@ -16,7 +16,10 @@
  */
 package com.acme.cdi.payment;
 
+import javax.enterprise.context.RequestScoped;
+
 @Asynchronous
+ at RequestScoped
 public class AsynchronousPaymentProcessor implements PaymentProcessor {
 
    public void process(String payment) 

Modified: arquillian/trunk/examples/domain/src/main/java/com/acme/cdi/payment/MockPaymentProcessor.java
===================================================================
--- arquillian/trunk/examples/domain/src/main/java/com/acme/cdi/payment/MockPaymentProcessor.java	2010-04-22 15:29:00 UTC (rev 4320)
+++ arquillian/trunk/examples/domain/src/main/java/com/acme/cdi/payment/MockPaymentProcessor.java	2010-04-22 20:24:25 UTC (rev 4321)
@@ -16,9 +16,11 @@
  */
 package com.acme.cdi.payment;
 
+import javax.enterprise.context.RequestScoped;
 import javax.enterprise.inject.Alternative;
 
 @Alternative @Asynchronous @Synchronous
+ at RequestScoped
 public class MockPaymentProcessor implements PaymentProcessor {
 
 	public static Boolean HAS_BEEN_CALLED = false;

Modified: arquillian/trunk/examples/domain/src/main/java/com/acme/cdi/payment/SynchronousPaymentProcessor.java
===================================================================
--- arquillian/trunk/examples/domain/src/main/java/com/acme/cdi/payment/SynchronousPaymentProcessor.java	2010-04-22 15:29:00 UTC (rev 4320)
+++ arquillian/trunk/examples/domain/src/main/java/com/acme/cdi/payment/SynchronousPaymentProcessor.java	2010-04-22 20:24:25 UTC (rev 4321)
@@ -16,7 +16,10 @@
  */
 package com.acme.cdi.payment;
 
+import javax.enterprise.context.RequestScoped;
+
 @Synchronous
+ at RequestScoped
 public class SynchronousPaymentProcessor implements PaymentProcessor {
 
    public void process(String payment) 

Modified: arquillian/trunk/examples/junit/src/test/java/com/acme/cdi/payment/SynchronousPaymentProcessorTestCase.java
===================================================================
--- arquillian/trunk/examples/junit/src/test/java/com/acme/cdi/payment/SynchronousPaymentProcessorTestCase.java	2010-04-22 15:29:00 UTC (rev 4320)
+++ arquillian/trunk/examples/junit/src/test/java/com/acme/cdi/payment/SynchronousPaymentProcessorTestCase.java	2010-04-22 20:24:25 UTC (rev 4321)
@@ -16,8 +16,6 @@
  */
 package com.acme.cdi.payment;
 
-import javax.inject.Inject;
-
 import org.jboss.arquillian.api.Deployment;
 import org.jboss.arquillian.junit.Arquillian;
 import org.jboss.shrinkwrap.api.ArchivePaths;
@@ -47,10 +45,8 @@
 						ArchivePaths.create("beans.xml"));
 	}
 	
-	@Inject @Synchronous PaymentProcessor processor;
-	
 	@Test
-	public void shouldBeReplacedByAMock() throws Exception
+	public void shouldBeReplacedByAMock(@Synchronous PaymentProcessor processor) throws Exception
 	{
 		processor.process("");
 		Assert.assertTrue(MockPaymentProcessor.HAS_BEEN_CALLED);

Modified: arquillian/trunk/examples/junit/src/test/java/com/acme/cdi/random/RandomTestCase.java
===================================================================
--- arquillian/trunk/examples/junit/src/test/java/com/acme/cdi/random/RandomTestCase.java	2010-04-22 15:29:00 UTC (rev 4320)
+++ arquillian/trunk/examples/junit/src/test/java/com/acme/cdi/random/RandomTestCase.java	2010-04-22 20:24:25 UTC (rev 4321)
@@ -16,8 +16,6 @@
  */
 package com.acme.cdi.random;
 
-import javax.inject.Inject;
-
 import org.jboss.arquillian.api.Deployment;
 import org.jboss.arquillian.junit.Arquillian;
 import org.jboss.shrinkwrap.api.ArchivePaths;
@@ -48,12 +46,9 @@
 						ArchivePaths.create("beans.xml"));
 	}
 
-	@Inject @Random 
-	private int randomNumber;
-
 	@Test
-	public void shouldRun() throws Exception 
+	public void shouldRun(@Random int randomNumber) throws Exception 
 	{
-		Assert.assertTrue(randomNumber < 101);
+	   Assert.assertTrue(randomNumber < 101);
 	}
 }

Modified: arquillian/trunk/junit/src/main/java/org/jboss/arquillian/junit/Arquillian.java
===================================================================
--- arquillian/trunk/junit/src/main/java/org/jboss/arquillian/junit/Arquillian.java	2010-04-22 15:29:00 UTC (rev 4320)
+++ arquillian/trunk/junit/src/main/java/org/jboss/arquillian/junit/Arquillian.java	2010-04-22 20:24:25 UTC (rev 4321)
@@ -16,6 +16,7 @@
  */
 package org.jboss.arquillian.junit;
 
+import java.lang.annotation.Annotation;
 import java.lang.reflect.Method;
 import java.util.Arrays;
 import java.util.List;
@@ -26,6 +27,7 @@
 import org.jboss.arquillian.spi.TestMethodExecutor;
 import org.jboss.arquillian.spi.TestResult;
 import org.jboss.arquillian.spi.TestRunnerAdaptor;
+import org.jboss.arquillian.spi.util.TestEnrichers;
 import org.junit.runners.BlockJUnit4ClassRunner;
 import org.junit.runners.model.FrameworkMethod;
 import org.junit.runners.model.InitializationError;
@@ -84,6 +86,21 @@
       return super.computeTestMethods();
    }
 
+
+   /**
+    * Override to allow test methods with arguments
+    */
+   @Override
+   protected void validatePublicVoidNoArgMethods(Class<? extends Annotation> annotation, boolean isStatic, List<Throwable> errors) 
+   {
+     List<FrameworkMethod> methods= getTestClass().getAnnotatedMethods(annotation);
+
+     for (FrameworkMethod eachTestMethod : methods) 
+     {
+        eachTestMethod.validatePublicVoid(isStatic, errors);
+     }
+  }
+   
       
    @Override
    protected Statement withBeforeClasses(final Statement originalStatement)
@@ -133,7 +150,7 @@
    @Override
    protected Statement withAfters(final FrameworkMethod method, final Object target, final Statement originalStatement)
    {
-      final Statement statementWithAfters = super.withBefores(method, target, originalStatement);
+      final Statement statementWithAfters = super.withAfters(method, target, originalStatement);
       return new Statement()
       {
          @Override
@@ -157,7 +174,8 @@
             {
                public void invoke() throws Throwable
                {
-                  method.invokeExplosively(test);
+                  Object parameterValues = TestEnrichers.enrich(getMethod());
+                  method.invokeExplosively(test, (Object[])parameterValues);
                }
                
                public Method getMethod()

Modified: arquillian/trunk/spi/src/main/java/org/jboss/arquillian/spi/TestEnricher.java
===================================================================
--- arquillian/trunk/spi/src/main/java/org/jboss/arquillian/spi/TestEnricher.java	2010-04-22 15:29:00 UTC (rev 4320)
+++ arquillian/trunk/spi/src/main/java/org/jboss/arquillian/spi/TestEnricher.java	2010-04-22 20:24:25 UTC (rev 4321)
@@ -16,17 +16,37 @@
  */
 package org.jboss.arquillian.spi;
 
+import java.lang.reflect.Method;
+
 /**
- * TestEnricher
+ * SPI used to enrich the runtime test object.
  *
- * @author <a href="mailto:aslak at conduct.no">Aslak Knutsen</a>
+ *
+ * @author <a href="mailto:aknutsen at redhat.com">Aslak Knutsen</a>
  * @version $Revision: $
  */
 public interface TestEnricher
 {
    /**
+    * Extension point to add features to the a Test class instance.<br/>
+    * <br/>
+    * IE. Instance field injection
+    *  
+    * @param testCase The test case instance
+    */
+   void enrich(Object testCase);
+   
+   /**
+    * Extension point to add features to the test method arguments.<br/>
+    * <br/>
+    * IE. Argument injection<br/>
+    * <br/>
     * 
-    * @param testCase
+    * The return value Object[] must match the Field[] indexes. 
+    * Leave Object[] index as null if it can't be handled by this {@link TestEnricher}.
+    * 
+    * @param method
+    * @return A Object[] of Arguments 
     */
-   void enrich(Object testCase);
+   Object[] resolve(Method method);
 }

Modified: arquillian/trunk/spi/src/main/java/org/jboss/arquillian/spi/util/TestEnrichers.java
===================================================================
--- arquillian/trunk/spi/src/main/java/org/jboss/arquillian/spi/util/TestEnrichers.java	2010-04-22 15:29:00 UTC (rev 4320)
+++ arquillian/trunk/spi/src/main/java/org/jboss/arquillian/spi/util/TestEnrichers.java	2010-04-22 20:24:25 UTC (rev 4321)
@@ -16,6 +16,8 @@
  */
 package org.jboss.arquillian.spi.util;
 
+import java.lang.reflect.Method;
+
 import org.jboss.arquillian.spi.TestEnricher;
 
 /**
@@ -28,19 +30,64 @@
  */
 public class TestEnrichers
 {
-   private TestEnrichers() {}
+   private TestEnrichers()
+   {
+   }
 
-   /**  
+   /**
     * Enrich a object based on all found TestEnricher providers.
     * 
-    * @param testCase The object that should be enriched.
+    * @param testCase
+    *           The object that should be enriched.
     */
-   public static void enrich(Object testCase) 
+   public static void enrich(Object testCase)
    {
-      DefaultServiceLoader<TestEnricher> serviceLoader = DefaultServiceLoader.load(TestEnricher.class);
-      for(TestEnricher enricher : serviceLoader) 
+      DefaultServiceLoader<TestEnricher> serviceLoader = DefaultServiceLoader
+            .load(TestEnricher.class);
+      for (TestEnricher enricher : serviceLoader)
       {
          enricher.enrich(testCase);
       }
    }
+
+   /**
+    * Enrich the method arguments of a method call.<br/>
+    * The Object[] index will match the method parameterType[] index.
+    * 
+    * @param method
+    * @return the argument values
+    */
+   public static Object[] enrich(Method method)
+   {
+      Object[] values = new Object[method.getParameterTypes().length];
+      DefaultServiceLoader<TestEnricher> serviceLoader = DefaultServiceLoader
+            .load(TestEnricher.class);
+      for (TestEnricher enricher : serviceLoader)
+      {
+         mergeValues(values, enricher.resolve(method));
+      }
+      return values;
+   }
+
+   private static void mergeValues(Object[] values, Object[] resolvedValues)
+   {
+      if(resolvedValues == null || resolvedValues.length == 0)
+      {
+         return;
+      }
+      if(values.length != resolvedValues.length)
+      {
+         throw new IllegalStateException("TestEnricher resolved wrong argument count, expected " + 
+               values.length + " returned " + resolvedValues.length);
+      }
+      for (int i = 0; i < resolvedValues.length; i++)
+      {
+         Object resvoledValue = resolvedValues[i];
+         if (resvoledValue != null && values[i] == null)
+         {
+            values[i] = resvoledValue;
+         }
+      }
+   }
+
 }

Modified: arquillian/trunk/testenrichers/cdi/src/main/java/org/jboss/arquillian/testenricher/cdi/CDIInjectionEnricher.java
===================================================================
--- arquillian/trunk/testenrichers/cdi/src/main/java/org/jboss/arquillian/testenricher/cdi/CDIInjectionEnricher.java	2010-04-22 15:29:00 UTC (rev 4320)
+++ arquillian/trunk/testenrichers/cdi/src/main/java/org/jboss/arquillian/testenricher/cdi/CDIInjectionEnricher.java	2010-04-22 20:24:25 UTC (rev 4321)
@@ -16,7 +16,11 @@
  */
 package org.jboss.arquillian.testenricher.cdi;
 
+import java.lang.annotation.Annotation;
+import java.lang.reflect.Method;
+
 import javax.enterprise.context.spi.CreationalContext;
+import javax.enterprise.inject.spi.Bean;
 import javax.enterprise.inject.spi.BeanManager;
 import javax.enterprise.inject.spi.InjectionTarget;
 import javax.naming.InitialContext;
@@ -24,7 +28,7 @@
 import org.jboss.arquillian.spi.TestEnricher;
 
 /**
- * CDIInjectionEnricher
+ * Enricher that provide JSR-299 CDI class and method argument injection.
  *
  * @author <a href="mailto:aslak at conduct.no">Aslak Knutsen</a>
  * @version $Revision: $
@@ -35,6 +39,9 @@
    private static final String JNDI_BEAN_MANAGER_JBOSS = "java:app/BeanManager";
    private static final String ANNOTATION_NAME = "javax.inject.Inject";
    
+   /* (non-Javadoc)
+    * @see org.jboss.arquillian.spi.TestEnricher#enrich(java.lang.Object)
+    */
    public void enrich(Object testCase)
    {
       if(SecurityActions.isClassPresent(ANNOTATION_NAME)) 
@@ -43,6 +50,39 @@
       }
    }
    
+   /* (non-Javadoc)
+    * @see org.jboss.arquillian.spi.TestEnricher#resolve(java.lang.reflect.Method)
+    */
+   public Object[] resolve(Method method) 
+   {
+     Object[] values = new Object[method.getParameterTypes().length];
+     if(SecurityActions.isClassPresent(ANNOTATION_NAME)) 
+     {
+        BeanManager beanManager = lookupBeanManager();
+        if(beanManager == null) 
+        {
+             return values;
+        }
+        Annotation[][] parameterAnnotations = method.getParameterAnnotations();
+        Class<?>[] parameterTypes = method.getParameterTypes();
+        for(int i = 0; i < parameterTypes.length; i++)
+        {
+           Class<?> parameterType = parameterTypes[i];
+           Annotation[] parameterAnnotation = parameterAnnotations[i];
+           values[i] = getInstanceByType(beanManager, parameterType, parameterAnnotation);
+        }
+     }
+     return values;
+   }
+   
+   @SuppressWarnings("unchecked")
+   private <T> T getInstanceByType(BeanManager manager, Class<T> type, Annotation... bindings)
+   {
+      final Bean<?> bean = manager.resolve(manager.getBeans(type, bindings));
+      CreationalContext<?> cc = manager.createCreationalContext(null);
+      return (T) manager.getReference(bean, type, cc);
+   }
+   
    protected void injectClass(Object testCase) 
    {
       try 

Modified: arquillian/trunk/testenrichers/ejb/src/main/java/org/jboss/arquillian/testenricher/ejb/EJBInjectionEnricher.java
===================================================================
--- arquillian/trunk/testenrichers/ejb/src/main/java/org/jboss/arquillian/testenricher/ejb/EJBInjectionEnricher.java	2010-04-22 15:29:00 UTC (rev 4320)
+++ arquillian/trunk/testenrichers/ejb/src/main/java/org/jboss/arquillian/testenricher/ejb/EJBInjectionEnricher.java	2010-04-22 20:24:25 UTC (rev 4321)
@@ -18,17 +18,19 @@
 
 import java.lang.annotation.Annotation;
 import java.lang.reflect.Field;
+import java.lang.reflect.Method;
 import java.util.List;
 
+import javax.ejb.EJB;
 import javax.naming.InitialContext;
 import javax.naming.NamingException;
 
 import org.jboss.arquillian.spi.TestEnricher;
 
 /**
- * InjectionEnricher
+ * Enricher that provide EJB class and setter method injection. 
  *
- * @author <a href="mailto:aslak at conduct.no">Aslak Knutsen</a>
+ * @author <a href="mailto:aknutsen at redhat.com">Aslak Knutsen</a>
  * @version $Revision: $
  */
 public class EJBInjectionEnricher implements TestEnricher
@@ -38,6 +40,9 @@
    private static final String ANNOTATION_FIELD_BEAN_INTERFACE = "beanInterface";
    private static final String ANNOTATION_FIELD_MAPPED_NAME = "mappedName";
    
+   /* (non-Javadoc)
+    * @see org.jboss.arquillian.spi.TestEnricher#enrich(java.lang.Object)
+    */
    public void enrich(Object testCase)
    {
       if(SecurityActions.isClassPresent(ANNOTATION_NAME)) 
@@ -46,6 +51,14 @@
       }
    }
 
+   /* (non-Javadoc)
+    * @see org.jboss.arquillian.spi.TestEnricher#resolve(java.lang.reflect.Method)
+    */
+   public Object[] resolve(Method method) 
+   {
+     return new Object[method.getParameterTypes().length];
+   }
+   
    protected void injectClass(Object testCase) 
    {
       try 
@@ -59,33 +72,52 @@
          
          for(Field field : annotatedFields) 
          {
-            Object ejb = lookupEJB(field);
+            Object ejb = lookupEJB(field.getType());
             field.set(testCase, ejb);
          }
+         
+         List<Method> methods = SecurityActions.getMethodsWithAnnotation(
+               testCase.getClass(), 
+               ejbAnnotation);
+         
+         for(Method method : methods) 
+         {
+            if(method.getParameterTypes().length != 1) 
+            {
+               throw new RuntimeException("@EJB only allowed on single argument methods");
+            }
+            if(!method.getName().startsWith("set")) 
+            {
+               throw new RuntimeException("@EJB only allowed on 'set' methods");
+            }
+            Object ejb = lookupEJB(method.getParameterTypes()[0]);
+            method.invoke(testCase, ejb);
+         }
+         
       } 
       catch (Exception e) 
       {
          throw new RuntimeException("Could not inject members", e);
       }
    }
-
-   protected Object lookupEJB(Field field) throws Exception 
+   
+   protected Object lookupEJB(Class<?> fieldType) throws Exception 
    {
       // TODO: figure out test context ? 
       InitialContext context = createContext();
       try 
       {
-         return context.lookup("java:global/test.ear/test/" + field.getType().getSimpleName() + "Bean");
+         return context.lookup("java:global/test.ear/test/" + fieldType.getSimpleName() + "Bean");
       } 
       catch (NamingException e) 
       {
     	  try 
     	  {
-    	     return context.lookup("test/" + field.getType().getSimpleName() + "Bean/local");
+    	     return context.lookup("test/" + fieldType.getSimpleName() + "Bean/local");
     	  } 
     	  catch (NamingException e2) 
     	  {
-    	     return context.lookup("test/" + field.getType().getSimpleName() + "Bean/remote");    	    
+    	     return context.lookup("test/" + fieldType.getSimpleName() + "Bean/remote");    	    
     	  }
       }
    }

Modified: arquillian/trunk/testenrichers/ejb/src/main/java/org/jboss/arquillian/testenricher/ejb/SecurityActions.java
===================================================================
--- arquillian/trunk/testenrichers/ejb/src/main/java/org/jboss/arquillian/testenricher/ejb/SecurityActions.java	2010-04-22 15:29:00 UTC (rev 4320)
+++ arquillian/trunk/testenrichers/ejb/src/main/java/org/jboss/arquillian/testenricher/ejb/SecurityActions.java	2010-04-22 20:24:25 UTC (rev 4321)
@@ -19,6 +19,7 @@
 import java.lang.annotation.Annotation;
 import java.lang.reflect.Constructor;
 import java.lang.reflect.Field;
+import java.lang.reflect.Method;
 import java.security.AccessController;
 import java.security.PrivilegedAction;
 import java.security.PrivilegedActionException;
@@ -199,6 +200,30 @@
       });
       return declaredAccessableFields;
    }
+
+   public static List<Method> getMethodsWithAnnotation(final Class<?> source, final Class<? extends Annotation> annotationClass) 
+   {
+      List<Method> declaredAccessableMethods = AccessController.doPrivileged(new PrivilegedAction<List<Method>>()
+      {
+         public List<Method> run()
+         {
+            List<Method> foundMethods = new ArrayList<Method>();
+            for(Method method : source.getDeclaredMethods())
+            {
+               if(method.isAnnotationPresent(annotationClass))
+               {
+                  if(!method.isAccessible()) 
+                  {
+                     method.setAccessible(true);
+                  }
+                  foundMethods.add(method);
+               }
+            }
+            return foundMethods;
+         }
+      });
+      return declaredAccessableMethods;
+   }
    
    //-------------------------------------------------------------------------------||
    // Inner Classes ----------------------------------------------------------------||

Modified: arquillian/trunk/testenrichers/resource/src/main/java/org/jboss/arquillian/testenricher/resource/ResourceInjectionEnricher.java
===================================================================
--- arquillian/trunk/testenrichers/resource/src/main/java/org/jboss/arquillian/testenricher/resource/ResourceInjectionEnricher.java	2010-04-22 15:29:00 UTC (rev 4320)
+++ arquillian/trunk/testenrichers/resource/src/main/java/org/jboss/arquillian/testenricher/resource/ResourceInjectionEnricher.java	2010-04-22 20:24:25 UTC (rev 4321)
@@ -18,6 +18,7 @@
 
 import java.lang.annotation.Annotation;
 import java.lang.reflect.Field;
+import java.lang.reflect.Method;
 import java.util.List;
 
 import javax.annotation.Resource;
@@ -26,9 +27,9 @@
 import org.jboss.arquillian.spi.TestEnricher;
 
 /**
- * ResourceInjectionEnricher
+ * Enricher that provide @Resource class and method argument injection.
  *
- * @author <a href="mailto:aslak at conduct.no">Aslak Knutsen</a>
+ * @author <a href="mailto:aknutsen at redhat.com">Aslak Knutsen</a>
  * @version $Revision: $
  */
 public class ResourceInjectionEnricher implements TestEnricher
@@ -36,6 +37,9 @@
    private static final String RESOURCE_LOOKUP_PREFIX = "java:/comp/env";
    private static final String ANNOTATION_NAME = "javax.annotation.Resource";
    
+   /* (non-Javadoc)
+    * @see org.jboss.arquillian.spi.TestEnricher#enrich(java.lang.Object)
+    */
    public void enrich(Object testCase)
    {
       if(SecurityActions.isClassPresent(ANNOTATION_NAME)) 
@@ -44,6 +48,14 @@
       }
    }
 
+   /* (non-Javadoc)
+    * @see org.jboss.arquillian.spi.TestEnricher#resolve(java.lang.reflect.Method)
+    */
+   public Object[] resolve(Method method) 
+   {
+     return new Object[method.getParameterTypes().length];
+   }
+
    protected void injectClass(Object testCase) 
    {
       try 
@@ -60,6 +72,25 @@
             Object ejb = lookup(getResourceName(field));
             field.set(testCase, ejb);
          }
+         
+         List<Method> methods = SecurityActions.getMethodsWithAnnotation(
+               testCase.getClass(), 
+               resourceAnnotation);
+         
+         for(Method method : methods) 
+         {
+            if(method.getParameterTypes().length != 1) 
+            {
+               throw new RuntimeException("@Resource only allowed on single argument methods");
+            }
+            if(!method.getName().startsWith("set")) 
+            {
+               throw new RuntimeException("@Resource only allowed on 'set' methods");
+            }
+            Object resource = lookup(getResourceName(method.getAnnotation(Resource.class)));
+            method.invoke(testCase, resource);
+         }
+         
       } 
       catch (Exception e) 
       {
@@ -77,6 +108,18 @@
    protected String getResourceName(Field field)
    {
       Resource resource = field.getAnnotation(Resource.class);
+      String resourceName = getResourceName(resource);
+      if(resourceName != null) 
+      {
+       return resourceName;
+      }
+      String propertyName = field.getName();
+      String className = field.getDeclaringClass().getName();
+      return RESOURCE_LOOKUP_PREFIX + "/" + className + "/" + propertyName;
+   }
+   
+   protected String getResourceName(Resource resource)
+   {
       String mappedName = resource.mappedName();
       if (!mappedName.equals(""))
       {
@@ -87,8 +130,6 @@
       {
          return RESOURCE_LOOKUP_PREFIX + "/" + name;
       }
-      String propertyName = field.getName();
-      String className = field.getDeclaringClass().getName();
-      return RESOURCE_LOOKUP_PREFIX + "/" + className + "/" + propertyName;
+      return null;
    }
 }

Modified: arquillian/trunk/testenrichers/resource/src/main/java/org/jboss/arquillian/testenricher/resource/SecurityActions.java
===================================================================
--- arquillian/trunk/testenrichers/resource/src/main/java/org/jboss/arquillian/testenricher/resource/SecurityActions.java	2010-04-22 15:29:00 UTC (rev 4320)
+++ arquillian/trunk/testenrichers/resource/src/main/java/org/jboss/arquillian/testenricher/resource/SecurityActions.java	2010-04-22 20:24:25 UTC (rev 4321)
@@ -19,6 +19,7 @@
 import java.lang.annotation.Annotation;
 import java.lang.reflect.Constructor;
 import java.lang.reflect.Field;
+import java.lang.reflect.Method;
 import java.security.AccessController;
 import java.security.PrivilegedAction;
 import java.security.PrivilegedActionException;
@@ -199,7 +200,31 @@
       });
       return declaredAccessableFields;
    }
-   
+
+   public static List<Method> getMethodsWithAnnotation(final Class<?> source, final Class<? extends Annotation> annotationClass) 
+   {
+      List<Method> declaredAccessableMethods = AccessController.doPrivileged(new PrivilegedAction<List<Method>>()
+      {
+         public List<Method> run()
+         {
+            List<Method> foundMethods = new ArrayList<Method>();
+            for(Method method : source.getDeclaredMethods())
+            {
+               if(method.isAnnotationPresent(annotationClass))
+               {
+                  if(!method.isAccessible()) 
+                  {
+                     method.setAccessible(true);
+                  }
+                  foundMethods.add(method);
+               }
+            }
+            return foundMethods;
+         }
+      });
+      return declaredAccessableMethods;
+   }
+
    //-------------------------------------------------------------------------------||
    // Inner Classes ----------------------------------------------------------------||
    //-------------------------------------------------------------------------------||

Added: arquillian/trunk/testng/src/main/java/org/jboss/arquillian/testng/TestDataProviderTransformer.java
===================================================================
--- arquillian/trunk/testng/src/main/java/org/jboss/arquillian/testng/TestDataProviderTransformer.java	                        (rev 0)
+++ arquillian/trunk/testng/src/main/java/org/jboss/arquillian/testng/TestDataProviderTransformer.java	2010-04-22 20:24:25 UTC (rev 4321)
@@ -0,0 +1,39 @@
+/**
+ * 
+ */
+package org.jboss.arquillian.testng;
+
+import java.lang.reflect.Constructor;
+import java.lang.reflect.Method;
+
+import org.testng.IAnnotationTransformer;
+import org.testng.annotations.DataProvider;
+import org.testng.annotations.ITestAnnotation;
+import org.testng.internal.annotations.TestAnnotation;
+
+/**
+ * A IAnnotationTransformer that will add the {@link TestEnricherDataProvider} as {@link DataProvider} 
+ * to the given test method to enable method argument injection support. 
+ *
+ * @author <a href="mailto:aknutsen at redhat.com">Aslak Knutsen</a>
+ * @version $Revision: $
+ */
+public class TestDataProviderTransformer implements IAnnotationTransformer {
+
+	/* (non-Javadoc)
+	 * @see org.testng.IAnnotationTransformer#transform(org.testng.annotations.ITestAnnotation, java.lang.Class, java.lang.reflect.Constructor, java.lang.reflect.Method)
+	 */
+	@SuppressWarnings("unchecked")
+	public void transform(ITestAnnotation testAnnotation, Class clazz, Constructor constructor, Method method) 
+	{
+		if(testAnnotation.getDataProviderClass() == null) 
+		{
+			if(testAnnotation instanceof TestAnnotation) 
+			{
+				TestAnnotation annoation = (TestAnnotation)testAnnotation;
+				annoation.setDataProviderClass(TestEnricherDataProvider.class);
+				annoation.setDataProvider(TestEnricherDataProvider.PROVIDER_NAME);
+			}
+		}
+	}
+}

Added: arquillian/trunk/testng/src/main/java/org/jboss/arquillian/testng/TestEnricherDataProvider.java
===================================================================
--- arquillian/trunk/testng/src/main/java/org/jboss/arquillian/testng/TestEnricherDataProvider.java	                        (rev 0)
+++ arquillian/trunk/testng/src/main/java/org/jboss/arquillian/testng/TestEnricherDataProvider.java	2010-04-22 20:24:25 UTC (rev 4321)
@@ -0,0 +1,43 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2009, Red Hat Middleware LLC, and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * Licensed 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.jboss.arquillian.testng;
+
+import java.lang.reflect.Method;
+
+import org.jboss.arquillian.spi.util.TestEnrichers;
+import org.testng.annotations.DataProvider;
+
+/**
+ * TestEnricherDataProvider
+ *
+ * @author <a href="mailto:aknutsen at redhat.com">Aslak Knutsen</a>
+ * @version $Revision: $
+ */
+public class TestEnricherDataProvider {
+
+	public static final String PROVIDER_NAME = "enrich";
+	
+	@DataProvider(name = PROVIDER_NAME)
+	public static Object[][] enrich(Method method) 
+	{
+		Object[] parameterValues = TestEnrichers.enrich(method);
+		Object[][] values = new Object[1][method.getParameterTypes().length];
+		values[0] = parameterValues; 
+		
+		return values;
+	}
+}



More information about the jboss-svn-commits mailing list