Author: covener
Date: Tue Jan 8 18:09:31 2013
New Revision: 1430423
URL: http://svn.apache.org/viewvc?rev=1430423&view=rev
Log:
[OWB-568] fix checking of generic decorated interfaces vs type of delegate
injection points. Re-enable previously failing unit test.
Modified:
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/decorator/DecoratorUtil.java
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/decorator/WebBeansDecorator.java
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/decorator/WebBeansDecoratorConfig.java
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/util/ClassUtil.java
openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/decorators/tests/GenericDecoratorTest.java
Modified:
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/decorator/DecoratorUtil.java
URL:
http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/decorator/DecoratorUtil.java?rev=1430423&r1=1430422&r2=1430423&view=diff
==============================================================================
---
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/decorator/DecoratorUtil.java
(original)
+++
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/decorator/DecoratorUtil.java
Tue Jan 8 18:09:31 2013
@@ -21,8 +21,6 @@ package org.apache.webbeans.decorator;
import java.lang.annotation.Annotation;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
-import java.lang.reflect.Type;
-import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
@@ -40,7 +38,6 @@ import org.apache.webbeans.exception.Web
import org.apache.webbeans.logger.WebBeansLoggerFacade;
import org.apache.webbeans.util.AnnotationUtil;
import org.apache.webbeans.util.Asserts;
-import org.apache.webbeans.util.ClassUtil;
/**
* Decorator related utility class.
@@ -80,16 +77,6 @@ public final class DecoratorUtil
throw new WebBeansConfigurationException("Decorator class : "
+ decoratorClazz + " can not have observer methods but it has one with name : "
+ method.getName());
}
}
-
- Set<Type> decoratorSet = new HashSet<Type>();
- ClassUtil.setInterfaceTypeHierarchy(decoratorSet, decoratorClazz);
-
- //Per section 8.1 do no consider Serializable a decorated type
- if(decoratorSet.contains(java.io.Serializable.class))
- {
- decoratorSet.remove(java.io.Serializable.class);
- }
-
}
public static void
checkManagedBeanDecoratorConditions(AbstractInjectionTargetBean<?> bean,
List<Decorator<?>> decoratorList)
Modified:
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/decorator/WebBeansDecorator.java
URL:
http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/decorator/WebBeansDecorator.java?rev=1430423&r1=1430422&r2=1430423&view=diff
==============================================================================
---
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/decorator/WebBeansDecorator.java
(original)
+++
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/decorator/WebBeansDecorator.java
Tue Jan 8 18:09:31 2013
@@ -22,6 +22,7 @@ import org.apache.webbeans.component.Abs
import org.apache.webbeans.component.ManagedBean;
import org.apache.webbeans.component.WebBeansType;
import org.apache.webbeans.config.OWBLogConst;
+import org.apache.webbeans.config.OwbParametrizedTypeImpl;
import org.apache.webbeans.config.WebBeansContext;
import org.apache.webbeans.exception.WebBeansConfigurationException;
import org.apache.webbeans.exception.WebBeansException;
@@ -46,6 +47,7 @@ import java.lang.reflect.Field;
import java.lang.reflect.Member;
import java.lang.reflect.Method;
import java.lang.reflect.Type;
+import java.lang.reflect.TypeVariable;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
@@ -71,6 +73,9 @@ public class WebBeansDecorator<T> extend
/** Delegate field class type */
protected Type delegateType;
+ /** The type of this decorator */
+ protected Type decoratorGenericType;
+
/** Delegate field bindings */
protected Set<Annotation> delegateBindings = new HashSet<Annotation>();
@@ -122,8 +127,38 @@ public class WebBeansDecorator<T> extend
protected void init()
{
- ClassUtil.setInterfaceTypeHierarchy(decoratedTypes, clazz);
+ Class<?> beanClass = getBeanClass();
+ decoratedTypes = new HashSet<Type>(this.getTypes());
+
+ /* determine a safe Type for for a later BeanManager.getReference(...)
*/
+ if (ClassUtil.isDefinitionContainsTypeVariables(beanClass))
+ {
+ OwbParametrizedTypeImpl pt = new
OwbParametrizedTypeImpl(beanClass.getDeclaringClass(),beanClass);
+ TypeVariable<?>[] tvs = beanClass.getTypeParameters();
+ for(TypeVariable<?> tv : tvs)
+ {
+ pt.addTypeArgument(tv);
+ }
+ decoratedTypes.remove(pt);
+ setDecoratorGenericType(pt);
+ }
+ else
+ {
+ decoratedTypes.remove(beanClass);
+ setDecoratorGenericType(beanClass);
+ }
+
+ /* drop any non-interface bean types */
+ Type superClass = beanClass.getGenericSuperclass();
+ while (superClass != Object.class)
+ {
+ decoratedTypes.remove(superClass);
+ superClass = superClass.getClass().getGenericSuperclass();
+ }
+ decoratedTypes.remove(Object.class);
+ decoratedTypes.remove(java.io.Serializable.class); /* 8.1 */
+
for (Iterator<Type> i = decoratedTypes.iterator(); i.hasNext(); )
{
Type t = i.next();
@@ -412,6 +447,15 @@ public class WebBeansDecorator<T> extend
}
}
+ public Type getDecoratorGenericType()
+ {
+ return decoratorGenericType;
+ }
+
+ public void setDecoratorGenericType(Type decoratorGenericType)
+ {
+ this.decoratorGenericType = decoratorGenericType;
+ }
private void injectField(Field field, Object instance,
CreationalContext<?> creationalContext)
{
InjectableField f = new InjectableField(field, instance, wrappedBean,
creationalContext);
Modified:
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/decorator/WebBeansDecoratorConfig.java
URL:
http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/decorator/WebBeansDecoratorConfig.java?rev=1430423&r1=1430422&r2=1430423&view=diff
==============================================================================
---
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/decorator/WebBeansDecoratorConfig.java
(original)
+++
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/decorator/WebBeansDecoratorConfig.java
Tue Jan 8 18:09:31 2013
@@ -155,7 +155,7 @@ public final class WebBeansDecoratorConf
decoratorInstance =
ownerCreationalContext.getDependentDecorator(instance, decorator);
if(decoratorInstance == null)
{
- decoratorInstance = manager.getReference(decorator,
decorator.getBeanClass(), ownerCreationalContext);
+ decoratorInstance = manager.getReference(decorator,
decorator.getDecoratorGenericType(), ownerCreationalContext);
decorator.setInjections(decoratorInstance,
ownerCreationalContext);
decorator.setDelegate(decoratorInstance, delegate);
Modified:
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/util/ClassUtil.java
URL:
http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/util/ClassUtil.java?rev=1430423&r1=1430422&r2=1430423&view=diff
==============================================================================
---
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/util/ClassUtil.java
(original)
+++
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/util/ClassUtil.java
Tue Jan 8 18:09:31 2013
@@ -1115,6 +1115,9 @@ public final class ClassUtil
return raw;
}
+ /**
+ * @deprecated no longer used by core, not safe for generic types
+ */
public static Set<Type> setInterfaceTypeHierarchy(Set<Type> set, Class<?>
clazz)
{
Asserts.nullCheckForClass(clazz);
Modified:
openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/decorators/tests/GenericDecoratorTest.java
URL:
http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/decorators/tests/GenericDecoratorTest.java?rev=1430423&r1=1430422&r2=1430423&view=diff
==============================================================================
---
openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/decorators/tests/GenericDecoratorTest.java
(original)
+++
openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/decorators/tests/GenericDecoratorTest.java
Tue Jan 8 18:09:31 2013
@@ -71,7 +71,7 @@ public class GenericDecoratorTest extend
shutDownContainer();
}
- //X TODO currently broken @Test
+ @Test
public void injection() throws Exception {
Collection<Class<?>> classes = new ArrayList<Class<?>>();
classes.add(DecoratedBean.class);