in webbeans-impl/src/main/java/org/apache/webbeans/config/BeansDeployer.java [612:666]
private void validateDecoratorGenericTypes()
{
for (Decorator<?> decorator : decoratorsManager.getDecorators())
{
Type type = decorator.getDelegateType();
// capture ParameterizedType from decorator type
Collection<Type> types = new HashSet<>();
if (Class.class.isInstance(type))
{
Class<?> c = Class.class.cast(type);
while (c != Object.class && c != null)
{
types.add(c);
for (Type t : asList(c.getGenericInterfaces()))
{
if (ParameterizedType.class.isInstance(t))
{
types.add(t);
}
}
Type genericSuperclass = c.getGenericSuperclass();
if (ParameterizedType.class.isInstance(genericSuperclass))
{
types.add(genericSuperclass);
}
c = c.getSuperclass();
}
} // else?
// check arguments matches with decorator API
for (Type api : decorator.getTypes())
{
if (!ParameterizedType.class.isInstance(api)) // no need to check here
{
continue;
}
ParameterizedType pt1 = ParameterizedType.class.cast(api);
for (Type t : types)
{
if (ParameterizedType.class.isInstance(t))
{
ParameterizedType pt2 = ParameterizedType.class.cast(t);
if (pt1.getRawType() == pt2.getRawType() &&
!GenericsUtil.isAssignableFrom(true, false, pt1, pt2, new HashMap<>()))
{
throw new WebBeansConfigurationException("Generic error matching " + api + " and " + t);
}
}
}
}
}
}