package org.jboss.as.weld.ejb; import org.jboss.as.weld.WeldBootstrapService; import org.jboss.as.weld.spi.ComponentInterceptorSupport; import org.jboss.msc.service.Service; import org.jboss.msc.service.ServiceName; import org.jboss.msc.service.StartContext; import org.jboss.msc.service.StartException; import org.jboss.msc.service.StopContext; import org.jboss.msc.value.InjectedValue; import org.jboss.weld.annotated.enhanced.EnhancedAnnotatedType; import org.jboss.weld.annotated.slim.SlimAnnotatedType; import org.jboss.weld.bean.interceptor.InterceptorBindingsAdapter; import org.jboss.weld.ejb.spi.InterceptorBindings; import org.jboss.weld.injection.producer.InterceptionModelInitializer; import org.jboss.weld.interceptor.spi.model.InterceptionModel; import org.jboss.weld.manager.BeanManagerImpl; import org.jboss.weld.resources.ClassTransformer; /** * @author Stuart Douglas * @author Jozef Hartinger */ public class WeldInterceptorBindingsService implements Service<InterceptorBindings> { private volatile InterceptorBindings interceptorBindings; private final InjectedValue<WeldBootstrapService> weldContainer = new InjectedValue<WeldBootstrapService>(); private final String beanArchiveId; private final String ejbName; private final Class<?> componentClass; private final ComponentInterceptorSupport interceptorSupport; public static final ServiceName SERVICE_NAME = ServiceName.of("WeldInterceptorBindingsService"); public WeldInterceptorBindingsService(String beanArchiveId, String ejbName, Class<?> componentClass, ComponentInterceptorSupport componentInterceptorSupport) { this.beanArchiveId = beanArchiveId; this.ejbName = ejbName; this.componentClass = componentClass; this.interceptorSupport = componentInterceptorSupport; } @Override public void start(StartContext startContext) throws StartException { BeanManagerImpl beanManager = this.weldContainer.getValue().getBeanManager(beanArchiveId); //this is not always called with the deployments TCCL set //which causes weld to blow up interceptorBindings = getInterceptorBindings(this.ejbName, beanManager); } protected InterceptorBindings getInterceptorBindings(String ejbName, final BeanManagerImpl manager) { if (ejbName != null) { return interceptorSupport.getInterceptorBindings(ejbName, manager); } else { // This is a managed bean SlimAnnotatedType<?> type = (SlimAnnotatedType<?>) manager.createAnnotatedType(componentClass); if (!manager.getInterceptorModelRegistry().containsKey(type)) { EnhancedAnnotatedType<?> enhancedType = manager.getServices().get(ClassTransformer.class).getEnhancedAnnotatedType(type); InterceptionModelInitializer.of(manager, enhancedType, null).init(); } InterceptionModel model = manager.getInterceptorModelRegistry().get(type); if (model != null) { return new InterceptorBindingsAdapter(manager.getInterceptorModelRegistry().get(type)); } } return null; } @Override public void stop(StopContext stopContext) { this.interceptorBindings = null; } @Override public InterceptorBindings getValue() throws IllegalStateException, IllegalArgumentException { return interceptorBindings; } public InjectedValue<WeldBootstrapService> getWeldContainer() { return weldContainer; } }