You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cxf.apache.org by se...@apache.org on 2016/09/01 16:07:47 UTC

cxf git commit: Making SwaggerUI autolink work in a filter too, better support for a non-scan option

Repository: cxf
Updated Branches:
  refs/heads/master be34ef216 -> 7d085d777


Making SwaggerUI autolink work in a filter too, better support for a non-scan option


Project: http://git-wip-us.apache.org/repos/asf/cxf/repo
Commit: http://git-wip-us.apache.org/repos/asf/cxf/commit/7d085d77
Tree: http://git-wip-us.apache.org/repos/asf/cxf/tree/7d085d77
Diff: http://git-wip-us.apache.org/repos/asf/cxf/diff/7d085d77

Branch: refs/heads/master
Commit: 7d085d77723451183360cb50dfb8a83d90ffec49
Parents: be34ef2
Author: Sergey Beryozkin <sb...@gmail.com>
Authored: Thu Sep 1 17:07:33 2016 +0100
Committer: Sergey Beryozkin <sb...@gmail.com>
Committed: Thu Sep 1 17:07:33 2016 +0100

----------------------------------------------------------------------
 .../jaxrs/swagger/ApplicationBeanConfig.java    | 16 ++--
 .../cxf/jaxrs/swagger/Swagger2Feature.java      | 94 ++++++++++++--------
 2 files changed, 67 insertions(+), 43 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cxf/blob/7d085d77/rt/rs/description-swagger/src/main/java/org/apache/cxf/jaxrs/swagger/ApplicationBeanConfig.java
----------------------------------------------------------------------
diff --git a/rt/rs/description-swagger/src/main/java/org/apache/cxf/jaxrs/swagger/ApplicationBeanConfig.java b/rt/rs/description-swagger/src/main/java/org/apache/cxf/jaxrs/swagger/ApplicationBeanConfig.java
index 84504a6..b825d19 100644
--- a/rt/rs/description-swagger/src/main/java/org/apache/cxf/jaxrs/swagger/ApplicationBeanConfig.java
+++ b/rt/rs/description-swagger/src/main/java/org/apache/cxf/jaxrs/swagger/ApplicationBeanConfig.java
@@ -21,18 +21,22 @@ package org.apache.cxf.jaxrs.swagger;
 import java.util.HashSet;
 import java.util.Set;
 
+import javax.ws.rs.core.Application;
+
 import io.swagger.jaxrs.config.BeanConfig;
 
 public class ApplicationBeanConfig extends BeanConfig {
-    private Set<Class<?>> classes;
-    public ApplicationBeanConfig(Set<Class<?>> classes) {
-        this.classes = classes;
+    private Application app;
+    public ApplicationBeanConfig(Application app) {
+        this.app = app;
     }
     @Override
     public Set<Class<?>> classes() {
         Set<Class<?>> allClasses = new HashSet<Class<?>>();       
-        allClasses.addAll(super.classes());
-        allClasses.addAll(classes);
-        return classes;
+        allClasses.addAll(app.getClasses());
+        for (Object singleton : app.getSingletons()) {
+            allClasses.add(singleton.getClass());
+        }
+        return allClasses;
     }
 }

http://git-wip-us.apache.org/repos/asf/cxf/blob/7d085d77/rt/rs/description-swagger/src/main/java/org/apache/cxf/jaxrs/swagger/Swagger2Feature.java
----------------------------------------------------------------------
diff --git a/rt/rs/description-swagger/src/main/java/org/apache/cxf/jaxrs/swagger/Swagger2Feature.java b/rt/rs/description-swagger/src/main/java/org/apache/cxf/jaxrs/swagger/Swagger2Feature.java
index 83e65a8..0403c3b 100644
--- a/rt/rs/description-swagger/src/main/java/org/apache/cxf/jaxrs/swagger/Swagger2Feature.java
+++ b/rt/rs/description-swagger/src/main/java/org/apache/cxf/jaxrs/swagger/Swagger2Feature.java
@@ -33,6 +33,7 @@ import java.util.Objects;
 import java.util.Set;
 import java.util.regex.Pattern;
 
+import javax.annotation.Priority;
 import javax.servlet.ServletConfig;
 import javax.servlet.ServletContext;
 import javax.ws.rs.GET;
@@ -40,12 +41,12 @@ import javax.ws.rs.HttpMethod;
 import javax.ws.rs.NotFoundException;
 import javax.ws.rs.Path;
 import javax.ws.rs.PathParam;
+import javax.ws.rs.Priorities;
 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.MediaType;
 import javax.ws.rs.core.Response;
 import javax.ws.rs.core.Response.ResponseBuilder;
 import javax.ws.rs.core.UriInfo;
@@ -63,7 +64,6 @@ import org.apache.cxf.jaxrs.model.ApplicationInfo;
 import org.apache.cxf.jaxrs.model.ClassResourceInfo;
 import org.apache.cxf.jaxrs.provider.ServerProviderFactory;
 import org.apache.cxf.jaxrs.utils.InjectionUtils;
-import org.apache.cxf.jaxrs.utils.JAXRSUtils;
 import org.apache.cxf.message.Message;
 
 import io.swagger.jaxrs.config.BeanConfig;
@@ -126,12 +126,22 @@ public class Swagger2Feature extends AbstractSwaggerFeature {
         ApiListingResource apiListingResource = new ApiListingResource();
         swaggerResources.add(apiListingResource);
         
-        SwaggerUIService swaggerUiService = null;
+        List<Object> providers = new ArrayList<>();
+        if (runAsFilter) {
+            providers.add(new SwaggerContainerRequestFilter(appInfo == null ? null : appInfo.getProvider()));
+        }
+        
         if (supportSwaggerUi) {
             String swaggerUiRoot = SwaggerUiResolver.findSwaggerUiRoot(swaggerUiVersion);
             if (swaggerUiRoot != null) {
-                swaggerUiService = new SwaggerUIService(swaggerUiRoot, swaggerUiMediaTypes);
-                swaggerResources.add(swaggerUiService);
+                SwaggerUIService swaggerUiService = new SwaggerUIService(swaggerUiRoot, swaggerUiMediaTypes);
+                if (!runAsFilter) {
+                    swaggerResources.add(swaggerUiService);
+                } else {
+                    providers.add(new SwaggerUIServiceFilter(swaggerUiService));
+                }
+                providers.add(new SwaggerUIResourceFilter());
+                
                 bus.setProperty("swagger.service.ui.available", "true");
             }
         }
@@ -139,21 +149,14 @@ public class Swagger2Feature extends AbstractSwaggerFeature {
         sfb.setResourceClassesFromBeans(swaggerResources);
         
         List<ClassResourceInfo> cris = sfb.getClassResourceInfo();
-
-        List<Object> providers = new ArrayList<>();
-        if (runAsFilter) {
-            providers.add(new SwaggerContainerRequestFilter());
-        } else {
+        if (!runAsFilter) {
             for (ClassResourceInfo cri : cris) {
                 if (ApiListingResource.class == cri.getResourceClass()) {
                     InjectionUtils.injectContextProxies(cri, apiListingResource);
                 }
             }
         }
-        if (swaggerUiService != null) {
-            providers.add(new SwaggerUIFilter());
-        }
-
+        
         if (swagger2Serializers == null) {
             swagger2Serializers = new DefaultSwagger2Serializers();
         }
@@ -172,7 +175,7 @@ public class Swagger2Feature extends AbstractSwaggerFeature {
                 ServerProviderFactory.class.getName())).setUserProviders(providers);
         BeanConfig beanConfig = appInfo == null 
             ? new BeanConfig() 
-            : new ApplicationBeanConfig(appInfo.getProvider().getClasses());
+            : new ApplicationBeanConfig(appInfo.getProvider());
         beanConfig.setResourcePackage(getResourcePackage());
         beanConfig.setUsePathBasedConfig(isUsePathBasedConfig());
         beanConfig.setVersion(getVersion());
@@ -315,36 +318,30 @@ public class Swagger2Feature extends AbstractSwaggerFeature {
     @PreMatching
     protected static class SwaggerContainerRequestFilter extends ApiListingResource implements ContainerRequestFilter {
 
-        protected static final MediaType APPLICATION_YAML_TYPE = JAXRSUtils.toMediaType("application/yaml");
-
-        protected static final String APIDOCS_LISTING_PATH = "swagger";
-
-        protected static final String APIDOCS_LISTING_PATH_JSON = APIDOCS_LISTING_PATH + ".json";
-
-        protected static final String APIDOCS_LISTING_PATH_YAML = APIDOCS_LISTING_PATH + ".yaml";
+        protected static final String APIDOCS_LISTING_PATH_JSON = "swagger.json";
+        protected static final String APIDOCS_LISTING_PATH_YAML = "swagger.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();
 
-            List<MediaType> mediaTypes = mc.getHttpHeaders().getAcceptableMediaTypes();
-
             Response response = null;
-            if ((ui.getPath().endsWith(APIDOCS_LISTING_PATH)
-                    && !JAXRSUtils.intersectMimeTypes(mediaTypes, MediaType.APPLICATION_JSON_TYPE).isEmpty())
-                    || ui.getPath().endsWith(APIDOCS_LISTING_PATH_JSON)) {
+            if (ui.getPath().endsWith(APIDOCS_LISTING_PATH_JSON)) {
 
                 response = getListingJsonResponse(
-                        null, mc.getServletContext(), mc.getServletConfig(), mc.getHttpHeaders(), ui);
-            } else if ((ui.getPath().endsWith(APIDOCS_LISTING_PATH)
-                    && !JAXRSUtils.intersectMimeTypes(mediaTypes, APPLICATION_YAML_TYPE).isEmpty())
-                    || ui.getPath().endsWith(APIDOCS_LISTING_PATH_YAML)) {
+                        app, mc.getServletContext(), mc.getServletConfig(), mc.getHttpHeaders(), ui);
+            } else if (ui.getPath().endsWith(APIDOCS_LISTING_PATH_YAML)) {
 
                 response = getListingYamlResponse(
-                        null, mc.getServletContext(), mc.getServletConfig(), mc.getHttpHeaders(), ui);
+                        app, mc.getServletContext(), mc.getServletConfig(), mc.getHttpHeaders(), ui);
             }
 
             if (response != null) {
@@ -384,6 +381,7 @@ public class Swagger2Feature extends AbstractSwaggerFeature {
             mc.getServletContext().setAttribute(ReaderConfig.class.getName(), rc);
         }
     }
+    
     @Path("api-docs")
     public static class SwaggerUIService {
         private static final String FAVICON = "favicon";
@@ -415,12 +413,12 @@ public class Swagger2Feature extends AbstractSwaggerFeature {
         @GET
         @Path("{resource:.*}")
         public Response getResource(@Context UriInfo uriInfo, @PathParam("resource") String resourcePath) {
-            if (resourcePath.contains(FAVICON)) {        
-                return Response.status(404).build();
-            }
             if (StringUtils.isEmpty(resourcePath) || "/".equals(resourcePath)) {        
                 resourcePath = "index.html";
             }
+            if (resourcePath.contains(FAVICON)) {        
+                return Response.status(404).build();
+            }
             if (resourcePath.startsWith("/")) {
                 resourcePath = resourcePath.substring(1);
             }
@@ -451,7 +449,8 @@ public class Swagger2Feature extends AbstractSwaggerFeature {
         
     }
     @PreMatching
-    protected static class SwaggerUIFilter implements ContainerRequestFilter {
+    @Priority(Priorities.USER)
+    protected static class SwaggerUIResourceFilter implements ContainerRequestFilter {
         private static final Pattern PATTERN = 
             Pattern.compile(".*[.]js|/css/.*|/images/.*|/lib/.*|.*ico|/fonts/.*"); 
         
@@ -466,7 +465,28 @@ public class Swagger2Feature extends AbstractSwaggerFeature {
             }
         }
     }
-    
+    @PreMatching
+    @Priority(Priorities.USER + 1)
+    protected static class SwaggerUIServiceFilter implements ContainerRequestFilter {
+        private SwaggerUIService uiService;
+        SwaggerUIServiceFilter(SwaggerUIService uiService) {
+            this.uiService = uiService;
+        }
+        @Override
+        public void filter(ContainerRequestContext rc) throws IOException {
+            if (HttpMethod.GET.equals(rc.getRequest().getMethod())) {
+                UriInfo ui = rc.getUriInfo();
+                String path = ui.getPath();
+                int uiPathIndex = path.lastIndexOf("api-docs");
+                if (uiPathIndex >= 0) {
+                    String resourcePath = uiPathIndex + 8 < path.length() 
+                        ? path.substring(uiPathIndex + 8) : "";
+                    rc.abortWith(uiService.getResource(ui, resourcePath));    
+                }
+            }
+            
+        }
+    }
     protected static class DefaultApplication extends Application {
         Set<Class<?>> serviceClasses;
         DefaultApplication(Set<Class<?>> serviceClasses) {