| /* |
| * Licensed to the Apache Software Foundation (ASF) under one or more |
| * contributor license agreements. See the NOTICE file distributed with |
| * this work for additional information regarding copyright ownership. |
| * The ASF licenses this file to You under the Apache License, Version 2.0 |
| * (the "License"); you may not use this file except in compliance with |
| * the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| package org.apache.streampark.console.base.config; |
| |
| import io.swagger.annotations.ApiOperation; |
| import org.springframework.beans.factory.annotation.Value; |
| import org.springframework.boot.actuate.autoconfigure.endpoint.web.CorsEndpointProperties; |
| import org.springframework.boot.actuate.autoconfigure.endpoint.web.WebEndpointProperties; |
| import org.springframework.boot.actuate.autoconfigure.web.server.ManagementPortType; |
| import org.springframework.boot.actuate.endpoint.ExposableEndpoint; |
| import org.springframework.boot.actuate.endpoint.web.EndpointLinksResolver; |
| import org.springframework.boot.actuate.endpoint.web.EndpointMapping; |
| import org.springframework.boot.actuate.endpoint.web.EndpointMediaTypes; |
| import org.springframework.boot.actuate.endpoint.web.ExposableWebEndpoint; |
| import org.springframework.boot.actuate.endpoint.web.WebEndpointsSupplier; |
| import org.springframework.boot.actuate.endpoint.web.annotation.ControllerEndpointsSupplier; |
| import org.springframework.boot.actuate.endpoint.web.annotation.ServletEndpointsSupplier; |
| import org.springframework.boot.actuate.endpoint.web.servlet.WebMvcEndpointHandlerMapping; |
| import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication; |
| import org.springframework.context.annotation.Bean; |
| import org.springframework.context.annotation.Configuration; |
| import org.springframework.core.env.Environment; |
| import org.springframework.util.StringUtils; |
| import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; |
| import springfox.documentation.builders.ApiInfoBuilder; |
| import springfox.documentation.builders.PathSelectors; |
| import springfox.documentation.builders.RequestHandlerSelectors; |
| import springfox.documentation.oas.annotations.EnableOpenApi; |
| import springfox.documentation.service.ApiInfo; |
| import springfox.documentation.service.ApiKey; |
| import springfox.documentation.service.AuthorizationScope; |
| import springfox.documentation.service.Contact; |
| import springfox.documentation.service.SecurityReference; |
| import springfox.documentation.spi.DocumentationType; |
| import springfox.documentation.spi.service.contexts.SecurityContextBuilder; |
| import springfox.documentation.spring.web.plugins.Docket; |
| |
| import java.util.ArrayList; |
| import java.util.Collection; |
| import java.util.Collections; |
| import java.util.List; |
| |
| @Configuration |
| @EnableOpenApi |
| @ConditionalOnWebApplication |
| public class SwaggerConfig implements WebMvcConfigurer { |
| |
| @Value("${swagger.enable:false}") |
| private Boolean swaggerEnabled; |
| |
| @Bean |
| public Docket createRestApi() { |
| return new Docket(DocumentationType.OAS_30) |
| .enable(swaggerEnabled) |
| .apiInfo(apiInfo()) |
| .securitySchemes( |
| Collections.singletonList(new ApiKey("Authorization", "Authorization", "header"))) |
| .securityContexts( |
| Collections.singletonList( |
| new SecurityContextBuilder() |
| .securityReferences( |
| Collections.singletonList( |
| SecurityReference.builder() |
| .scopes(new AuthorizationScope[0]) |
| .reference("Authorization") |
| .build())) |
| .operationSelector(s -> true) |
| .build())) |
| .select() |
| .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class)) |
| .paths(PathSelectors.any()) |
| .build(); |
| } |
| |
| private ApiInfo apiInfo() { |
| return new ApiInfoBuilder() |
| .title("Apache StreamPark Api Docs") |
| .description("Apache StreamPark Api Docs") |
| .contact( |
| new Contact( |
| "Apache StreamPark", "https://streampark.apache.org/", "dev@streampark.apache.org")) |
| .version("2.0.0") |
| .license("Apache-2.0 license") |
| .build(); |
| } |
| |
| /** |
| * Streampark used `ant_path_matcher` as default matching-strategy in the springboot 2.6+ version, |
| * but actuator endpoint used `PathPattern` based URL matching. So rewrite |
| * webEndpointServletHandlerMapping @Bean for resolve springfox and actuator conflicts. |
| */ |
| @Bean |
| public WebMvcEndpointHandlerMapping webEndpointServletHandlerMapping( |
| WebEndpointsSupplier webEndpointsSupplier, |
| ServletEndpointsSupplier servletEndpointsSupplier, |
| ControllerEndpointsSupplier controllerEndpointsSupplier, |
| EndpointMediaTypes endpointMediaTypes, |
| CorsEndpointProperties corsProperties, |
| WebEndpointProperties webEndpointProperties, |
| Environment environment) { |
| List<ExposableEndpoint<?>> allEndpoints = new ArrayList<>(); |
| Collection<ExposableWebEndpoint> webEndpoints = webEndpointsSupplier.getEndpoints(); |
| allEndpoints.addAll(webEndpoints); |
| allEndpoints.addAll(servletEndpointsSupplier.getEndpoints()); |
| allEndpoints.addAll(controllerEndpointsSupplier.getEndpoints()); |
| String basePath = webEndpointProperties.getBasePath(); |
| EndpointMapping endpointMapping = new EndpointMapping(basePath); |
| boolean shouldRegisterLinksMapping = |
| this.shouldRegisterLinksMapping(webEndpointProperties, environment, basePath); |
| return new WebMvcEndpointHandlerMapping( |
| endpointMapping, |
| webEndpoints, |
| endpointMediaTypes, |
| corsProperties.toCorsConfiguration(), |
| new EndpointLinksResolver(allEndpoints, basePath), |
| shouldRegisterLinksMapping, |
| null); |
| } |
| |
| private boolean shouldRegisterLinksMapping( |
| WebEndpointProperties webEndpointProperties, Environment environment, String basePath) { |
| return webEndpointProperties.getDiscovery().isEnabled() |
| && (StringUtils.hasText(basePath) |
| || ManagementPortType.get(environment).equals(ManagementPortType.DIFFERENT)); |
| } |
| } |