content: 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);
    }
  }
  