jhipster-sample-app/src/main/java/io/github/jhipster/sample/config/apidoc/PageableParameterBuilderPlu...

88 lines
3.8 KiB
Java

package io.github.jhipster.sample.config.apidoc;
import io.github.jhipster.sample.config.Constants;
import com.fasterxml.classmate.ResolvedType;
import com.fasterxml.classmate.TypeResolver;
import com.google.common.base.Function;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Profile;
import org.springframework.core.MethodParameter;
import org.springframework.core.annotation.Order;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Component;
import springfox.documentation.schema.ModelReference;
import springfox.documentation.schema.TypeNameExtractor;
import springfox.documentation.service.Parameter;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spi.schema.contexts.ModelContext;
import springfox.documentation.spi.service.ParameterBuilderPlugin;
import springfox.documentation.spi.service.contexts.ParameterContext;
import springfox.documentation.swagger.common.SwaggerPluginSupport;
import java.util.List;
import static com.google.common.collect.Lists.newArrayList;
import static springfox.documentation.schema.ResolvedTypes.modelRefFactory;
import static springfox.documentation.spi.schema.contexts.ModelContext.inputParam;
@Component
@Order(SwaggerPluginSupport.SWAGGER_PLUGIN_ORDER)
@Profile(Constants.SPRING_PROFILE_SWAGGER)
public class PageableParameterBuilderPlugin implements ParameterBuilderPlugin {
private final TypeNameExtractor nameExtractor;
private final TypeResolver resolver;
@Autowired
public PageableParameterBuilderPlugin(TypeNameExtractor nameExtractor, TypeResolver resolver) {
this.nameExtractor = nameExtractor;
this.resolver = resolver;
}
@Override
public boolean supports(DocumentationType delimiter) {
return true;
}
private Function<ResolvedType, ? extends ModelReference>
createModelRefFactory(ParameterContext context) {
ModelContext modelContext = inputParam(context.methodParameter().getParameterType(),
context.getDocumentationType(),
context.getAlternateTypeProvider(),
context.getGenericNamingStrategy(),
context.getIgnorableParameterTypes());
return modelRefFactory(modelContext, nameExtractor);
}
@Override
public void apply(ParameterContext context) {
MethodParameter parameter = context.methodParameter();
Class<?> type = parameter.getParameterType();
if (type != null && Pageable.class.isAssignableFrom(type)) {
Function<ResolvedType, ? extends ModelReference> factory =
createModelRefFactory(context);
ModelReference intModel = factory.apply(resolver.resolve(Integer.TYPE));
ModelReference stringModel = factory.apply(resolver.resolve(List.class, String.class));
List<Parameter> parameters = newArrayList(
context.parameterBuilder()
.parameterType("query").name("page").modelRef(intModel)
.description("Page number of the requested page")
.build(),
context.parameterBuilder()
.parameterType("query").name("size").modelRef(intModel)
.description("Size of a page")
.build(),
context.parameterBuilder()
.parameterType("query").name("sort").modelRef(stringModel).allowMultiple(true)
.description("Sorting criteria in the format: property(,asc|desc). "
+ "Default sort order is ascending. "
+ "Multiple sort criteria are supported.")
.build());
context.getOperationContext().operationBuilder().parameters(parameters);
}
}
}