This is an automated email from the ASF dual-hosted git repository. ilgrosso pushed a commit to branch 3.1.x-fixes in repository https://gitbox.apache.org/repos/asf/cxf.git
The following commit(s) were added to refs/heads/3.1.x-fixes by this push: new def576f [CXF-7525] Support dynamic basePath (when used via Swagger2Customizer) and fix recursive ref under components/schemas def576f is described below commit def576ff5f1fccc0115a929377af0a017ca25104 Author: Francesco Chicchiriccò <ilgro...@apache.org> AuthorDate: Tue Jan 2 16:14:06 2018 +0100 [CXF-7525] Support dynamic basePath (when used via Swagger2Customizer) and fix recursive ref under components/schemas --- .../openapi/SwaggerToOpenApiConversionFilter.java | 15 +++++-- .../openapi/SwaggerToOpenApiConversionUtils.java | 50 ++++++++++++---------- 2 files changed, 39 insertions(+), 26 deletions(-) diff --git a/rt/rs/description-swagger/src/main/java/org/apache/cxf/jaxrs/swagger/openapi/SwaggerToOpenApiConversionFilter.java b/rt/rs/description-swagger/src/main/java/org/apache/cxf/jaxrs/swagger/openapi/SwaggerToOpenApiConversionFilter.java index 88332ca..3da18a4 100644 --- a/rt/rs/description-swagger/src/main/java/org/apache/cxf/jaxrs/swagger/openapi/SwaggerToOpenApiConversionFilter.java +++ b/rt/rs/description-swagger/src/main/java/org/apache/cxf/jaxrs/swagger/openapi/SwaggerToOpenApiConversionFilter.java @@ -33,6 +33,7 @@ import javax.ws.rs.ext.WriterInterceptorContext; import org.apache.cxf.common.util.StringUtils; import org.apache.cxf.helpers.IOUtils; import org.apache.cxf.io.CachedOutputStream; +import org.apache.cxf.jaxrs.ext.MessageContext; import org.apache.cxf.jaxrs.utils.JAXRSUtils; @Provider @@ -42,7 +43,7 @@ public final class SwaggerToOpenApiConversionFilter implements ContainerRequestF private static final String SWAGGER_PATH = "swagger.json"; private static final String OPEN_API_PATH = "openapi.json"; private static final String OPEN_API_PROPERTY = "openapi"; - + private OpenApiConfiguration openApiConfig; @Override public void filter(ContainerRequestContext reqCtx) throws IOException { @@ -51,9 +52,9 @@ public final class SwaggerToOpenApiConversionFilter implements ContainerRequestF reqCtx.setRequestUri(URI.create(SWAGGER_PATH)); JAXRSUtils.getCurrentMessage().getExchange().put(OPEN_API_PROPERTY, Boolean.TRUE); } - + } - + public OpenApiConfiguration getOpenApiConfig() { return openApiConfig; } @@ -70,7 +71,8 @@ public final class SwaggerToOpenApiConversionFilter implements ContainerRequestF context.setOutputStream(cos); context.proceed(); String swaggerJson = IOUtils.readStringFromStream(cos.getInputStream()); - String openApiJson = SwaggerToOpenApiConversionUtils.getOpenApiFromSwaggerJson(swaggerJson, openApiConfig); + String openApiJson = SwaggerToOpenApiConversionUtils.getOpenApiFromSwaggerJson( + createMessageContext(), swaggerJson, openApiConfig); os.write(StringUtils.toBytesUTF8(openApiJson)); os.flush(); } else { @@ -78,6 +80,11 @@ public final class SwaggerToOpenApiConversionFilter implements ContainerRequestF } } + private MessageContext createMessageContext() { + return JAXRSUtils.createContextValue( + JAXRSUtils.getCurrentMessage(), null, MessageContext.class); + } + private boolean isOpenApiRequested() { return Boolean.TRUE == JAXRSUtils.getCurrentMessage().getExchange().get(OPEN_API_PROPERTY); } diff --git a/rt/rs/description-swagger/src/main/java/org/apache/cxf/jaxrs/swagger/openapi/SwaggerToOpenApiConversionUtils.java b/rt/rs/description-swagger/src/main/java/org/apache/cxf/jaxrs/swagger/openapi/SwaggerToOpenApiConversionUtils.java index fbfdb43..63e3274 100644 --- a/rt/rs/description-swagger/src/main/java/org/apache/cxf/jaxrs/swagger/openapi/SwaggerToOpenApiConversionUtils.java +++ b/rt/rs/description-swagger/src/main/java/org/apache/cxf/jaxrs/swagger/openapi/SwaggerToOpenApiConversionUtils.java @@ -20,6 +20,7 @@ package org.apache.cxf.jaxrs.swagger.openapi; import java.io.IOException; import java.io.InputStream; +import java.net.URI; import java.util.Arrays; import java.util.Collections; import java.util.Iterator; @@ -35,6 +36,7 @@ import org.apache.cxf.common.logging.LogUtils; import org.apache.cxf.common.util.StringUtils; import org.apache.cxf.helpers.CastUtils; import org.apache.cxf.helpers.IOUtils; +import org.apache.cxf.jaxrs.ext.MessageContext; import org.apache.cxf.jaxrs.json.basic.JsonMapObject; import org.apache.cxf.jaxrs.json.basic.JsonMapObjectReaderWriter; import org.apache.cxf.jaxrs.utils.ExceptionUtils; @@ -77,14 +79,16 @@ public final class SwaggerToOpenApiConversionUtils { } public static String getOpenApiFromSwaggerStream(InputStream is, OpenApiConfiguration cfg) throws IOException { - return getOpenApiFromSwaggerJson(IOUtils.readStringFromStream(is), cfg); + return getOpenApiFromSwaggerJson(null, IOUtils.readStringFromStream(is), cfg); } public static String getOpenApiFromSwaggerJson(String json) throws IOException { - return getOpenApiFromSwaggerJson(json, null); + return getOpenApiFromSwaggerJson(null, json, null); } - public static String getOpenApiFromSwaggerJson(String json, OpenApiConfiguration cfg) throws IOException { + public static String getOpenApiFromSwaggerJson( + MessageContext ctx, String json, OpenApiConfiguration cfg) throws IOException { + JsonMapObjectReaderWriter readerWriter = new JsonMapObjectReaderWriter(); JsonMapObject sw2 = readerWriter.fromJsonToJsonObject(json); JsonMapObject sw3 = new JsonMapObject(); @@ -93,7 +97,7 @@ public final class SwaggerToOpenApiConversionUtils { sw3.setProperty("openapi", "3.0.0"); // "servers" - setServersProperty(sw2, sw3); + setServersProperty(ctx, sw2, sw3); // "info" JsonMapObject infoObject = sw2.getJsonMapProperty("info"); @@ -121,7 +125,7 @@ public final class SwaggerToOpenApiConversionUtils { sw3.setProperty("externalDocs", externalDocsObject); } - return readerWriter.toJson(sw3); + return readerWriter.toJson(sw3).replace("#/definitions/", "#/components/schemas/"); } private static void setComponentsProperty(JsonMapObject sw2, JsonMapObject sw3, @@ -145,7 +149,6 @@ public final class SwaggerToOpenApiConversionUtils { } sw3.setProperty("components", comps); - } private static void setPathsProperty(JsonMapObject sw2, JsonMapObject sw3, @@ -165,8 +168,6 @@ public final class SwaggerToOpenApiConversionUtils { } sw3.setProperty("paths", sw2Paths); - - } private static void prepareResponses(JsonMapObject sw2PathVerbProps) { @@ -206,7 +207,6 @@ public final class SwaggerToOpenApiConversionUtils { } sw2PathVerbProps.setProperty("responses", sw3PathVerbResps); } - } private static void prepareRequestBody(JsonMapObject sw2PathVerbProps, @@ -301,7 +301,6 @@ public final class SwaggerToOpenApiConversionUtils { } } } - } private static JsonMapObject prepareFormContent(List<JsonMapObject> formList, List<String> mediaTypes) { @@ -327,6 +326,7 @@ public final class SwaggerToOpenApiConversionUtils { content.setProperty(mediaType, formType); return content; } + private static JsonMapObject prepareContentFromSchema(JsonMapObject schema, List<String> mediaTypes, boolean storeModelName) { @@ -351,8 +351,6 @@ public final class SwaggerToOpenApiConversionUtils { } else { items.setProperty("$ref", "#components/schemas/" + modelName); } - - } } JsonMapObject content = new JsonMapObject(); @@ -372,22 +370,30 @@ public final class SwaggerToOpenApiConversionUtils { return content; } - private static void setServersProperty(JsonMapObject sw2, JsonMapObject sw3) { - String sw2Host = sw2.getStringProperty("host"); - String sw2BasePath = sw2.getStringProperty("basePath"); - String sw2Scheme = null; + private static void setServersProperty(MessageContext ctx, JsonMapObject sw2, JsonMapObject sw3) { + URI requestURI = ctx == null ? null : URI.create(ctx.getHttpServletRequest().getRequestURL().toString()); + List<String> sw2Schemes = sw2.getListStringProperty("schemes"); + String sw2Scheme; if (StringUtils.isEmpty(sw2Schemes)) { - sw2Scheme = "https"; + if (requestURI == null) { + sw2Scheme = "https"; + } else { + sw2Scheme = requestURI.getScheme(); + } } else { sw2Scheme = sw2Schemes.get(0); } + + String sw2Host = sw2.getStringProperty("host"); + if (sw2Host == null && requestURI != null) { + sw2Host = requestURI.getHost() + ":" + requestURI.getPort(); + } + + String sw2BasePath = sw2.getStringProperty("basePath"); + String sw3ServerUrl = sw2Scheme + "://" + sw2Host + sw2BasePath; - sw3.setProperty("servers", - Collections.singletonList( - Collections.singletonMap("url", sw3ServerUrl))); - + sw3.setProperty("servers", Collections.singletonList(Collections.singletonMap("url", sw3ServerUrl))); } - } -- To stop receiving notification emails like this one, please contact ['"commits@cxf.apache.org" <commits@cxf.apache.org>'].