final DeploymentUnit deploymentUnit = phaseContext.getDeploymentUnit();
final EjbJarMetaData metaData = deploymentUnit.getAttachment(EjbDeploymentAttachmentKeys.EJB_JAR_METADATA);
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);
if (metaData == null) {
return;
}
if (metaData.getAssemblyDescriptor() == null) {
return;
}
if (metaData.getAssemblyDescriptor().getInterceptorBindings() == null) {
return;
}
//default interceptors must be mentioned in the interceptors section
final Set<String> interceptorClasses = new HashSet<String>();
if (metaData.getInterceptors() != null) {
for (final InterceptorMetaData interceptor : metaData.getInterceptors()) {
interceptorClasses.add(interceptor.getInterceptorClass());
}
}
final Map<String, List<InterceptorBindingMetaData>> bindingsPerComponent = new HashMap<String, List<InterceptorBindingMetaData>>();
final List<InterceptorBindingMetaData> defaultInterceptorBindings = new ArrayList<InterceptorBindingMetaData>();
for (final InterceptorBindingMetaData binding : metaData.getAssemblyDescriptor().getInterceptorBindings()) {
if (binding.getEjbName().equals("*")) {
if (binding.getMethod() != null) {
throw MESSAGES.defaultInterceptorsNotBindToMethod();
}
defaultInterceptorBindings.add(binding);
} else {
List<InterceptorBindingMetaData> bindings = bindingsPerComponent.get(binding.getEjbName());
if (bindings == null) {
bindingsPerComponent.put(binding.getEjbName(), bindings = new ArrayList<InterceptorBindingMetaData>());
}
bindings.add(binding);
}
}
final List<InterceptorDescription> defaultInterceptors = new ArrayList<InterceptorDescription>();
for (InterceptorBindingMetaData binding : defaultInterceptorBindings) {
if (binding.getInterceptorClasses() != null) {
for (final String clazz : binding.getInterceptorClasses()) {
//we only want default interceptors referenced in the interceptors section
if (interceptorClasses.contains(clazz)) {
defaultInterceptors.add(new InterceptorDescription(clazz));
} else {
ROOT_LOGGER.defaultInterceptorClassNotListed(clazz);
}
}
}
}
//now we need to process the components, and add interceptor information
//we iterate over all components, as we need to process default interceptors
for (final ComponentDescription componentDescription : eeModuleDescription.getComponentDescriptions()) {
final Class<?> componentClass;
try {
componentClass = module.getClassLoader().loadClass(componentDescription.getComponentClassName());
} catch (ClassNotFoundException e) {
throw MESSAGES.failToLoadComponentClass(componentDescription.getComponentClassName());
}
final List<InterceptorBindingMetaData> bindings = bindingsPerComponent.get(componentDescription.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
//absolute ordering takes precedence
boolean classLevelAbsoluteOrder = false;
final Map<Method, Boolean> methodLevelAbsoluteOrder = new HashMap<Method, Boolean>();
if (bindings != null) {
for (final InterceptorBindingMetaData binding : bindings) {
if (binding.getMethod() == null) {
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());