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(a)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(a)baileyroberts.com.au>
+ *
+ */
+(a)Retention(RetentionPolicy.RUNTIME)
+(a)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;
+@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;
+@Artifact
+@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;
+
+(a)Retention(RetentionPolicy.RUNTIME)
+(a)Target({ElementType.METHOD,ElementType.TYPE})
+@InterceptorBinding
+@RequiresIdentification
+public @interface IdentifiableInterceptorBinding
+{
+
+}
Show replies by date