use of org.springframework.web.bind.annotation.RestController in project herd by FINRAOS.
the class RestControllerProcessor method processRestControllerClass.
/**
* Processes a Spring MVC REST controller class that is annotated with RestController. Also collects any required model objects based on parameters and
* return types of each endpoint into the specified model classes set.
*
* @param clazz the class to process
*
* @throws MojoExecutionException if any errors were encountered.
*/
private void processRestControllerClass(Class<?> clazz) throws MojoExecutionException {
// Get the Java class source information.
JavaClassSource javaClassSource = sourceMap.get(clazz.getSimpleName());
if (javaClassSource == null) {
throw new MojoExecutionException("No source resource found for class \"" + clazz.getName() + "\".");
}
Api api = clazz.getAnnotation(Api.class);
boolean hidden = api != null && api.hidden();
if ((clazz.getAnnotation(RestController.class) != null) && (!hidden)) {
log.debug("Processing RestController class \"" + clazz.getName() + "\".");
// Default the tag name to the simple class name.
String tagName = clazz.getSimpleName();
// See if the "Api" annotation exists.
if (api != null && api.tags().length > 0) {
// The "Api" annotation was found so use it's configured tag.
tagName = api.tags()[0];
} else {
// No "Api" annotation so try to get the tag name from the class name. If not, we will stick with the default simple class name.
Matcher matcher = tagPattern.matcher(clazz.getSimpleName());
if (matcher.find()) {
// If our class has the form
tagName = matcher.group("tag");
}
}
log.debug("Using tag name \"" + tagName + "\".");
// Add the tag and process each method.
swagger.addTag(new Tag().name(tagName));
List<Method> methods = Lists.newArrayList(clazz.getDeclaredMethods());
// Based on the Java 8 doc, getDeclaredMethods() is not guaranteed sorted
// In order to be sure we generate stable API when the URL's don't change
// we can give it a sort order based on the first URI hit in the request mapping
List<Method> outMethods = methods.stream().filter((method) -> {
RequestMapping rm = method.getAnnotation(RequestMapping.class);
ApiOperation apiOp = method.getAnnotation(ApiOperation.class);
return // Has RequestMapping
rm != null && // has at least 1 URI
rm.value().length > 0 && // has at least 1 HttpMethod
rm.method().length > 0 && // marked as a hidden ApiOperation
(apiOp == null || !apiOp.hidden());
}).sorted(Comparator.comparing(a -> ((Method) a).getAnnotation(RequestMapping.class).value()[0]).thenComparing(a -> ((Method) a).getAnnotation(RequestMapping.class).method()[0])).collect(Collectors.toList());
for (Method method : outMethods) {
// Get the method source information.
List<Class<?>> methodParamClasses = new ArrayList<>();
for (Parameter parameter : method.getParameters()) {
methodParamClasses.add(parameter.getType());
}
MethodSource<JavaClassSource> methodSource = javaClassSource.getMethod(method.getName(), methodParamClasses.toArray(new Class<?>[methodParamClasses.size()]));
if (methodSource == null) {
throw new MojoExecutionException("No method source found for class \"" + clazz.getName() + "\" and method name \"" + method.getName() + "\".");
}
// Process the REST controller method along with its source information.
processRestControllerMethod(method, clazz.getAnnotation(RequestMapping.class), tagName, methodSource);
}
} else {
log.debug("Skipping class \"" + clazz.getName() + "\" because it is either not a RestController or it is hidden.");
}
}
Aggregations