}
log.debug("Found class interceptors " + classInterceptorClasses);
{
// Ordering of lifecycle interceptors
InterceptorOrder order = (InterceptorOrder) advisor.resolveAnnotation(InterceptorOrder.class);
if(order != null)
{
List<Class<?>> orderedInterceptorClasses = Arrays.asList(order.value());
if(!orderedInterceptorClasses.containsAll(lifecycleInterceptorClasses))
throw new IllegalStateException("EJB3 12.8.2 footnote 59: all applicable lifecycle interceptors must be listed in the interceptor order");
lifecycleInterceptorClasses = orderedInterceptorClasses;
}
}
this.lifecycleInterceptorClasses.addAll(lifecycleInterceptorClasses);
for(Class<?> interceptorClass : lifecycleInterceptorClasses)
{
if(!interceptorClasses.contains(interceptorClass))
interceptorClasses.add(interceptorClass);
}
Class<?> beanClass = advisor.getClazz();
// EJB3 spec says in section 12.7
// "A business method interceptor method may be defined to apply to a specific *business method*
// invocation, rather than to all of the business methods of the bean class."
// So all we need are "public" methods.
for(Method beanMethod : beanClass.getMethods())
{
interceptorsAnnotation = (Interceptors) advisor.resolveAnnotation(beanMethod, Interceptors.class);
List<Class<?>> methodInterceptorClasses = new ArrayList<Class<?>>();
if(interceptorsAnnotation != null)
{
for(Class<?> interceptorClass : interceptorsAnnotation.value())
methodInterceptorClasses.add(interceptorClass);
}
// Interceptors applicable for this bean method
List<Class<?>> methodApplicableInterceptorClasses = new ArrayList<Class<?>>();
if(!isExcludeDefaultInterceptors(advisor, beanMethod))
methodApplicableInterceptorClasses.addAll(defaultInterceptorClasses);
if(!isExcludeClassInterceptors(advisor, beanMethod))
methodApplicableInterceptorClasses.addAll(classInterceptorClasses);
methodApplicableInterceptorClasses.addAll(methodInterceptorClasses);
// TODO: remove duplicates?
// Total ordering (EJB 3 12.8.2.1)
// TODO: @Interceptors with all?
InterceptorOrder order = (InterceptorOrder) advisor.resolveAnnotation(beanMethod, InterceptorOrder.class);
if(order == null)
order = (InterceptorOrder) advisor.resolveAnnotation(InterceptorOrder.class);
// TODO: validate the order to see if all interceptors are listed
if(order != null)
{
List<Class<?>> orderedInterceptorClasses = Arrays.asList(order.value());
if(!orderedInterceptorClasses.containsAll(methodApplicableInterceptorClasses))
{
log.debug("applicable interceptors: " + methodApplicableInterceptorClasses);
log.debug("interceptor order: " + orderedInterceptorClasses);
List<Class<?>> subset = new ArrayList<Class<?>>(methodApplicableInterceptorClasses);