Skip to content

Commit

Permalink
WELD-238: Support Interceptors added via portable extensions.
Browse files Browse the repository at this point in the history
  • Loading branch information
mbogoevici committed Nov 3, 2009
1 parent c8d703f commit ac6b6a8
Show file tree
Hide file tree
Showing 5 changed files with 54 additions and 31 deletions.
18 changes: 9 additions & 9 deletions impl/src/main/java/org/jboss/weld/BeanManagerImpl.java
Expand Up @@ -218,7 +218,7 @@ public String toString()
*/
private transient final TypeSafeBeanResolver<Bean<?>> beanResolver;
private transient final TypeSafeResolver<? extends Resolvable, DecoratorImpl<?>> decoratorResolver;
private transient final TypeSafeResolver<? extends Resolvable, InterceptorImpl<?>> interceptorResolver;
private transient final TypeSafeResolver<? extends Resolvable, Interceptor<?>> interceptorResolver;
private transient final TypeSafeResolver<? extends Resolvable, ObserverMethod<?>> observerResolver;
private transient final NameBasedResolver nameBasedResolver;
private transient final ELResolver weldELResolver;
Expand All @@ -236,7 +236,7 @@ public String toString()
private transient final List<Bean<?>> beans;
private transient final List<Bean<?>> transitiveBeans;
private transient final List<DecoratorImpl<?>> decorators;
private transient final List<InterceptorImpl<?>> interceptors;
private transient final List<Interceptor<?>> interceptors;
private transient final List<String> namespaces;
private transient final List<ObserverMethod<?>> observers;

Expand Down Expand Up @@ -290,7 +290,7 @@ public List<Context> get()
new CopyOnWriteArrayList<Bean<?>>(),
new CopyOnWriteArrayList<Bean<?>>(),
new CopyOnWriteArrayList<DecoratorImpl<?>>(),
new CopyOnWriteArrayList<InterceptorImpl<?>>(),
new CopyOnWriteArrayList<Interceptor<?>>(),
new CopyOnWriteArrayList<ObserverMethod<?>>(),
new CopyOnWriteArrayList<String>(),
new ConcurrentHashMap<EjbDescriptor<?>, SessionBean<?>>(),
Expand Down Expand Up @@ -319,7 +319,7 @@ public static BeanManagerImpl newManager(BeanManagerImpl rootManager, String id,
new CopyOnWriteArrayList<Bean<?>>(),
new CopyOnWriteArrayList<Bean<?>>(),
new CopyOnWriteArrayList<DecoratorImpl<?>>(),
new CopyOnWriteArrayList<InterceptorImpl<?>>(),
new CopyOnWriteArrayList<Interceptor<?>>(),
new CopyOnWriteArrayList<ObserverMethod<?>>(),
new CopyOnWriteArrayList<String>(),
rootManager.getEnterpriseBeans(),
Expand Down Expand Up @@ -385,7 +385,7 @@ private BeanManagerImpl(
List<Bean<?>> beans,
List<Bean<?>> transitiveBeans,
List<DecoratorImpl<?>> decorators,
List<InterceptorImpl<?>> interceptors,
List<Interceptor<?>> interceptors,
List<ObserverMethod<?>> observers,
List<String> namespaces,
Map<EjbDescriptor<?>, SessionBean<?>> enterpriseBeans,
Expand Down Expand Up @@ -528,10 +528,10 @@ public Iterable<DecoratorImpl<?>> transform(BeanManagerImpl beanManager)

};

public static Transform<InterceptorImpl<?>> INTERCEPTOR_BEAN = new Transform<InterceptorImpl<?>>()
public static Transform<Interceptor<?>> INTERCEPTOR_BEAN = new Transform<Interceptor<?>>()
{

public Iterable<InterceptorImpl<?>> transform(BeanManagerImpl beanManager)
public Iterable<Interceptor<?>> transform(BeanManagerImpl beanManager)
{
return beanManager.getInterceptors();
}
Expand Down Expand Up @@ -610,7 +610,7 @@ public <T> Set<ObserverMethod<? super T>> resolveObserverMethods(T event, Annota
return this.<T>resolveObserverMethods(event.getClass(), bindings);
}

public void addInterceptor(InterceptorImpl<?> bean)
public void addInterceptor(Interceptor<?> bean)
{
interceptors.add(bean);
getServices().get(ContextualStore.class).putIfAbsent(bean);
Expand Down Expand Up @@ -815,7 +815,7 @@ public List<DecoratorImpl<?>> getDecorators()
return Collections.unmodifiableList(decorators);
}

public List<InterceptorImpl<?>> getInterceptors()
public List<Interceptor<?>> getInterceptors()
{
return Collections.unmodifiableList(interceptors);
}
Expand Down
24 changes: 24 additions & 0 deletions impl/src/main/java/org/jboss/weld/Validator.java
Expand Up @@ -27,6 +27,7 @@
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.Map;

import javax.enterprise.context.Dependent;
import javax.enterprise.event.Event;
Expand Down Expand Up @@ -266,6 +267,7 @@ public void validateDeployment(BeanManagerImpl manager, BeanDeployerEnvironment
validateBeans(manager.getDecorators(), new ArrayList<RIBean<?>>(), manager);
validateBeans(manager.getBeans(), new ArrayList<RIBean<?>>(), manager);
validateEnabledDecoratorClasses(manager);
validateEnabledInterceptorClasses(manager);
validateEnabledPolicies(manager);
validateDisposalMethods(environment);
validateBeanNames(manager);
Expand Down Expand Up @@ -324,6 +326,28 @@ public Set<Bean<?>> get()
}
}
}

private void validateEnabledInterceptorClasses(BeanManagerImpl beanManager)
{
Set<Class<?>> interceptorBeanClasses = new HashSet<Class<?>>();
for (Interceptor<?> interceptor : beanManager.getInterceptors())
{
interceptorBeanClasses.add(interceptor.getBeanClass());
}
for (Class<?> enabledInterceptorClass: beanManager.getEnabledInterceptorClasses())
{
if (beanManager.getEnabledInterceptorClasses().indexOf(enabledInterceptorClass)
< beanManager.getEnabledInterceptorClasses().lastIndexOf(enabledInterceptorClass))
{
throw new DeploymentException("Enabled interceptor class" + enabledInterceptorClass + " specified twice");
}
if (!interceptorBeanClasses.contains(enabledInterceptorClass))
{
throw new DeploymentException("Enabled interceptor class " + enabledInterceptorClass
+ " is neither annotated with @Interceptor, nor registered through a portable extension");
}
}
}

private void validateEnabledDecoratorClasses(BeanManagerImpl beanManager)
{
Expand Down
Expand Up @@ -24,6 +24,8 @@
import javax.enterprise.inject.spi.AfterBeanDiscovery;
import javax.enterprise.inject.spi.Bean;
import javax.enterprise.inject.spi.ObserverMethod;
import javax.enterprise.inject.spi.Interceptor;
import javax.decorator.Decorator;

import org.jboss.weld.BeanManagerImpl;
import org.jboss.weld.bootstrap.BeanDeployment;
Expand Down Expand Up @@ -56,7 +58,14 @@ public List<Throwable> getDefinitionErrors()
public void addBean(Bean<?> bean)
{
BeanManagerImpl beanManager = getOrCreateBeanDeployment(bean.getBeanClass()).getBeanManager();
beanManager.addBean(bean);
if (bean instanceof Interceptor)
{
beanManager.addInterceptor((Interceptor<?>) bean);
}
else
{
beanManager.addBean(bean);
}
ProcessBeanImpl.fire(beanManager, bean);
}

Expand Down
Expand Up @@ -23,41 +23,43 @@
import java.util.Set;
import java.util.TreeSet;

import javax.enterprise.inject.spi.Interceptor;

import org.jboss.weld.BeanManagerImpl;
import org.jboss.weld.bean.InterceptorImpl;
import org.jboss.weld.util.Beans;

/**
* @author <a href="mailto:mariusb@redhat.com">Marius Bogoevici</a>
*/
public class TypeSafeInterceptorResolver extends TypeSafeResolver<InterceptorResolvable,InterceptorImpl<?>>
public class TypeSafeInterceptorResolver extends TypeSafeResolver<InterceptorResolvable,Interceptor<?>>
{
private BeanManagerImpl manager;


public TypeSafeInterceptorResolver(BeanManagerImpl manager, Iterable<InterceptorImpl<?>> interceptors)
public TypeSafeInterceptorResolver(BeanManagerImpl manager, Iterable<Interceptor<?>> interceptors)
{
super(interceptors);
this.manager = manager;
}

@Override
protected boolean matches(InterceptorResolvable resolvable, InterceptorImpl<?> bean)
protected boolean matches(InterceptorResolvable resolvable, Interceptor<?> bean)
{
return bean.intercepts(resolvable.getInterceptionType())
&& bean.getInterceptorBindings().size() > 0
&& Beans.containsAllInterceptionBindings(bean.getInterceptorBindings(), resolvable.getQualifiers(), getManager())
&& getManager().getEnabledInterceptorClasses().contains(bean.getType());
&& getManager().getEnabledInterceptorClasses().contains(bean.getBeanClass());
}


@Override
protected Set<InterceptorImpl<?>> sortResult(Set<InterceptorImpl<?>> matchedInterceptors)
protected Set<Interceptor<?>> sortResult(Set<Interceptor<?>> matchedInterceptors)
{
Set<InterceptorImpl<?>> sortedBeans = new TreeSet<InterceptorImpl<?>>(new Comparator<InterceptorImpl<?>>()
Set<Interceptor<?>> sortedBeans = new TreeSet<Interceptor<?>>(new Comparator<Interceptor<?>>()
{

public int compare(InterceptorImpl<?> o1, InterceptorImpl<?> o2)
public int compare(Interceptor<?> o1, Interceptor<?> o2)
{
List<Class<?>> enabledInterceptors = getManager().getEnabledInterceptorClasses();
int p1 = enabledInterceptors.indexOf(((InterceptorImpl<?>) o1).getType());
Expand All @@ -71,7 +73,7 @@ public int compare(InterceptorImpl<?> o1, InterceptorImpl<?> o2)
}

@Override
protected Set<InterceptorImpl<?>> filterResult(Set<InterceptorImpl<?>> matched)
protected Set<Interceptor<?>> filterResult(Set<Interceptor<?>> matched)
{
return matched;
}
Expand Down
14 changes: 1 addition & 13 deletions impl/src/main/java/org/jboss/weld/xml/BeansXmlParser.java
Expand Up @@ -283,19 +283,7 @@ private static List<Class<?>> processInterceptorElement(ResourceLoader resourceL
try
{
Class<?> clazz = resourceLoader.classForName(className);
if (!clazz.isAnnotationPresent(Interceptor.class))
{
throw new DeploymentException("Class " + clazz.getName() + " is enabled as an interceptor," +
" but it does not have the appropriate annotation");
}
else if (list.contains(clazz))
{
throw new DeploymentException("Class " + clazz.getName() + " is listed twice as an enabled interceptor");
}
else
{
list.add(clazz);
}
list.add(clazz);
}
catch (ResourceLoadingException e)
{
Expand Down

0 comments on commit ac6b6a8

Please sign in to comment.