/** * ============LICENSE_START======================================================= * org.onap.aai * ================================================================================ * Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved. * ================================================================================ * 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 *

* 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. * ============LICENSE_END========================================================= */ package org.onap.aai.schemagen.genxsd; import com.google.common.base.CharMatcher; 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.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; public class YAMLfromOXM extends OxmFileProcessor { private static final Logger logger = LoggerFactory.getLogger("YAMLfromOXM.class"); // private static StringBuffer totalPathSbAccumulator = new StringBuffer(); private static final String root = "../aai-schema/src/main/resources"; private static final String autoGenRoot = "aai-schema/src/main/resources"; private static final String generateTypeYAML = "yaml"; private static final String normalStartDir = "aai-schema-gen"; private static final String yaml_dir = (((System.getProperty("user.dir") != null) && (!System.getProperty("user.dir").contains(normalStartDir))) ? autoGenRoot : root) + "/aai_swagger_yaml"; private final String patchDefinePrefix = "zzzz-patch-"; private StringBuilder inventoryDefSb = null; private String basePath; public YAMLfromOXM(String basePath, SchemaVersions schemaVersions, NodeIngestor ni, EdgeIngestor ei) { super(schemaVersions, ni, ei); this.basePath = basePath; } public void setOxmVersion(File oxmFile, SchemaVersion v) { super.setOxmVersion(oxmFile, v); } public void setXmlVersion(String xml, SchemaVersion v) { super.setXmlVersion(xml, v); } public void setVersion(SchemaVersion v) { super.setVersion(v); } @Override public String getDocumentHeader() { StringBuilder sb = new StringBuilder(); 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(DOUBLE_LINE_SEPARATOR).append( " Copyright © 2017-18 AT&T Intellectual Property. All rights reserved.") .append(OxmFileProcessor.DOUBLE_LINE_SEPARATOR).append( " Licensed under the Creative Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except in compliance with the License.") .append(DOUBLE_LINE_SEPARATOR).append( " You may obtain a copy of the License at\n\n (https://creativecommons.org/licenses/by/4.0/)") .append(DOUBLE_LINE_SEPARATOR).append( " 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.") .append(OxmFileProcessor.DOUBLE_LINE_SEPARATOR) .append(" 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.").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(" contact:").append(LINE_SEPARATOR).append(" name: n/a") .append(LINE_SEPARATOR).append(" url: n/a").append(LINE_SEPARATOR) .append(" email: n/a").append(LINE_SEPARATOR); sb.append("host: n/a").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(); } protected void init() throws ParserConfigurationException, SAXException, IOException, FileNotFoundException, EdgeRuleNotFoundException { super.init(); } @Override public String process() throws ParserConfigurationException, SAXException, IOException, FileNotFoundException, EdgeRuleNotFoundException { StringBuilder sb = new StringBuilder(); StringBuilder pathSb = new StringBuilder(); try { init(); } catch (Exception e) { logger.error("Error initializing " + this.getClass(), e); throw e; } pathSb.append(getDocumentHeader()); StringBuilder definitionsSb = new StringBuilder(); Element elem; String javaTypeName; combinedJavaTypes = new HashMap(); for (int i = 0; i < javaTypeNodes.getLength(); ++i) { elem = (Element) javaTypeNodes.item(i); javaTypeName = elem.getAttribute("name"); boolean processInventory = false; if (!"Inventory".equals(javaTypeName)) { if (generatedJavaType.containsKey(getXmlRootElementName(javaTypeName))) { continue; } // will combine all matching java-types elem = getJavaTypeElementSwagger(javaTypeName); } else { processInventory = true; } XSDElement javaTypeElement = new XSDElement(elem); if (processInventory) { getTopLevelPaths(javaTypeElement); } if (javaTypeName == null) { String msg = "Invalid OXM file: has no name attribute in " + oxmFile; logger.error(msg); throw new SAXException(msg); } namespaceFilter.add(getXmlRootElementName(javaTypeName)); processJavaTypeElementSwagger(javaTypeName, javaTypeElement, pathSb, definitionsSb, null, null, null, null, null, null); } sb.append(pathSb); sb.append(appendDefinitions()); PutRelationPathSet prp = new PutRelationPathSet(v); prp.generateRelations(ei); return sb.toString(); } public String appendDefinitions() { return appendDefinitions(null); } public String appendDefinitions(Set namespaceFilter) { // append definitions if (inventoryDefSb != null) { javaTypeDefinitions.put("inventory", inventoryDefSb.toString()); } StringBuilder sb = new StringBuilder("definitions:\n"); Map sortedJavaTypeDefinitions = new TreeMap(javaTypeDefinitions); for (Map.Entry entry : sortedJavaTypeDefinitions.entrySet()) { // logger.info("Key: "+entry.getKey()+"Value: "+ entry.getValue()); if (namespaceFilter != null && entry.getKey().matches("service-capabilities")) { for (String tally : namespaceFilter) { logger.debug("Marker: " + tally); } } if (namespaceFilter != null && (!namespaceFilter.contains(entry.getKey()))) { continue; } logger.debug( "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 = StringUtils.stripEnd(jb, " "); } logger.debug("Value-after: " + jb); sb.append(jb); continue; } sb.append(entry.getValue()); } return sb.toString(); } private String getDictionary(String resource) { StringBuilder dictSb = new StringBuilder(); dictSb.append(" ").append(resource).append(":\n"); dictSb.append(" description: |\n"); dictSb.append(" dictionary of ").append(resource).append("\n"); dictSb.append(" type: object\n"); dictSb.append(" properties:\n"); dictSb.append(" ").append(resource).append(":\n"); dictSb.append(" type: array\n"); dictSb.append(" items:\n"); dictSb.append(" $ref: \"#/definitions/").append(resource).append("-dict\"\n"); return dictSb.toString(); } private String processJavaTypeElementSwagger( String javaTypeName, Element javaTypeElement, 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); StringBuilder definitionsLocalPatchSb = new StringBuilder(256); String useTag = null; String useOpId = null; logger.debug("tag=" + tag); if (tag != null) { // set ignore to true to skip Actions and Search boolean topCheck = checkTopLevel(tag, true); if (!topCheck) { return null; } } if (!"Inventory".equals(javaTypeName)) { if ("AaiInternal".equals(javaTypeName)) { return null; } if (opId == null) { useOpId = javaTypeName; } else { useOpId = opId + javaTypeName; } if (tag == null) { useTag = javaTypeName; } } path = "inventory".equals(xmlRootElementName) ? "" : (path == null) ? "/" + xmlRootElementName : path + "/" + xmlRootElementName; XSDJavaType javaType = new XSDJavaType(javaTypeElement); if (getItemName != null) { if ("array".equals(getItemName)) { return javaType.getArrayType(); } else { return javaType.getItemName(); } } NodeList parentNodes = javaTypeElement.getElementsByTagName("java-attributes"); if (parentNodes.getLength() == 0) { logger.debug("no java-attributes for java-type " + javaTypeName); return ""; } String pathDescriptionProperty = javaType.getPathDescriptionProperty(); String container = javaType.getContainerProperty(); Vector indexedProps = javaType.getIndexedProps(); Vector dslStartNodeProps = javaType.getDslStartNodeProps(); Vector containerProps = new Vector(); if (container != null) { logger.debug("javaTypeName " + javaTypeName + " container:" + container + " indexedProps:" + indexedProps); } Element parentElement = (Element) parentNodes.item(0); NodeList xmlElementNodes = parentElement.getElementsByTagName("xml-element"); 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; StringBuilder sbProperties = new StringBuilder(); int patchPropertyCnt = 0; // manage payload properties separately for patch StringBuilder sbPropertiesPatch = new StringBuilder(); if (appliedPaths.containsKey(path)) { return null; } StringTokenizer st = new StringTokenizer(path, "/"); logger.debug("path: " + path + " st? " + st.toString()); if (st.countTokens() > 1 && getItemName == null) { logger.debug("appliedPaths: " + appliedPaths + " containsKey? " + appliedPaths.containsKey(path)); appliedPaths.put(path, xmlRootElementName); } Vector addTypeV = null; String modifiedName; String replaceDescription; for (int i = 0; i < xmlElementNodes.getLength(); ++i) { XSDElement xmlElementElement = new XSDElement((Element) xmlElementNodes.item(i)); if (!xmlElementElement.getParentNode().isSameNode(parentElement)) { continue; } String elementDescription = xmlElementElement.getPathDescriptionProperty(); if (getItemName == null) { addTypeV = xmlElementElement.getAddTypes(v.toString()); } // 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"); } else { modifiedName = xmlElementElement.getAttribute("name"); } if ("true".equals(xmlElementElement.getAttribute("xml-key"))) { path += "/{" + modifiedName + "}"; } logger.debug("path: " + path); logger.debug("xmlElementElement.getAttribute(required):" + xmlElementElement.getAttribute("required")); if ("true".equals(xmlElementElement.getAttribute("xml-key"))) { sbParameters.append(xmlElementElement.getPathParamYAML(elementDescription)); sbPathParameters .append(xmlElementElement.getPathParamYAML(elementDescription, modifiedName)); } if ("true".equals(xmlElementElement.getAttribute("required"))) { if (requiredCnt == 0) { sbRequired.append(" required:\n"); } ++requiredCnt; if (addTypeV == null || addTypeV.isEmpty()) { sbRequired.append(" - ").append(xmlElementElement.getAttribute("name")) .append("\n"); } else { for (int k = 0; k < addTypeV.size(); ++k) { sbRequired.append(" - ") .append(getXmlRootElementName(addTypeV.elementAt(k))).append(":\n"); } } } if (indexedProps != null && indexedProps.contains(xmlElementElement.getAttribute("name"))) { containerProps.add(xmlElementElement.getQueryParamYAML()); GetOperation.addContainerProps(container, containerProps); } if (xmlElementElement.isStandardType()) { 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; } ++propertyCnt; } StringBuilder newPathParams = new StringBuilder( (pathParams == null ? "" : pathParams.toString()) + sbPathParameters.toString()); String useName; for (int k = 0; addTypeV != null && k < addTypeV.size(); ++k) { String addType = addTypeV.elementAt(k); namespaceFilter.add(getXmlRootElementName(addType)); logger.debug("addType: " + addType); if (opId == null || !opId.contains(addType)) { processJavaTypeElementSwagger(addType, getJavaTypeElementSwagger(addType), pathSb, definitionsSb, path, tag == null ? useTag : tag, useOpId, null, newPathParams, validEdges); } // need item name of array String itemName = processJavaTypeElementSwagger(addType, getJavaTypeElementSwagger(addType), pathSb, definitionsSb, path, tag == null ? useTag : tag, useOpId, "array", null, null); if (itemName != null) { if (addType.equals("AaiInternal")) { logger.debug("addType AaiInternal, skip properties"); } else if (getItemName == null) { ++propertyCnt; sbProperties.append(" ").append(getXmlRootElementName(addType)) .append(":\n"); if ("RelationshipList".equals(addType)) { sbProperties.append(" type: object\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/") .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/") .append("".equals(itemName) ? "inventory-item-data" : itemName) .append("\"\n"); } if (StringUtils.isNotEmpty(elementDescription)) { sbProperties.append(" description: ").append(elementDescription) .append("\n"); } } } else { if (("java.util.ArrayList") .equals(xmlElementElement.getAttribute("container-type"))) { // need properties for getXmlRootElementName(addType) namespaceFilter.add(getXmlRootElementName(addType)); 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(" ").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"); ++patchPropertyCnt; } else { 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))) { sbProperties.append(" ").append(getXmlRootElementName(addType)) .append(":\n"); sbProperties.append(" type: object\n"); sbProperties.append(" $ref: \"#/definitions/") .append(getXmlRootElementName(addType)).append("\"\n"); } } if (StringUtils.isNotEmpty(elementDescription)) { sbProperties.append(" description: ").append(elementDescription) .append("\n"); } ++propertyCnt; } } } if (sbParameters.toString().length() > 0) { if (pathParams == null) { pathParams = new StringBuilder(); } pathParams.append(sbPathParameters); } GetOperation get = new GetOperation(useOpId, xmlRootElementName, tag, path, pathParams == null ? "" : pathParams.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); // add PATCH PatchOperation patch = new PatchOperation(useOpId, xmlRootElementName, tag, path, pathParams == null ? "" : pathParams.toString(), this.v, this.basePath); patch.setPrefixForPatchRef(patchDefinePrefix); pathSb.append(patch); // add DELETE DeleteOperation del = new DeleteOperation(useOpId, xmlRootElementName, tag, path, pathParams == null ? "" : pathParams.toString()); pathSb.append(del); if (generatedJavaType.containsKey(xmlRootElementName)) { logger.debug("xmlRootElementName(1)=" + xmlRootElementName); return null; } boolean processingInventoryDef = false; String dict = null; if (xmlRootElementName.equals("inventory")) { // inventory properties for each oxm to be concatenated processingInventoryDef = true; if (inventoryDefSb == null) { inventoryDefSb = new StringBuilder(); definitionsSb.append(" ").append(xmlRootElementName).append(":\n"); definitionsLocalSb.append(" ").append(xmlRootElementName).append(":\n"); definitionsLocalSb.append(" properties:\n"); } } else if (xmlRootElementName.equals("relationship")) { definitionsSb.append(" " + "relationship-dict" + ":\n"); definitionsLocalSb.append(" " + "relationship-dict" + ":\n"); dict = getDictionary(xmlRootElementName); } else { definitionsSb.append(" ").append(xmlRootElementName).append(":\n"); definitionsLocalSb.append(" ").append(xmlRootElementName).append(":\n"); } // Collection edges = edgeRuleSet.getEdgeRules(xmlRootElementName ); DeleteFootnoteSet footnotes = new DeleteFootnoteSet(xmlRootElementName); StringBuilder sbEdge = new StringBuilder(); LinkedHashSet preventDelete = new LinkedHashSet(); String prevent = null; String nodeCaption = " ###### Related Nodes\n"; try { EdgeRuleQuery q = new EdgeRuleQuery.Builder(xmlRootElementName).version(v).fromOnly().build(); Multimap results = ei.getRules(q); SortedSet ss = new TreeSet(results.keySet()); sbEdge.append(nodeCaption); nodeCaption = ""; for (String key : ss) { results.get(key).stream() .filter((i) -> (i.getFrom().equals(xmlRootElementName) && (!i.isPrivateEdge()))) .forEach((i) -> { 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 ").append(i.getTo()); EdgeDescription ed = new EdgeDescription(i); String footnote = ed.getAlsoDeleteFootnote(xmlRootElementName); sbEdge.append(ed.getRelationshipDescription("TO", xmlRootElementName)) .append(footnote).append("\n"); if (StringUtils.isNotEmpty(footnote)) { footnotes.add(footnote); } }); results.get(key).stream() .filter((i) -> (i.getFrom().equals(xmlRootElementName) && (!i.isPrivateEdge() && i.getPreventDelete().equals("OUT")))) .forEach((i) -> { preventDelete.add(i.getTo().toUpperCase()); }); } } catch (Exception e) { logger.debug("xmlRootElementName: " + xmlRootElementName + " from edge exception\n", e); } try { EdgeRuleQuery q1 = new EdgeRuleQuery.Builder(xmlRootElementName).version(v).toOnly().build(); Multimap results = ei.getRules(q1); SortedSet ss = new TreeSet(results.keySet()); sbEdge.append(nodeCaption); for (String key : ss) { results.get(key).stream() .filter((i) -> (i.getTo().equals(xmlRootElementName) && (!i.isPrivateEdge()))) .forEach((i) -> { sbEdge.append(" - FROM ").append(i.getFrom()); EdgeDescription ed = new EdgeDescription(i); String footnote = ed.getAlsoDeleteFootnote(xmlRootElementName); sbEdge.append(ed.getRelationshipDescription("FROM", xmlRootElementName)) .append(footnote).append("\n"); if (StringUtils.isNotEmpty(footnote)) { footnotes.add(footnote); } }); results.get(key).stream() .filter((i) -> (i.getTo().equals(xmlRootElementName) && (!i.isPrivateEdge()))) .forEach((i) -> { 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) && (!i.isPrivateEdge() && i.getPreventDelete().equals("IN")))) .forEach((i) -> { preventDelete.add(i.getFrom().toUpperCase()); }); } } catch (Exception e) { logger.debug("xmlRootElementName: " + xmlRootElementName + " to edge exception\n", e); } if (preventDelete.size() > 0) { prevent = xmlRootElementName.toUpperCase() + " cannot be deleted if related to " + String.join(",", preventDelete); logger.debug(prevent); } if (StringUtils.isNotEmpty(prevent)) { footnotes.add(prevent); } if (footnotes.footnotes.size() > 0) { sbEdge.append(footnotes.toString()); } validEdges = sbEdge.toString(); // Handle description property. Might have a description OR valid edges OR both OR neither. // Only put a description: tag if there is at least one. if (StringUtils.isNotEmpty(pathDescriptionProperty) || StringUtils.isNotEmpty(validEdges)) { definitionsSb.append(" description: |\n"); definitionsLocalSb.append(" description: |\n"); if (pathDescriptionProperty != null) { definitionsSb.append(" ").append(pathDescriptionProperty).append("\n"); definitionsLocalSb.append(" ").append(pathDescriptionProperty).append("\n"); } if (StringUtils.isNotEmpty(validEdges)) { definitionsSb.append(validEdges); definitionsLocalSb.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"); } if (requiredCnt > 0) { definitionsSb.append(sbRequired); definitionsLocalSb.append(sbRequired); } if (propertyCnt > 0) { definitionsSb.append(" properties:\n"); definitionsSb.append(sbProperties); if (!processingInventoryDef) { definitionsLocalSb.append(" properties:\n"); } definitionsLocalSb.append(sbProperties); definitionsLocalPatchSb.append(sbPropertiesPatch); } try { namespaceFilter.add(xmlRootElementName); if (xmlRootElementName.equals("inventory")) { // will add to javaTypeDefinitions at end inventoryDefSb.append(definitionsLocalSb.toString()); } else if (xmlRootElementName.equals("relationship")) { javaTypeDefinitions.put(xmlRootElementName, dict); javaTypeDefinitions.put(xmlRootElementName + "-dict", definitionsLocalSb.toString()); } else { javaTypeDefinitions.put(xmlRootElementName, definitionsLocalSb.toString()); if (!"relationship-list".equals(xmlRootElementName)) { javaTypeDefinitions.put(patchDefinePrefix + xmlRootElementName, definitionsLocalPatchSb.toString()); } } } catch (Exception e) { logger.error("Exception adding in javaTypeDefinitions", e); } if (xmlRootElementName.equals("inventory")) { logger.trace("skip xmlRootElementName(2)=" + xmlRootElementName); return null; } generatedJavaType.put(xmlRootElementName, null); /* * if( validTag(javaTypeName) && javaTypeName == useTag && tag == null) { * String nameSpaceResult = * getDocumentHeader()+pathSb.toString()+appendDefinitions(namespaceFilter); * writeYAMLfile(javaTypeName, nameSpaceResult); * totalPathSbAccumulator.append(pathSb); * pathSb.delete(0, pathSb.length()); * namespaceFilter.clear(); * } */ logger.trace("xmlRootElementName(2)=" + xmlRootElementName); return null; } private void writeYAMLfile(String outfileName, String fileContent) { outfileName = (StringUtils.isEmpty(outfileName)) ? "aai_swagger" : outfileName; outfileName = (outfileName.lastIndexOf(File.separator) == -1) ? yaml_dir + File.separator + outfileName + "_" + v.toString() + "." + generateTypeYAML : outfileName; File outfile = new File(outfileName); File parentDir = outfile.getParentFile(); if (parentDir != null && !parentDir.exists()) { parentDir.mkdirs(); } try { if(!outfile.createNewFile()) { logger.error( "File {} already exist", outfileName); } } catch (IOException e) { logger.error("Exception creating output file " + outfileName, e); } try { 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); } } public boolean validTag(String tag) { if (tag != null) { // set ignore to true to skip Actions and Search return checkTopLevel(tag, true); } return false; } }