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 2017/12/12 16:47:47 UTC
[cxf] branch 3.1.x-fixes updated (34bf6b2 -> e329110)
This is an automated email from the ASF dual-hosted git repository.
sergeyb pushed a change to branch 3.1.x-fixes
in repository https://gitbox.apache.org/repos/asf/cxf.git.
from 34bf6b2 Upgrading Jackson
new 8f95084 [CXF-7525] Adapting swagger to open api conversion code for 3.1.x
new e329110 [CXF-7525] Adding the resources for 3.1.x
The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails. The revisions
listed as "add" were already present in the repository and have only
been added to this reference.
Summary of changes:
.../swagger/openapi/OpenApiConfiguration.java | 15 +-
.../openapi/SwaggerToOpenApiConversionFilter.java | 79 +++
.../openapi/SwaggerToOpenApiConversionUtils.java | 393 +++++++++++
.../SwaggerToOpenApiConversionUtilsTest.java | 775 +++++++++++++++++++++
.../apache/cxf/jaxrs/json/basic/JsonMapObject.java | 26 +
5 files changed, 1281 insertions(+), 7 deletions(-)
copy core/src/main/java/org/apache/cxf/interceptor/security/AuthenticationException.java => rt/rs/description-swagger/src/main/java/org/apache/cxf/jaxrs/swagger/openapi/OpenApiConfiguration.java (71%)
create mode 100644 rt/rs/description-swagger/src/main/java/org/apache/cxf/jaxrs/swagger/openapi/SwaggerToOpenApiConversionFilter.java
create mode 100644 rt/rs/description-swagger/src/main/java/org/apache/cxf/jaxrs/swagger/openapi/SwaggerToOpenApiConversionUtils.java
create mode 100644 rt/rs/description-swagger/src/test/java/org/apache/cxf/jaxrs/swagger/openapi/SwaggerToOpenApiConversionUtilsTest.java
--
To stop receiving notification emails like this one, please contact
['"commits@cxf.apache.org" <co...@cxf.apache.org>'].
[cxf] 02/02: [CXF-7525] Adding the resources for 3.1.x
Posted by se...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
sergeyb pushed a commit to branch 3.1.x-fixes
in repository https://gitbox.apache.org/repos/asf/cxf.git
commit e3291104573c631481fbc933e0783c5cc4027962
Author: Sergey Beryozkin <sb...@gmail.com>
AuthorDate: Tue Dec 12 16:47:28 2017 +0000
[CXF-7525] Adding the resources for 3.1.x
---
.../swagger/openapi/OpenApiConfiguration.java | 31 +
.../openapi/SwaggerToOpenApiConversionFilter.java | 79 +++
.../openapi/SwaggerToOpenApiConversionUtils.java | 393 +++++++++++
.../SwaggerToOpenApiConversionUtilsTest.java | 775 +++++++++++++++++++++
4 files changed, 1278 insertions(+)
diff --git a/rt/rs/description-swagger/src/main/java/org/apache/cxf/jaxrs/swagger/openapi/OpenApiConfiguration.java b/rt/rs/description-swagger/src/main/java/org/apache/cxf/jaxrs/swagger/openapi/OpenApiConfiguration.java
new file mode 100644
index 0000000..c0f2256
--- /dev/null
+++ b/rt/rs/description-swagger/src/main/java/org/apache/cxf/jaxrs/swagger/openapi/OpenApiConfiguration.java
@@ -0,0 +1,31 @@
+/**
+ * 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.openapi;
+
+public class OpenApiConfiguration {
+ private boolean createRequestBodies;
+
+ public boolean isCreateRequestBodies() {
+ return createRequestBodies;
+ }
+
+ public void setCreateRequestBodies(boolean createRequestBodies) {
+ this.createRequestBodies = createRequestBodies;
+ }
+}
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
new file mode 100644
index 0000000..ccda81a
--- /dev/null
+++ b/rt/rs/description-swagger/src/main/java/org/apache/cxf/jaxrs/swagger/openapi/SwaggerToOpenApiConversionFilter.java
@@ -0,0 +1,79 @@
+/**
+ * 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.openapi;
+
+import java.io.IOException;
+import java.io.OutputStream;
+import java.net.URI;
+
+import javax.ws.rs.WebApplicationException;
+import javax.ws.rs.container.ContainerRequestContext;
+import javax.ws.rs.container.ContainerRequestFilter;
+import javax.ws.rs.container.PreMatching;
+import javax.ws.rs.ext.Provider;
+import javax.ws.rs.ext.WriterInterceptor;
+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.utils.JAXRSUtils;
+
+@Provider
+@PreMatching
+public final class SwaggerToOpenApiConversionFilter implements ContainerRequestFilter, WriterInterceptor {
+
+ 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 {
+ String path = reqCtx.getUriInfo().getPath();
+ if (path.endsWith(OPEN_API_PATH)) {
+ reqCtx.setRequestUri(URI.create(SWAGGER_PATH));
+ JAXRSUtils.getCurrentMessage().getExchange().put(OPEN_API_PROPERTY, Boolean.TRUE);
+ }
+
+ }
+
+ public OpenApiConfiguration getOpenApiConfig() {
+ return openApiConfig;
+ }
+
+ public void setOpenApiConfig(OpenApiConfiguration openApiConfig) {
+ this.openApiConfig = openApiConfig;
+ }
+
+ @Override
+ public void aroundWriteTo(WriterInterceptorContext context) throws IOException, WebApplicationException {
+ if (Boolean.TRUE == JAXRSUtils.getCurrentMessage().getExchange().get(OPEN_API_PROPERTY)) {
+ OutputStream os = context.getOutputStream();
+ CachedOutputStream cos = new CachedOutputStream();
+ context.setOutputStream(cos);
+ context.proceed();
+ String swaggerJson = IOUtils.readStringFromStream(cos.getInputStream());
+ String openApiJson = SwaggerToOpenApiConversionUtils.getOpenApiFromSwaggerJson(swaggerJson, openApiConfig);
+ os.write(StringUtils.toBytesUTF8(openApiJson));
+ os.flush();
+
+ }
+ }
+}
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
new file mode 100644
index 0000000..fbfdb43
--- /dev/null
+++ b/rt/rs/description-swagger/src/main/java/org/apache/cxf/jaxrs/swagger/openapi/SwaggerToOpenApiConversionUtils.java
@@ -0,0 +1,393 @@
+/**
+ * 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.openapi;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.LinkedHashMap;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import java.util.logging.Logger;
+
+import org.apache.cxf.Bus;
+import org.apache.cxf.BusFactory;
+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.json.basic.JsonMapObject;
+import org.apache.cxf.jaxrs.json.basic.JsonMapObjectReaderWriter;
+import org.apache.cxf.jaxrs.utils.ExceptionUtils;
+import org.apache.cxf.jaxrs.utils.ResourceUtils;
+
+public final class SwaggerToOpenApiConversionUtils {
+ private static final Logger LOG = LogUtils.getL7dLogger(SwaggerToOpenApiConversionUtils.class);
+
+ private static final List<String> SIMPLE_TYPE_RELATED_PROPS =
+ Arrays.asList("format", "minimum", "maximum", "default");
+
+ private SwaggerToOpenApiConversionUtils() {
+
+ }
+
+ public static String getOpenApiFromSwaggerLoc(String loc) {
+ return getOpenApiFromSwaggerLoc(loc, null);
+ }
+
+ public static String getOpenApiFromSwaggerLoc(String loc, OpenApiConfiguration cfg) {
+ return getOpenApiFromSwaggerLoc(loc, cfg, BusFactory.getThreadDefaultBus());
+ }
+
+ public static String getOpenApiFromSwaggerLoc(String loc, OpenApiConfiguration cfg, Bus bus) {
+ try {
+ InputStream is = ResourceUtils.getResourceStream(loc, bus);
+ if (is == null) {
+ return null;
+ }
+ return getOpenApiFromSwaggerStream(is, cfg);
+ } catch (Exception ex) {
+ LOG.warning("Problem with processing a user model at " + loc + ", exception: "
+ + ExceptionUtils.getStackTrace(ex));
+ }
+ return null;
+ }
+
+ public static String getOpenApiFromSwaggerStream(InputStream is) throws IOException {
+ return getOpenApiFromSwaggerStream(is, null);
+ }
+
+ public static String getOpenApiFromSwaggerStream(InputStream is, OpenApiConfiguration cfg) throws IOException {
+ return getOpenApiFromSwaggerJson(IOUtils.readStringFromStream(is), cfg);
+ }
+
+ public static String getOpenApiFromSwaggerJson(String json) throws IOException {
+ return getOpenApiFromSwaggerJson(json, null);
+ }
+
+ public static String getOpenApiFromSwaggerJson(String json, OpenApiConfiguration cfg) throws IOException {
+ JsonMapObjectReaderWriter readerWriter = new JsonMapObjectReaderWriter();
+ JsonMapObject sw2 = readerWriter.fromJsonToJsonObject(json);
+ JsonMapObject sw3 = new JsonMapObject();
+
+ // "openapi"
+ sw3.setProperty("openapi", "3.0.0");
+
+ // "servers"
+ setServersProperty(sw2, sw3);
+
+ // "info"
+ JsonMapObject infoObject = sw2.getJsonMapProperty("info");
+ if (infoObject != null) {
+ sw3.setProperty("info", infoObject);
+ }
+
+ // "tags"
+ List<Map<String, Object>> tagsObject = sw2.getListMapProperty("tags");
+ if (tagsObject != null) {
+ sw3.setProperty("tags", tagsObject);
+ }
+
+ // paths
+ Map<String, JsonMapObject> requestBodies = cfg != null && cfg.isCreateRequestBodies()
+ ? new LinkedHashMap<String, JsonMapObject>() : null;
+ setPathsProperty(sw2, sw3, requestBodies);
+
+ // components
+ setComponentsProperty(sw2, sw3, requestBodies);
+
+ // externalDocs
+ Object externalDocsObject = sw2.getProperty("externalDocs");
+ if (externalDocsObject != null) {
+ sw3.setProperty("externalDocs", externalDocsObject);
+ }
+
+ return readerWriter.toJson(sw3);
+ }
+
+ private static void setComponentsProperty(JsonMapObject sw2, JsonMapObject sw3,
+ Map<String, JsonMapObject> requestBodies) {
+ JsonMapObject comps = new JsonMapObject();
+ JsonMapObject requestBodiesObj = new JsonMapObject();
+ if (requestBodies != null) {
+ for (Map.Entry<String, JsonMapObject> entry : requestBodies.entrySet()) {
+ requestBodiesObj.setProperty(entry.getKey(), entry.getValue());
+ }
+ }
+ comps.setProperty("requestBodies", requestBodiesObj);
+
+ Object s2Defs = sw2.getProperty("definitions");
+ if (s2Defs != null) {
+ comps.setProperty("schemas", s2Defs);
+ }
+ Object s2SecurityDefs = sw2.getProperty("securityDefinitions");
+ if (s2SecurityDefs != null) {
+ comps.setProperty("securitySchemes", s2SecurityDefs);
+ }
+
+ sw3.setProperty("components", comps);
+
+ }
+
+ private static void setPathsProperty(JsonMapObject sw2, JsonMapObject sw3,
+ Map<String, JsonMapObject> requestBodies) {
+ JsonMapObject sw2Paths = sw2.getJsonMapProperty("paths");
+ for (Map.Entry<String, Object> sw2PathEntries : sw2Paths.asMap().entrySet()) {
+ Map<String, Object> map1 = CastUtils.cast((Map<?, ?>)sw2PathEntries.getValue());
+ JsonMapObject sw2PathVerbs = new JsonMapObject(map1);
+ for (Map.Entry<String, Object> sw2PathVerbEntries : sw2PathVerbs.asMap().entrySet()) {
+ Map<String, Object> map2 = CastUtils.cast((Map<?, ?>)sw2PathVerbEntries.getValue());
+ JsonMapObject sw2PathVerbProps = new JsonMapObject(map2);
+
+ prepareRequestBody(sw2PathVerbProps, requestBodies);
+ prepareResponses(sw2PathVerbProps);
+
+ }
+ }
+
+ sw3.setProperty("paths", sw2Paths);
+
+
+ }
+
+ private static void prepareResponses(JsonMapObject sw2PathVerbProps) {
+ List<String> sw2PathVerbProduces =
+ CastUtils.cast((List<?>)sw2PathVerbProps.removeProperty("produces"));
+
+ JsonMapObject sw3PathVerbResps = null;
+ JsonMapObject sw2PathVerbResps = sw2PathVerbProps.getJsonMapProperty("responses");
+ if (sw2PathVerbResps != null) {
+ sw3PathVerbResps = new JsonMapObject();
+
+ JsonMapObject okResp = null;
+ if (sw2PathVerbResps.containsProperty("200")) {
+ Map<String, Object> map = CastUtils.cast((Map<?, ?>)sw2PathVerbResps.removeProperty("200"));
+ okResp = new JsonMapObject(map);
+ JsonMapObject newOkResp = new JsonMapObject();
+ String description = okResp.getStringProperty("description");
+ if (description != null) {
+ newOkResp.setProperty("description", description);
+ }
+ JsonMapObject schema = okResp.getJsonMapProperty("schema");
+ if (schema != null) {
+ JsonMapObject content = prepareContentFromSchema(schema, sw2PathVerbProduces, false);
+ if (content != null) {
+ newOkResp.setProperty("content", content);
+ }
+
+ }
+ JsonMapObject headers = okResp.getJsonMapProperty("headers");
+ if (headers != null) {
+ newOkResp.setProperty("headers", headers);
+ }
+ sw3PathVerbResps.setProperty("200", newOkResp);
+ }
+ for (Map.Entry<String, Object> entry : sw2PathVerbResps.asMap().entrySet()) {
+ sw3PathVerbResps.setProperty(entry.getKey(), entry.getValue());
+ }
+ sw2PathVerbProps.setProperty("responses", sw3PathVerbResps);
+ }
+
+ }
+
+ private static void prepareRequestBody(JsonMapObject sw2PathVerbProps,
+ Map<String, JsonMapObject> requestBodies) {
+ List<String> sw2PathVerbConsumes =
+ CastUtils.cast((List<?>)sw2PathVerbProps.removeProperty("consumes"));
+
+ JsonMapObject sw3RequestBody = null;
+ List<JsonMapObject> sw3formBody = null;
+ List<Map<String, Object>> sw2PathVerbParamsList = sw2PathVerbProps.getListMapProperty("parameters");
+ if (sw2PathVerbParamsList != null) {
+ for (Iterator<Map<String, Object>> it = sw2PathVerbParamsList.iterator(); it.hasNext();) {
+ JsonMapObject sw2PathVerbParamMap = new JsonMapObject(it.next());
+ if ("body".equals(sw2PathVerbParamMap.getStringProperty("in"))) {
+ it.remove();
+
+ sw3RequestBody = new JsonMapObject();
+ String description = sw2PathVerbParamMap.getStringProperty("description");
+ if (description != null) {
+ sw3RequestBody.setProperty("description", description);
+ }
+ Boolean required = sw2PathVerbParamMap.getBooleanProperty("required");
+ if (required != null) {
+ sw3RequestBody.setProperty("required", required);
+ }
+ JsonMapObject schema = sw2PathVerbParamMap.getJsonMapProperty("schema");
+ if (schema != null) {
+ JsonMapObject content = prepareContentFromSchema(schema, sw2PathVerbConsumes,
+ requestBodies != null);
+ if (content != null) {
+ sw3RequestBody.setProperty("content", content);
+ }
+
+ }
+ } else if ("formData".equals(sw2PathVerbParamMap.getStringProperty("in"))) {
+ it.remove();
+ if (sw3formBody == null) {
+ sw3formBody = new LinkedList<JsonMapObject>();
+ sw3RequestBody = new JsonMapObject();
+ }
+ sw2PathVerbParamMap.removeProperty("in");
+ sw2PathVerbParamMap.removeProperty("required");
+ sw3formBody.add(sw2PathVerbParamMap);
+ } else if ("array".equals(sw2PathVerbParamMap.getStringProperty("type"))) {
+ sw2PathVerbParamMap.removeProperty("type");
+ sw2PathVerbParamMap.removeProperty("collectionFormat");
+ sw2PathVerbParamMap.setProperty("explode", true);
+ JsonMapObject items = sw2PathVerbParamMap.getJsonMapProperty("items");
+ sw2PathVerbParamMap.removeProperty("items");
+ JsonMapObject schema = new JsonMapObject();
+ schema.setProperty("type", "array");
+ schema.setProperty("items", items);
+ sw2PathVerbParamMap.setProperty("schema", schema);
+ } else {
+ String type = (String)sw2PathVerbParamMap.removeProperty("type");
+ if (type != null) {
+ JsonMapObject schema = new JsonMapObject();
+ schema.setProperty("type", type);
+ for (String prop : SIMPLE_TYPE_RELATED_PROPS) {
+ Object value = sw2PathVerbParamMap.removeProperty(prop);
+ if (value != null) {
+ schema.setProperty(prop, value);
+ }
+ }
+ if ("password".equals(sw2PathVerbParamMap.getProperty("name"))) {
+ schema.setProperty("format", "password");
+ }
+ sw2PathVerbParamMap.setProperty("schema", schema);
+ }
+ }
+ }
+ }
+ if (sw2PathVerbParamsList.isEmpty()) {
+ sw2PathVerbProps.removeProperty("parameters");
+ }
+ if (sw3formBody != null) {
+ sw3RequestBody.setProperty("content", prepareFormContent(sw3formBody, sw2PathVerbConsumes));
+ }
+ if (sw3RequestBody != null) {
+ if (requestBodies == null || sw3formBody != null) {
+ sw2PathVerbProps.setProperty("requestBody", sw3RequestBody);
+ } else {
+ JsonMapObject content = sw3RequestBody.getJsonMapProperty("content");
+ if (content != null) {
+ String requestBodyName = (String)content.removeProperty("requestBodyName");
+ if (requestBodyName != null) {
+ requestBodies.put(requestBodyName, sw3RequestBody);
+ String ref = "#components/requestBodies/" + requestBodyName;
+ sw2PathVerbProps.setProperty("requestBody",
+ Collections.singletonMap("$ref", ref));
+ }
+ }
+ }
+ }
+
+ }
+
+ private static JsonMapObject prepareFormContent(List<JsonMapObject> formList, List<String> mediaTypes) {
+ String mediaType = StringUtils.isEmpty(mediaTypes)
+ ? "application/x-www-form-urlencoded" : mediaTypes.get(0);
+ JsonMapObject content = new JsonMapObject();
+ JsonMapObject formType = new JsonMapObject();
+ JsonMapObject schema = new JsonMapObject();
+ schema.setProperty("type", "object");
+ JsonMapObject props = new JsonMapObject();
+ for (JsonMapObject prop : formList) {
+ String name = (String)prop.removeProperty("name");
+ props.setProperty(name, prop);
+ if ("file".equals(prop.getProperty("type"))) {
+ prop.setProperty("type", "string");
+ if (!prop.containsProperty("format")) {
+ prop.setProperty("format", "binary");
+ }
+ }
+ }
+ schema.setProperty("properties", props);
+ formType.setProperty("schema", schema);
+ content.setProperty(mediaType, formType);
+ return content;
+ }
+ private static JsonMapObject prepareContentFromSchema(JsonMapObject schema,
+ List<String> mediaTypes,
+ boolean storeModelName) {
+ String type = schema.getStringProperty("type");
+ String modelName = null;
+ boolean isArray = false;
+ if (!"object".equals(type) || !"string".equals(type)) {
+ String ref = null;
+ JsonMapObject items = null;
+ if ("array".equals(type)) {
+ isArray = true;
+ items = schema.getJsonMapProperty("items");
+ ref = (String)items.getProperty("$ref");
+ } else {
+ ref = schema.getStringProperty("$ref");
+ }
+ if (ref != null) {
+ int index = ref.lastIndexOf("/");
+ modelName = ref.substring(index + 1);
+ if (items == null) {
+ schema.setProperty("$ref", "#components/schemas/" + modelName);
+ } else {
+ items.setProperty("$ref", "#components/schemas/" + modelName);
+ }
+
+
+ }
+ }
+ JsonMapObject content = new JsonMapObject();
+
+ List<String> mediaTypesList = mediaTypes == null
+ ? Collections.singletonList("application/json") : mediaTypes;
+
+ for (String mediaType : mediaTypesList) {
+ content.setProperty(mediaType,
+ Collections.singletonMap("schema", schema));
+
+ }
+ if (modelName != null && storeModelName) {
+ content.setProperty("requestBodyName", isArray ? modelName + "Array" : modelName);
+ }
+ // pass the model name via the content object
+ return content;
+ }
+
+ private static void setServersProperty(JsonMapObject sw2, JsonMapObject sw3) {
+ String sw2Host = sw2.getStringProperty("host");
+ String sw2BasePath = sw2.getStringProperty("basePath");
+ String sw2Scheme = null;
+ List<String> sw2Schemes = sw2.getListStringProperty("schemes");
+ if (StringUtils.isEmpty(sw2Schemes)) {
+ sw2Scheme = "https";
+ } else {
+ sw2Scheme = sw2Schemes.get(0);
+ }
+ String sw3ServerUrl = sw2Scheme + "://" + sw2Host + sw2BasePath;
+ sw3.setProperty("servers",
+ Collections.singletonList(
+ Collections.singletonMap("url", sw3ServerUrl)));
+
+ }
+
+
+}
diff --git a/rt/rs/description-swagger/src/test/java/org/apache/cxf/jaxrs/swagger/openapi/SwaggerToOpenApiConversionUtilsTest.java b/rt/rs/description-swagger/src/test/java/org/apache/cxf/jaxrs/swagger/openapi/SwaggerToOpenApiConversionUtilsTest.java
new file mode 100644
index 0000000..73b352e
--- /dev/null
+++ b/rt/rs/description-swagger/src/test/java/org/apache/cxf/jaxrs/swagger/openapi/SwaggerToOpenApiConversionUtilsTest.java
@@ -0,0 +1,775 @@
+/**
+ * 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.openapi;
+
+import java.util.List;
+import java.util.Map;
+
+import org.apache.cxf.jaxrs.json.basic.JsonMapObject;
+import org.apache.cxf.jaxrs.json.basic.JsonMapObjectReaderWriter;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+public class SwaggerToOpenApiConversionUtilsTest extends Assert {
+
+ @Test
+ public void testConvertFromSwaggerToOpenApi() {
+ OpenApiConfiguration cfg = new OpenApiConfiguration();
+ String s = SwaggerToOpenApiConversionUtils.getOpenApiFromSwaggerLoc("/swagger2petShop.json");
+ JsonMapObjectReaderWriter readerWriter = new JsonMapObjectReaderWriter();
+ JsonMapObject sw3 = readerWriter.fromJsonToJsonObject(s);
+ assertEquals("3.0.0", sw3.getStringProperty("openapi"));
+ verifyServersProperty(sw3);
+ verifyInfoProperty(sw3);
+ verifyTagsProperty(sw3);
+ verifyPathsProperty(sw3, cfg);
+ verifyComponentsProperty(sw3, cfg);
+ }
+
+ @Test
+ public void testConvertFromSwaggerToOpenApiWithRequestBodies() {
+ OpenApiConfiguration cfg = new OpenApiConfiguration();
+ cfg.setCreateRequestBodies(true);
+ String s = SwaggerToOpenApiConversionUtils.getOpenApiFromSwaggerLoc("/swagger2petShop.json", cfg);
+ JsonMapObjectReaderWriter readerWriter = new JsonMapObjectReaderWriter();
+ JsonMapObject sw3 = readerWriter.fromJsonToJsonObject(s);
+ assertEquals("3.0.0", sw3.getStringProperty("openapi"));
+ verifyServersProperty(sw3);
+ verifyInfoProperty(sw3);
+ verifyTagsProperty(sw3);
+ verifyPathsProperty(sw3, cfg);
+ verifyComponentsProperty(sw3, cfg);
+ }
+
+ private void verifyPathsProperty(JsonMapObject sw3, OpenApiConfiguration cfg) {
+ JsonMapObject paths = sw3.getJsonMapProperty("paths");
+ assertEquals(14, paths.size());
+ // /pet
+ verifyPetPath(paths, cfg);
+ // /pet/findByStatus
+ verifyPetFindByStatusPath(paths);
+ // /pet/findByTags
+ verifyPetFindByTagsPath(paths);
+ // /pet/{petId}
+ verifyPetIdPath(paths);
+ // "/pet/{petId}/uploadImage"
+ verifyPetIdUploadImagePath(paths);
+ // "/store/inventory"
+ verifyStoreInventoryPath(paths);
+ // "/store/order"
+ verifyStoreOrderPath(paths, cfg);
+ // "/store/order/{orderId}"
+ verifyStoreOrderIdPath(paths);
+ // "/user"
+ verifyUserPath(paths, cfg);
+ // "/user/createWithArray"
+ verifyUserCreateWithArrayPath(paths, cfg);
+ // "/user/createWithList"
+ verifyUserCreateWithListPath(paths, cfg);
+ // "/user/login"
+ verifyUserLoginPath(paths);
+ // "/user/logout"
+ verifyUserLogoutPath(paths);
+ // "/user/{username}"
+ verifyUserUsernamePath(paths, cfg);
+ }
+
+ private void verifyPetPath(JsonMapObject paths, OpenApiConfiguration cfg) {
+ // /pet
+ JsonMapObject pet = paths.getJsonMapProperty("/pet");
+ assertEquals(2, pet.size());
+ verifyPetPathPost(pet, cfg);
+ verifyPetPathPut(pet, cfg);
+ }
+
+ private void verifyPetFindByStatusPath(JsonMapObject paths) {
+ // /pet/findByStatus
+ JsonMapObject pet = paths.getJsonMapProperty("/pet/findByStatus");
+ assertEquals(1, pet.size());
+ verifyPetFindByStatusOrTags(pet, "findPetsByStatus");
+
+ }
+ private void verifyPetFindByTagsPath(JsonMapObject paths) {
+ // /pet/findByTags
+ JsonMapObject pet = paths.getJsonMapProperty("/pet/findByTags");
+ assertEquals(1, pet.size());
+ verifyPetFindByStatusOrTags(pet, "findPetsByTags");
+ }
+
+ private void verifyPetIdPath(JsonMapObject paths) {
+ // /pet/{petId}
+ JsonMapObject pet = paths.getJsonMapProperty("/pet/{petId}");
+ assertEquals(3, pet.size());
+ verifyPetIdPathPost(pet);
+ verifyPetIdPathGet(pet);
+ verifyPetIdPathDelete(pet);
+ }
+
+ private void verifyPetIdUploadImagePath(JsonMapObject paths) {
+ // /pet/{petId}/uploadImage
+ JsonMapObject pet = paths.getJsonMapProperty("/pet/{petId}/uploadImage");
+ assertEquals(1, pet.size());
+ verifyPetIdUploadImagePathPost(pet);
+ }
+
+ private void verifyStoreInventoryPath(JsonMapObject paths) {
+ // /store/inventory
+ JsonMapObject store = paths.getJsonMapProperty("/store/inventory");
+ assertEquals(1, store.size());
+ verifyStoreInventoryPathGet(store);
+ }
+
+ private void verifyStoreOrderPath(JsonMapObject paths, OpenApiConfiguration cfg) {
+ // /store/order
+ JsonMapObject store = paths.getJsonMapProperty("/store/order");
+ assertEquals(1, store.size());
+ verifyStoreOrderPathPost(store, cfg);
+ }
+
+ private void verifyStoreOrderIdPath(JsonMapObject paths) {
+ // /store/order/{orderId}
+ JsonMapObject store = paths.getJsonMapProperty("/store/order/{orderId}");
+ assertEquals(2, store.size());
+ verifyStoreOrderIdPathGet(store);
+ verifyStoreOrderIdPathDelete(store);
+ }
+
+ private void verifyUserPath(JsonMapObject paths, OpenApiConfiguration cfg) {
+ // /user
+ JsonMapObject user = paths.getJsonMapProperty("/user");
+ assertEquals(1, user.size());
+ verifyUserPathPost(user, cfg);
+ }
+
+ private void verifyUserCreateWithArrayPath(JsonMapObject paths, OpenApiConfiguration cfg) {
+ // /user/createWithArray
+ JsonMapObject user = paths.getJsonMapProperty("/user/createWithArray");
+ assertEquals(1, user.size());
+ verifyUserCreateWithArrayPathPost(user, cfg);
+ }
+
+ private void verifyUserCreateWithListPath(JsonMapObject paths, OpenApiConfiguration cfg) {
+ // /user/createWithList
+ JsonMapObject user = paths.getJsonMapProperty("/user/createWithList");
+ assertEquals(1, user.size());
+ verifyUserCreateWithListPathPost(user, cfg);
+ }
+
+ private void verifyUserLoginPath(JsonMapObject paths) {
+ // /user/login
+ JsonMapObject user = paths.getJsonMapProperty("/user/login");
+ assertEquals(1, user.size());
+ verifyUserLoginPathPost(user);
+ }
+
+ private void verifyUserLogoutPath(JsonMapObject paths) {
+ // /user/logout
+ JsonMapObject user = paths.getJsonMapProperty("/user/logout");
+ assertEquals(1, user.size());
+ verifyUserLogoutPathGet(user);
+ }
+
+ private void verifyUserUsernamePath(JsonMapObject paths, OpenApiConfiguration cfg) {
+ // /user/{username}
+ JsonMapObject user = paths.getJsonMapProperty("/user/{username}");
+ assertEquals(3, user.size());
+ verifyUserUsernamePathGet(user);
+ verifyUserUsernamePathPut(user, cfg);
+ verifyUserUsernamePathDelete(user);
+ }
+
+ private void verifyUserLoginPathPost(JsonMapObject user) {
+ JsonMapObject userPost = user.getJsonMapProperty("get");
+ assertEquals(6, userPost.size());
+ testCommonVerbPropsExceptSec(userPost, "loginUser");
+ assertNull(userPost.getProperty("requestBody"));
+ List<Map<String, Object>> parameters = userPost.getListMapProperty("parameters");
+ assertEquals(2, parameters.size());
+ verifyUserNameParameter(new JsonMapObject(parameters.get(0)), "username", "query");
+ verifyPasswordParameter(new JsonMapObject(parameters.get(1)), "password");
+ JsonMapObject responses = userPost.getJsonMapProperty("responses");
+ assertEquals(2, responses.size());
+ assertNotNull(responses.getJsonMapProperty("400"));
+ JsonMapObject okResp = responses.getJsonMapProperty("200");
+ assertEquals(3, okResp.size());
+ assertNotNull(okResp.getProperty("description"));
+ assertNotNull(okResp.getProperty("headers"));
+ JsonMapObject content = okResp.getJsonMapProperty("content");
+ assertEquals(2, content.size());
+ verifySimpleStringContent(content, "application/json");
+ verifySimpleStringContent(content, "application/xml");
+ }
+
+ private void verifyUserLogoutPathGet(JsonMapObject user) {
+ JsonMapObject userGet = user.getJsonMapProperty("get");
+ assertEquals(5, userGet.size());
+ testCommonVerbPropsExceptSec(userGet, "logoutUser");
+ assertNull(userGet.getListMapProperty("parameters"));
+ assertNull(userGet.getProperty("requestBody"));
+ JsonMapObject responses = userGet.getJsonMapProperty("responses");
+ assertEquals(1, responses.size());
+ testDefaultResponse(userGet);
+ }
+
+ private void verifyUserUsernamePathGet(JsonMapObject user) {
+ JsonMapObject userGet = user.getJsonMapProperty("get");
+ assertEquals(6, userGet.size());
+ testCommonVerbPropsExceptSec(userGet, "getUserByName");
+ List<Map<String, Object>> parameters = userGet.getListMapProperty("parameters");
+ assertEquals(1, parameters.size());
+ JsonMapObject userParam = new JsonMapObject(parameters.get(0));
+ verifyUserNameParameter(userParam, "username", "path");
+ assertNull(userGet.getProperty("requestBody"));
+ JsonMapObject responses = userGet.getJsonMapProperty("responses");
+ assertEquals(3, responses.size());
+ assertNotNull(responses.getProperty("400"));
+ assertNotNull(responses.getProperty("404"));
+ JsonMapObject okResp = responses.getJsonMapProperty("200");
+ assertEquals(2, okResp.size());
+ assertNotNull(okResp.getProperty("description"));
+ JsonMapObject content = okResp.getJsonMapProperty("content");
+ assertEquals(2, content.size());
+ verifySimpleContent(content, "application/json", "User");
+ verifySimpleContent(content, "application/xml", "User");
+ }
+
+ private void verifyUserUsernamePathPut(JsonMapObject user, OpenApiConfiguration cfg) {
+ JsonMapObject userPut = user.getJsonMapProperty("put");
+ assertEquals(7, userPut.size());
+ testCommonVerbPropsExceptSec(userPut, "updateUser");
+ List<Map<String, Object>> parameters = userPut.getListMapProperty("parameters");
+ assertEquals(1, parameters.size());
+ JsonMapObject userParam = new JsonMapObject(parameters.get(0));
+ verifyUserNameParameter(userParam, "username", "path");
+ if (cfg.isCreateRequestBodies()) {
+ verifyRequestBodyRef(userPut, "User");
+ } else {
+ JsonMapObject requestBody = userPut.getJsonMapProperty("requestBody");
+ assertEquals(3, requestBody.size());
+ assertNotNull(requestBody.getProperty("description"));
+ assertTrue(requestBody.getBooleanProperty("required"));
+ JsonMapObject content = requestBody.getJsonMapProperty("content");
+ assertEquals(1, content.size());
+ verifySimpleContent(content, "application/json", "User");
+ }
+
+ JsonMapObject responses = userPut.getJsonMapProperty("responses");
+ assertEquals(2, responses.size());
+ assertNotNull(responses.getProperty("400"));
+ assertNotNull(responses.getProperty("404"));
+ }
+
+ private void verifyUserUsernamePathDelete(JsonMapObject user) {
+ JsonMapObject usetDelete = user.getJsonMapProperty("delete");
+ assertEquals(6, usetDelete.size());
+ testCommonVerbPropsExceptSec(usetDelete, "deleteUser");
+ List<Map<String, Object>> parameters = usetDelete.getListMapProperty("parameters");
+ assertEquals(1, parameters.size());
+ JsonMapObject userParam = new JsonMapObject(parameters.get(0));
+ verifyUserNameParameter(userParam, "username", "path");
+ assertNull(usetDelete.getJsonMapProperty("requestBody"));
+ JsonMapObject responses = usetDelete.getJsonMapProperty("responses");
+ assertEquals(2, responses.size());
+ assertNotNull(responses.getProperty("400"));
+ assertNotNull(responses.getProperty("404"));
+
+
+ }
+
+ private void verifyStoreOrderIdPathGet(JsonMapObject store) {
+ JsonMapObject storeGet = store.getJsonMapProperty("get");
+ assertEquals(6, storeGet.size());
+ testCommonVerbPropsExceptSec(storeGet, "getOrderById");
+ List<Map<String, Object>> parameters = storeGet.getListMapProperty("parameters");
+ assertEquals(1, parameters.size());
+ JsonMapObject orderIdParam = new JsonMapObject(parameters.get(0));
+ verifyOrderIdParameter(orderIdParam, false);
+ assertNull(storeGet.getJsonMapProperty("requestBody"));
+ JsonMapObject responses = storeGet.getJsonMapProperty("responses");
+ assertEquals(3, responses.size());
+ assertNotNull(responses.getProperty("400"));
+ assertNotNull(responses.getProperty("404"));
+ JsonMapObject okResp = responses.getJsonMapProperty("200");
+ assertEquals(2, okResp.size());
+ assertNotNull(okResp.getProperty("description"));
+ JsonMapObject content = okResp.getJsonMapProperty("content");
+ assertEquals(2, content.size());
+ verifySimpleContent(content, "application/json", "Order");
+ verifySimpleContent(content, "application/xml", "Order");
+ }
+
+ private void verifyStoreOrderIdPathDelete(JsonMapObject store) {
+ JsonMapObject storeGet = store.getJsonMapProperty("delete");
+ assertEquals(6, storeGet.size());
+ testCommonVerbPropsExceptSec(storeGet, "deleteOrder");
+ List<Map<String, Object>> parameters = storeGet.getListMapProperty("parameters");
+ assertEquals(1, parameters.size());
+ JsonMapObject orderIdParam = new JsonMapObject(parameters.get(0));
+ verifyOrderIdParameter(orderIdParam, true);
+ assertNull(storeGet.getJsonMapProperty("requestBody"));
+ JsonMapObject responses = storeGet.getJsonMapProperty("responses");
+ assertEquals(2, responses.size());
+ assertNotNull(responses.getProperty("400"));
+ assertNotNull(responses.getProperty("404"));
+ }
+
+ private void verifyStoreOrderPathPost(JsonMapObject store, OpenApiConfiguration cfg) {
+ JsonMapObject storePost = store.getJsonMapProperty("post");
+ assertEquals(6, storePost.size());
+ testCommonVerbPropsExceptSec(storePost, "placeOrder");
+ assertNull(storePost.getProperty("parameters"));
+
+ if (cfg.isCreateRequestBodies()) {
+ verifyRequestBodyRef(storePost, "Order");
+ } else {
+ JsonMapObject contentIn = verifyRequestBodyContent(storePost);
+ assertEquals(1, contentIn.size());
+ verifySimpleContent(contentIn, "application/json", "Order");
+ }
+ JsonMapObject responses = storePost.getJsonMapProperty("responses");
+ assertEquals(2, responses.size());
+ assertNotNull(responses.getJsonMapProperty("400"));
+ JsonMapObject okResp = responses.getJsonMapProperty("200");
+ assertEquals(2, okResp.size());
+ assertNotNull(okResp.getProperty("description"));
+ JsonMapObject contentOut = okResp.getJsonMapProperty("content");
+ assertEquals(2, contentOut.size());
+ verifySimpleContent(contentOut, "application/json", "Order");
+ verifySimpleContent(contentOut, "application/xml", "Order");
+ }
+
+ private void verifyUserPathPost(JsonMapObject store, OpenApiConfiguration cfg) {
+ JsonMapObject userPost = store.getJsonMapProperty("post");
+ assertEquals(6, userPost.size());
+ testCommonVerbPropsExceptSec(userPost, "createUser");
+ assertNull(userPost.getProperty("parameters"));
+ if (cfg.isCreateRequestBodies()) {
+ verifyRequestBodyRef(userPost, "User");
+ } else {
+ JsonMapObject contentIn = verifyRequestBodyContent(userPost);
+ assertEquals(1, contentIn.size());
+ verifySimpleContent(contentIn, "application/json", "User");
+ }
+ testDefaultResponse(userPost);
+ }
+
+ private void testDefaultResponse(JsonMapObject json) {
+ JsonMapObject responses = json.getJsonMapProperty("responses");
+ assertEquals(1, responses.size());
+ assertNotNull(responses.getProperty("default"));
+
+ }
+
+ private void verifyUserCreateWithArrayPathPost(JsonMapObject store, OpenApiConfiguration cfg) {
+ verifyUserCreateWithListOrArrayPathPost(store, "createUsersWithArrayInput", cfg);
+ }
+
+ private void verifyUserCreateWithListPathPost(JsonMapObject store, OpenApiConfiguration cfg) {
+ verifyUserCreateWithListOrArrayPathPost(store, "createUsersWithListInput", cfg);
+ }
+
+ private void verifyUserCreateWithListOrArrayPathPost(JsonMapObject store, String opId,
+ OpenApiConfiguration cfg) {
+ JsonMapObject userPost = store.getJsonMapProperty("post");
+ assertEquals(6, userPost.size());
+ testCommonVerbPropsExceptSec(userPost, opId);
+ assertNull(userPost.getProperty("parameters"));
+ if (cfg.isCreateRequestBodies()) {
+ verifyRequestBodyRef(userPost, "UserArray");
+ } else {
+ JsonMapObject contentIn = verifyRequestBodyContent(userPost);
+ assertEquals(1, contentIn.size());
+ verifyArrayContent(contentIn, "application/json", "User");
+ }
+ testDefaultResponse(userPost);
+ }
+
+ private void verifyStoreInventoryPathGet(JsonMapObject store) {
+ JsonMapObject storeGet = store.getJsonMapProperty("get");
+ assertEquals(6, storeGet.size());
+ testCommonVerbProps(storeGet, "getInventory");
+ assertNull(storeGet.getProperty("parameters"));
+ assertNull(storeGet.getJsonMapProperty("requestBody"));
+ JsonMapObject responses = storeGet.getJsonMapProperty("responses");
+ assertEquals(1, responses.size());
+ JsonMapObject okResp = responses.getJsonMapProperty("200");
+ assertEquals(2, okResp.size());
+ assertNotNull(okResp.getProperty("description"));
+ JsonMapObject content = okResp.getJsonMapProperty("content");
+ assertEquals(1, content.size());
+ verifyMapContent(content, "application/json", "integer", "int32");
+ }
+
+ private void verifyPetFindByStatusOrTags(JsonMapObject pet, String opId) {
+ JsonMapObject petGet = pet.getJsonMapProperty("get");
+ boolean findByStatus = "findPetsByStatus".equals(opId);
+
+ assertEquals(findByStatus ? 7 : 8, petGet.size());
+ testCommonVerbProps(petGet, opId);
+ assertNull(petGet.getJsonMapProperty("requestBody"));
+ List<Map<String, Object>> parameters = petGet.getListMapProperty("parameters");
+ assertEquals(1, parameters.size());
+ JsonMapObject param = new JsonMapObject(parameters.get(0));
+ assertEquals(findByStatus ? "status" : "tags", param.getProperty("name"));
+ assertEquals("query", param.getProperty("in"));
+ assertNull(param.getProperty("type"));
+ assertNull(param.getProperty("items"));
+ assertNull(param.getProperty("collectionFormat"));
+ assertTrue(param.getBooleanProperty("explode"));
+ assertTrue(param.getBooleanProperty("required"));
+ JsonMapObject schema = param.getJsonMapProperty("schema");
+ assertEquals(2, schema.size());
+ assertEquals("array", schema.getStringProperty("type"));
+ assertNotNull(schema.getProperty("items"));
+ assertNull(schema.getProperty("requestBody"));
+ JsonMapObject responses = petGet.getJsonMapProperty("responses");
+ assertEquals(2, responses.size());
+ assertNotNull(responses.getProperty("400"));
+ JsonMapObject okResp = responses.getJsonMapProperty("200");
+ assertEquals(2, okResp.size());
+ assertNotNull(okResp.getProperty("description"));
+ JsonMapObject content = okResp.getJsonMapProperty("content");
+ assertEquals(2, content.size());
+ verifyArrayContent(content, "application/json", "Pet");
+ verifyArrayContent(content, "application/xml", "Pet");
+ if (findByStatus) {
+ assertNull(petGet.getProperty("deprecated"));
+ } else {
+ assertTrue(petGet.getBooleanProperty("deprecated"));
+ }
+ }
+ private void verifyPetIdUploadImagePathPost(JsonMapObject pet) {
+ JsonMapObject petPost = pet.getJsonMapProperty("post");
+ assertEquals(8, petPost.size());
+ testCommonVerbProps(petPost, "uploadFile");
+ List<Map<String, Object>> parameters = petPost.getListMapProperty("parameters");
+ assertEquals(1, parameters.size());
+ JsonMapObject pathIdParam = new JsonMapObject(parameters.get(0));
+ verifyPetIdParameter(pathIdParam);
+
+ verifyPetFormContent(petPost, "multipart/form-data",
+ "additionalMetadata", "file");
+ JsonMapObject responses = petPost.getJsonMapProperty("responses");
+ assertEquals(1, responses.size());
+ JsonMapObject okResp = responses.getJsonMapProperty("200");
+ assertEquals(2, okResp.size());
+ assertNotNull(okResp.getProperty("description"));
+ JsonMapObject content = okResp.getJsonMapProperty("content");
+ assertEquals(1, content.size());
+ verifySimpleContent(content, "application/json", "ApiResponse");
+
+ }
+ private void verifyPetIdPathPost(JsonMapObject pet) {
+ JsonMapObject petPost = pet.getJsonMapProperty("post");
+ assertEquals(8, petPost.size());
+ testCommonVerbProps(petPost, "updatePetWithForm");
+ List<Map<String, Object>> parameters = petPost.getListMapProperty("parameters");
+ assertEquals(1, parameters.size());
+ JsonMapObject pathIdParam = new JsonMapObject(parameters.get(0));
+ verifyPetIdParameter(pathIdParam);
+
+ verifyPetFormContent(petPost, "application/x-www-form-urlencoded",
+ "name", "status");
+ JsonMapObject responses = petPost.getJsonMapProperty("responses");
+ assertEquals(1, responses.size());
+ assertNotNull(responses.getProperty("405"));
+
+ }
+ private void verifyPetIdPathGet(JsonMapObject pet) {
+ JsonMapObject petGet = pet.getJsonMapProperty("get");
+ assertEquals(7, petGet.size());
+ testCommonVerbProps(petGet, "getPetById");
+ List<Map<String, Object>> parameters = petGet.getListMapProperty("parameters");
+ assertEquals(1, parameters.size());
+ JsonMapObject pathIdParam = new JsonMapObject(parameters.get(0));
+ verifyPetIdParameter(pathIdParam);
+
+ assertNull(petGet.getJsonMapProperty("requestBody"));
+ JsonMapObject responses = petGet.getJsonMapProperty("responses");
+ assertEquals(3, responses.size());
+ JsonMapObject okResp = responses.getJsonMapProperty("200");
+ assertEquals(2, okResp.size());
+ JsonMapObject content = okResp.getJsonMapProperty("content");
+ assertEquals(2, content.size());
+ verifySimpleContent(content, "application/json", "Pet");
+ verifySimpleContent(content, "application/xml", "Pet");
+ assertNotNull(responses.getProperty("400"));
+ assertNotNull(responses.getProperty("404"));
+
+ }
+
+ private void verifyPetIdPathDelete(JsonMapObject pet) {
+ JsonMapObject petDel = pet.getJsonMapProperty("delete");
+ assertEquals(7, petDel.size());
+ testCommonVerbProps(petDel, "deletePet");
+ List<Map<String, Object>> parameters = petDel.getListMapProperty("parameters");
+ assertEquals(2, parameters.size());
+ JsonMapObject apiKeyParam = new JsonMapObject(parameters.get(0));
+ assertEquals("api_key", apiKeyParam.getProperty("name"));
+ assertEquals("header", apiKeyParam.getProperty("in"));
+ assertNull(apiKeyParam.getProperty("type"));
+ assertNull(apiKeyParam.getProperty("format"));
+ assertFalse(apiKeyParam.getBooleanProperty("required"));
+ JsonMapObject schema = apiKeyParam.getJsonMapProperty("schema");
+ assertEquals(1, schema.size());
+ assertEquals("string", schema.getProperty("type"));
+ JsonMapObject pathIdParam = new JsonMapObject(parameters.get(1));
+ verifyPetIdParameter(pathIdParam);
+ assertNull(petDel.getJsonMapProperty("requestBody"));
+ JsonMapObject responses = petDel.getJsonMapProperty("responses");
+ assertEquals(2, responses.size());
+ assertNotNull(responses.getProperty("400"));
+ assertNotNull(responses.getProperty("404"));
+
+ }
+
+ private void verifyPetIdParameter(JsonMapObject param) {
+ assertEquals("petId", param.getProperty("name"));
+ assertEquals("path", param.getProperty("in"));
+ assertNull(param.getProperty("type"));
+ assertNull(param.getProperty("format"));
+ assertNotNull(param.getProperty("description"));
+ assertTrue(param.getBooleanProperty("required"));
+ JsonMapObject schema = param.getJsonMapProperty("schema");
+ assertEquals(2, schema.size());
+ assertEquals("integer", schema.getProperty("type"));
+ assertEquals("int64", schema.getProperty("format"));
+ }
+
+ private void verifyUserNameParameter(JsonMapObject param, String name, String inType) {
+ verifyStringParameter(param, "username", inType);
+
+ }
+
+ private void verifyPasswordParameter(JsonMapObject param, String name) {
+ verifyStringParameter(param, "password", "query");
+ assertEquals("password",
+ param.getJsonMapProperty("schema").getProperty("format"));
+ }
+
+ private void verifyStringParameter(JsonMapObject param, String name, String inType) {
+ assertEquals(name, param.getProperty("name"));
+ assertEquals(inType, param.getProperty("in"));
+ assertNull(param.getProperty("type"));
+ assertNull(param.getProperty("format"));
+ assertNotNull(param.getProperty("description"));
+ assertTrue(param.getBooleanProperty("required"));
+ JsonMapObject schema = param.getJsonMapProperty("schema");
+ assertEquals("password".equals(name) ? 2 : 1, schema.size());
+ assertEquals("string", schema.getProperty("type"));
+ }
+
+ private void verifyOrderIdParameter(JsonMapObject param, boolean minOnly) {
+ assertEquals("orderId", param.getProperty("name"));
+ assertEquals("path", param.getProperty("in"));
+ assertNull(param.getProperty("type"));
+ assertNull(param.getProperty("format"));
+ assertNotNull(param.getProperty("description"));
+ assertTrue(param.getBooleanProperty("required"));
+ JsonMapObject schema = param.getJsonMapProperty("schema");
+
+ assertEquals(minOnly ? 3 : 4, schema.size());
+ assertEquals("integer", schema.getProperty("type"));
+ assertNotNull(schema.getProperty("minimum"));
+ if (!minOnly) {
+ assertNotNull(schema.getProperty("maximum"));
+ }
+ }
+
+ private void verifyPetPathPost(JsonMapObject pet, OpenApiConfiguration cfg) {
+ JsonMapObject petPost = pet.getJsonMapProperty("post");
+ assertEquals(7, petPost.size());
+ testCommonVerbProps(petPost, "addPet");
+ assertNull(petPost.getProperty("parameters"));
+ if (cfg.isCreateRequestBodies()) {
+ verifyRequestBodyRef(petPost, "Pet");
+ } else {
+ JsonMapObject content = verifyRequestBodyContent(petPost);
+ assertEquals(2, content.size());
+ verifySimpleContent(content, "application/json", "Pet");
+ verifySimpleContent(content, "application/xml", "Pet");
+ }
+ JsonMapObject responses = petPost.getJsonMapProperty("responses");
+ assertEquals(1, responses.size());
+ assertNotNull(responses.getProperty("405"));
+ }
+ private JsonMapObject verifyRequestBodyContent(JsonMapObject json) {
+ return verifyRequestBodyContent(json, "requestBody");
+ }
+ private JsonMapObject verifyRequestBodyContent(JsonMapObject json, String propName) {
+ JsonMapObject requestBody = json.getJsonMapProperty(propName);
+ assertEquals(3, requestBody.size());
+ assertNotNull(requestBody.getProperty("description"));
+ assertTrue(requestBody.getBooleanProperty("required"));
+ return requestBody.getJsonMapProperty("content");
+ }
+ private void verifyRequestBodyRef(JsonMapObject json, String refName) {
+ JsonMapObject requestBody = json.getJsonMapProperty("requestBody");
+ assertEquals(1, requestBody.size());
+ assertEquals("#components/requestBodies/" + refName,
+ requestBody.getProperty("$ref"));
+ }
+
+ private void verifyPetPathPut(JsonMapObject pet, OpenApiConfiguration cfg) {
+ JsonMapObject petPut = pet.getJsonMapProperty("put");
+ assertEquals(7, petPut.size());
+ testCommonVerbProps(petPut, "updatePet");
+ assertNull(petPut.getProperty("parameters"));
+ if (cfg.isCreateRequestBodies()) {
+ verifyRequestBodyRef(petPut, "Pet");
+ } else {
+ JsonMapObject content = verifyRequestBodyContent(petPut);
+ assertEquals(2, content.size());
+ verifySimpleContent(content, "application/json", "Pet");
+ verifySimpleContent(content, "application/xml", "Pet");
+ }
+ JsonMapObject responses = petPut.getJsonMapProperty("responses");
+ assertEquals(3, responses.size());
+ assertNotNull(responses.getProperty("400"));
+ assertNotNull(responses.getProperty("404"));
+ assertNotNull(responses.getProperty("405"));
+ }
+
+
+ private void verifySimpleContent(JsonMapObject contentMap, String mediaType, String modelName) {
+ JsonMapObject content = contentMap.getJsonMapProperty(mediaType);
+ assertEquals(1, content.size());
+ JsonMapObject schema = content.getJsonMapProperty("schema");
+ assertEquals(1, schema.size());
+ assertEquals("#components/schemas/" + modelName, schema.getStringProperty("$ref"));
+ }
+ private void verifySimpleStringContent(JsonMapObject contentMap, String mediaType) {
+ JsonMapObject content = contentMap.getJsonMapProperty(mediaType);
+ assertEquals(1, content.size());
+ JsonMapObject schema = content.getJsonMapProperty("schema");
+ assertEquals(1, schema.size());
+ assertEquals("string", schema.getStringProperty("type"));
+ }
+ private void verifyMapContent(JsonMapObject contentMap, String mediaType, String type, String format) {
+ JsonMapObject content = contentMap.getJsonMapProperty(mediaType);
+ assertEquals(1, content.size());
+ JsonMapObject schema = content.getJsonMapProperty("schema");
+ assertEquals(2, schema.size());
+ assertEquals("object", schema.getStringProperty("type"));
+ JsonMapObject additionalProps = schema.getJsonMapProperty("additionalProperties");
+ assertEquals(type, additionalProps.getStringProperty("type"));
+ assertEquals(format, additionalProps.getStringProperty("format"));
+ }
+ private void verifyPetFormContent(JsonMapObject petPost,
+ String mediaType,
+ String firstPropName,
+ String secondPropName) {
+ JsonMapObject requestBody = petPost.getJsonMapProperty("requestBody");
+ assertEquals(1, requestBody.size());
+ JsonMapObject contentMap = requestBody.getJsonMapProperty("content");
+ assertEquals(1, contentMap.size());
+
+
+ JsonMapObject content = contentMap.getJsonMapProperty(mediaType);
+ assertEquals(1, content.size());
+ JsonMapObject schema = content.getJsonMapProperty("schema");
+ assertEquals(2, schema.size());
+ assertEquals("object", schema.getStringProperty("type"));
+ JsonMapObject props = schema.getJsonMapProperty("properties");
+ assertEquals(2, props.size());
+ JsonMapObject firstProp = props.getJsonMapProperty(firstPropName);
+ assertNotNull(firstProp.getProperty("description"));
+ assertEquals("string", firstProp.getProperty("type"));
+ JsonMapObject secondProp = props.getJsonMapProperty(secondPropName);
+ assertNotNull(secondProp.getProperty("description"));
+ assertEquals("string", secondProp.getProperty("type"));
+ if ("file".equals(secondPropName)) {
+ assertEquals("binary", secondProp.getProperty("format"));
+ }
+ }
+ private void verifyArrayContent(JsonMapObject contentMap, String mediaType, String modelName) {
+ JsonMapObject content = contentMap.getJsonMapProperty(mediaType);
+ assertEquals(1, content.size());
+ JsonMapObject schema = content.getJsonMapProperty("schema");
+ assertEquals(2, schema.size());
+ assertEquals("array", schema.getStringProperty("type"));
+ JsonMapObject items = schema.getJsonMapProperty("items");
+ assertEquals(1, items.size());
+ assertEquals("#components/schemas/" + modelName, items.getStringProperty("$ref"));
+ }
+
+ private void verifyServersProperty(JsonMapObject sw3) {
+ List<Map<String, Object>> servers = sw3.getListMapProperty("servers");
+ assertEquals(1, servers.size());
+ JsonMapObject server = new JsonMapObject(servers.get(0));
+ assertEquals(1, server.size());
+ assertEquals("http://petstore.swagger.io/v2", server.getStringProperty("url"));
+ }
+
+ private void verifyInfoProperty(JsonMapObject sw3) {
+ //TODO: check info properties as well, though it's only copied from the original doc
+ assertNotNull(sw3.getJsonMapProperty("info"));
+ }
+
+ private void verifyTagsProperty(JsonMapObject sw3) {
+ //TODO: check info properties as well, though it's only copied from the original doc
+ assertNotNull(sw3.getListMapProperty("tags"));
+ }
+
+ private void verifyComponentsProperty(JsonMapObject sw3, OpenApiConfiguration cfg) {
+ JsonMapObject comps = sw3.getJsonMapProperty("components");
+ assertEquals(3, comps.size());
+ JsonMapObject requestBodies = comps.getJsonMapProperty("requestBodies");
+ if (cfg.isCreateRequestBodies()) {
+ assertEquals(4, requestBodies.size());
+ // UserArray
+ JsonMapObject userArrayContent = verifyRequestBodyContent(requestBodies, "UserArray");
+ assertEquals(1, userArrayContent.size());
+ verifyArrayContent(userArrayContent, "application/json", "User");
+ // Pet
+ JsonMapObject petContent = verifyRequestBodyContent(requestBodies, "Pet");
+ assertEquals(2, petContent.size());
+ verifySimpleContent(petContent, "application/json", "Pet");
+ verifySimpleContent(petContent, "application/xml", "Pet");
+ // User
+ JsonMapObject userContent = verifyRequestBodyContent(requestBodies, "User");
+ assertEquals(1, userContent.size());
+ verifySimpleContent(userContent, "application/json", "User");
+ // Order
+ JsonMapObject orderContent = verifyRequestBodyContent(requestBodies, "Order");
+ assertEquals(1, orderContent.size());
+ verifySimpleContent(orderContent, "application/json", "Order");
+ } else {
+ assertEquals(0, requestBodies.size());
+ }
+ assertNotNull(comps.getJsonMapProperty("schemas"));
+ assertNotNull(comps.getJsonMapProperty("securitySchemes"));
+
+ }
+
+ private void testCommonVerbProps(JsonMapObject method, String opId) {
+ testCommonVerbPropsExceptSec(method, opId);
+ assertNotNull(method.getProperty("security"));
+ }
+ private void testCommonVerbPropsExceptSec(JsonMapObject method, String opId) {
+ assertNotNull(method.getProperty("tags"));
+ assertNotNull(method.getProperty("summary"));
+ assertNotNull(method.getProperty("description"));
+ assertEquals(opId, method.getStringProperty("operationId"));
+ assertNull(method.getProperty("produces"));
+ assertNull(method.getProperty("consumes"));
+
+ }
+}
--
To stop receiving notification emails like this one, please contact
"commits@cxf.apache.org" <co...@cxf.apache.org>.
[cxf] 01/02: [CXF-7525] Adapting swagger to open api conversion
code for 3.1.x
Posted by se...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
sergeyb pushed a commit to branch 3.1.x-fixes
in repository https://gitbox.apache.org/repos/asf/cxf.git
commit 8f95084efc3258e8697f8206f68a3206535fb008
Author: Sergey Beryozkin <sb...@gmail.com>
AuthorDate: Tue Dec 12 16:46:40 2017 +0000
[CXF-7525] Adapting swagger to open api conversion code for 3.1.x
---
.../apache/cxf/jaxrs/json/basic/JsonMapObject.java | 26 ++++++++++++++++++++++
1 file changed, 26 insertions(+)
diff --git a/rt/rs/extensions/json-basic/src/main/java/org/apache/cxf/jaxrs/json/basic/JsonMapObject.java b/rt/rs/extensions/json-basic/src/main/java/org/apache/cxf/jaxrs/json/basic/JsonMapObject.java
index 0783c5c..84f916c 100644
--- a/rt/rs/extensions/json-basic/src/main/java/org/apache/cxf/jaxrs/json/basic/JsonMapObject.java
+++ b/rt/rs/extensions/json-basic/src/main/java/org/apache/cxf/jaxrs/json/basic/JsonMapObject.java
@@ -48,6 +48,9 @@ public class JsonMapObject implements Serializable {
count = count == null ? 2 : count++;
updateCount.put(name, count);
}
+ if (value instanceof JsonMapObject) {
+ value = ((JsonMapObject)value).asMap();
+ }
values.put(name, value);
}
@@ -68,6 +71,14 @@ public class JsonMapObject implements Serializable {
}
}
+ public JsonMapObject getJsonMapProperty(String name) {
+ Map<String, Object> value = getMapProperty(name);
+ if (value != null) {
+ return new JsonMapObject(value);
+ }
+ return null;
+ }
+
public Map<String, Object> asMap() {
return values;
}
@@ -111,6 +122,16 @@ public class JsonMapObject implements Serializable {
return null;
}
}
+
+ public List<Map<String, Object>> getListMapProperty(String name) {
+ Object value = getProperty(name);
+ List<Map<String, Object>> list = null;
+ if (value != null) {
+ list = CastUtils.cast((List<?>)value);
+ }
+ return list;
+ }
+
public int hashCode() {
return values.hashCode();
}
@@ -118,6 +139,11 @@ public class JsonMapObject implements Serializable {
public boolean equals(Object obj) {
return obj instanceof JsonMapObject && ((JsonMapObject)obj).values.equals(this.values);
}
+
+ public int size() {
+ return values.size();
+ }
+
public Map<String, Object> getUpdateCount() {
return updateCount == null ? null : Collections.<String, Object>unmodifiableMap(updateCount);
}
--
To stop receiving notification emails like this one, please contact
"commits@cxf.apache.org" <co...@cxf.apache.org>.