package com.github.aesteve.vertx.nubes.handlers;
import com.github.aesteve.vertx.nubes.reflections.factories.AnnotationProcessorFactory;
import java.lang.annotation.Annotation;
import java.util.HashMap;
import java.util.Map;
public class AnnotationProcessorRegistry {
private final Map<Class<? extends Annotation>, AnnotationProcessorFactory<? extends Annotation>> factoryMap;
private final Map<Class<? extends Annotation>, AnnotationProcessor<? extends Annotation>> processorMap;
public AnnotationProcessorRegistry() {
factoryMap = new HashMap<>();
processorMap = new HashMap<>();
}
public <T extends Annotation> void registerProcessor(Class<T> annotation, AnnotationProcessorFactory<T> processor) {
factoryMap.put(annotation, processor);
}
public <T extends Annotation> void registerProcessor(Class<T> annotation, AnnotationProcessor<T> processor) {
processorMap.put(annotation, processor);
}
@SuppressWarnings("unchecked")
public <T extends Annotation> AnnotationProcessor<T> getProcessor(T annotation) {
AnnotationProcessorFactory<T> factory = (AnnotationProcessorFactory<T>) getFactory(annotation.annotationType());
if (factory != null) {
return factory.create(annotation);
}
return getSimpleProcessor(annotation);
}
@SuppressWarnings("unchecked")
private <T extends Annotation> AnnotationProcessor<T> getSimpleProcessor(T annotation) {
return (AnnotationProcessor<T>) processorMap.get(annotation.annotationType());
}
@SuppressWarnings("unchecked")
private <T extends Annotation> AnnotationProcessorFactory<T> getFactory(Class<T> annotation) {
return (AnnotationProcessorFactory<T>) factoryMap.get(annotation);
}
}