![JAR search and dependency download from the Maven repository](/logo.png)
org.apache.cxf.jaxrs.openapi.OpenApiFeature Maven / Gradle / Ivy
/**
* 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.cxf.jaxrs.openapi;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Enumeration;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.Properties;
import java.util.Set;
import java.util.UUID;
import java.util.stream.Collectors;
import jakarta.ws.rs.container.ContainerRequestContext;
import jakarta.ws.rs.container.ContainerRequestFilter;
import jakarta.ws.rs.container.PreMatching;
import jakarta.ws.rs.core.Application;
import jakarta.ws.rs.core.Context;
import jakarta.ws.rs.core.Response;
import jakarta.ws.rs.core.UriInfo;
import org.apache.cxf.Bus;
import org.apache.cxf.annotations.Provider;
import org.apache.cxf.annotations.Provider.Scope;
import org.apache.cxf.annotations.Provider.Type;
import org.apache.cxf.common.util.PropertyUtils;
import org.apache.cxf.common.util.StringUtils;
import org.apache.cxf.endpoint.Server;
import org.apache.cxf.feature.AbstractPortableFeature;
import org.apache.cxf.feature.DelegatingFeature;
import org.apache.cxf.jaxrs.JAXRSServiceFactoryBean;
import org.apache.cxf.jaxrs.common.openapi.DefaultApplicationFactory;
import org.apache.cxf.jaxrs.common.openapi.SwaggerProperties;
import org.apache.cxf.jaxrs.ext.MessageContext;
import org.apache.cxf.jaxrs.provider.ServerProviderFactory;
import org.apache.cxf.jaxrs.swagger.ui.SwaggerUiConfig;
import org.apache.cxf.jaxrs.swagger.ui.SwaggerUiSupport;
import io.swagger.v3.jaxrs2.integration.JaxrsOpenApiContextBuilder;
import io.swagger.v3.jaxrs2.integration.resources.BaseOpenApiResource;
import io.swagger.v3.jaxrs2.integration.resources.OpenApiResource;
import io.swagger.v3.oas.integration.GenericOpenApiContextBuilder;
import io.swagger.v3.oas.integration.OpenApiConfigurationException;
import io.swagger.v3.oas.integration.SwaggerConfiguration;
import io.swagger.v3.oas.integration.api.OpenAPIConfiguration;
import io.swagger.v3.oas.integration.api.OpenApiContext;
import io.swagger.v3.oas.models.Components;
import io.swagger.v3.oas.models.OpenAPI;
import io.swagger.v3.oas.models.info.Contact;
import io.swagger.v3.oas.models.info.Info;
import io.swagger.v3.oas.models.info.License;
import io.swagger.v3.oas.models.security.SecurityScheme;
@Provider(value = Type.Feature, scope = Scope.Server)
public class OpenApiFeature extends DelegatingFeature
implements SwaggerUiSupport, SwaggerProperties {
public OpenApiFeature() {
super(new Portable());
}
public boolean isScan() {
return delegate.isScan();
}
public void setScan(boolean scan) {
delegate.setScan(scan);
}
public String getFilterClass() {
return delegate.getFilterClass();
}
public void setFilterClass(String filterClass) {
delegate.setFilterClass(filterClass);
}
public Set getResourcePackages() {
return delegate.getResourcePackages();
}
public void setResourcePackages(Set resourcePackages) {
delegate.setResourcePackages(resourcePackages);
}
public String getVersion() {
return delegate.getVersion();
}
public void setVersion(String version) {
delegate.setVersion(version);
}
public String getTitle() {
return delegate.getTitle();
}
public void setTitle(String title) {
delegate.setTitle(title);
}
public String getDescription() {
return delegate.getDescription();
}
public void setDescription(String description) {
delegate.setDescription(description);
}
public String getContactName() {
return delegate.getContactName();
}
public void setContactName(String contactName) {
delegate.setContactName(contactName);
}
public String getContactEmail() {
return delegate.getContactEmail();
}
public void setContactEmail(String contactEmail) {
delegate.setContactEmail(contactEmail);
}
public String getContactUrl() {
return delegate.getContactUrl();
}
public void setContactUrl(String contactUrl) {
delegate.setContactUrl(contactUrl);
}
public String getLicense() {
return delegate.getLicense();
}
public void setLicense(String license) {
delegate.setLicense(license);
}
public String getLicenseUrl() {
return delegate.getLicenseUrl();
}
public void setLicenseUrl(String licenseUrl) {
delegate.setLicenseUrl(licenseUrl);
}
public String getTermsOfServiceUrl() {
return delegate.getTermsOfServiceUrl();
}
public void setTermsOfServiceUrl(String termsOfServiceUrl) {
delegate.setTermsOfServiceUrl(termsOfServiceUrl);
}
public boolean isReadAllResources() {
return delegate.isReadAllResources();
}
public void setReadAllResources(boolean readAllResources) {
delegate.setReadAllResources(readAllResources);
}
public Set getResourceClasses() {
return delegate.getResourceClasses();
}
public void setResourceClasses(Set resourceClasses) {
delegate.setResourceClasses(resourceClasses);
}
public Collection getIgnoredRoutes() {
return delegate.getIgnoredRoutes();
}
public void setIgnoredRoutes(Collection ignoredRoutes) {
delegate.setIgnoredRoutes(ignoredRoutes);
}
public boolean isPrettyPrint() {
return delegate.isPrettyPrint();
}
public void setPrettyPrint(boolean prettyPrint) {
delegate.setPrettyPrint(prettyPrint);
}
public boolean isRunAsFilter() {
return delegate.isRunAsFilter();
}
@Override
public Boolean isSupportSwaggerUi() {
return delegate.isSupportSwaggerUi();
}
public void setSupportSwaggerUi(Boolean supportSwaggerUi) {
delegate.setSupportSwaggerUi(supportSwaggerUi);
}
public String getSwaggerUiVersion() {
return delegate.getSwaggerUiVersion();
}
public void setSwaggerUiVersion(String swaggerUiVersion) {
delegate.setSwaggerUiVersion(swaggerUiVersion);
}
public String getSwaggerUiMavenGroupAndArtifact() {
return delegate.getSwaggerUiMavenGroupAndArtifact();
}
public void setSwaggerUiMavenGroupAndArtifact(String swaggerUiMavenGroupAndArtifact) {
delegate.setSwaggerUiMavenGroupAndArtifact(swaggerUiMavenGroupAndArtifact);
}
@Override
public Map getSwaggerUiMediaTypes() {
return delegate.getSwaggerUiMediaTypes();
}
public void setSwaggerUiMediaTypes(Map swaggerUiMediaTypes) {
delegate.setSwaggerUiMediaTypes(swaggerUiMediaTypes);
}
public String getConfigLocation() {
return delegate.getConfigLocation();
}
public void setConfigLocation(String configLocation) {
delegate.setConfigLocation(configLocation);
}
public String getPropertiesLocation() {
return delegate.getPropertiesLocation();
}
public void setPropertiesLocation(String propertiesLocation) {
delegate.setPropertiesLocation(propertiesLocation);
}
public void setRunAsFilter(boolean runAsFilter) {
delegate.setRunAsFilter(runAsFilter);
}
public Map getSecurityDefinitions() {
return delegate.getSecurityDefinitions();
}
public void setSecurityDefinitions(Map securityDefinitions) {
delegate.setSecurityDefinitions(securityDefinitions);
}
public OpenApiCustomizer getCustomizer() {
return delegate.getCustomizer();
}
public void setCustomizer(OpenApiCustomizer customizer) {
delegate.setCustomizer(customizer);
}
public void setScanKnownConfigLocations(boolean scanKnownConfigLocations) {
delegate.setScanKnownConfigLocations(scanKnownConfigLocations);
}
public boolean isScanKnownConfigLocations() {
return delegate.isScanKnownConfigLocations();
}
public void setSwaggerUiConfig(SwaggerUiConfig swaggerUiConfig) {
delegate.setSwaggerUiConfig(swaggerUiConfig);
}
public void setUseContextBasedConfig(boolean useContextBasedConfig) {
delegate.setUseContextBasedConfig(useContextBasedConfig);
}
public boolean isUseContextBasedConfig() {
return delegate.isUseContextBasedConfig();
}
public String getScannerClass() {
return delegate.getScannerClass();
}
public void setScannerClass(String scannerClass) {
delegate.setScannerClass(scannerClass);
}
@Override
public SwaggerUiConfig getSwaggerUiConfig() {
return delegate.getSwaggerUiConfig();
}
@Override
public String findSwaggerUiRoot() {
return delegate.findSwaggerUiRoot();
}
public Properties getUserProperties(Map userDefinedOptions) {
return delegate.getUserProperties(userDefinedOptions);
}
public void registerOpenApiResources(JAXRSServiceFactoryBean sfb, Set packages,
OpenAPIConfiguration config) {
delegate.registerOpenApiResources(sfb, packages, config);
}
public void registerServletConfigProvider(ServerProviderFactory factory) {
delegate.registerServletConfigProvider(factory);
}
public void registerSwaggerUiResources(JAXRSServiceFactoryBean sfb, Properties properties,
ServerProviderFactory factory, Bus bus) {
delegate.registerSwaggerUiResources(sfb, properties, factory, bus);
}
public Info getInfo(Properties properties) {
return delegate.getInfo(properties);
}
public String getOrFallback(String value, Properties properties, String property) {
return delegate.getOrFallback(value, properties, property);
}
public Boolean getOrFallback(Boolean value, Properties properties, String property) {
return delegate.getOrFallback(value, properties, property);
}
public Set getOrFallback(Set collection, Properties properties, String property) {
return delegate.getOrFallback(collection, properties, property);
}
public Collection scanResourcePackages(JAXRSServiceFactoryBean sfb) {
return delegate.scanResourcePackages(sfb);
}
public static Properties combine(Properties primary, Properties secondary) {
return Portable.combine(primary, secondary);
}
public static void setOrReplace(Properties source, Properties destination) {
Portable.setOrReplace(source, destination);
}
public static Optional registerComponents(Map securityDefinitions) {
return Portable.registerComponents(securityDefinitions);
}
public BaseOpenApiResource createOpenApiResource() {
return delegate.createOpenApiResource();
}
public static class Portable implements AbstractPortableFeature, SwaggerUiSupport, SwaggerProperties {
private String version;
private String title;
private String description;
private String contactName;
private String contactEmail;
private String contactUrl;
private String license;
private String licenseUrl;
private String termsOfServiceUrl;
// Read all operations also with no @Operation
private boolean readAllResources = true;
// Scan all JAX-RS resources automatically
private boolean scan = true;
private boolean prettyPrint = true;
private boolean runAsFilter;
private Collection ignoredRoutes;
private Set resourcePackages;
private Set resourceClasses;
private String filterClass;
private Boolean supportSwaggerUi;
private String swaggerUiVersion;
private String swaggerUiMavenGroupAndArtifact;
private Map swaggerUiMediaTypes;
// Additional components
private Map securityDefinitions;
private OpenApiCustomizer customizer;
// Allows to pass the configuration location, usually openapi-configuration.json
// or openapi-configuration.yml file.
private String configLocation;
// Allows to pass the properties location, by default swagger.properties
private String propertiesLocation = DEFAULT_PROPS_LOCATION;
// Allows to disable automatic scan of known configuration locations (enabled by default)
private boolean scanKnownConfigLocations = true;
// Swagger UI configuration parameters (to be passed as query string).
private SwaggerUiConfig swaggerUiConfig;
// Generates the Swagger Context ID (instead of using the default one). It is
// necessary when more than one JAXRS Server Factory Bean or OpenApiFeature instance
// are co-located in the same application.
private boolean useContextBasedConfig;
private String ctxId;
// The API Scanner class to use
private String scannerClass;
@Override
public void initialize(Server server, Bus bus) {
final JAXRSServiceFactoryBean sfb = (JAXRSServiceFactoryBean)server
.getEndpoint()
.get(JAXRSServiceFactoryBean.class.getName());
final ServerProviderFactory factory = (ServerProviderFactory)server
.getEndpoint()
.get(ServerProviderFactory.class.getName());
final Set packages = new HashSet<>();
if (resourcePackages != null) {
packages.addAll(resourcePackages);
}
// Generate random Context ID for Swagger
if (useContextBasedConfig) {
ctxId = UUID.randomUUID().toString();
}
Properties swaggerProps = null;
GenericOpenApiContextBuilder> openApiConfiguration;
final Application application = DefaultApplicationFactory.createApplicationOrDefault(server, factory,
sfb, bus, resourcePackages, isScan());
String defaultConfigLocation = getConfigLocation();
if (scanKnownConfigLocations && StringUtils.isEmpty(defaultConfigLocation)) {
defaultConfigLocation = OpenApiDefaultConfigurationScanner.locateDefaultConfiguration().orElse(null);
}
if (StringUtils.isEmpty(defaultConfigLocation)) {
swaggerProps = getSwaggerProperties(propertiesLocation, bus);
if (isScan()) {
packages.addAll(scanResourcePackages(sfb));
}
final OpenAPI oas = new OpenAPI().info(getInfo(swaggerProps));
registerComponents(securityDefinitions).ifPresent(oas::setComponents);
final SwaggerConfiguration config = new SwaggerConfiguration()
.openAPI(oas)
.prettyPrint(getOrFallback(isPrettyPrint(), swaggerProps, PRETTY_PRINT_PROPERTY))
.readAllResources(isReadAllResources())
.ignoredRoutes(getIgnoredRoutes())
.filterClass(getOrFallback(getFilterClass(), swaggerProps, FILTER_CLASS_PROPERTY))
.resourceClasses(getResourceClasses())
.resourcePackages(getOrFallback(packages, swaggerProps, RESOURCE_PACKAGE_PROPERTY));
if (!StringUtils.isEmpty(getScannerClass())) {
config.setScannerClass(getScannerClass());
}
openApiConfiguration = new JaxrsOpenApiContextBuilder<>()
.application(application)
.openApiConfiguration(config)
.ctxId(ctxId); /* will be null if not used */
} else {
openApiConfiguration = new JaxrsOpenApiContextBuilder<>()
.application(application)
.configLocation(defaultConfigLocation)
.ctxId(ctxId); /* will be null if not used */
}
try {
final OpenApiContext context = openApiConfiguration.buildContext(true);
final Properties userProperties = getUserProperties(
context
.getOpenApiConfiguration()
.getUserDefinedOptions());
registerOpenApiResources(sfb, packages, context.getOpenApiConfiguration());
registerSwaggerUiResources(sfb, combine(swaggerProps, userProperties), factory, bus);
registerSwaggerContainerRequestFilter(factory, application, context.getOpenApiConfiguration());
if (useContextBasedConfig) {
registerServletConfigProvider(factory);
}
if (customizer != null) {
customizer.setApplicationInfo(factory.getApplicationProvider());
}
bus.setProperty("openapi.service.description.available", "true");
} catch (OpenApiConfigurationException ex) {
throw new RuntimeException("Unable to initialize OpenAPI context", ex);
}
}
private void registerSwaggerContainerRequestFilter(ServerProviderFactory factory, Application application,
OpenAPIConfiguration config) {
if (isRunAsFilter()) {
List
© 2015 - 2025 Weber Informatics LLC | Privacy Policy