package alien4cloud.webconfiguration;
import java.util.Iterator;
import java.util.List;
import java.util.concurrent.atomic.AtomicBoolean;
import javax.servlet.ServletContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationListener;
import org.springframework.context.annotation.Profile;
import org.springframework.context.event.ContextRefreshedEvent;
import org.springframework.stereotype.Component;
import com.fasterxml.classmate.TypeResolver;
import alien4cloud.common.AlienConstants;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spi.service.DocumentationPlugin;
import springfox.documentation.spi.service.contexts.Defaults;
import springfox.documentation.spi.service.contexts.DocumentationContext;
import springfox.documentation.spi.service.contexts.DocumentationContextBuilder;
import springfox.documentation.spi.service.contexts.Orderings;
import springfox.documentation.spring.web.DocumentationCache;
import springfox.documentation.spring.web.plugins.DefaultConfiguration;
import springfox.documentation.spring.web.plugins.DocumentationPluginsManager;
import springfox.documentation.spring.web.scanners.ApiDocumentationScanner;
/**
* Override rest documentation bootstrapper from swagger so we can load plugins and .
*/
@Component
@Profile(AlienConstants.API_DOC_PROFILE_FILTER)
public class RestDocumentationPluginsBootstrapper implements ApplicationListener<ContextRefreshedEvent> {
private static final Logger log = LoggerFactory.getLogger(RestDocumentationPluginsBootstrapper.class);
private final DocumentationPluginsManager documentationPluginsManager;
private final RestDocumentationHandlerProvider handlerProvider;
private final DocumentationCache scanned;
private final ApiDocumentationScanner resourceListing;
private final DefaultConfiguration defaultConfiguration;
private AtomicBoolean initialized = new AtomicBoolean(false);
@Autowired
public RestDocumentationPluginsBootstrapper(DocumentationPluginsManager documentationPluginsManager, RestDocumentationHandlerProvider handlerProvider,
DocumentationCache scanned, ApiDocumentationScanner resourceListing, TypeResolver typeResolver, Defaults defaults, ServletContext servletContext) {
this.documentationPluginsManager = documentationPluginsManager;
this.handlerProvider = handlerProvider;
this.scanned = scanned;
this.resourceListing = resourceListing;
this.defaultConfiguration = new DefaultConfiguration(defaults, typeResolver, servletContext);
}
public void onApplicationEvent(ContextRefreshedEvent contextRefreshedEvent) {
if (this.initialized.compareAndSet(false, true)) {
refresh();
}
}
/**
* Refresh the documentation
*/
public void refresh() {
List plugins = Orderings.pluginOrdering().sortedCopy(this.documentationPluginsManager.documentationPlugins());
log.info("Found {} custom documentation plugin(s)", Integer.valueOf(plugins.size()));
Iterator var3 = plugins.iterator();
while (var3.hasNext()) {
DocumentationPlugin each = (DocumentationPlugin) var3.next();
DocumentationType documentationType = each.getDocumentationType();
if (each.isEnabled()) {
this.scanDocumentation(this.buildContext(each));
} else {
log.info("Skipping initializing disabled plugin bean {} v{}", documentationType.getName(), documentationType.getVersion());
}
}
}
private DocumentationContext buildContext(DocumentationPlugin each) {
return each.configure(this.defaultContextBuilder(each));
}
private void scanDocumentation(DocumentationContext context) {
this.scanned.addDocumentation(this.resourceListing.scan(context));
}
private DocumentationContextBuilder defaultContextBuilder(DocumentationPlugin each) {
DocumentationType documentationType = each.getDocumentationType();
return this.documentationPluginsManager.createContextBuilder(documentationType, this.defaultConfiguration)
.requestHandlers(this.handlerProvider.requestHandlers());
}
}