package alien4cloud.webconfiguration;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Profile;
import org.springframework.stereotype.Component;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.mvc.method.RequestMappingInfo;
import org.springframework.web.servlet.mvc.method.RequestMappingInfoHandlerMapping;
import com.google.common.base.Function;
import com.google.common.collect.FluentIterable;
import com.google.common.collect.Sets;
import alien4cloud.common.AlienConstants;
import springfox.documentation.RequestHandler;
import springfox.documentation.builders.BuilderDefaults;
import springfox.documentation.spi.service.RequestHandlerProvider;
import springfox.documentation.spi.service.contexts.Orderings;
/**
* Request handler provider that also manages plugins apis.
*/
@Component
@Profile(AlienConstants.API_DOC_PROFILE_FILTER)
public class RestDocumentationHandlerProvider implements RequestHandlerProvider {
private final Set<RequestMappingInfoHandlerMapping> handlerMappings;
@Autowired
public RestDocumentationHandlerProvider(List<RequestMappingInfoHandlerMapping> handlerMappings) {
this.handlerMappings = Sets.newHashSet(handlerMappings);
}
public void register(RequestMappingInfoHandlerMapping handler) {
handlerMappings.add(handler);
}
public void unregister(RequestMappingInfoHandlerMapping handler) {
handlerMappings.remove(handler);
}
@Override
public List<RequestHandler> requestHandlers() {
return Orderings.byPatternsCondition().sortedCopy(FluentIterable.from(BuilderDefaults.nullToEmptyList(this.handlerMappings))
.transformAndConcat(this.toMappingEntries()).transform(this.toRequestHandler()));
}
private Function<? super RequestMappingInfoHandlerMapping, Iterable<Map.Entry<RequestMappingInfo, HandlerMethod>>> toMappingEntries() {
return input -> input.getHandlerMethods().entrySet();
}
private Function<Map.Entry<RequestMappingInfo, HandlerMethod>, RequestHandler> toRequestHandler() {
return input -> new RequestHandler(input.getKey(), input.getValue());
}
}