/**
*
*/
package org.minnal.instrument.entity.metadata.handler;
import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import org.minnal.instrument.MinnalInstrumentationException;
import org.minnal.instrument.entity.Action;
import org.minnal.instrument.entity.AggregateRoot;
import org.minnal.instrument.entity.metadata.ActionMetaData;
import org.minnal.instrument.entity.metadata.EntityMetaData;
import org.minnal.instrument.entity.metadata.ParameterMetaData;
import org.minnal.instrument.util.ParameterNameDiscoverer;
import org.minnal.utils.reflection.ClassUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.common.base.Strings;
/**
* @author ganeshs
*
*/
public class ActionAnnotationHandler extends AbstractEntityAnnotationHandler {
private static final Logger logger = LoggerFactory.getLogger(ActionAnnotationHandler.class);
@Override
public void handle(EntityMetaData metaData, Annotation annotation, Method method) {
if (! ClassUtils.hasAnnotation(metaData.getEntityClass(), AggregateRoot.class)) {
logger.error("@Action can be specified only on classes marked with @AggregateRoot. {} class is not an aggregate root", metaData.getEntityClass());
throw new MinnalInstrumentationException("@Action can be specified only on classes marked with @AggregateRoot. " +
metaData.getEntityClass() + " class is not an aggregate root");
}
String value = ((Action)annotation).value();
String path = ((Action)annotation).path();
if (Strings.isNullOrEmpty(value)) {
value = method.getName();
}
if (Strings.isNullOrEmpty(path)) {
path = null;
}
ActionMetaData actionMetaData = new ActionMetaData(value, path, method);
String[] parameterNames = ParameterNameDiscoverer.getParameterNames(method);
Class<?>[] parameterTypes = method.getParameterTypes();
for (int i = 0; i < parameterTypes.length; i++) {
ParameterMetaData parameterMetaData = new ParameterMetaData(parameterNames[i], parameterNames[i], parameterTypes[i]);
actionMetaData.addParameter(parameterMetaData);
}
metaData.addActionMethod(actionMetaData);
}
@Override
public void handle(EntityMetaData metaData, Annotation annotation, Field field) {
throw new IllegalArgumentException("@Action should be annotated only over methods");
}
@Override
public Class<?> getAnnotationType() {
return Action.class;
}
}