private void validateDecoratorGenericTypes()

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);
                        }
                    }
                }
            }
        }
    }