Several Swagger-related improvements: swagger-jaxrs upgraded to 1.5.8, now working properly even as filter, prepared Swagger2Feature for extension
Project: http://git-wip-us.apache.org/repos/asf/cxf/repo Commit: http://git-wip-us.apache.org/repos/asf/cxf/commit/e515c136 Tree: http://git-wip-us.apache.org/repos/asf/cxf/tree/e515c136 Diff: http://git-wip-us.apache.org/repos/asf/cxf/diff/e515c136 Branch: refs/heads/3.0.x-fixes Commit: e515c136504d2854a6db42c5351adf7aa00cddb3 Parents: 0afa9d2 Author: Francesco Chicchiriccò <ilgro...@apache.org> Authored: Wed Mar 16 16:40:02 2016 +0100 Committer: Francesco Chicchiriccò <ilgro...@apache.org> Committed: Wed Mar 16 16:40:02 2016 +0100 ---------------------------------------------------------------------- parent/pom.xml | 2 +- .../cxf/jaxrs/swagger/Swagger2Feature.java | 82 ++++++++++++-------- .../cxf/jaxrs/swagger/Swagger2Serializers.java | 14 ++-- 3 files changed, 57 insertions(+), 41 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cxf/blob/e515c136/parent/pom.xml ---------------------------------------------------------------------- diff --git a/parent/pom.xml b/parent/pom.xml index 1a49ffa..18abcc7 100644 --- a/parent/pom.xml +++ b/parent/pom.xml @@ -159,7 +159,7 @@ <cxf.spring.ldap.version>1.3.1.RELEASE</cxf.spring.ldap.version> <cxf.spring.mock>spring-test</cxf.spring.mock> <cxf.swagger.version>1.3.13</cxf.swagger.version> - <cxf.swagger2.version>1.5.4</cxf.swagger2.version> + <cxf.swagger2.version>1.5.8</cxf.swagger2.version> <cxf.velocity.version>1.7</cxf.velocity.version> <cxf.woodstox.core.version>4.4.1</cxf.woodstox.core.version> <cxf.woodstox.stax2-api.version>3.1.4</cxf.woodstox.stax2-api.version> http://git-wip-us.apache.org/repos/asf/cxf/blob/e515c136/rt/rs/description/src/main/java/org/apache/cxf/jaxrs/swagger/Swagger2Feature.java ---------------------------------------------------------------------- diff --git a/rt/rs/description/src/main/java/org/apache/cxf/jaxrs/swagger/Swagger2Feature.java b/rt/rs/description/src/main/java/org/apache/cxf/jaxrs/swagger/Swagger2Feature.java index 701701b..df5ea1e 100644 --- a/rt/rs/description/src/main/java/org/apache/cxf/jaxrs/swagger/Swagger2Feature.java +++ b/rt/rs/description/src/main/java/org/apache/cxf/jaxrs/swagger/Swagger2Feature.java @@ -32,6 +32,7 @@ import javax.ws.rs.container.ContainerRequestContext; import javax.ws.rs.container.ContainerRequestFilter; import javax.ws.rs.container.PreMatching; import javax.ws.rs.core.Context; +import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import javax.ws.rs.core.UriInfo; @@ -44,6 +45,7 @@ import org.apache.cxf.jaxrs.model.doc.DocumentationProvider; import org.apache.cxf.jaxrs.model.doc.JavaDocProvider; import org.apache.cxf.jaxrs.provider.ServerProviderFactory; import org.apache.cxf.jaxrs.utils.InjectionUtils; +import org.apache.cxf.jaxrs.utils.JAXRSUtils; import io.swagger.jaxrs.config.BeanConfig; import io.swagger.jaxrs.config.DefaultReaderConfig; @@ -52,6 +54,12 @@ import io.swagger.jaxrs.listing.ApiListingResource; public class Swagger2Feature extends AbstractSwaggerFeature { + protected boolean dynamicBasePath; + + protected boolean replaceTags; + + protected DocumentationProvider javadocProvider; + private String host; private String[] schemes; @@ -62,33 +70,24 @@ public class Swagger2Feature extends AbstractSwaggerFeature { private String ignoreRoutes; - private boolean dynamicBasePath; - - private boolean replaceTags; - - private DocumentationProvider javadocProvider; - @Override protected void addSwaggerResource(Server server) { - List<ClassResourceInfo> cris = Collections.emptyList(); - if (!runAsFilter) { - List<Object> serviceBeans = new ArrayList<Object>(); - ApiListingResource apiListingResource = new ApiListingResource(); - serviceBeans.add(apiListingResource); - JAXRSServiceFactoryBean sfb = - (JAXRSServiceFactoryBean) server.getEndpoint().get(JAXRSServiceFactoryBean.class.getName()); - sfb.setResourceClassesFromBeans(serviceBeans); - cris = sfb.getClassResourceInfo(); + ApiListingResource apiListingResource = new ApiListingResource(); + JAXRSServiceFactoryBean sfb = + (JAXRSServiceFactoryBean) server.getEndpoint().get(JAXRSServiceFactoryBean.class.getName()); + sfb.setResourceClassesFromBeans(Collections.<Object>singletonList(apiListingResource)); + List<ClassResourceInfo> cris = sfb.getClassResourceInfo(); + + List<Object> providers = new ArrayList<Object>(); + if (runAsFilter) { + providers.add(new SwaggerContainerRequestFilter()); + } else { for (ClassResourceInfo cri : cris) { if (ApiListingResource.class == cri.getResourceClass()) { - InjectionUtils.injectContextProxiesAndApplication(cri, apiListingResource, null); + InjectionUtils.injectContextProxies(cri, apiListingResource); } } } - List<Object> providers = new ArrayList<Object>(); - if (runAsFilter) { - providers.add(new SwaggerContainerRequestFilter()); - } providers.add(new Swagger2Serializers(dynamicBasePath, replaceTags, javadocProvider, cris)); providers.add(new ReaderConfigFilter()); ((ServerProviderFactory) server.getEndpoint().get( @@ -184,32 +183,49 @@ public class Swagger2Feature extends AbstractSwaggerFeature { } @PreMatching - private static class SwaggerContainerRequestFilter extends ApiListingResource implements ContainerRequestFilter { + 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"; - private static final String APIDOCS_LISTING_PATH_JSON = "swagger.json"; + protected static final String APIDOCS_LISTING_PATH_JSON = APIDOCS_LISTING_PATH + ".json"; - private static final String APIDOCS_LISTING_PATH_YAML = "swagger.yaml"; + protected static final String APIDOCS_LISTING_PATH_YAML = APIDOCS_LISTING_PATH + ".yaml"; @Context - private MessageContext mc; + protected MessageContext mc; @Override public void filter(ContainerRequestContext requestContext) throws IOException { UriInfo ui = mc.getUriInfo(); - if (ui.getPath().endsWith(APIDOCS_LISTING_PATH_JSON)) { - Response r = getListingJson(null, mc.getServletConfig(), mc.getHttpHeaders(), ui); - requestContext.abortWith(r); - } else if (ui.getPath().endsWith(APIDOCS_LISTING_PATH_YAML)) { - Response r = getListingYaml(null, mc.getServletConfig(), mc.getHttpHeaders(), ui); - requestContext.abortWith(r); + 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)) { + + 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)) { + + response = getListingYamlResponse( + null, mc.getServletContext(), mc.getServletConfig(), mc.getHttpHeaders(), ui); + } + + if (response != null) { + requestContext.abortWith(response); } } } - private class ReaderConfigFilter implements ContainerRequestFilter { + protected class ReaderConfigFilter implements ContainerRequestFilter { @Context - private MessageContext mc; + protected MessageContext mc; @Override public void filter(ContainerRequestContext requestContext) throws IOException { @@ -224,7 +240,7 @@ public class Swagger2Feature extends AbstractSwaggerFeature { } } - private void addReaderConfig(String ignoreRoutesParam) { + protected void addReaderConfig(String ignoreRoutesParam) { DefaultReaderConfig rc = new DefaultReaderConfig(); rc.setScanAllResources(true); if (ignoreRoutesParam != null) { http://git-wip-us.apache.org/repos/asf/cxf/blob/e515c136/rt/rs/description/src/main/java/org/apache/cxf/jaxrs/swagger/Swagger2Serializers.java ---------------------------------------------------------------------- diff --git a/rt/rs/description/src/main/java/org/apache/cxf/jaxrs/swagger/Swagger2Serializers.java b/rt/rs/description/src/main/java/org/apache/cxf/jaxrs/swagger/Swagger2Serializers.java index 0a39b8d..c6dcdae 100644 --- a/rt/rs/description/src/main/java/org/apache/cxf/jaxrs/swagger/Swagger2Serializers.java +++ b/rt/rs/description/src/main/java/org/apache/cxf/jaxrs/swagger/Swagger2Serializers.java @@ -48,13 +48,13 @@ import io.swagger.models.Tag; public class Swagger2Serializers extends SwaggerSerializers { - private final boolean dynamicBasePath; + protected final boolean dynamicBasePath; - private final boolean replaceTags; + protected final boolean replaceTags; - private final DocumentationProvider javadocProvider; + protected final DocumentationProvider javadocProvider; - private final List<ClassResourceInfo> cris; + protected final List<ClassResourceInfo> cris; public Swagger2Serializers( final boolean dynamicBasePath, @@ -88,8 +88,8 @@ public class Swagger2Serializers extends SwaggerSerializers { if (replaceTags || javadocProvider != null) { Map<String, ClassResourceInfo> operations = new HashMap<String, ClassResourceInfo>(); - Map<Pair<String, String>, OperationResourceInfo> methods = - new HashMap<Pair<String, String>, OperationResourceInfo>(); + Map<Pair<String, String>, OperationResourceInfo> methods = + new HashMap<Pair<String, String>, OperationResourceInfo>(); for (ClassResourceInfo cri : cris) { for (OperationResourceInfo ori : cri.getMethodDispatcher().getOperationResourceInfos()) { String normalizedPath = getNormalizedPath( @@ -146,7 +146,7 @@ public class Swagger2Serializers extends SwaggerSerializers { super.writeTo(data, type, genericType, annotations, mediaType, headers, out); } - private String getNormalizedPath(String classResourcePath, String operationResourcePath) { + protected String getNormalizedPath(String classResourcePath, String operationResourcePath) { StringBuilder normalizedPath = new StringBuilder(); String[] segments = StringUtils.split(classResourcePath + operationResourcePath, "/");