if (metaData == null || metaData.getAssemblyDescriptor() == null) {
return;
}
final EEModuleDescription eeModuleDescription = deploymentUnit.getAttachment(Attachments.EE_MODULE_DESCRIPTION);
final Module module = deploymentUnit.getAttachment(org.jboss.as.server.deployment.Attachments.MODULE);
final DeploymentReflectionIndex index = deploymentUnit.getAttachment(org.jboss.as.server.deployment.Attachments.REFLECTION_INDEX);
// fetch the container-interceptors
final List<ContainerInterceptorsMetaData> containerInterceptorConfigurations = metaData.getAssemblyDescriptor().getAny(ContainerInterceptorsMetaData.class);
if (containerInterceptorConfigurations == null || containerInterceptorConfigurations.isEmpty()) {
return;
}
final ContainerInterceptorsMetaData containerInterceptorsMetaData = containerInterceptorConfigurations.get(0);
if (containerInterceptorsMetaData == null) {
return;
}
final InterceptorBindingsMetaData containerInterceptorBindings = containerInterceptorsMetaData.getInterceptorBindings();
// no interceptor-binding == nothing to do
if (containerInterceptorBindings == null || containerInterceptorBindings.isEmpty()) {
return;
}
// we have now found some container interceptors which are bound to certain EJBs, start the real work!
final Map<String, List<InterceptorBindingMetaData>> bindingsPerEJB = new HashMap<String, List<InterceptorBindingMetaData>>();
final List<InterceptorBindingMetaData> bindingsForAllEJBs = new ArrayList<InterceptorBindingMetaData>();
for (final InterceptorBindingMetaData containerInterceptorBinding : containerInterceptorBindings) {
if (containerInterceptorBinding.getEjbName().equals("*")) {
// container interceptor bindings that are applicable for all EJBs are *not* expected to specify a method
// since all EJBs having the same method is not really practical
if (containerInterceptorBinding.getMethod() != null) {
throw MESSAGES.defaultInterceptorsNotBindToMethod();
}
if (containerInterceptorBinding.getInterceptorOrder() != null) {
throw MESSAGES.defaultInterceptorsNotSpecifyOrder();
}
// Make a note that this container interceptor binding is applicable for all EJBs
bindingsForAllEJBs.add(containerInterceptorBinding);
} else {
// fetch existing container interceptor bindings for the EJB, if any.
List<InterceptorBindingMetaData> bindings = bindingsPerEJB.get(containerInterceptorBinding.getEjbName());
if (bindings == null) {
bindings = new ArrayList<InterceptorBindingMetaData>();
bindingsPerEJB.put(containerInterceptorBinding.getEjbName(), bindings);
}
// Make a note that the container interceptor binding is applicable for this specific EJB
bindings.add(containerInterceptorBinding);
}
}
// At this point we now know which container interceptor bindings have been configured for which EJBs.
// Next, we create InterceptorDescription(s) out of those.
final List<InterceptorDescription> interceptorDescriptionsForAllEJBs = new ArrayList<InterceptorDescription>();
// first process container interceptors applicable for all EJBs
for (InterceptorBindingMetaData binding : bindingsForAllEJBs) {
if (binding.getInterceptorClasses() != null) {
for (final String clazz : binding.getInterceptorClasses()) {
interceptorDescriptionsForAllEJBs.add(new InterceptorDescription(clazz));
}
}
}
// Now process container interceptors for each EJB
for (final ComponentDescription componentDescription : eeModuleDescription.getComponentDescriptions()) {
if (!(componentDescription instanceof EJBComponentDescription)) {
continue;
}
final EJBComponentDescription ejbComponentDescription = (EJBComponentDescription) componentDescription;
final Class<?> componentClass;
try {
componentClass = module.getClassLoader().loadClass(ejbComponentDescription.getComponentClassName());
} catch (ClassNotFoundException e) {
throw MESSAGES.failToLoadComponentClass(ejbComponentDescription.getComponentClassName());
}
final List<InterceptorBindingMetaData> bindingsApplicableForCurrentEJB = bindingsPerEJB.get(ejbComponentDescription.getComponentName());
final Map<Method, List<InterceptorBindingMetaData>> methodInterceptors = new HashMap<Method, List<InterceptorBindingMetaData>>();
final List<InterceptorBindingMetaData> classLevelBindings = new ArrayList<InterceptorBindingMetaData>();
// we only want to exclude default and class level interceptors if every binding
// has the exclude element.
boolean classLevelExcludeDefaultInterceptors = false;
Map<Method, Boolean> methodLevelExcludeDefaultInterceptors = new HashMap<Method, Boolean>();
Map<Method, Boolean> methodLevelExcludeClassInterceptors = new HashMap<Method, Boolean>();
// if an absolute order has been defined at any level then absolute ordering takes precedence
boolean classLevelAbsoluteOrder = false;
final Map<Method, Boolean> methodLevelAbsoluteOrder = new HashMap<Method, Boolean>();
if (bindingsApplicableForCurrentEJB != null) {
for (final InterceptorBindingMetaData binding : bindingsApplicableForCurrentEJB) {
if (binding.getMethod() == null) {
// The container interceptor is expected to be fired for all methods of that EJB
classLevelBindings.add(binding);
// if even one binding does not say exclude default then we do not exclude
if (binding.isExcludeDefaultInterceptors()) {
classLevelExcludeDefaultInterceptors = true;
}
if (binding.isTotalOrdering()) {
if (classLevelAbsoluteOrder) {
throw MESSAGES.twoEjbBindingsSpecifyAbsoluteOrder(componentClass.toString());
} else {
classLevelAbsoluteOrder = true;
}
}
} else {
// Method level bindings
// First find the right method
final NamedMethodMetaData methodData = binding.getMethod();
final ClassReflectionIndex<?> classIndex = index.getClassIndex(componentClass);
Method resolvedMethod = null;
if (methodData.getMethodParams() == null) {
final Collection<Method> methods = classIndex.getAllMethods(methodData.getMethodName());
if (methods.isEmpty()) {
throw MESSAGES.failToFindMethodInEjbJarXml(componentClass.getName(), methodData.getMethodName());