[jboss-cvs] JBossAS SVN: r82709 - in projects/webbeans-ri-int/trunk/jbossas/src/main/java/org/jboss/webbeans/integration/jbossas: util and 1 other directory.

jboss-cvs-commits at lists.jboss.org jboss-cvs-commits at lists.jboss.org
Thu Jan 8 13:20:37 EST 2009


Author: petemuir
Date: 2009-01-08 13:20:35 -0500 (Thu, 08 Jan 2009)
New Revision: 82709

Modified:
   projects/webbeans-ri-int/trunk/jbossas/src/main/java/org/jboss/webbeans/integration/jbossas/ejb/JBossEjbResolver.java
   projects/webbeans-ri-int/trunk/jbossas/src/main/java/org/jboss/webbeans/integration/jbossas/util/Reflections.java
Log:
add @Resource injection

Modified: projects/webbeans-ri-int/trunk/jbossas/src/main/java/org/jboss/webbeans/integration/jbossas/ejb/JBossEjbResolver.java
===================================================================
--- projects/webbeans-ri-int/trunk/jbossas/src/main/java/org/jboss/webbeans/integration/jbossas/ejb/JBossEjbResolver.java	2009-01-08 17:52:29 UTC (rev 82708)
+++ projects/webbeans-ri-int/trunk/jbossas/src/main/java/org/jboss/webbeans/integration/jbossas/ejb/JBossEjbResolver.java	2009-01-08 18:20:35 UTC (rev 82709)
@@ -4,11 +4,10 @@
 import java.lang.reflect.Field;
 import java.lang.reflect.Method;
 
+import javax.annotation.Resource;
 import javax.ejb.EJB;
 import javax.persistence.PersistenceContext;
-import javax.persistence.PersistenceContextType;
 import javax.servlet.ServletContext;
-import javax.webbeans.DefinitionException;
 import javax.webbeans.InjectionPoint;
 
 import org.jboss.deployers.structure.spi.DeploymentUnit;
@@ -23,13 +22,22 @@
 import org.jboss.metadata.web.jboss.JBossWebMetaData;
 import org.jboss.webbeans.ejb.spi.EjbResolver;
 import org.jboss.webbeans.integration.jbossas.util.JBossEjb;
+import org.jboss.webbeans.integration.jbossas.util.Reflections;
 import org.jboss.webbeans.integration.jbossas.vdf.KernelControllerVDFConnector;
 import org.jboss.webbeans.integration.jbossas.vdf.VFSDeploymentUnitVDFConnector;
 import org.jboss.webbeans.resources.spi.Naming;
 
+/**
+ * An implementation of EjbResolver for JBoss AS
+ * 
+ * @author Pete Muir
+ *
+ */
 public class JBossEjbResolver implements EjbResolver
 {
    
+   private static final String RESOURCE_LOOKUP_PREFIX = "java:/comp/env";
+   
    private final DeploymentUnit topLevelDeploymentUnit;
    private KernelController controller;
    
@@ -57,6 +65,10 @@
       {
          throw new IllegalArgumentException("No @EJB annotation found on injection point " + injectionPoint);
       }
+      if (injectionPoint.getMember() instanceof Method && ((Method) injectionPoint.getMember()).getParameterTypes().length != 1)
+      {
+         throw new IllegalArgumentException("Injection point represents a method which doesn't follow JavaBean conventions (must have exactly one parameter) " + injectionPoint);
+      }
       EJB annotation = injectionPoint.getAnnotation(EJB.class);
       // Get properties from the annotation
       String beanName = annotation.beanName();
@@ -73,14 +85,7 @@
          else if (injectionPoint.getMember() instanceof Method)
          {
             Method method = (Method) injectionPoint.getMember();
-            if (method.getParameterTypes().length == 1)
-            {
-               beanInterface = method.getParameterTypes()[0].getName();
-            }
-            else
-            {
-               throw new DefinitionException("Can only inject into a method with one parameter " + injectionPoint);
-            }
+            beanInterface = method.getParameterTypes()[0].getName();
          }
       }
 
@@ -92,15 +97,15 @@
       return naming.lookup(jndiName, Object.class);
    }
 
-   public Object resolvePersistenceUnit(InjectionPoint injectionPoint, Naming naming)
+   public Object resolvePersistenceContext(InjectionPoint injectionPoint, Naming naming)
    {
       if (!injectionPoint.isAnnotationPresent(PersistenceContext.class))
       {
          throw new IllegalArgumentException("No @PersistenceContext annotation found on injection point " + injectionPoint);
       }
-      if (injectionPoint.getAnnotation(PersistenceContext.class).type().equals(PersistenceContextType.EXTENDED))
+      if (injectionPoint.getMember() instanceof Method && ((Method) injectionPoint.getMember()).getParameterTypes().length != 1)
       {
-         throw new UnsupportedOperationException("Cannot inject an extended persistence context into " + injectionPoint);
+         throw new IllegalArgumentException("Injection point represents a method which doesn't follow JavaBean conventions (must have exactly one parameter) " + injectionPoint);
       }
       String persistenceUnitName = injectionPoint.getAnnotation(PersistenceContext.class).unitName(); 
       PersistenceUnitDependencyResolver persistenceUnitDependencyResolver = JBossEjb.lookupPersistenceUnitDependencyResolver(controller);
@@ -113,6 +118,20 @@
       ManagedEntityManagerFactory managedFactory = deployment.getManagedFactory();
       return new InjectedEntityManagerFactory(managedFactory).createEntityManager();
    }
+   
+   public Object resolveResource(InjectionPoint injectionPoint, Naming naming)
+   {
+      if (!injectionPoint.isAnnotationPresent(Resource.class))
+      {
+         throw new IllegalArgumentException("No @Resource annotation found on injection point " + injectionPoint);
+      }
+      if (injectionPoint.getMember() instanceof Method && ((Method) injectionPoint.getMember()).getParameterTypes().length != 1)
+      {
+         throw new IllegalArgumentException("Injection point represents a method which doesn't follow JavaBean conventions (must have exactly one parameter) " + injectionPoint);
+      }
+      String name = getResourceName(injectionPoint);
+      return naming.lookup(name, Object.class);
+   }
 
    public Class<? extends Annotation> getEJBAnnotation()
    {
@@ -124,8 +143,13 @@
       return PersistenceContext.class;
    }
    
-   private String getPersistenceUnitSupplier(DeploymentUnit deploymentUnit, PersistenceUnitDependencyResolver persistenceUnitDependencyResolver, String persistenceUnitName)
+   public Class<? extends Annotation> getResourceAnnotation()
    {
+      return Resource.class;
+   }
+   
+   private static String getPersistenceUnitSupplier(DeploymentUnit deploymentUnit, PersistenceUnitDependencyResolver persistenceUnitDependencyResolver, String persistenceUnitName)
+   {
       if ((deploymentUnit.getAttachment(AttachmentNames.PROCESSED_METADATA, JBossMetaData.class) != null && deploymentUnit.getAttachment(JBossMetaData.class).isEJB3x()) || (deploymentUnit.getAttachment(JBossWebMetaData.class) != null))
       {
          try
@@ -148,4 +172,38 @@
       return null;
    }
    
+   private static String getResourceName(InjectionPoint injectionPoint)
+   {
+      Resource resource = injectionPoint.getAnnotation(Resource.class);
+      String mappedName = resource.mappedName();
+      if (!mappedName.equals(""))
+      {
+         return mappedName;
+      }
+      String name = resource.name();
+      if (!name.equals(""))
+      {
+         return RESOURCE_LOOKUP_PREFIX + "/" + name;
+      }
+      String propertyName;
+      if (injectionPoint.getMember() instanceof Field)
+      {
+         propertyName = injectionPoint.getMember().getName();
+      }
+      else if (injectionPoint.getMember() instanceof Method)
+      {
+         propertyName = Reflections.getPropertyName((Method) injectionPoint.getMember());
+         if (propertyName == null)
+         {
+            throw new IllegalArgumentException("Injection point represents a method which doesn't follow JavaBean conventions (unable to determine property name) " + injectionPoint);
+         }
+      }
+      else
+      {
+         throw new AssertionError("Unable to inject into " + injectionPoint);
+      }
+      String className = injectionPoint.getMember().getDeclaringClass().getName();
+      return RESOURCE_LOOKUP_PREFIX + "/" + className + "/" + propertyName;
+   }
+   
 }

Modified: projects/webbeans-ri-int/trunk/jbossas/src/main/java/org/jboss/webbeans/integration/jbossas/util/Reflections.java
===================================================================
--- projects/webbeans-ri-int/trunk/jbossas/src/main/java/org/jboss/webbeans/integration/jbossas/util/Reflections.java	2009-01-08 17:52:29 UTC (rev 82708)
+++ projects/webbeans-ri-int/trunk/jbossas/src/main/java/org/jboss/webbeans/integration/jbossas/util/Reflections.java	2009-01-08 18:20:35 UTC (rev 82709)
@@ -1,5 +1,8 @@
 package org.jboss.webbeans.integration.jbossas.util;
 
+import java.beans.Introspector;
+import java.lang.reflect.Method;
+
 public class Reflections
 {
    
@@ -21,4 +24,23 @@
          return Class.forName(name);
       }
    }
+   
+   public static String getPropertyName(Method method)
+   {
+      String methodName = method.getName();
+      if (methodName.matches("^(get).*") && method.getParameterTypes().length == 0)
+      {
+         return Introspector.decapitalize(methodName.substring(3));
+      }
+      else if (methodName.matches("^(is).*") && method.getParameterTypes().length == 0)
+      {
+         return Introspector.decapitalize(methodName.substring(2));
+      }
+      else
+      {
+         return null;
+      }
+
+   }
+   
 }




More information about the jboss-cvs-commits mailing list