package org.jsondoc.core.scanner;
import java.lang.reflect.Method;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.jsondoc.core.annotation.Api;
import org.jsondoc.core.annotation.ApiBodyObject;
import org.jsondoc.core.annotation.ApiMethod;
import org.jsondoc.core.annotation.ApiObject;
import org.jsondoc.core.annotation.flow.ApiFlowSet;
import org.jsondoc.core.annotation.global.ApiChangelogSet;
import org.jsondoc.core.annotation.global.ApiGlobal;
import org.jsondoc.core.annotation.global.ApiMigrationSet;
import org.jsondoc.core.pojo.ApiDoc;
import org.jsondoc.core.pojo.ApiMethodDoc;
import org.jsondoc.core.pojo.ApiObjectDoc;
import org.jsondoc.core.pojo.JSONDocTemplate;
import org.jsondoc.core.scanner.builder.JSONDocApiDocBuilder;
import org.jsondoc.core.scanner.builder.JSONDocApiMethodDocBuilder;
import org.jsondoc.core.scanner.builder.JSONDocApiObjectDocBuilder;
import org.jsondoc.core.util.JSONDocUtils;
public class DefaultJSONDocScanner extends AbstractJSONDocScanner {
public static final String UNDEFINED = "undefined";
public static final String ANONYMOUS = "anonymous";
@Override
public Set<Class<?>> jsondocControllers() {
return reflections.getTypesAnnotatedWith(Api.class, true);
}
@Override
public Set<Method> jsondocMethods(Class<?> controller) {
Set<Method> annotatedMethods = new LinkedHashSet<Method>();
for (Method method : controller.getDeclaredMethods()) {
if(method.isAnnotationPresent(ApiMethod.class)) {
annotatedMethods.add(method);
}
}
return annotatedMethods;
}
@Override
public Set<Class<?>> jsondocObjects(List<String> packages) {
return reflections.getTypesAnnotatedWith(ApiObject.class, true);
}
@Override
public Set<Class<?>> jsondocFlows() {
return reflections.getTypesAnnotatedWith(ApiFlowSet.class, true);
}
@Override
public ApiDoc initApiDoc(Class<?> controller) {
return JSONDocApiDocBuilder.build(controller);
}
@Override
public ApiDoc mergeApiDoc(Class<?> controller, ApiDoc apiDoc) {
return apiDoc;
}
@Override
public ApiMethodDoc initApiMethodDoc(Method method, Map<Class<?>, JSONDocTemplate> jsondocTemplates) {
ApiMethodDoc apiMethodDoc = JSONDocApiMethodDocBuilder.build(method);
if (method.isAnnotationPresent(ApiBodyObject.class)) {
apiMethodDoc.getBodyobject().setJsondocTemplate(jsondocTemplates.get(method.getAnnotation(ApiBodyObject.class).clazz()));
}
Integer index = JSONDocUtils.getIndexOfParameterWithAnnotation(method, ApiBodyObject.class);
if (index != -1) {
apiMethodDoc.getBodyobject().setJsondocTemplate(jsondocTemplates.get(method.getParameterTypes()[index]));
}
return apiMethodDoc;
}
@Override
public ApiMethodDoc mergeApiMethodDoc(Method method, ApiMethodDoc apiMethodDoc) {
return apiMethodDoc;
}
@Override
public ApiObjectDoc initApiObjectDoc(Class<?> clazz) {
return JSONDocApiObjectDocBuilder.build(clazz);
}
@Override
public ApiObjectDoc mergeApiObjectDoc(Class<?> clazz, ApiObjectDoc apiObjectDoc) {
return apiObjectDoc;
}
@Override
public Set<Class<?>> jsondocGlobal() {
return reflections.getTypesAnnotatedWith(ApiGlobal.class, true);
}
@Override
public Set<Class<?>> jsondocChangelogs() {
return reflections.getTypesAnnotatedWith(ApiChangelogSet.class, true);
}
@Override
public Set<Class<?>> jsondocMigrations() {
return reflections.getTypesAnnotatedWith(ApiMigrationSet.class, true);
}
}