[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