package alien4cloud.webconfiguration; import java.util.List; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.FilterType; import org.springframework.context.annotation.Import; import org.springframework.context.annotation.Profile; import org.springframework.plugin.core.config.EnablePluginRegistries; import com.google.common.base.Predicate; import com.google.common.base.Predicates; import com.google.common.collect.Lists; import alien4cloud.common.AlienConstants; import springfox.documentation.builders.PathSelectors; import springfox.documentation.schema.configuration.ModelsConfiguration; import springfox.documentation.service.ApiInfo; import springfox.documentation.service.PathDecorator; import springfox.documentation.spi.DocumentationType; import springfox.documentation.spi.service.ApiListingBuilderPlugin; import springfox.documentation.spi.service.DefaultsProviderPlugin; import springfox.documentation.spi.service.DocumentationPlugin; import springfox.documentation.spi.service.ExpandedParameterBuilderPlugin; import springfox.documentation.spi.service.OperationBuilderPlugin; import springfox.documentation.spi.service.OperationModelsProviderPlugin; import springfox.documentation.spi.service.ParameterBuilderPlugin; import springfox.documentation.spi.service.ResourceGroupingStrategy; import springfox.documentation.spi.service.contexts.Defaults; import springfox.documentation.spring.web.DocumentationCache; import springfox.documentation.spring.web.ObjectMapperConfigurer; import springfox.documentation.spring.web.json.JacksonModuleRegistrar; import springfox.documentation.spring.web.json.JsonSerializer; import springfox.documentation.spring.web.plugins.Docket; import springfox.documentation.spring.web.plugins.DocumentationPluginsBootstrapper; import springfox.documentation.swagger.configuration.SwaggerCommonConfiguration; import springfox.documentation.swagger.web.UiConfiguration; import springfox.documentation.swagger2.configuration.Swagger2JacksonModule; @Configuration @Import({ ModelsConfiguration.class, SwaggerCommonConfiguration.class }) @ComponentScan(basePackages = { "springfox.documentation.swagger2.readers.parameter", "springfox.documentation.swagger2.web", "springfox.documentation.swagger2.mappers", "springfox.documentation.spring.web.scanners", "springfox.documentation.spring.web.readers.operation", "springfox.documentation.spring.web.readers.parameter", "springfox.documentation.spring.web.plugins", "springfox.documentation.spring.web.paths" }, excludeFilters = { @ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, value = DocumentationPluginsBootstrapper.class) }) @EnablePluginRegistries({ DocumentationPlugin.class, ApiListingBuilderPlugin.class, OperationBuilderPlugin.class, ParameterBuilderPlugin.class, ExpandedParameterBuilderPlugin.class, ResourceGroupingStrategy.class, OperationModelsProviderPlugin.class, DefaultsProviderPlugin.class, PathDecorator.class }) @Profile(AlienConstants.API_DOC_PROFILE_FILTER) public class RestDocumentationConfig { private static final String CURRENT_API_VERSION = "1"; private static final String PREFIXED_CURRENT_API_VERSION = "v" + CURRENT_API_VERSION; private List<Predicate<String>> predicates = Lists.newArrayList(); @Bean public JacksonModuleRegistrar swagger2Module() { return new Swagger2JacksonModule(); } @Bean public Defaults defaults() { return new Defaults(); } @Bean public DocumentationCache resourceGroupCache() { return new DocumentationCache(); } @Bean public static ObjectMapperConfigurer objectMapperConfigurer() { return new ObjectMapperConfigurer(); } @Bean public JsonSerializer jsonSerializer(List<JacksonModuleRegistrar> moduleRegistrars) { return new JsonSerializer(moduleRegistrars); } @Bean public Docket adminApiDocket() { Predicate predicate = PathSelectors.regex("/rest/admin.*"); predicates.add(predicate); return new Docket(DocumentationType.SWAGGER_2).groupName("admin-api").select().paths(predicate).build().apiInfo(apiInfo()); } @Bean public Docket adminUserApiDocket() { Predicate predicate = Predicates.or(PathSelectors.regex("/rest/" + PREFIXED_CURRENT_API_VERSION + "/users.*"), PathSelectors.regex("/rest/" + PREFIXED_CURRENT_API_VERSION + "/groups.*")); predicates.add(predicate); return new Docket(DocumentationType.SWAGGER_2).groupName("admin-user-api").select().paths(predicate).build().apiInfo(apiInfo()); } @Bean public Docket adminPluginApiDocket() { Predicate predicate = PathSelectors.regex("/rest/" + PREFIXED_CURRENT_API_VERSION + "/plugins.*"); predicates.add(predicate); return new Docket(DocumentationType.SWAGGER_2).groupName("admin-plugin-api").select().paths(predicate).build().apiInfo(apiInfo()); } @Bean public Docket adminOrchestratorApiDocket() { Predicate predicate = PathSelectors.regex("/rest/" + PREFIXED_CURRENT_API_VERSION + "/orchestrators.*"); predicates.add(predicate); return new Docket(DocumentationType.SWAGGER_2).groupName("admin-orchestrator-api").select().paths(predicate).build().apiInfo(apiInfo()); } @Bean public Docket adminAuditApiDocket() { Predicate predicate = PathSelectors.regex("/rest/" + PREFIXED_CURRENT_API_VERSION + "/audit.*"); predicates.add(predicate); return new Docket(DocumentationType.SWAGGER_2).groupName("admin-audit-api").select().paths(predicate).build().apiInfo(apiInfo()); } @Bean public Docket adminMetaPropertiesApiDocket() { Predicate predicate = PathSelectors.regex("/rest/" + PREFIXED_CURRENT_API_VERSION + "/metaproperties.*"); predicates.add(predicate); return new Docket(DocumentationType.SWAGGER_2).groupName("admin-metaproperties-api").select().paths(predicate).build().apiInfo(apiInfo()); } @Bean public Docket catalogApiDocket() { Predicate predicate = Predicates.or(PathSelectors.regex("/rest/" + PREFIXED_CURRENT_API_VERSION + "/catalog.*"), PathSelectors.regex("/rest/" + PREFIXED_CURRENT_API_VERSION + "/components.*"), PathSelectors.regex("/rest/" + PREFIXED_CURRENT_API_VERSION + "/csars.*")); predicates.add(predicate); return new Docket(DocumentationType.SWAGGER_2).groupName("catalog-api").select().paths(predicate).build().apiInfo(apiInfo()); } @Bean public Docket workspacesApiDocket() { Predicate predicate = PathSelectors.regex("/rest/" + PREFIXED_CURRENT_API_VERSION + "/workspaces.*"); predicates.add(predicate); return new Docket(DocumentationType.SWAGGER_2).groupName("workspaces-api").select().paths(predicate).build().apiInfo(apiInfo()); } @Bean public Docket applicationApiDocket() { Predicate predicate = PathSelectors.regex("/rest/" + PREFIXED_CURRENT_API_VERSION + "/applications.*"); predicates.add(predicate); return new Docket(DocumentationType.SWAGGER_2).groupName("applications-api").select().paths(predicate).build().apiInfo(apiInfo()); } @Bean public Docket deploymentApiDocket() { Predicate predicate = Predicates.or(PathSelectors.regex("/rest/" + PREFIXED_CURRENT_API_VERSION + "/deployments.*"), PathSelectors.regex("/rest/" + PREFIXED_CURRENT_API_VERSION + "/runtime.*")); predicates.add(predicate); return new Docket(DocumentationType.SWAGGER_2).groupName("applications-deployment-api").select().paths(predicate).build().apiInfo(apiInfo()); } @Bean public Docket topologyEditorApiDocket() { Predicate predicate = PathSelectors.regex("/rest/" + PREFIXED_CURRENT_API_VERSION + "/topologies.*"); predicates.add(predicate); return new Docket(DocumentationType.SWAGGER_2).groupName("topology-editor-api").select().paths(predicate).build().apiInfo(apiInfo()); } @Bean public Docket otherApiDocket() { return new Docket(DocumentationType.SWAGGER_2).groupName("other-apis").select().paths(otherApiPredicate()).build().apiInfo(apiInfo()); } private Predicate<String> otherApiPredicate() { Predicate<String> notAlreadyTreated = Predicates.not(Predicates.or(predicates)); Predicate<String> isCurrentVersionApi = PathSelectors.regex("/rest/" + PREFIXED_CURRENT_API_VERSION + "/.*"); return Predicates.and(notAlreadyTreated, isCurrentVersionApi); } private ApiInfo apiInfo() { ApiInfo apiInfo = new ApiInfo("ALIEN 4 Cloud API", "Welcome on the live configuration of ALIEN 4 Cloud Rest API.", CURRENT_API_VERSION, "", "Need help? Join us on slack! https://alien4cloud.github.io/community/index.html", "Licensed under the Apache License, Version 2.0", "http://www.apache.org/licenses/LICENSE-2.0"); return apiInfo; } @Bean public UiConfiguration uiConfig() { return new UiConfiguration(null); } }