package com.sebastian_daschner.jaxrs_analyzer.analysis.javadoc;
import com.sebastian_daschner.jaxrs_analyzer.model.JavaUtils;
import com.sebastian_daschner.jaxrs_analyzer.model.methods.MethodIdentifier;
import com.sun.javadoc.*;
import java.util.stream.Stream;
import static com.sebastian_daschner.jaxrs_analyzer.model.JavaUtils.getMethodSignature;
import static com.sebastian_daschner.jaxrs_analyzer.model.Types.*;
import static com.sebastian_daschner.jaxrs_analyzer.model.methods.MethodIdentifier.of;
/**
* @author Sebastian Daschner
*/
public class JAXRSDoclet {
public static boolean start(RootDoc rootDoc) {
Stream.of(rootDoc.classes()).forEach(JAXRSDoclet::handleClassDoc);
return true;
}
private static void handleClassDoc(final ClassDoc classDoc) {
final String className = toClassName(classDoc.qualifiedName());
JavaDocAnalyzer.put(className, classDoc);
Stream.of(classDoc.methods()).forEach(m -> handleMethodDoc(m, className));
}
private static void handleMethodDoc(final MethodDoc methodDoc, final String className) {
final String[] parameterTypes = Stream.of(methodDoc.parameters())
.map(p -> p.type().qualifiedTypeName())
.map(JAXRSDoclet::toType)
.toArray(String[]::new);
final String returnType = toType(methodDoc.returnType().qualifiedTypeName());
final String signature = getMethodSignature(returnType, parameterTypes);
final MethodIdentifier identifier = of(className, methodDoc.name(), signature, methodDoc.isStatic());
JavaDocAnalyzer.put(identifier, methodDoc);
}
private static String toClassName(final String qualifiedName) {
return qualifiedName.replace('.', '/');
}
private static String toType(final String qualifiedName) {
switch (qualifiedName) {
case CLASS_PRIMITIVE_VOID:
return PRIMITIVE_VOID;
case CLASS_PRIMITIVE_BOOLEAN:
return PRIMITIVE_BOOLEAN;
case CLASS_PRIMITIVE_CHAR:
return PRIMITIVE_CHAR;
case CLASS_PRIMITIVE_INT:
return PRIMITIVE_INT;
case CLASS_PRIMITIVE_BYTE:
return PRIMITIVE_BYTE;
case CLASS_PRIMITIVE_SHORT:
return PRIMITIVE_SHORT;
case CLASS_PRIMITIVE_DOUBLE:
return PRIMITIVE_DOUBLE;
case CLASS_PRIMITIVE_FLOAT:
return PRIMITIVE_FLOAT;
case CLASS_PRIMITIVE_LONG:
return PRIMITIVE_LONG;
default:
return JavaUtils.toType(toClassName(qualifiedName));
}
}
}