/**
*
*/
package org.minnal.instrument.metadata.handler;
import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;
import java.util.ServiceLoader;
import org.minnal.instrument.metadata.MetaData;
/**
* @author ganeshs
*
*/
@SuppressWarnings("rawtypes")
public abstract class AbstractAnnotationHandler<T extends MetaData> {
private static Map<Class<?>, AbstractAnnotationHandler> handlers;
public synchronized static AbstractAnnotationHandler handlerFor(Annotation annotation) {
if (handlers == null) {
handlers = new HashMap<Class<?>, AbstractAnnotationHandler>();
ServiceLoader<AbstractAnnotationHandler> loader = ServiceLoader.load(AbstractAnnotationHandler.class);
for (AbstractAnnotationHandler handler : loader) {
handlers.put(handler.getAnnotationType(), handler);
}
}
return handlers.get(annotation.annotationType());
}
public abstract Class<?> getAnnotationType();
public abstract void handle(T metaData, Annotation annotation, Method method);
public abstract void handle(T metaData, Annotation annotation, Field field);
}