Search in sources :

Example 1 with RestController

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.");
    }
}
Also used : PathVariable(org.springframework.web.bind.annotation.PathVariable) AnnotationSource(org.jboss.forge.roaster.model.source.AnnotationSource) RequestParam(org.springframework.web.bind.annotation.RequestParam) Tag(io.swagger.models.Tag) SerializableParameter(io.swagger.models.parameters.SerializableParameter) ParameterSource(org.jboss.forge.roaster.model.source.ParameterSource) PathMatchingResourcePatternResolver(org.springframework.core.io.support.PathMatchingResourcePatternResolver) ApiOperation(io.swagger.annotations.ApiOperation) Matcher(java.util.regex.Matcher) TagElement(org.jboss.forge.roaster._shade.org.eclipse.jdt.core.dom.TagElement) Roaster(org.jboss.forge.roaster.Roaster) Path(io.swagger.models.Path) Map(java.util.Map) MetadataReader(org.springframework.core.type.classreading.MetadataReader) Operation(io.swagger.models.Operation) Method(java.lang.reflect.Method) MethodSource(org.jboss.forge.roaster.model.source.MethodSource) Resource(org.springframework.core.io.Resource) RefModel(io.swagger.models.RefModel) ClassUtils(org.springframework.util.ClassUtils) PathParameter(io.swagger.models.parameters.PathParameter) JavaDocSource(org.jboss.forge.roaster.model.source.JavaDocSource) Set(java.util.Set) CachingMetadataReaderFactory(org.springframework.core.type.classreading.CachingMetadataReaderFactory) RequestMethod(org.springframework.web.bind.annotation.RequestMethod) Collectors(java.util.stream.Collectors) RestController(org.springframework.web.bind.annotation.RestController) QueryParameter(io.swagger.models.parameters.QueryParameter) Response(io.swagger.models.Response) List(java.util.List) JavaClassSource(org.jboss.forge.roaster.model.source.JavaClassSource) CollectionUtils(org.springframework.util.CollectionUtils) JavaDocTag(org.jboss.forge.roaster.model.JavaDocTag) Pattern(java.util.regex.Pattern) Javadoc(org.jboss.forge.roaster._shade.org.eclipse.jdt.core.dom.Javadoc) Swagger(io.swagger.models.Swagger) RequestMapping(org.springframework.web.bind.annotation.RequestMapping) HashMap(java.util.HashMap) BooleanUtils(org.apache.commons.lang3.BooleanUtils) ArrayList(java.util.ArrayList) HashSet(java.util.HashSet) RequestBody(org.springframework.web.bind.annotation.RequestBody) XmlType(javax.xml.bind.annotation.XmlType) Lists(com.google.common.collect.Lists) Parameter(java.lang.reflect.Parameter) RefProperty(io.swagger.models.properties.RefProperty) SystemPropertyUtils(org.springframework.util.SystemPropertyUtils) Api(io.swagger.annotations.Api) BodyParameter(io.swagger.models.parameters.BodyParameter) IOException(java.io.IOException) MojoExecutionException(org.apache.maven.plugin.MojoExecutionException) Log(org.apache.maven.plugin.logging.Log) ResourcePatternResolver(org.springframework.core.io.support.ResourcePatternResolver) Comparator(java.util.Comparator) Collections(java.util.Collections) MojoExecutionException(org.apache.maven.plugin.MojoExecutionException) Matcher(java.util.regex.Matcher) ArrayList(java.util.ArrayList) JavaClassSource(org.jboss.forge.roaster.model.source.JavaClassSource) RestController(org.springframework.web.bind.annotation.RestController) Method(java.lang.reflect.Method) RequestMethod(org.springframework.web.bind.annotation.RequestMethod) RequestMapping(org.springframework.web.bind.annotation.RequestMapping) ApiOperation(io.swagger.annotations.ApiOperation) SerializableParameter(io.swagger.models.parameters.SerializableParameter) PathParameter(io.swagger.models.parameters.PathParameter) QueryParameter(io.swagger.models.parameters.QueryParameter) Parameter(java.lang.reflect.Parameter) BodyParameter(io.swagger.models.parameters.BodyParameter) Api(io.swagger.annotations.Api) Tag(io.swagger.models.Tag) JavaDocTag(org.jboss.forge.roaster.model.JavaDocTag)

Aggregations

Lists (com.google.common.collect.Lists)1 Api (io.swagger.annotations.Api)1 ApiOperation (io.swagger.annotations.ApiOperation)1 Operation (io.swagger.models.Operation)1 Path (io.swagger.models.Path)1 RefModel (io.swagger.models.RefModel)1 Response (io.swagger.models.Response)1 Swagger (io.swagger.models.Swagger)1 Tag (io.swagger.models.Tag)1 BodyParameter (io.swagger.models.parameters.BodyParameter)1 PathParameter (io.swagger.models.parameters.PathParameter)1 QueryParameter (io.swagger.models.parameters.QueryParameter)1 SerializableParameter (io.swagger.models.parameters.SerializableParameter)1 RefProperty (io.swagger.models.properties.RefProperty)1 IOException (java.io.IOException)1 Method (java.lang.reflect.Method)1 Parameter (java.lang.reflect.Parameter)1 ArrayList (java.util.ArrayList)1 Collections (java.util.Collections)1 Comparator (java.util.Comparator)1