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);
+            }
+        }
+    }
 }