commit 9a95e9c274fa60911052d7480695c3af5c6879c0 Author: Freeman Fang Date: Wed Dec 27 09:03:57 2017 +0800 [ENTESB]ensure multiple swagger enabled jaxrs endpoints in same bundle can get rendered separately in swagger-ui diff --git a/parent/pom.xml b/parent/pom.xml index 5eeb4b7..1d70ee5 100644 --- a/parent/pom.xml +++ b/parent/pom.xml @@ -155,7 +155,7 @@ 1.3.1.RELEASE spring-test 1.3.13 - 1.5.8 + 1.5.12 1.7.0.redhat-4 1.7_6 4.4.1 diff --git a/rt/rs/description/pom.xml b/rt/rs/description/pom.xml index 1958d6c..4d10cd0 100644 --- a/rt/rs/description/pom.xml +++ b/rt/rs/description/pom.xml @@ -97,6 +97,7 @@ io.swagger swagger-jaxrs true + diff --git a/rt/rs/description/src/main/java/org/apache/cxf/jaxrs/swagger/DelegatingServletConfig.java b/rt/rs/description/src/main/java/org/apache/cxf/jaxrs/swagger/DelegatingServletConfig.java new file mode 100644 index 0000000..a64f3a5 --- /dev/null +++ b/rt/rs/description/src/main/java/org/apache/cxf/jaxrs/swagger/DelegatingServletConfig.java @@ -0,0 +1,59 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.cxf.jaxrs.swagger; + +import java.util.Enumeration; +import java.util.Objects; + +import javax.servlet.ServletConfig; +import javax.servlet.ServletContext; + +import io.swagger.jaxrs.config.SwaggerContextService; + +class DelegatingServletConfig implements ServletConfig { + private final ServletConfig delegate; + + DelegatingServletConfig(final ServletConfig sc) { + this.delegate = sc; + } + + @Override + public String getServletName() { + return delegate.getServletName(); + } + + @Override + public ServletContext getServletContext() { + return delegate.getServletContext(); + } + + @Override + public Enumeration getInitParameterNames() { + return delegate.getInitParameterNames(); + } + + @Override + public String getInitParameter(String name) { + if (Objects.equals(SwaggerContextService.USE_PATH_BASED_CONFIG, name)) { + return "true"; + } else { + return delegate.getInitParameter(name); + } + } +} diff --git a/rt/rs/description/src/main/java/org/apache/cxf/jaxrs/swagger/JaxRs2Extension.java b/rt/rs/description/src/main/java/org/apache/cxf/jaxrs/swagger/JaxRs2Extension.java index 87e0cf2..d738d07 100644 --- a/rt/rs/description/src/main/java/org/apache/cxf/jaxrs/swagger/JaxRs2Extension.java +++ b/rt/rs/description/src/main/java/org/apache/cxf/jaxrs/swagger/JaxRs2Extension.java @@ -20,6 +20,7 @@ package org.apache.cxf.jaxrs.swagger; import java.lang.annotation.Annotation; import java.lang.reflect.Type; +import java.math.BigDecimal; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; @@ -184,17 +185,17 @@ public class JaxRs2Extension extends AbstractSwaggerExtension { if (annos.containsKey(Min.class.getName())) { Min min = (Min) annos.get(Min.class.getName()); - serializable.setMinimum(new Double(min.value())); + serializable.setMinimum(BigDecimal.valueOf(new Double(min.value()))); } if (annos.containsKey(Max.class.getName())) { Max max = (Max) annos.get(Max.class.getName()); - serializable.setMaximum(new Double(max.value())); + serializable.setMaximum(BigDecimal.valueOf(new Double(max.value()))); } if (annos.containsKey(Size.class.getName())) { Size size = (Size) annos.get(Size.class.getName()); - serializable.setMinimum(new Double(size.min())); - serializable.setMaximum(new Double(size.max())); + serializable.setMinimum(BigDecimal.valueOf(new Double(size.min()))); + serializable.setMaximum(BigDecimal.valueOf(new Double(size.max()))); serializable.setMinItems(size.min()); serializable.setMaxItems(size.max()); @@ -202,7 +203,7 @@ public class JaxRs2Extension extends AbstractSwaggerExtension { if (annos.containsKey(DecimalMin.class.getName())) { DecimalMin min = (DecimalMin) annos.get(DecimalMin.class.getName()); if (min.inclusive()) { - serializable.setMinimum(new Double(min.value())); + serializable.setMinimum(BigDecimal.valueOf(new Double(min.value()))); } else { serializable.setExclusiveMinimum(!min.inclusive()); } @@ -210,7 +211,7 @@ public class JaxRs2Extension extends AbstractSwaggerExtension { if (annos.containsKey(DecimalMax.class.getName())) { DecimalMax max = (DecimalMax) annos.get(DecimalMax.class.getName()); if (max.inclusive()) { - serializable.setMaximum(new Double(max.value())); + serializable.setMaximum(BigDecimal.valueOf(new Double(max.value()))); } else { serializable.setExclusiveMaximum(!max.inclusive()); } 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 bc9102f..1a02e49 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 @@ -27,6 +27,7 @@ import java.util.LinkedHashSet; import java.util.List; import java.util.Set; +import javax.servlet.ServletConfig; import javax.servlet.ServletContext; import javax.ws.rs.container.ContainerRequestContext; import javax.ws.rs.container.ContainerRequestFilter; @@ -41,6 +42,7 @@ import org.apache.cxf.annotations.Provider.Type; import org.apache.cxf.common.util.StringUtils; import org.apache.cxf.endpoint.Server; import org.apache.cxf.jaxrs.JAXRSServiceFactoryBean; +import org.apache.cxf.jaxrs.ext.ContextProvider; import org.apache.cxf.jaxrs.ext.MessageContext; import org.apache.cxf.jaxrs.model.ClassResourceInfo; import org.apache.cxf.jaxrs.model.doc.DocumentationProvider; @@ -48,10 +50,12 @@ 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 org.apache.cxf.message.Message; import io.swagger.jaxrs.config.BeanConfig; import io.swagger.jaxrs.config.DefaultReaderConfig; import io.swagger.jaxrs.config.ReaderConfig; +import io.swagger.jaxrs.config.SwaggerContextService; import io.swagger.jaxrs.listing.ApiListingResource; @Provider(Type.Feature) @@ -62,6 +66,8 @@ public class Swagger2Feature extends AbstractSwaggerFeature { protected boolean replaceTags; protected DocumentationProvider javadocProvider; + + private boolean usePathBasedConfig; private String host; @@ -93,6 +99,12 @@ public class Swagger2Feature extends AbstractSwaggerFeature { } providers.add(new Swagger2Serializers(dynamicBasePath, replaceTags, javadocProvider, cris)); providers.add(new ReaderConfigFilter()); + + if (usePathBasedConfig) { + providers.add(new ServletConfigProvider()); + } + + ((ServerProviderFactory) server.getEndpoint().get( ServerProviderFactory.class.getName())).setUserProviders(providers); @@ -100,6 +112,7 @@ public class Swagger2Feature extends AbstractSwaggerFeature { beanConfig.setResourcePackage(getResourcePackage()); beanConfig.setVersion(getVersion()); beanConfig.setBasePath(getBasePath()); + beanConfig.setUsePathBasedConfig(isUsePathBasedConfig()); beanConfig.setHost(getHost()); beanConfig.setSchemes(getSchemes()); beanConfig.setTitle(getTitle()); @@ -112,6 +125,15 @@ public class Swagger2Feature extends AbstractSwaggerFeature { beanConfig.setPrettyPrint(isPrettyPrint()); beanConfig.setFilterClass(getFilterClass()); } + + public boolean isUsePathBasedConfig() { + return usePathBasedConfig; + } + + public void setUsePathBasedConfig(boolean usePathBasedConfig) { + this.usePathBasedConfig = usePathBasedConfig; + } + public String getHost() { return host; @@ -184,6 +206,30 @@ public class Swagger2Feature extends AbstractSwaggerFeature { setBasePath(address); } } + + private class ServletConfigProvider implements ContextProvider { + + @Override + public ServletConfig createContext(Message message) { + final ServletConfig sc = (ServletConfig)message.get("HTTP.CONFIG"); + + // When deploying into OSGi container, it is possible to use embedded Jetty + // transport. In this case, the ServletConfig is not available and Swagger + // does not take into account certain configuration parameters. To overcome + // that, the ServletConfig is synthesized from ServletContext instance. + if (sc == null) { + final ServletContext context = (ServletContext)message.get("HTTP.CONTEXT"); + if (context != null) { + return new SyntheticServletConfig(context); + } + } else if (sc != null && sc.getInitParameter(SwaggerContextService.USE_PATH_BASED_CONFIG) == null) { + return new DelegatingServletConfig(sc); + } + + return sc; + } + } + @PreMatching protected static class SwaggerContainerRequestFilter extends ApiListingResource implements ContainerRequestFilter { diff --git a/rt/rs/description/src/main/java/org/apache/cxf/jaxrs/swagger/SyntheticServletConfig.java b/rt/rs/description/src/main/java/org/apache/cxf/jaxrs/swagger/SyntheticServletConfig.java new file mode 100644 index 0000000..2e17a6f --- /dev/null +++ b/rt/rs/description/src/main/java/org/apache/cxf/jaxrs/swagger/SyntheticServletConfig.java @@ -0,0 +1,59 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.cxf.jaxrs.swagger; + +import java.util.Enumeration; +import java.util.Objects; + +import javax.servlet.ServletConfig; +import javax.servlet.ServletContext; + +import io.swagger.jaxrs.config.SwaggerContextService; + +class SyntheticServletConfig implements ServletConfig { + private final ServletContext delegate; + + SyntheticServletConfig(final ServletContext context) { + this.delegate = context; + } + + @Override + public String getServletName() { + return null; /* no servlet available */ + } + + @Override + public ServletContext getServletContext() { + return delegate; + } + + @Override + public Enumeration getInitParameterNames() { + return delegate.getInitParameterNames(); + } + + @Override + public String getInitParameter(String name) { + if (Objects.equals(SwaggerContextService.USE_PATH_BASED_CONFIG, name)) { + return "true"; + } else { + return delegate.getInitParameter(name); + } + } +}