package com.sebastian_daschner.jaxrs_analyzer.analysis.classes; import com.sebastian_daschner.jaxrs_analyzer.analysis.classes.annotation.DefaultValueAnnotationVisitor; import com.sebastian_daschner.jaxrs_analyzer.analysis.classes.annotation.ParamAnnotationVisitor; import com.sebastian_daschner.jaxrs_analyzer.model.Types; import com.sebastian_daschner.jaxrs_analyzer.model.rest.MethodParameter; import com.sebastian_daschner.jaxrs_analyzer.model.rest.ParameterType; import com.sebastian_daschner.jaxrs_analyzer.model.rest.TypeIdentifier; import com.sebastian_daschner.jaxrs_analyzer.model.results.ClassResult; import org.objectweb.asm.AnnotationVisitor; import org.objectweb.asm.FieldVisitor; import org.objectweb.asm.Opcodes; /** * @author Sebastian Daschner */ class JAXRSFieldVisitor extends FieldVisitor { private final ClassResult classResult; private final String signature; private MethodParameter parameter; JAXRSFieldVisitor(final ClassResult classResult, final String desc, final String signature) { super(Opcodes.ASM5); this.classResult = classResult; this.signature = signature == null ? desc : signature; } @Override public AnnotationVisitor visitAnnotation(final String desc, final boolean visible) { switch (desc) { case Types.PATH_PARAM: return paramAnnotationVisitor(ParameterType.PATH); case Types.QUERY_PARAM: return paramAnnotationVisitor(ParameterType.QUERY); case Types.HEADER_PARAM: return paramAnnotationVisitor(ParameterType.HEADER); case Types.FORM_PARAM: return paramAnnotationVisitor(ParameterType.FORM); case Types.COOKIE_PARAM: return paramAnnotationVisitor(ParameterType.COOKIE); case Types.MATRIX_PARAM: return paramAnnotationVisitor(ParameterType.MATRIX); case Types.DEFAULT_VALUE: return defaultAnnotationVisitor(); default: return null; } } private AnnotationVisitor paramAnnotationVisitor(final ParameterType parameterType) { if (parameter == null) parameter = new MethodParameter(TypeIdentifier.ofType(signature), parameterType); else parameter.setParameterType(parameterType); return new ParamAnnotationVisitor(parameter); } private AnnotationVisitor defaultAnnotationVisitor() { if (parameter == null) parameter = new MethodParameter(TypeIdentifier.ofType(signature)); return new DefaultValueAnnotationVisitor(parameter); } @Override public void visitEnd() { if (parameter != null) classResult.getClassFields().add(parameter); } }