package org.jboss.as.weld.deployment.processors;
import static org.jboss.as.weld.discovery.AnnotationType.FOR_CLASSINFO;
import static org.jboss.as.weld.util.Indices.ANNOTATION_PREDICATE;
import static org.jboss.as.weld.util.Indices.getAnnotatedClasses;
import java.util.Collection;
import java.util.HashSet;
import java.util.Set;
import javax.transaction.TransactionScoped;
import org.jboss.as.server.deployment.Attachments;
import org.jboss.as.server.deployment.DeploymentPhaseContext;
import org.jboss.as.server.deployment.DeploymentUnit;
import org.jboss.as.server.deployment.DeploymentUnitProcessingException;
import org.jboss.as.server.deployment.DeploymentUnitProcessor;
import org.jboss.as.server.deployment.annotation.CompositeIndex;
import org.jboss.as.weld.CdiAnnotations;
import org.jboss.as.weld.deployment.WeldAttachments;
import org.jboss.as.weld.discovery.AnnotationType;
import org.jboss.jandex.ClassInfo;
import org.jboss.jandex.DotName;
/**
* Determines the set of bean defining annotations as defined by the CDI specification and attaches them under
* {@link WeldAttachments#BEAN_DEFINING_ANNOTATIONS}.
*
* @author Jozef Hartinger
*
*/
public class BeanDefiningAnnotationProcessor implements DeploymentUnitProcessor {
private static final DotName VIEW_SCOPED_NAME = DotName.createSimple("javax.faces.view.ViewScoped");
private static final DotName FLOW_SCOPED_NAME = DotName.createSimple("javax.faces.flow.FlowScoped");
@Override
public void deploy(DeploymentPhaseContext phaseContext) throws DeploymentUnitProcessingException {
final DeploymentUnit deploymentUnit = phaseContext.getDeploymentUnit();
if (deploymentUnit.getParent() != null) {
return; // only run for top-level deployments
}
final CompositeIndex index = deploymentUnit.getAttachment(Attachments.COMPOSITE_ANNOTATION_INDEX);
// CDI built-in normal scopes plus @Dependent
addAnnotations(deploymentUnit, CdiAnnotations.BEAN_DEFINING_ANNOTATIONS);
// CDI @Model stereotype
addAnnotation(deploymentUnit, new AnnotationType(CdiAnnotations.MODEL.getDotName(), false));
// EE7 built-in normal scopes and stereotypes
addAnnotation(deploymentUnit, new AnnotationType(TransactionScoped.class));
addAnnotation(deploymentUnit, new AnnotationType(VIEW_SCOPED_NAME, true));
addAnnotation(deploymentUnit, new AnnotationType(FLOW_SCOPED_NAME, true));
for (AnnotationType annotationType : CdiAnnotations.BEAN_DEFINING_META_ANNOTATIONS) {
addAnnotations(deploymentUnit, getAnnotationsAnnotatedWith(index, annotationType.getName()));
}
}
private static void addAnnotations(final DeploymentUnit deploymentUnit, Collection<AnnotationType> annotations) {
for(AnnotationType annotation : annotations){
addAnnotation(deploymentUnit, annotation);
}
}
private static void addAnnotation(final DeploymentUnit deploymentUnit, AnnotationType annotation) {
deploymentUnit.addToAttachmentList(WeldAttachments.BEAN_DEFINING_ANNOTATIONS, annotation);
}
private Collection<AnnotationType> getAnnotationsAnnotatedWith(CompositeIndex index, DotName annotationName) {
Set<AnnotationType> annotations = new HashSet<>();
for (ClassInfo classInfo : getAnnotatedClasses(index.getAnnotations(annotationName))) {
if (ANNOTATION_PREDICATE.test(classInfo)) {
annotations.add(FOR_CLASSINFO.apply(classInfo));
}
}
return annotations;
}
@Override
public void undeploy(DeploymentUnit deploymentUnit) {
deploymentUnit.removeAttachment(WeldAttachments.BEAN_DEFINING_ANNOTATIONS);
}
}