package org.magnum.soda.aop;
import java.lang.annotation.Annotation;
import java.util.HashMap;
import java.util.Map;
public class DefaultInvocationProcessorFactory implements
InvocationProcessorFactory {
private Map<Class<?>, Class<? extends InvocationProcessor<?>>> processors_ = new HashMap<Class<?>, Class<? extends InvocationProcessor<?>>>();
public DefaultInvocationProcessorFactory() {}
public <Type extends Annotation> void addProcessor(
Class<Type> anno, Class<? extends InvocationProcessor<Type>> proc) {
processors_.put(anno, proc);
}
@SuppressWarnings("unchecked")
@Override
public <PreProc extends Annotation> InvocationProcessor<PreProc> getProcessor(
PreProc proc) {
Class<? extends InvocationProcessor<PreProc>> processortype = (Class<? extends InvocationProcessor<PreProc>>) processors_
.get(proc.annotationType());
InvocationProcessor<PreProc> processor = null;
if (processortype != null) {
try {
processor = processortype.newInstance();
processor.setAnnotation(proc);
} catch (Exception e) {
throw new RuntimeException("Error creating processor of type: "
+ processortype + " for processing annotation:" + proc);
}
}
return processor;
}
}