Generated AAI Swagger file has schema violations
[aai/schema-service.git] / aai-schema-gen / src / main / java / org / onap / aai / schemagen / genxsd / YAMLfromOXM.java
index 0ec95e9..55767c3 100644 (file)
@@ -7,9 +7,9 @@
  * Licensed 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
- *
+ * <p>
  * http://www.apache.org/licenses/LICENSE-2.0
- *
+ * <p>
  * 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.
  * limitations under the License.
  * ============LICENSE_END=========================================================
  */
+
 package org.onap.aai.schemagen.genxsd;
 
 import com.google.common.collect.Multimap;
+
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.nio.charset.Charset;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.HashMap;
+import java.util.LinkedHashSet;
+import java.util.Map;
+import java.util.Set;
+import java.util.SortedSet;
+import java.util.StringTokenizer;
+import java.util.TreeMap;
+import java.util.TreeSet;
+import java.util.Vector;
+
+import javax.xml.parsers.ParserConfigurationException;
+
 import org.apache.commons.lang3.StringUtils;
 import org.onap.aai.edges.EdgeIngestor;
 import org.onap.aai.edges.EdgeRule;
 import org.onap.aai.edges.EdgeRuleQuery;
 import org.onap.aai.edges.exceptions.EdgeRuleNotFoundException;
 import org.onap.aai.nodes.NodeIngestor;
+import org.onap.aai.setup.SchemaConfigVersions;
 import org.onap.aai.setup.SchemaVersion;
-import org.onap.aai.setup.SchemaVersions;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.w3c.dom.Element;
 import org.w3c.dom.NodeList;
 import org.xml.sax.SAXException;
 
-import javax.xml.parsers.ParserConfigurationException;
-import java.io.BufferedWriter;
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.nio.charset.Charset;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-import java.util.*;
-
 public class YAMLfromOXM extends OxmFileProcessor {
     private static final Logger logger = LoggerFactory.getLogger("YAMLfromOXM.class");
     // private static StringBuffer totalPathSbAccumulator = new StringBuffer();
@@ -60,9 +72,9 @@ public class YAMLfromOXM extends OxmFileProcessor {
 
     private String basePath;
 
-    public YAMLfromOXM(String basePath, SchemaVersions schemaVersions, NodeIngestor ni,
+    public YAMLfromOXM(String basePath, SchemaConfigVersions schemaConfigVersions, NodeIngestor ni,
         EdgeIngestor ei) {
-        super(schemaVersions, ni, ei);
+        super(schemaConfigVersions, ni, ei);
         this.basePath = basePath;
     }
 
@@ -80,26 +92,59 @@ public class YAMLfromOXM extends OxmFileProcessor {
 
     @Override
     public String getDocumentHeader() {
-        StringBuffer sb = new StringBuffer();
-        sb.append("swagger: \"2.0\"\ninfo:" + LINE_SEPARATOR + "  ");
+        StringBuilder sb = new StringBuilder();
+        sb.append("#").append(LINE_SEPARATOR).append(
+            "# ============LICENSE_START=======================================================")
+            .append(LINE_SEPARATOR).append("# org.onap.aai").append(LINE_SEPARATOR)
+            .append(
+                "# ================================================================================")
+            .append(LINE_SEPARATOR)
+            .append("# Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved.")
+            .append(LINE_SEPARATOR)
+            .append(
+                "# ================================================================================")
+            .append(LINE_SEPARATOR)
+            .append(
+                "# Licensed under the Creative Commons License, Attribution 4.0 Intl. (the \"License\");")
+            .append(LINE_SEPARATOR)
+            .append("# you may not use this file except in compliance with the License.")
+            .append(LINE_SEPARATOR).append("# You may obtain a copy of the License at")
+            .append(LINE_SEPARATOR).append("# <p>").append(LINE_SEPARATOR)
+            .append("# https://creativecommons.org/licenses/by/4.0/").append(LINE_SEPARATOR)
+            .append("# <p>").append(LINE_SEPARATOR)
+            .append("# Unless required by applicable law or agreed to in writing, software")
+            .append(LINE_SEPARATOR)
+            .append("# distributed under the License is distributed on an \"AS IS\" BASIS,")
+            .append(LINE_SEPARATOR)
+            .append("# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.")
+            .append(LINE_SEPARATOR)
+            .append("# See the License for the specific language governing permissions and")
+            .append(LINE_SEPARATOR).append("# limitations under the License.")
+            .append(LINE_SEPARATOR)
+            .append(
+                "# ============LICENSE_END=========================================================")
+            .append(LINE_SEPARATOR).append("#").append(LINE_SEPARATOR).append(LINE_SEPARATOR);
+        sb.append("swagger: \"2.0\"\ninfo:").append(LINE_SEPARATOR).append("  ");
         sb.append("description: |");
         if (versionSupportsSwaggerDiff(v.toString())) {
-            sb.append("\n\n    [Differences versus the previous schema version]("
-                    + "apidocs" + basePath + "/aai_swagger_" + v.toString() + ".diff)");
+            sb.append("\n    [Differences versus the previous schema version](" + "apidocs"
+                + basePath + "/aai_swagger_" + v.toString() + ".diff)");
         }
+        sb.append(DOUBLE_LINE_SEPARATOR)
+            .append("    This document is best viewed with Firefox or Chrome. ");
         sb.append(
-                DOUBLE_LINE_SEPARATOR + "    Copyright &copy; 2017-18 AT&amp;T Intellectual Property. All rights reserved." + OxmFileProcessor.DOUBLE_LINE_SEPARATOR + "    Licensed under the Creative Commons License, Attribution 4.0 Intl. (the &quot;License&quot;); you may not use this documentation except in compliance with the License." + DOUBLE_LINE_SEPARATOR + "    You may obtain a copy of the License at\n\n    (https://creativecommons.org/licenses/by/4.0/)" + DOUBLE_LINE_SEPARATOR + "    Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an &quot;AS IS&quot; 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." + OxmFileProcessor.DOUBLE_LINE_SEPARATOR + "    This document is best viewed with Firefox or Chrome. ");
-        sb.append(
-                "Nodes can be found by opening the models link below and finding the node-type. ");
-        sb.append(
-                "Edge definitions can be found with the node definitions." + LINE_SEPARATOR + "  version: \""
-                    + v.toString() + "\"" + LINE_SEPARATOR );
-        sb.append("  title: Active and Available Inventory REST API" + LINE_SEPARATOR);
-        sb.append(
-            "  license:" + LINE_SEPARATOR + "    name: Apache 2.0\n    url: http://www.apache.org/licenses/LICENSE-2.0.html" + LINE_SEPARATOR);
-        sb.append("  contact:" + LINE_SEPARATOR + "    name: n/a" + LINE_SEPARATOR + "    url: n/a" + LINE_SEPARATOR + "    email: n/a" + LINE_SEPARATOR);
-        sb.append("host: n/a" + LINE_SEPARATOR + "basePath: " + basePath + "/" + v.toString() + LINE_SEPARATOR);
-        sb.append("schemes:" + LINE_SEPARATOR + "  - https\npaths:" + LINE_SEPARATOR);
+            "Nodes can be found by opening the models link below and finding the node-type. ");
+        sb.append("Edge definitions can be found with the node definitions.").append(LINE_SEPARATOR)
+            .append("  version: \"").append(v.toString()).append("\"").append(LINE_SEPARATOR);
+        sb.append("  title: Active and Available Inventory REST API").append(LINE_SEPARATOR);
+        sb.append("  license:").append(LINE_SEPARATOR)
+            .append(
+                "    name: Apache 2.0\n    url: http://www.apache.org/licenses/LICENSE-2.0.html")
+            .append(LINE_SEPARATOR);
+        sb.append("host: localhost").append(LINE_SEPARATOR).append("basePath: ").append(basePath)
+            .append("/").append(v.toString()).append(LINE_SEPARATOR);
+        sb.append("schemes:").append(LINE_SEPARATOR).append("  - https\npaths:")
+            .append(LINE_SEPARATOR);
         return sb.toString();
     }
 
@@ -111,8 +156,8 @@ public class YAMLfromOXM extends OxmFileProcessor {
     @Override
     public String process() throws ParserConfigurationException, SAXException, IOException,
         FileNotFoundException, EdgeRuleNotFoundException {
-        StringBuffer sb = new StringBuffer();
-        StringBuffer pathSb = new StringBuffer();
+        StringBuilder sb = new StringBuilder();
+        StringBuilder pathSb = new StringBuilder();
         try {
             init();
         } catch (Exception e) {
@@ -120,10 +165,10 @@ public class YAMLfromOXM extends OxmFileProcessor {
             throw e;
         }
         pathSb.append(getDocumentHeader());
-        StringBuffer definitionsSb = new StringBuffer();
+        StringBuilder definitionsSb = new StringBuilder();
         Element elem;
         String javaTypeName;
-        combinedJavaTypes = new HashMap();
+        combinedJavaTypes = new HashMap<>();
         for (int i = 0; i < javaTypeNodes.getLength(); ++i) {
             elem = (Element) javaTypeNodes.item(i);
             javaTypeName = elem.getAttribute("name");
@@ -170,7 +215,7 @@ public class YAMLfromOXM extends OxmFileProcessor {
         if (inventoryDefSb != null) {
             javaTypeDefinitions.put("inventory", inventoryDefSb.toString());
         }
-        StringBuffer sb = new StringBuffer("definitions:\n");
+        StringBuilder sb = new StringBuilder("definitions:\n");
         Map<String, String> sortedJavaTypeDefinitions =
             new TreeMap<String, String>(javaTypeDefinitions);
         for (Map.Entry<String, String> entry : sortedJavaTypeDefinitions.entrySet()) {
@@ -184,14 +229,14 @@ public class YAMLfromOXM extends OxmFileProcessor {
                 continue;
             }
             logger.debug(
-                "Key: " + entry.getKey() + "Test: " + (entry.getKey() == "relationship-dict"));
+                "Key: " + entry.getKey() + "Test: " + ("relationship-dict".equals(entry.getKey())));
             if (entry.getKey().matches("relationship-dict")) {
                 String jb = entry.getValue();
                 logger.debug("Value: " + jb);
                 int ndx = jb.indexOf("related-to-property:");
                 if (ndx > 0) {
                     jb = jb.substring(0, ndx);
-                    jb = jb.replaceAll(" +$", "");
+                    jb = StringUtils.stripEnd(jb, " ");
                 }
                 logger.debug("Value-after: " + jb);
                 sb.append(jb);
@@ -203,22 +248,22 @@ public class YAMLfromOXM extends OxmFileProcessor {
     }
 
     private String getDictionary(String resource) {
-        StringBuffer dictSb = new StringBuffer();
-        dictSb.append("  " + resource + ":\n");
+        StringBuilder dictSb = new StringBuilder();
+        dictSb.append("  ").append(resource).append(":\n");
         dictSb.append("    description: |\n");
-        dictSb.append("      dictionary of " + resource + "\n");
+        dictSb.append("      dictionary of ").append(resource).append("\n");
         dictSb.append("    type: object\n");
         dictSb.append("    properties:\n");
-        dictSb.append("      " + resource + ":\n");
+        dictSb.append("      ").append(resource).append(":\n");
         dictSb.append("        type: array\n");
         dictSb.append("        items:\n");
-        dictSb.append("          $ref: \"#/definitions/" + resource + "-dict\"\n");
+        dictSb.append("          $ref: \"#/definitions/").append(resource).append("-dict\"\n");
         return dictSb.toString();
     }
 
     private String processJavaTypeElementSwagger(String javaTypeName, Element javaTypeElement,
-        StringBuffer pathSb, StringBuffer definitionsSb, String path, String tag, String opId,
-        String getItemName, StringBuffer pathParams, String validEdges) {
+        StringBuilder pathSb, StringBuilder definitionsSb, String path, String tag, String opId,
+        String getItemName, StringBuilder pathParams, String validEdges) {
 
         String xmlRootElementName = getXMLRootElementName(javaTypeElement);
         StringBuilder definitionsLocalSb = new StringBuilder(256);
@@ -228,15 +273,15 @@ public class YAMLfromOXM extends OxmFileProcessor {
         String useOpId = null;
         logger.debug("tag=" + tag);
         if (tag != null) {
-         // set ignore to true to skip Actions and Search
+            // set ignore to true to skip Actions and Search
             boolean topCheck = checkTopLevel(tag, true);
             if (!topCheck) {
                 return null;
             }
         }
 
-        if (!javaTypeName.equals("Inventory")) {
-            if (javaTypeName.equals("AaiInternal")) {
+        if (!"Inventory".equals(javaTypeName)) {
+            if ("AaiInternal".equals(javaTypeName)) {
                 return null;
             }
             if (opId == null) {
@@ -248,11 +293,11 @@ public class YAMLfromOXM extends OxmFileProcessor {
                 useTag = javaTypeName;
             }
         }
-        path = xmlRootElementName.equals("inventory") ? ""
+        path = "inventory".equals(xmlRootElementName) ? ""
             : (path == null) ? "/" + xmlRootElementName : path + "/" + xmlRootElementName;
         XSDJavaType javaType = new XSDJavaType(javaTypeElement);
         if (getItemName != null) {
-            if (getItemName.equals("array")) {
+            if ("array".equals(getItemName)) {
                 return javaType.getArrayType();
             } else {
                 return javaType.getItemName();
@@ -278,15 +323,17 @@ public class YAMLfromOXM extends OxmFileProcessor {
         Element parentElement = (Element) parentNodes.item(0);
         NodeList xmlElementNodes = parentElement.getElementsByTagName("xml-element");
 
-        StringBuffer sbParameters = new StringBuffer();
-        StringBuffer sbPathParameters = new StringBuffer(); // separate naming path parameters from name of parameter in the schema
-        StringBuffer sbRequired = new StringBuffer();
-        
+        StringBuilder sbParameters = new StringBuilder();
+        StringBuilder sbPathParameters = new StringBuilder(); // separate naming path parameters
+                                                              // from name of parameter in the
+                                                              // schema
+        StringBuilder sbRequired = new StringBuilder();
+
         int requiredCnt = 0;
         int propertyCnt = 0;
-        StringBuffer sbProperties = new StringBuffer();
+        StringBuilder sbProperties = new StringBuilder();
         int patchPropertyCnt = 0; // manage payload properties separately for patch
-        StringBuffer sbPropertiesPatch = new StringBuffer();
+        StringBuilder sbPropertiesPatch = new StringBuilder();
 
         if (appliedPaths.containsKey(path)) {
             return null;
@@ -299,7 +346,7 @@ public class YAMLfromOXM extends OxmFileProcessor {
                 + appliedPaths.containsKey(path));
             appliedPaths.put(path, xmlRootElementName);
         }
-        
+
         Vector<String> addTypeV = null;
         String modifiedName;
         String replaceDescription;
@@ -312,12 +359,13 @@ public class YAMLfromOXM extends OxmFileProcessor {
             if (getItemName == null) {
                 addTypeV = xmlElementElement.getAddTypes(v.toString());
             }
-            // use alternate name for parameter if already in the path string 
+            // use alternate name for parameter if already in the path string
             modifiedName = "/{" + xmlElementElement.getAttribute("name") + "}";
-            if ( path.contains(modifiedName)) {
-               modifiedName = path.substring(path.lastIndexOf('/')+1) + "." + xmlElementElement.getAttribute("name");
+            if (path.contains(modifiedName)) {
+                modifiedName = path.substring(path.lastIndexOf('/') + 1) + "."
+                    + xmlElementElement.getAttribute("name");
             } else {
-               modifiedName = xmlElementElement.getAttribute("name");
+                modifiedName = xmlElementElement.getAttribute("name");
             }
             if ("true".equals(xmlElementElement.getAttribute("xml-key"))) {
                 path += "/{" + modifiedName + "}";
@@ -328,19 +376,21 @@ public class YAMLfromOXM extends OxmFileProcessor {
 
             if ("true".equals(xmlElementElement.getAttribute("xml-key"))) {
                 sbParameters.append(xmlElementElement.getPathParamYAML(elementDescription));
-                sbPathParameters.append(xmlElementElement.getPathParamYAML(elementDescription, modifiedName));
+                sbPathParameters
+                    .append(xmlElementElement.getPathParamYAML(elementDescription, modifiedName));
             }
-            if (("true").equals(xmlElementElement.getAttribute("required"))) {
+            if ("true".equals(xmlElementElement.getAttribute("required"))) {
                 if (requiredCnt == 0) {
                     sbRequired.append("    required:\n");
                 }
                 ++requiredCnt;
                 if (addTypeV == null || addTypeV.isEmpty()) {
-                    sbRequired.append("    - " + xmlElementElement.getAttribute("name") + "\n");
+                    sbRequired.append("    - ").append(xmlElementElement.getAttribute("name"))
+                        .append("\n");
                 } else {
                     for (int k = 0; k < addTypeV.size(); ++k) {
-                        sbRequired.append(
-                            "    - " + getXmlRootElementName(addTypeV.elementAt(k)) + ":\n");
+                        sbRequired.append("    - ")
+                            .append(getXmlRootElementName(addTypeV.elementAt(k))).append(":\n");
                     }
                 }
             }
@@ -350,16 +400,17 @@ public class YAMLfromOXM extends OxmFileProcessor {
                 GetOperation.addContainerProps(container, containerProps);
             }
             if (xmlElementElement.isStandardType()) {
-               boolean isDslStartNode = dslStartNodeProps.contains(xmlElementElement.getAttribute("name"));
+                boolean isDslStartNode =
+                    dslStartNodeProps.contains(xmlElementElement.getAttribute("name"));
                 sbProperties.append(xmlElementElement.getTypePropertyYAML(isDslStartNode));
-                if ( !"resource-version".equals(xmlElementElement.getAttribute("name"))) {
-                       sbPropertiesPatch.append(xmlElementElement.getTypePropertyYAML(isDslStartNode));
-                       ++patchPropertyCnt;
+                if (!"resource-version".equals(xmlElementElement.getAttribute("name"))) {
+                    sbPropertiesPatch.append(xmlElementElement.getTypePropertyYAML(isDslStartNode));
+                    ++patchPropertyCnt;
                 }
                 ++propertyCnt;
             }
 
-            StringBuffer newPathParams = new StringBuffer(
+            StringBuilder newPathParams = new StringBuilder(
                 (pathParams == null ? "" : pathParams.toString()) + sbPathParameters.toString());
             String useName;
             for (int k = 0; addTypeV != null && k < addTypeV.size(); ++k) {
@@ -383,27 +434,31 @@ public class YAMLfromOXM extends OxmFileProcessor {
 
                     } else if (getItemName == null) {
                         ++propertyCnt;
-                        sbProperties.append("      " + getXmlRootElementName(addType) + ":\n");
-                        if ( "RelationshipList".equals(addType)) {
+                        sbProperties.append("      ").append(getXmlRootElementName(addType))
+                            .append(":\n");
+                        if ("RelationshipList".equals(addType)) {
                             sbProperties.append("        type: object\n");
-                            sbProperties.append("        $ref: \"#/definitions/"
-                                + itemName + "\"\n");
-                            sbPropertiesPatch.append("      " + getXmlRootElementName(addType) + ":\n");
+                            sbProperties.append("        $ref: \"#/definitions/").append(itemName)
+                                .append("\"\n");
+                            sbPropertiesPatch.append("      ")
+                                .append(getXmlRootElementName(addType)).append(":\n");
                             sbPropertiesPatch.append("        type: object\n");
-                            sbPropertiesPatch.append("        $ref: \"#/definitions/"
-                                + itemName + "\"\n");
+                            sbPropertiesPatch.append("        $ref: \"#/definitions/")
+                                .append(itemName).append("\"\n");
                             ++patchPropertyCnt;
                         } else {
-                               if ( "relationship".equals(itemName) ) {
-                                       System.out.println(v + "-relationship added as array for getItemName null");
-                               }
-                               sbProperties.append("        type: array\n        items:\n");
-                               sbProperties.append("          $ref: \"#/definitions/"
-                            + (itemName == "" ? "inventory-item-data" : itemName) + "\"\n");
+                            if ("relationship".equals(itemName)) {
+                                System.out.println(
+                                    v + "-relationship added as array for getItemName null");
+                            }
+                            sbProperties.append("        type: array\n        items:\n");
+                            sbProperties.append("          $ref: \"#/definitions/")
+                                .append("".equals(itemName) ? "inventory-item-data" : itemName)
+                                .append("\"\n");
                         }
                         if (StringUtils.isNotEmpty(elementDescription)) {
-                            sbProperties
-                                .append("        description: " + elementDescription + "\n");
+                            sbProperties.append("        description: ").append(elementDescription)
+                                .append("\n");
                         }
                     }
                 } else {
@@ -411,43 +466,43 @@ public class YAMLfromOXM extends OxmFileProcessor {
                         .equals(xmlElementElement.getAttribute("container-type"))) {
                         // need properties for getXmlRootElementName(addType)
                         namespaceFilter.add(getXmlRootElementName(addType));
-                        newPathParams =
-                            new StringBuffer((pathParams == null ? "" : pathParams.toString())
-                                + sbParameters.toString());
+                        newPathParams = new StringBuilder(
+                            (pathParams == null ? "" : pathParams.toString()) + sbParameters);
                         processJavaTypeElementSwagger(addType, getJavaTypeElementSwagger(addType),
                             pathSb, definitionsSb, path, tag == null ? useTag : tag, useOpId, null,
                             newPathParams, validEdges);
                         useName = getXmlRootElementName(addType);
-                        sbProperties.append("      " + useName + ":\n");
-                        if ( "relationship".equals(useName)) {
+                        sbProperties.append("      ").append(useName).append(":\n");
+                        if ("relationship".equals(useName)) {
                             sbProperties.append("        type: object\n");
                             sbProperties.append("        $ref: \"#/definitions/relationship\"\n");
                             sbPropertiesPatch.append("        type: object\n");
-                            sbPropertiesPatch.append("        $ref: \"#/definitions/relationship\"\n");
+                            sbPropertiesPatch
+                                .append("        $ref: \"#/definitions/relationship\"\n");
                             ++patchPropertyCnt;
                         } else {
-                                   sbProperties.append("        type: array\n        items:          \n");
-                                   sbProperties.append("          $ref: \"#/definitions/"
-                                       + getXmlRootElementName(addType) + "\"\n");
-                                   if (StringUtils.isNotEmpty(elementDescription)) {
-                                       sbProperties
-                                           .append("        description: " + elementDescription + "\n");
-                                   }
+                            sbProperties.append("        type: array\n        items:          \n");
+                            sbProperties.append("          $ref: \"#/definitions/"
+                                + getXmlRootElementName(addType) + "\"\n");
+                            if (StringUtils.isNotEmpty(elementDescription)) {
+                                sbProperties.append("        description: ")
+                                    .append(elementDescription).append("\n");
+                            }
                         }
 
                     } else {
                         // Make sure certain types added to the filter don't appear
-                        if (nodeFilter.contains(getXmlRootElementName(addType))) {
-                            ;
-                        } else {
-                            sbProperties.append("      " + getXmlRootElementName(addType) + ":\n");
+                        if (!nodeFilter.contains(getXmlRootElementName(addType))) {
+                            sbProperties.append("      ").append(getXmlRootElementName(addType))
+                                .append(":\n");
                             sbProperties.append("        type: object\n");
-                            sbProperties.append("        $ref: \"#/definitions/"
-                                + getXmlRootElementName(addType) + "\"\n");
+                            sbProperties.append("        $ref: \"#/definitions/")
+                                .append(getXmlRootElementName(addType)).append("\"\n");
                         }
                     }
                     if (StringUtils.isNotEmpty(elementDescription)) {
-                        sbProperties.append("        description: " + elementDescription + "\n");
+                        sbProperties.append("        description: ").append(elementDescription)
+                            .append("\n");
                     }
                     ++propertyCnt;
                 }
@@ -456,27 +511,27 @@ public class YAMLfromOXM extends OxmFileProcessor {
 
         if (sbParameters.toString().length() > 0) {
             if (pathParams == null) {
-                pathParams = new StringBuffer();
+                pathParams = new StringBuilder();
             }
             pathParams.append(sbPathParameters);
         }
         GetOperation get = new GetOperation(useOpId, xmlRootElementName, tag, path,
             pathParams == null ? "" : pathParams.toString());
-        pathSb.append(get.toString());
+        pathSb.append(get);
         logger.debug("opId vs useOpId:" + opId + " vs " + useOpId + " PathParams=" + pathParams);
         // add PUT
         PutOperation put = new PutOperation(useOpId, xmlRootElementName, tag, path,
             pathParams == null ? "" : pathParams.toString(), this.v, this.basePath);
-        pathSb.append(put.toString());
+        pathSb.append(put);
         // add PATCH
         PatchOperation patch = new PatchOperation(useOpId, xmlRootElementName, tag, path,
             pathParams == null ? "" : pathParams.toString(), this.v, this.basePath);
         patch.setPrefixForPatchRef(patchDefinePrefix);
-        pathSb.append(patch.toString());
+        pathSb.append(patch);
         // add DELETE
         DeleteOperation del = new DeleteOperation(useOpId, xmlRootElementName, tag, path,
             pathParams == null ? "" : pathParams.toString());
-        pathSb.append(del.toString());
+        pathSb.append(del);
         if (generatedJavaType.containsKey(xmlRootElementName)) {
             logger.debug("xmlRootElementName(1)=" + xmlRootElementName);
             return null;
@@ -489,8 +544,8 @@ public class YAMLfromOXM extends OxmFileProcessor {
             processingInventoryDef = true;
             if (inventoryDefSb == null) {
                 inventoryDefSb = new StringBuilder();
-                definitionsSb.append("  " + xmlRootElementName + ":\n");
-                definitionsLocalSb.append("  " + xmlRootElementName + ":\n");
+                definitionsSb.append("  ").append(xmlRootElementName).append(":\n");
+                definitionsLocalSb.append("  ").append(xmlRootElementName).append(":\n");
                 definitionsLocalSb.append("    properties:\n");
             }
         } else if (xmlRootElementName.equals("relationship")) {
@@ -498,15 +553,15 @@ public class YAMLfromOXM extends OxmFileProcessor {
             definitionsLocalSb.append("  " + "relationship-dict" + ":\n");
             dict = getDictionary(xmlRootElementName);
         } else {
-            definitionsSb.append("  " + xmlRootElementName + ":\n");
-            definitionsLocalSb.append("  " + xmlRootElementName + ":\n");
+            definitionsSb.append("  ").append(xmlRootElementName).append(":\n");
+            definitionsLocalSb.append("  ").append(xmlRootElementName).append(":\n");
         }
         // Collection<EdgeDescription> edges = edgeRuleSet.getEdgeRules(xmlRootElementName );
         DeleteFootnoteSet footnotes = new DeleteFootnoteSet(xmlRootElementName);
-        StringBuffer sbEdge = new StringBuffer();
+        StringBuilder sbEdge = new StringBuilder();
         LinkedHashSet<String> preventDelete = new LinkedHashSet<String>();
         String prevent = null;
-        String nodeCaption = new String("      ###### Related Nodes\n");
+        String nodeCaption = "      ###### Related Nodes\n";
         try {
             EdgeRuleQuery q =
                 new EdgeRuleQuery.Builder(xmlRootElementName).version(v).fromOnly().build();
@@ -518,17 +573,17 @@ public class YAMLfromOXM extends OxmFileProcessor {
                 results.get(key).stream()
                     .filter((i) -> (i.getFrom().equals(xmlRootElementName) && (!i.isPrivateEdge())))
                     .forEach((i) -> {
-                        logger.info(new String(new StringBuffer("      - TO ").append(i.getTo())
+                        logger.info(new String(new StringBuilder("      - TO ").append(i.getTo())
                             .append(i.getDirection().toString()).append(i.getContains())));
                     });
                 results.get(key).stream()
                     .filter((i) -> (i.getFrom().equals(xmlRootElementName) && (!i.isPrivateEdge())))
                     .forEach((i) -> {
-                        sbEdge.append("      - TO " + i.getTo());
+                        sbEdge.append("      - TO ").append(i.getTo());
                         EdgeDescription ed = new EdgeDescription(i);
                         String footnote = ed.getAlsoDeleteFootnote(xmlRootElementName);
-                        sbEdge.append(ed.getRelationshipDescription("TO", xmlRootElementName)
-                            + footnote + "\n");
+                        sbEdge.append(ed.getRelationshipDescription("TO", xmlRootElementName))
+                            .append(footnote).append("\n");
                         if (StringUtils.isNotEmpty(footnote)) {
                             footnotes.add(footnote);
                         }
@@ -553,11 +608,11 @@ public class YAMLfromOXM extends OxmFileProcessor {
                 results.get(key).stream()
                     .filter((i) -> (i.getTo().equals(xmlRootElementName) && (!i.isPrivateEdge())))
                     .forEach((i) -> {
-                        sbEdge.append("      - FROM " + i.getFrom());
+                        sbEdge.append("      - FROM ").append(i.getFrom());
                         EdgeDescription ed = new EdgeDescription(i);
                         String footnote = ed.getAlsoDeleteFootnote(xmlRootElementName);
-                        sbEdge.append(ed.getRelationshipDescription("FROM", xmlRootElementName)
-                            + footnote + "\n");
+                        sbEdge.append(ed.getRelationshipDescription("FROM", xmlRootElementName))
+                            .append(footnote).append("\n");
                         if (StringUtils.isNotEmpty(footnote)) {
                             footnotes.add(footnote);
                         }
@@ -565,8 +620,9 @@ public class YAMLfromOXM extends OxmFileProcessor {
                 results.get(key).stream()
                     .filter((i) -> (i.getTo().equals(xmlRootElementName) && (!i.isPrivateEdge())))
                     .forEach((i) -> {
-                        logger.info(new String(new StringBuffer("      - FROM ").append(i.getFrom())
-                            .append(i.getDirection().toString()).append(i.getContains())));
+                        logger
+                            .info(new String(new StringBuilder("      - FROM ").append(i.getFrom())
+                                .append(i.getDirection().toString()).append(i.getContains())));
                     });
                 results.get(key).stream()
                     .filter((i) -> (i.getTo().equals(xmlRootElementName)
@@ -599,25 +655,28 @@ public class YAMLfromOXM extends OxmFileProcessor {
             definitionsLocalSb.append("    description: |\n");
 
             if (pathDescriptionProperty != null) {
-                definitionsSb.append("      " + pathDescriptionProperty + "\n");
-                definitionsLocalSb.append("      " + pathDescriptionProperty + "\n");    
+                definitionsSb.append("      ").append(pathDescriptionProperty).append("\n");
+                definitionsLocalSb.append("      ").append(pathDescriptionProperty).append("\n");
             }
-            if (StringUtils.isNotEmpty(validEdges) ) {
-                   definitionsSb.append(validEdges);
-                   definitionsLocalSb.append(validEdges);
+            if (StringUtils.isNotEmpty(validEdges)) {
+                definitionsSb.append(validEdges);
+                definitionsLocalSb.append(validEdges);
             }
         }
-        if ( patchPropertyCnt > 0 ) {
-               definitionsLocalPatchSb.append("  " + patchDefinePrefix + xmlRootElementName + ":\n");
-               if (StringUtils.isNotEmpty(pathDescriptionProperty) || StringUtils.isNotEmpty(validEdges)) {
-                       definitionsLocalPatchSb.append("    description: |\n");
-               }
-               if (pathDescriptionProperty != null) {
-                       definitionsLocalPatchSb.append("      " + pathDescriptionProperty + "\n");
-               }
-               if (StringUtils.isNotEmpty(validEdges) ) {
-                       definitionsLocalPatchSb.append(validEdges);
-               }
+        if (patchPropertyCnt > 0) {
+            definitionsLocalPatchSb.append("  " + patchDefinePrefix).append(xmlRootElementName)
+                .append(":\n");
+            if (StringUtils.isNotEmpty(pathDescriptionProperty)
+                || StringUtils.isNotEmpty(validEdges)) {
+                definitionsLocalPatchSb.append("    description: |\n");
+            }
+            if (pathDescriptionProperty != null) {
+                definitionsLocalPatchSb.append("      ").append(pathDescriptionProperty)
+                    .append("\n");
+            }
+            if (StringUtils.isNotEmpty(validEdges)) {
+                definitionsLocalPatchSb.append(validEdges);
+            }
             definitionsLocalPatchSb.append("    properties:\n");
         }
 
@@ -646,12 +705,12 @@ public class YAMLfromOXM extends OxmFileProcessor {
                     definitionsLocalSb.toString());
             } else {
                 javaTypeDefinitions.put(xmlRootElementName, definitionsLocalSb.toString());
-                if ( !"relationship-list".equals(xmlRootElementName)) {
-                       javaTypeDefinitions.put(patchDefinePrefix + xmlRootElementName, definitionsLocalPatchSb.toString());
+                if (!"relationship-list".equals(xmlRootElementName)) {
+                    javaTypeDefinitions.put(patchDefinePrefix + xmlRootElementName,
+                        definitionsLocalPatchSb.toString());
                 }
             }
         } catch (Exception e) {
-            e.printStackTrace();
             logger.error("Exception adding in javaTypeDefinitions", e);
         }
         if (xmlRootElementName.equals("inventory")) {
@@ -684,33 +743,29 @@ public class YAMLfromOXM extends OxmFileProcessor {
             parentDir.mkdirs();
         }
         try {
-            outfile.createNewFile();
+            if (!outfile.createNewFile()) {
+                logger.error("File {} already exist", outfileName);
+            }
         } catch (IOException e) {
-            logger.error("Exception creating output file " + outfileName);
-            e.printStackTrace();
+            logger.error("Exception creating output file " + outfileName, e);
         }
         try {
-            Charset charset = Charset.forName("UTF-8");
+            Charset charset = StandardCharsets.UTF_8;
             Path path = Paths.get(outfileName);
             try (BufferedWriter bw = Files.newBufferedWriter(path, charset)) {
                 bw.write(fileContent);
             }
         } catch (IOException e) {
-            logger.error("Exception writing output file " + outfileName);
-            e.printStackTrace();
+            logger.error("Exception writing output file " + outfileName, e);
         }
     }
 
     public boolean validTag(String tag) {
         if (tag != null) {
             // set ignore to true to skip Actions and Search
-            boolean topCheck = checkTopLevel(tag, true);
-            if (topCheck) {
-                return true;
-            }
+            return checkTopLevel(tag, true);
         }
         return false;
     }
 
 }
-