You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cxf.apache.org by ff...@apache.org on 2019/07/02 20:55:30 UTC
[cxf] branch master updated: [CXF-8064]OpenApiFeature(OpenAPI V3)
should be able to work with camel-cxfrs endpoint
This is an automated email from the ASF dual-hosted git repository.
ffang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/cxf.git
The following commit(s) were added to refs/heads/master by this push:
new 34473b5 [CXF-8064]OpenApiFeature(OpenAPI V3) should be able to work with camel-cxfrs endpoint
34473b5 is described below
commit 34473b533d14ca0c4e5ba24e3d92b0d5f402973a
Author: Freeman Fang <fr...@gmail.com>
AuthorDate: Tue Jul 2 16:55:15 2019 -0400
[CXF-8064]OpenApiFeature(OpenAPI V3) should be able to work with camel-cxfrs endpoint
---
.../apache/cxf/jaxrs/openapi/OpenApiFeature.java | 68 +++++++++++++++++++++-
1 file changed, 67 insertions(+), 1 deletion(-)
diff --git a/rt/rs/description-openapi-v3/src/main/java/org/apache/cxf/jaxrs/openapi/OpenApiFeature.java b/rt/rs/description-openapi-v3/src/main/java/org/apache/cxf/jaxrs/openapi/OpenApiFeature.java
index dae1bdb..e7900e2 100644
--- a/rt/rs/description-openapi-v3/src/main/java/org/apache/cxf/jaxrs/openapi/OpenApiFeature.java
+++ b/rt/rs/description-openapi-v3/src/main/java/org/apache/cxf/jaxrs/openapi/OpenApiFeature.java
@@ -18,10 +18,13 @@
*/
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;
@@ -29,7 +32,14 @@ import java.util.Set;
import java.util.UUID;
import java.util.stream.Collectors;
+import javax.ws.rs.container.ContainerRequestContext;
+import javax.ws.rs.container.ContainerRequestFilter;
+import javax.ws.rs.container.PreMatching;
import javax.ws.rs.core.Application;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.core.UriInfo;
+
import org.apache.cxf.Bus;
import org.apache.cxf.annotations.Provider;
@@ -43,11 +53,14 @@ 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;
@@ -61,6 +74,7 @@ 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<OpenApiFeature.Portable>
implements SwaggerUiSupport, SwaggerProperties {
@@ -469,6 +483,7 @@ public class OpenApiFeature extends DelegatingFeature<OpenApiFeature.Portable>
.getUserDefinedOptions());
registerOpenApiResources(sfb, packages, context.getOpenApiConfiguration());
registerSwaggerUiResources(sfb, combine(swaggerProps, userProperties), factory, bus);
+ registerSwaggerContainerRequestFilter(factory, application);
if (useContextBasedConfig) {
registerServletConfigProvider(factory);
@@ -484,6 +499,16 @@ public class OpenApiFeature extends DelegatingFeature<OpenApiFeature.Portable>
}
}
+ private void registerSwaggerContainerRequestFilter(ServerProviderFactory factory, Application application) {
+ if (isRunAsFilter()) {
+ List<Object> providers = new ArrayList<>();
+ providers.add(new SwaggerContainerRequestFilter(application));
+ factory.setUserProviders(providers);
+ }
+
+
+ }
+
public boolean isScan() {
return scan;
}
@@ -759,8 +784,9 @@ public class OpenApiFeature extends DelegatingFeature<OpenApiFeature.Portable>
if (!isRunAsFilter()) {
sfb.setResourceClassesFromBeans(swaggerUiRegistration.getResources());
}
-
+
factory.setUserProviders(swaggerUiRegistration.getProviders());
+
}
/**
@@ -868,4 +894,44 @@ public class OpenApiFeature extends DelegatingFeature<OpenApiFeature.Portable>
return (customizer == null) ? new OpenApiResource() : new OpenApiCustomizedResource(customizer);
}
}
+
+ @PreMatching
+ protected static class SwaggerContainerRequestFilter extends BaseOpenApiResource implements ContainerRequestFilter {
+
+ protected static final String APIDOCS_LISTING_PATH_JSON = "openapi.json";
+ protected static final String APIDOCS_LISTING_PATH_YAML = "openapi.yaml";
+
+
+ @Context
+ protected MessageContext mc;
+
+ private Application app;
+ public SwaggerContainerRequestFilter(Application app) {
+ this.app = app;
+ }
+
+ @Override
+ public void filter(ContainerRequestContext requestContext) throws IOException {
+ UriInfo ui = mc.getUriInfo();
+
+ Response response = null;
+ if (ui.getPath().endsWith(APIDOCS_LISTING_PATH_JSON)) {
+ try {
+ response = super.getOpenApi(mc.getHttpHeaders(), mc.getServletConfig(), app, ui, "json");
+ } catch (Exception ex) {
+ throw new IOException(ex);
+ }
+ } else if (ui.getPath().endsWith(APIDOCS_LISTING_PATH_YAML)) {
+ try {
+ response = super.getOpenApi(mc.getHttpHeaders(), mc.getServletConfig(), app, ui, "yaml");
+ } catch (Exception ex) {
+ throw new IOException(ex);
+ }
+ }
+
+ if (response != null) {
+ requestContext.abortWith(response);
+ }
+ }
+ }
}