All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.mangofactory.swagger.readers.ApiDescriptionReader Maven / Gradle / Ivy

package com.mangofactory.swagger.readers;

import com.mangofactory.swagger.core.RequestMappingEvaluator;
import com.mangofactory.swagger.models.dto.ApiDescription;
import com.mangofactory.swagger.models.dto.Operation;
import com.mangofactory.swagger.models.dto.builder.ApiDescriptionBuilder;
import com.mangofactory.swagger.paths.SwaggerPathProvider;
import com.mangofactory.swagger.readers.operation.RequestMappingReader;
import com.mangofactory.swagger.scanners.RequestMappingContext;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.mvc.condition.PatternsRequestCondition;
import org.springframework.web.servlet.mvc.method.RequestMappingInfo;

import java.util.Collection;
import java.util.List;

import static com.google.common.collect.Lists.*;

public class ApiDescriptionReader implements Command {

  private final SwaggerPathProvider swaggerPathProvider;
  private Collection customAnnotationReaders;
  private final RequestMappingEvaluator requestMappingEvaluator;

  public ApiDescriptionReader(SwaggerPathProvider pathProvider,
                              Collection customAnnotationReaders,
                              RequestMappingEvaluator requestMappingEvaluator) {
    this.swaggerPathProvider = pathProvider;
    this.customAnnotationReaders = customAnnotationReaders;
    this.requestMappingEvaluator = requestMappingEvaluator;
  }

  @SuppressWarnings("unchecked")
  @Override
  public void execute(RequestMappingContext context) {
    RequestMappingInfo requestMappingInfo = context.getRequestMappingInfo();
    HandlerMethod handlerMethod = context.getHandlerMethod();
    PatternsRequestCondition patternsCondition = requestMappingInfo.getPatternsCondition();

    List apiDescriptionList = newArrayList();
    for (String pattern : patternsCondition.getPatterns()) {
      if (requestMappingEvaluator.shouldIncludePath(pattern)) {
        String cleanedRequestMappingPath = sanitizeRequestMappingPattern(pattern);
        String path = swaggerPathProvider.getOperationPath(cleanedRequestMappingPath);
        String methodName = handlerMethod.getMethod().getName();
        context.put("requestMappingPattern", cleanedRequestMappingPath);
        ApiOperationReader apiOperationReader = new ApiOperationReader(customAnnotationReaders);
        apiOperationReader.execute(context);
        List operations = (List) context.get("operations");
        apiDescriptionList.add(
                new ApiDescriptionBuilder()
                        .path(path)
                        .description(methodName)
                        .operations(operations)
                        .hidden(false)
                        .build());
      }
    }
    context.put("apiDescriptionList", apiDescriptionList);
  }

  /**
   * Gets a uri friendly path from a request mapping pattern.
   * Typically involves removing any regex patterns or || conditions from a spring request mapping
   * This method will be called to resolve every request mapping endpoint.
   * A good extension point if you need to alter endpoints by adding or removing path segments.
   * Note: this should not be an absolute  uri
   *
   * @param requestMappingPattern
   * @return the request mapping endpoint
   */
  public String sanitizeRequestMappingPattern(String requestMappingPattern) {
    String result = requestMappingPattern;
    //remove regex portion '/{businessId:\\w+}'
    result = result.replaceAll("\\{([^}]*?):.*?\\}", "{$1}");
    return result.isEmpty() ? "/" : result;
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy