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 21:19:58 UTC

[cxf] branch 3.2.x-fixes 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 3.2.x-fixes
in repository https://gitbox.apache.org/repos/asf/cxf.git


The following commit(s) were added to refs/heads/3.2.x-fixes by this push:
     new b1d2da0  [CXF-8064]OpenApiFeature(OpenAPI V3) should be able to work with camel-cxfrs endpoint
b1d2da0 is described below

commit b1d2da079099a41f562eaa76c5b36be9284d2cfb
Author: Freeman Fang <fr...@gmail.com>
AuthorDate: Tue Jul 2 17:19:43 2019 -0400

    [CXF-8064]OpenApiFeature(OpenAPI V3) should be able to work with camel-cxfrs endpoint
---
 .../apache/cxf/jaxrs/openapi/OpenApiFeature.java   | 62 ++++++++++++++++++++++
 1 file changed, 62 insertions(+)

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 49caef1..cb8483d 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,17 +18,26 @@
  */
 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.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;
@@ -41,11 +50,13 @@ import org.apache.cxf.feature.AbstractFeature;
 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;
@@ -161,6 +172,7 @@ public class OpenApiFeature extends AbstractFeature implements SwaggerUiSupport,
                     .getUserDefinedOptions());
             registerOpenApiResources(sfb, packages, context.getOpenApiConfiguration());
             registerSwaggerUiResources(sfb, combine(swaggerProps, userProperties), factory, bus);
+            registerSwaggerContainerRequestFilter(factory, application);
             
             if (customizer != null) {
                 customizer.setApplicationInfo(factory.getApplicationProvider());
@@ -171,6 +183,16 @@ public class OpenApiFeature extends AbstractFeature implements SwaggerUiSupport,
             throw new RuntimeException("Unable to initialize OpenAPI context", ex);
         }
     }
+    
+    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;
@@ -543,4 +565,44 @@ public class OpenApiFeature extends AbstractFeature implements SwaggerUiSupport,
     private OpenApiResource createOpenApiResource() {
         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);
+            }
+        }
+    }
 }