package org.jboss.seam.deployment;
import java.lang.annotation.Annotation;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.jboss.seam.log.LogProvider;
import org.jboss.seam.log.Logging;
public class AnnotationDeploymentHandler extends AbstractClassDeploymentHandler
{
private class AnnotationDeploymentHandlerMetadata implements ClassDeploymentMetadata
{
private Set<Class<? extends Annotation>> annotations;
public AnnotationDeploymentHandlerMetadata(Set<Class<? extends Annotation>> annotations)
{
this.annotations = annotations;
}
public Set<Class<? extends Annotation>> getClassAnnotatedWith()
{
return annotations;
}
public String getFileNameSuffix()
{
return null;
}
}
/**
* Name under which this {@link DeploymentHandler} is registered
*/
public static final String NAME = "org.jboss.seam.deployment.AnnotationDeploymentHandler";
public static final String ANNOTATIONS_KEY = "org.jboss.seam.deployment.annotationTypes";
private static final LogProvider log = Logging.getLogProvider(AnnotationDeploymentHandler.class);
private ClassDeploymentMetadata metadata;
private Map<String, Set<Class<?>>> classes;
private Set<Class<? extends Annotation>> annotations;
public AnnotationDeploymentHandler(List<String> annotationTypes, ClassLoader classLoader)
{
this.annotations = new HashSet<Class<? extends Annotation>>();
for (String classname: annotationTypes)
{
try
{
annotations.add((Class<? extends Annotation>) classLoader.loadClass(classname));
}
catch (ClassNotFoundException cnfe)
{
log.warn("could not load annotation class: " + classname, cnfe);
}
catch (NoClassDefFoundError ncdfe)
{
log.warn("could not load annotation class (missing dependency): " + classname, ncdfe);
}
catch (ClassCastException cce)
{
log.warn("could not load annotation class (not an annotation): " + classname, cce);
}
}
metadata = new AnnotationDeploymentHandlerMetadata(annotations);
}
/**
* Get annotated classes
*/
public Map<String, Set<Class<?>>> getClassMap()
{
return Collections.unmodifiableMap(classes);
}
public String getName()
{
return NAME;
}
public ClassDeploymentMetadata getMetadata()
{
return metadata;
}
@Override
public void postProcess(ClassLoader classLoader)
{
classes = new HashMap<String, Set<Class<?>>>();
for (Class<? extends Annotation> annotationType: annotations)
{
classes.put(annotationType.getName(), new HashSet<Class<?>>());
}
for (ClassDescriptor classDescriptor : getClasses())
{
for (Annotation annotation: classDescriptor.getClazz().getAnnotations())
{
if (classes.containsKey(annotation.annotationType().getName()))
{
classes.get(annotation.annotationType().getName()).add(classDescriptor.getClazz());
}
}
}
}
}