You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openwebbeans.apache.org by rm...@apache.org on 2014/09/07 18:40:20 UTC
svn commit: r1623069 -
/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/config/BeansDeployer.java
Author: rmannibucau
Date: Sun Sep 7 16:40:19 2014
New Revision: 1623069
URL: http://svn.apache.org/r1623069
Log:
trying to validate decorator generics - this is a first draft and will surely need to adjustments
Modified:
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/config/BeansDeployer.java
Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/config/BeansDeployer.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/config/BeansDeployer.java?rev=1623069&r1=1623068&r2=1623069&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/config/BeansDeployer.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/config/BeansDeployer.java Sun Sep 7 16:40:19 2014
@@ -77,6 +77,7 @@ import org.apache.webbeans.spi.plugins.O
import org.apache.webbeans.util.AnnotationUtil;
import org.apache.webbeans.util.ClassUtil;
import org.apache.webbeans.util.ExceptionUtil;
+import org.apache.webbeans.util.GenericsUtil;
import org.apache.webbeans.util.InjectionExceptionUtil;
import org.apache.webbeans.util.SpecializationUtil;
import org.apache.webbeans.util.WebBeansConstants;
@@ -98,6 +99,8 @@ import javax.enterprise.inject.spi.Obser
import java.lang.annotation.Annotation;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
+import java.lang.reflect.ParameterizedType;
+import java.lang.reflect.Type;
import java.net.URL;
import java.security.PrivilegedActionException;
import java.util.ArrayList;
@@ -112,6 +115,8 @@ import java.util.Stack;
import java.util.logging.Level;
import java.util.logging.Logger;
+import static java.util.Arrays.asList;
+
/**
* Deploys the all beans that are defined in the {@link org.apache.webbeans.spi.ScannerService} at
* the scanner phase.
@@ -245,7 +250,9 @@ public class BeansDeployer
// Validate injection Points
validateInjectionPoints();
-
+
+ validateDecoratorGenericTypes();
+
// fire event
fireAfterDeploymentValidationEvent();
@@ -288,6 +295,65 @@ public class BeansDeployer
}
}
+ // avoid delegate implementing Foo<A> and decorator implementing Foo<B> with no link between A and B
+ private void validateDecoratorGenericTypes()
+ {
+ for (final Decorator<?> decorator : webBeansContext.getDecoratorsManager().getDecorators())
+ {
+ final Type type = decorator.getDelegateType();
+
+ // capture ParameterizedType from decorator type
+ final Collection<Type> types = new HashSet<Type>();
+ if (Class.class.isInstance(type))
+ {
+ Class<?> c = Class.class.cast(type);
+ while (c != Object.class && c != null)
+ {
+ types.add(c);
+ for (final Type t : asList(c.getGenericInterfaces()))
+ {
+ if (ParameterizedType.class.isInstance(t))
+ {
+ types.add(t);
+ }
+ }
+ final Type genericSuperclass = c.getGenericSuperclass();
+ if (ParameterizedType.class.isInstance(genericSuperclass))
+ {
+ types.add(genericSuperclass);
+ }
+ c = c.getSuperclass();
+ }
+ } // else?
+
+ // check arguments matches with decorator API
+ for (final Type api : decorator.getTypes())
+ {
+ if (!ParameterizedType.class.isInstance(api)) // no need to check here
+ {
+ continue;
+ }
+
+ final ParameterizedType pt1 = ParameterizedType.class.cast(api);
+ for (final Type t : types)
+ {
+ if (ParameterizedType.class.isInstance(t))
+ {
+ final ParameterizedType pt2 = ParameterizedType.class.cast(t);
+
+ if (pt1.getRawType() == pt2.getRawType())
+ {
+ if (!GenericsUtil.isAssignableFrom(true, pt1, pt2))
+ {
+ throw new DefinitionException("Generic error matching " + api + " and " + t);
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
/**
* Remove all beans which are not enabled anymore.
* This might e.g. happen because they are 'overridden'