/** * */ package org.minnal.instrument.resource.metadata.handler; import java.lang.annotation.Annotation; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.util.Set; import javax.ws.rs.DELETE; import javax.ws.rs.GET; import javax.ws.rs.HEAD; import javax.ws.rs.OPTIONS; import javax.ws.rs.POST; import javax.ws.rs.PUT; import javax.ws.rs.Path; import org.minnal.instrument.resource.metadata.ResourceMetaData; import org.minnal.utils.http.HttpUtil; import org.minnal.utils.reflection.ClassUtils; import com.google.common.collect.Sets; /** * @author ganeshs * */ public class PathAnnotationHandler extends AbstractResourceAnnotationHandler { public static final Set<Class<? extends Annotation>> httpMethods = Sets.newHashSet(GET.class, PUT.class, DELETE.class, POST.class, HEAD.class, OPTIONS.class); /** * @param metaData * @param annotation * @param method */ public void handle(ResourceMetaData metaData, Annotation annotation, Method method) { if (! hasHttpMethod(method)) { ResourceMetaData subResource = new ResourceMetaData(method.getReturnType(), HttpUtil.concatPaths(metaData.getPath(), ((Path)annotation).value())); metaData.addSubResource(subResource); } } public Class<?> getAnnotationType() { return Path.class; } /** * Checks if a HTTP method annotation is defined for the given method * * @param method * @return */ protected boolean hasHttpMethod(Method method) { for (Class<? extends Annotation> annotationClass : httpMethods) { if (ClassUtils.hasAnnotation(method, annotationClass)) { return true; } } return false; } @Override public void handle(ResourceMetaData metaData, Annotation annotation, Field field) { // do nothing } }