package org.jboss.seam.faces.component; import javax.enterprise.context.NormalScope; import javax.enterprise.event.Observes; import javax.enterprise.inject.spi.Bean; import javax.enterprise.inject.spi.Extension; import javax.enterprise.inject.spi.ProcessManagedBean; import javax.enterprise.inject.spi.ProcessProducerMethod; import javax.faces.convert.Converter; import javax.faces.validator.Validator; //import org.jboss.solder.literal.RequestScopedLiteral; import org.apache.deltaspike.core.api.literal.RequestScopedLiteral; import org.apache.deltaspike.core.util.metadata.builder.AnnotatedTypeBuilder; import org.jboss.solder.logging.internal.Logger; //import org.jboss.solder.reflection.annotated.AnnotatedTypeBuilder; /** * Performs validation of validators and converters to ensure they're normal scoped (i.e. not @Dependent scoped) * * @author Shane Bryzak * */ public class ValidatorConverterScopeOverrideExtension implements Extension { private Logger log = Logger.getLogger(ValidatorConverterScopeOverrideExtension.class); public <T> void processManagedBean(@Observes final ProcessManagedBean<T> event) { if (isMatch(event.getBean())) { log.warn("The " + (event.getBean().getTypes().contains(Validator.class) ? "validator" : "converter") + " bean [" + event.getBean().getBeanClass().getName() + "] does not have a normal scope - overriding it with @RequestScoped"); AnnotatedTypeBuilder<T> builder = new AnnotatedTypeBuilder<T>().readFromType(event.getAnnotatedBeanClass()); builder.removeFromClass(event.getBean().getScope()); builder.addToClass(new RequestScopedLiteral()); } } private <T> boolean isMatch(Bean<T> bean) { return ((bean.getTypes().contains(Validator.class) || bean.getTypes().contains(Converter.class)) && !bean.getScope().isAnnotationPresent(NormalScope.class)); } }