final DeploymentUnit deploymentUnit = phaseContext.getDeploymentUnit();
final EjbJarMetaData metaData = deploymentUnit.getAttachment(EjbDeploymentAttachmentKeys.EJB_JAR_METADATA);
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;