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 <[email protected]>
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
"[email protected]" <[email protected]>.

Reply via email to