in webbeans-impl/src/main/java/org/apache/webbeans/intercept/InterceptorResolutionService.java [502:569]
private Method getDecoratingMethod(Decorator decorator, AnnotatedMethod annotatedMethod)
{
Set<Type> decoratedTypes = decorator.getDecoratedTypes();
for (Type decoratedType : decoratedTypes)
{
if (decoratedType instanceof ParameterizedType)
{
// TODO handle the case that method parameter types are TypeVariables
ParameterizedType parameterizedType = (ParameterizedType)decoratedType;
decoratedType = parameterizedType.getRawType();
}
if (decoratedType instanceof Class)
{
Class decoratedClass = (Class) decoratedType;
Method[] decoratorMethods = decoratedClass.getDeclaredMethods();
for (Method decoratorMethod : decoratorMethods)
{
int modifiers = decoratorMethod.getModifiers();
if (Modifier.isFinal(modifiers) ||
Modifier.isPrivate(modifiers) ||
Modifier.isStatic(modifiers))
{
continue;
}
if (methodEquals(decoratorMethod, annotatedMethod.getJavaMember()))
{
// yikes our method is decorated by this very decorator type.
if (Modifier.isAbstract((decorator.getBeanClass().getModifiers())))
{
// For abstract classes we will only decorate this method if it's really implemented on the decorator itself
Class decoratorClass = decorator.getBeanClass();
while (decoratorClass != Object.class)
{
try
{
Method m = decoratorClass.getDeclaredMethod(decoratorMethod.getName(), decoratorMethod.getParameterTypes());
if (Modifier.isAbstract(m.getModifiers()))
{
return null;
}
else
{
return decoratorMethod;
}
}
catch (NoSuchMethodException e)
{
// all ok, just continue
}
decoratorClass = decoratorClass.getSuperclass();
}
return null;
}
{
return decoratorMethod;
}
}
}
}
}
return null;
}