[weld-commits] Weld SVN: r6142 - in extensions/trunk/src: test/java/org/jboss/weld/test/extensions and 1 other directories.

weld-commits at lists.jboss.org weld-commits at lists.jboss.org
Wed Apr 21 20:13:07 EDT 2010


Author: swd847
Date: 2010-04-21 20:13:06 -0400 (Wed, 21 Apr 2010)
New Revision: 6142

Added:
   extensions/trunk/src/main/java/org/jboss/weld/extensions/beanid/RequiresIdentification.java
   extensions/trunk/src/test/java/org/jboss/weld/test/extensions/beanid/
   extensions/trunk/src/test/java/org/jboss/weld/test/extensions/beanid/IdentifiableBean.java
   extensions/trunk/src/test/java/org/jboss/weld/test/extensions/beanid/IdentifiableBeansTest.java
   extensions/trunk/src/test/java/org/jboss/weld/test/extensions/beanid/IdentifiableInterceptorBinding.java
Removed:
   extensions/trunk/src/main/java/org/jboss/weld/extensions/beanid/IdentifiableBean.java
Modified:
   extensions/trunk/src/main/java/org/jboss/weld/extensions/beanid/AnnotatedTypeIdentifier.java
   extensions/trunk/src/main/java/org/jboss/weld/extensions/beanid/IdentifiableBeanExtension.java
   extensions/trunk/src/main/java/org/jboss/weld/extensions/beanid/IdentifiableInjectionTarget.java
Log:
Update to identifiable beans



Modified: extensions/trunk/src/main/java/org/jboss/weld/extensions/beanid/AnnotatedTypeIdentifier.java
===================================================================
--- extensions/trunk/src/main/java/org/jboss/weld/extensions/beanid/AnnotatedTypeIdentifier.java	2010-04-21 23:10:58 UTC (rev 6141)
+++ extensions/trunk/src/main/java/org/jboss/weld/extensions/beanid/AnnotatedTypeIdentifier.java	2010-04-22 00:13:06 UTC (rev 6142)
@@ -12,9 +12,8 @@
 {
    @Inject IdentifiableBeanExtension beans;
    
-   public AnnotatedType<?> getAnnotatedType(IdentifiableBean instance)
+   public AnnotatedType<?> getAnnotatedType(Object instance)
    {
-      long id = instance.getBeanId();
-      return beans.getAnnotatedType(id);
+      return beans.getAnnotatedType(instance);
    }
 }

Deleted: extensions/trunk/src/main/java/org/jboss/weld/extensions/beanid/IdentifiableBean.java
===================================================================
--- extensions/trunk/src/main/java/org/jboss/weld/extensions/beanid/IdentifiableBean.java	2010-04-21 23:10:58 UTC (rev 6141)
+++ extensions/trunk/src/main/java/org/jboss/weld/extensions/beanid/IdentifiableBean.java	2010-04-22 00:13:06 UTC (rev 6142)
@@ -1,9 +0,0 @@
-package org.jboss.weld.extensions.beanid;
-
-public interface IdentifiableBean
-{
-   public long getBeanId();
-   
-   public void setBeanId(long id);
-}
- 
\ No newline at end of file

Modified: extensions/trunk/src/main/java/org/jboss/weld/extensions/beanid/IdentifiableBeanExtension.java
===================================================================
--- extensions/trunk/src/main/java/org/jboss/weld/extensions/beanid/IdentifiableBeanExtension.java	2010-04-21 23:10:58 UTC (rev 6141)
+++ extensions/trunk/src/main/java/org/jboss/weld/extensions/beanid/IdentifiableBeanExtension.java	2010-04-22 00:13:06 UTC (rev 6142)
@@ -1,37 +1,61 @@
 package org.jboss.weld.extensions.beanid;
 
+import java.lang.annotation.Annotation;
+import java.util.Collections;
 import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.atomic.AtomicLong;
+import java.util.WeakHashMap;
 
 import javax.enterprise.event.Observes;
+import javax.enterprise.inject.spi.AnnotatedMethod;
 import javax.enterprise.inject.spi.AnnotatedType;
 import javax.enterprise.inject.spi.Extension;
 import javax.enterprise.inject.spi.ProcessInjectionTarget;
 /**
  * extension that allows the AnnotatedType to be retrieved for a given bean 
+ * 
+ * This is hopefully a temporary workaround until a spec limitation is removed
+ * 
  * @author Stuart Douglas <stuart at baileyroberts.com.au>
  *
  */
 public class IdentifiableBeanExtension implements Extension
 {
-   private AtomicLong currentId = new AtomicLong();
-   
-   private Map<Long,AnnotatedType<?>> types = new ConcurrentHashMap<Long, AnnotatedType<?>>();
-  
+   Map<Object, AnnotatedType<?>> types = Collections.synchronizedMap(new WeakHashMap<Object, AnnotatedType<?>>(1000));
+
    public void processInjectionTarget(@Observes ProcessInjectionTarget<?> event)
    {
-      if(event.getAnnotatedType().getBaseType() instanceof IdentifiableBean)
+      boolean requiresId = false;
+      for(Annotation a : event.getAnnotatedType().getAnnotations())
       {
-         long id = currentId.incrementAndGet();
-         types.put(id, event.getAnnotatedType());
-         event.setInjectionTarget(new IdentifiableInjectionTarget(event.getInjectionTarget(), id));
+         if(a.annotationType().isAnnotationPresent(RequiresIdentification.class))
+         {
+            requiresId = true;
+            break;
+         }
       }
+      if(!requiresId)
+      {
+         for(AnnotatedMethod<?> m : event.getAnnotatedType().getMethods())
+         {
+            for(Annotation a  : m.getAnnotations())
+            {
+               if(a.annotationType().isAnnotationPresent(RequiresIdentification.class))
+               {
+                  requiresId = true;
+                  break;
+               }
+            }
+         }
+      }
+      if(requiresId)
+      {
+         event.setInjectionTarget(new IdentifiableInjectionTarget(event.getInjectionTarget(), event.getAnnotatedType(),types));
+      }
    }
    
-   public AnnotatedType<?> getAnnotatedType(long id)
+   public AnnotatedType<?> getAnnotatedType(Object instance)
    {
-      return types.get(id);
+      return types.get(instance);
    }
    
 }

Modified: extensions/trunk/src/main/java/org/jboss/weld/extensions/beanid/IdentifiableInjectionTarget.java
===================================================================
--- extensions/trunk/src/main/java/org/jboss/weld/extensions/beanid/IdentifiableInjectionTarget.java	2010-04-21 23:10:58 UTC (rev 6141)
+++ extensions/trunk/src/main/java/org/jboss/weld/extensions/beanid/IdentifiableInjectionTarget.java	2010-04-22 00:13:06 UTC (rev 6142)
@@ -1,8 +1,10 @@
 package org.jboss.weld.extensions.beanid;
 
+import java.util.Map;
 import java.util.Set;
 
 import javax.enterprise.context.spi.CreationalContext;
+import javax.enterprise.inject.spi.AnnotatedType;
 import javax.enterprise.inject.spi.InjectionPoint;
 import javax.enterprise.inject.spi.InjectionTarget;
 /**
@@ -15,19 +17,21 @@
 {
    InjectionTarget<T> delegate;
    
-   long id;
+   AnnotatedType<?> type;
    
-   IdentifiableInjectionTarget(InjectionTarget<T> delegate, long id)
+   Map<Object, AnnotatedType<?>> typeMap;
+   
+   IdentifiableInjectionTarget(InjectionTarget<T> delegate, AnnotatedType<?> type,Map<Object, AnnotatedType<?>> typeMap)
    {
       this.delegate = delegate;
-      this.id=id;
+      this.type=type;
+      this.typeMap=typeMap;
    }
    
    
    public void inject(T instance, CreationalContext<T> ctx)
    {
-      IdentifiableBean bean =(IdentifiableBean)instance;
-      bean.setBeanId(id);
+      typeMap.put(instance, type);
       delegate.inject(instance, ctx);
    }
 
@@ -43,6 +47,7 @@
 
    public void dispose(T instance)
    {
+      typeMap.remove(instance);
       delegate.dispose(instance);
    }
 

Added: extensions/trunk/src/main/java/org/jboss/weld/extensions/beanid/RequiresIdentification.java
===================================================================
--- extensions/trunk/src/main/java/org/jboss/weld/extensions/beanid/RequiresIdentification.java	                        (rev 0)
+++ extensions/trunk/src/main/java/org/jboss/weld/extensions/beanid/RequiresIdentification.java	2010-04-22 00:13:06 UTC (rev 6142)
@@ -0,0 +1,17 @@
+package org.jboss.weld.extensions.beanid;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+/**
+ * annotation that should be applied to an interceptor binding to signify that it requires access to AnnotatedType information
+ * @author Stuart Douglas <stuart at baileyroberts.com.au>
+ *
+ */
+ at Retention(RetentionPolicy.RUNTIME)
+ at Target(ElementType.ANNOTATION_TYPE)
+public @interface RequiresIdentification
+{
+   
+}

Added: extensions/trunk/src/test/java/org/jboss/weld/test/extensions/beanid/IdentifiableBean.java
===================================================================
--- extensions/trunk/src/test/java/org/jboss/weld/test/extensions/beanid/IdentifiableBean.java	                        (rev 0)
+++ extensions/trunk/src/test/java/org/jboss/weld/test/extensions/beanid/IdentifiableBean.java	2010-04-22 00:13:06 UTC (rev 6142)
@@ -0,0 +1,12 @@
+package org.jboss.weld.test.extensions.beanid;
+ at IdentifiableInterceptorBinding
+public class IdentifiableBean
+{
+   Class atClass;
+   boolean bindingFound = false;
+   
+   public void someMethod()
+   {
+      
+   }
+}

Added: extensions/trunk/src/test/java/org/jboss/weld/test/extensions/beanid/IdentifiableBeansTest.java
===================================================================
--- extensions/trunk/src/test/java/org/jboss/weld/test/extensions/beanid/IdentifiableBeansTest.java	                        (rev 0)
+++ extensions/trunk/src/test/java/org/jboss/weld/test/extensions/beanid/IdentifiableBeansTest.java	2010-04-22 00:13:06 UTC (rev 6142)
@@ -0,0 +1,28 @@
+package org.jboss.weld.test.extensions.beanid;
+
+import javax.enterprise.inject.Default;
+import javax.enterprise.inject.spi.AnnotatedType;
+import javax.enterprise.util.AnnotationLiteral;
+
+import org.jboss.testharness.impl.packaging.Artifact;
+import org.jboss.testharness.impl.packaging.Classes;
+import org.jboss.weld.extensions.beanid.AnnotatedTypeIdentifier;
+import org.jboss.weld.test.AbstractWeldTest;
+import org.testng.annotations.Test;
+ at Artifact
+ at Classes(packages = { "org.jboss.weld.extensions.beanid" })
+public class IdentifiableBeansTest extends AbstractWeldTest
+{
+   @Test
+   public void testBeanIdentifiers()
+   {
+      //TODO: This needs to be split up into lots of little tests
+      IdentifiableBean bean = getReference(IdentifiableBean.class);
+      AnnotatedTypeIdentifier identifier  = getReference(AnnotatedTypeIdentifier.class,new AnnotationLiteral<Default>()
+      {
+      });
+      AnnotatedType<?> type = identifier.getAnnotatedType(bean);
+      assert type.getJavaClass() == IdentifiableBean.class;
+      assert type.isAnnotationPresent(IdentifiableInterceptorBinding.class);
+   }
+}

Added: extensions/trunk/src/test/java/org/jboss/weld/test/extensions/beanid/IdentifiableInterceptorBinding.java
===================================================================
--- extensions/trunk/src/test/java/org/jboss/weld/test/extensions/beanid/IdentifiableInterceptorBinding.java	                        (rev 0)
+++ extensions/trunk/src/test/java/org/jboss/weld/test/extensions/beanid/IdentifiableInterceptorBinding.java	2010-04-22 00:13:06 UTC (rev 6142)
@@ -0,0 +1,19 @@
+package org.jboss.weld.test.extensions.beanid;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+import javax.interceptor.InterceptorBinding;
+
+import org.jboss.weld.extensions.beanid.RequiresIdentification;
+
+ at Retention(RetentionPolicy.RUNTIME)
+ at Target({ElementType.METHOD,ElementType.TYPE})
+ at InterceptorBinding
+ at RequiresIdentification
+public @interface IdentifiableInterceptorBinding
+{
+   
+}



More information about the weld-commits mailing list