2 * ============LICENSE_START=======================================================
4 * ================================================================================
5 * Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved.
6 * ================================================================================
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
11 * http://www.apache.org/licenses/LICENSE-2.0
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
18 * ============LICENSE_END=========================================================
21 package org.onap.aai.schemagen.genxsd;
23 import com.google.common.collect.Multimap;
25 import java.io.BufferedWriter;
27 import java.io.FileNotFoundException;
28 import java.io.IOException;
29 import java.nio.charset.Charset;
30 import java.nio.charset.StandardCharsets;
31 import java.nio.file.Files;
32 import java.nio.file.Path;
33 import java.nio.file.Paths;
34 import java.util.HashMap;
35 import java.util.LinkedHashSet;
38 import java.util.SortedSet;
39 import java.util.StringTokenizer;
40 import java.util.TreeMap;
41 import java.util.TreeSet;
42 import java.util.Vector;
44 import javax.xml.parsers.ParserConfigurationException;
46 import org.apache.commons.lang3.StringUtils;
47 import org.onap.aai.edges.EdgeIngestor;
48 import org.onap.aai.edges.EdgeRule;
49 import org.onap.aai.edges.EdgeRuleQuery;
50 import org.onap.aai.edges.exceptions.EdgeRuleNotFoundException;
51 import org.onap.aai.nodes.NodeIngestor;
52 import org.onap.aai.setup.SchemaConfigVersions;
53 import org.onap.aai.setup.SchemaVersion;
54 import org.slf4j.Logger;
55 import org.slf4j.LoggerFactory;
56 import org.w3c.dom.Element;
57 import org.w3c.dom.NodeList;
58 import org.xml.sax.SAXException;
60 public class YAMLfromOXM extends OxmFileProcessor {
61 private static final Logger logger = LoggerFactory.getLogger("YAMLfromOXM.class");
62 // private static StringBuffer totalPathSbAccumulator = new StringBuffer();
63 private static final String root = "../aai-schema/src/main/resources";
64 private static final String autoGenRoot = "aai-schema/src/main/resources";
65 private static final String generateTypeYAML = "yaml";
66 private static final String normalStartDir = "aai-schema-gen";
67 private static final String yaml_dir = (((System.getProperty("user.dir") != null)
68 && (!System.getProperty("user.dir").contains(normalStartDir))) ? autoGenRoot : root)
69 + "/aai_swagger_yaml";
70 private final String patchDefinePrefix = "zzzz-patch-";
71 private StringBuilder inventoryDefSb = null;
73 private String basePath;
75 public YAMLfromOXM(String basePath, SchemaConfigVersions schemaConfigVersions, NodeIngestor ni,
77 super(schemaConfigVersions, ni, ei);
78 this.basePath = basePath;
81 public void setOxmVersion(File oxmFile, SchemaVersion v) {
82 super.setOxmVersion(oxmFile, v);
85 public void setXmlVersion(String xml, SchemaVersion v) {
86 super.setXmlVersion(xml, v);
89 public void setVersion(SchemaVersion v) {
94 public String getDocumentHeader() {
95 StringBuilder sb = new StringBuilder();
96 sb.append("#").append(LINE_SEPARATOR).append(
97 "# ============LICENSE_START=======================================================")
98 .append(LINE_SEPARATOR).append("# org.onap.aai").append(LINE_SEPARATOR)
100 "# ================================================================================")
101 .append(LINE_SEPARATOR)
102 .append("# Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved.")
103 .append(LINE_SEPARATOR)
105 "# ================================================================================")
106 .append(LINE_SEPARATOR)
108 "# Licensed under the Creative Commons License, Attribution 4.0 Intl. (the \"License\");")
109 .append(LINE_SEPARATOR)
110 .append("# you may not use this file except in compliance with the License.")
111 .append(LINE_SEPARATOR).append("# You may obtain a copy of the License at")
112 .append(LINE_SEPARATOR).append("# <p>").append(LINE_SEPARATOR)
113 .append("# https://creativecommons.org/licenses/by/4.0/").append(LINE_SEPARATOR)
114 .append("# <p>").append(LINE_SEPARATOR)
115 .append("# Unless required by applicable law or agreed to in writing, software")
116 .append(LINE_SEPARATOR)
117 .append("# distributed under the License is distributed on an \"AS IS\" BASIS,")
118 .append(LINE_SEPARATOR)
119 .append("# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.")
120 .append(LINE_SEPARATOR)
121 .append("# See the License for the specific language governing permissions and")
122 .append(LINE_SEPARATOR).append("# limitations under the License.")
123 .append(LINE_SEPARATOR)
125 "# ============LICENSE_END=========================================================")
126 .append(LINE_SEPARATOR).append("#").append(LINE_SEPARATOR).append(LINE_SEPARATOR);
127 sb.append("swagger: \"2.0\"\ninfo:").append(LINE_SEPARATOR).append(" ");
128 sb.append("description: |");
129 if (versionSupportsSwaggerDiff(v.toString())) {
130 sb.append("\n [Differences versus the previous schema version](" + "apidocs"
131 + basePath + "/aai_swagger_" + v.toString() + ".diff)");
133 sb.append(DOUBLE_LINE_SEPARATOR)
134 .append(" This document is best viewed with Firefox or Chrome. ");
136 "Nodes can be found by opening the models link below and finding the node-type. ");
137 sb.append("Edge definitions can be found with the node definitions.").append(LINE_SEPARATOR)
138 .append(" version: \"").append(v.toString()).append("\"").append(LINE_SEPARATOR);
139 sb.append(" title: Active and Available Inventory REST API").append(LINE_SEPARATOR);
140 sb.append(" license:").append(LINE_SEPARATOR)
142 " name: Apache 2.0\n url: http://www.apache.org/licenses/LICENSE-2.0.html")
143 .append(LINE_SEPARATOR);
144 sb.append("host: localhost").append(LINE_SEPARATOR).append("basePath: ").append(basePath)
145 .append("/").append(v.toString()).append(LINE_SEPARATOR);
146 sb.append("schemes:").append(LINE_SEPARATOR).append(" - https\npaths:")
147 .append(LINE_SEPARATOR);
148 return sb.toString();
151 protected void init() throws ParserConfigurationException, SAXException, IOException,
152 FileNotFoundException, EdgeRuleNotFoundException {
157 public String process() throws ParserConfigurationException, SAXException, IOException,
158 FileNotFoundException, EdgeRuleNotFoundException {
159 StringBuilder sb = new StringBuilder();
160 StringBuilder pathSb = new StringBuilder();
163 } catch (Exception e) {
164 logger.error("Error initializing " + this.getClass(), e);
167 pathSb.append(getDocumentHeader());
168 StringBuilder definitionsSb = new StringBuilder();
171 combinedJavaTypes = new HashMap<>();
172 for (int i = 0; i < javaTypeNodes.getLength(); ++i) {
173 elem = (Element) javaTypeNodes.item(i);
174 javaTypeName = elem.getAttribute("name");
175 boolean processInventory = false;
176 if (!"Inventory".equals(javaTypeName)) {
177 if (generatedJavaType.containsKey(getXmlRootElementName(javaTypeName))) {
180 // will combine all matching java-types
181 elem = getJavaTypeElementSwagger(javaTypeName);
183 processInventory = true;
186 XSDElement javaTypeElement = new XSDElement(elem);
188 if (processInventory) {
189 getTopLevelPaths(javaTypeElement);
192 if (javaTypeName == null) {
193 String msg = "Invalid OXM file: <java-type> has no name attribute in " + oxmFile;
195 throw new SAXException(msg);
197 namespaceFilter.add(getXmlRootElementName(javaTypeName));
198 processJavaTypeElementSwagger(javaTypeName, javaTypeElement, pathSb, definitionsSb,
199 null, null, null, null, null, null);
203 sb.append(appendDefinitions());
204 PutRelationPathSet prp = new PutRelationPathSet(v);
205 prp.generateRelations(ei);
206 return sb.toString();
209 public String appendDefinitions() {
210 return appendDefinitions(null);
213 public String appendDefinitions(Set<String> namespaceFilter) {
214 // append definitions
215 if (inventoryDefSb != null) {
216 javaTypeDefinitions.put("inventory", inventoryDefSb.toString());
218 StringBuilder sb = new StringBuilder("definitions:\n");
219 Map<String, String> sortedJavaTypeDefinitions =
220 new TreeMap<String, String>(javaTypeDefinitions);
221 for (Map.Entry<String, String> entry : sortedJavaTypeDefinitions.entrySet()) {
222 // logger.info("Key: "+entry.getKey()+"Value: "+ entry.getValue());
223 if (namespaceFilter != null && entry.getKey().matches("service-capabilities")) {
224 for (String tally : namespaceFilter) {
225 logger.debug("Marker: " + tally);
228 if (namespaceFilter != null && (!namespaceFilter.contains(entry.getKey()))) {
232 "Key: " + entry.getKey() + "Test: " + ("relationship-dict".equals(entry.getKey())));
233 if (entry.getKey().matches("relationship-dict")) {
234 String jb = entry.getValue();
235 logger.debug("Value: " + jb);
236 int ndx = jb.indexOf("related-to-property:");
238 jb = jb.substring(0, ndx);
239 jb = StringUtils.stripEnd(jb, " ");
241 logger.debug("Value-after: " + jb);
245 sb.append(entry.getValue());
247 return sb.toString();
250 private String getDictionary(String resource) {
251 StringBuilder dictSb = new StringBuilder();
252 dictSb.append(" ").append(resource).append(":\n");
253 dictSb.append(" description: |\n");
254 dictSb.append(" dictionary of ").append(resource).append("\n");
255 dictSb.append(" type: object\n");
256 dictSb.append(" properties:\n");
257 dictSb.append(" ").append(resource).append(":\n");
258 dictSb.append(" type: array\n");
259 dictSb.append(" items:\n");
260 dictSb.append(" $ref: \"#/definitions/").append(resource).append("-dict\"\n");
261 return dictSb.toString();
264 private String processJavaTypeElementSwagger(String javaTypeName, Element javaTypeElement,
265 StringBuilder pathSb, StringBuilder definitionsSb, String path, String tag, String opId,
266 String getItemName, StringBuilder pathParams, String validEdges) {
268 String xmlRootElementName = getXMLRootElementName(javaTypeElement);
269 StringBuilder definitionsLocalSb = new StringBuilder(256);
270 StringBuilder definitionsLocalPatchSb = new StringBuilder(256);
272 String useTag = null;
273 String useOpId = null;
274 logger.debug("tag=" + tag);
276 // set ignore to true to skip Actions and Search
277 boolean topCheck = checkTopLevel(tag, true);
283 if (!"Inventory".equals(javaTypeName)) {
284 if ("AaiInternal".equals(javaTypeName)) {
288 useOpId = javaTypeName;
290 useOpId = opId + javaTypeName;
293 useTag = javaTypeName;
296 path = "inventory".equals(xmlRootElementName) ? ""
297 : (path == null) ? "/" + xmlRootElementName : path + "/" + xmlRootElementName;
298 XSDJavaType javaType = new XSDJavaType(javaTypeElement);
299 if (getItemName != null) {
300 if ("array".equals(getItemName)) {
301 return javaType.getArrayType();
303 return javaType.getItemName();
307 NodeList parentNodes = javaTypeElement.getElementsByTagName("java-attributes");
308 if (parentNodes.getLength() == 0) {
309 logger.debug("no java-attributes for java-type " + javaTypeName);
313 String pathDescriptionProperty = javaType.getPathDescriptionProperty();
314 String container = javaType.getContainerProperty();
315 Vector<String> indexedProps = javaType.getIndexedProps();
316 Vector<String> dslStartNodeProps = javaType.getDslStartNodeProps();
317 Vector<String> containerProps = new Vector<String>();
318 if (container != null) {
319 logger.debug("javaTypeName " + javaTypeName + " container:" + container
320 + " indexedProps:" + indexedProps);
323 Element parentElement = (Element) parentNodes.item(0);
324 NodeList xmlElementNodes = parentElement.getElementsByTagName("xml-element");
326 StringBuilder sbParameters = new StringBuilder();
327 StringBuilder sbPathParameters = new StringBuilder(); // separate naming path parameters
328 // from name of parameter in the
330 StringBuilder sbRequired = new StringBuilder();
334 StringBuilder sbProperties = new StringBuilder();
335 int patchPropertyCnt = 0; // manage payload properties separately for patch
336 StringBuilder sbPropertiesPatch = new StringBuilder();
338 if (appliedPaths.containsKey(path)) {
342 StringTokenizer st = new StringTokenizer(path, "/");
343 logger.debug("path: " + path + " st? " + st.toString());
344 if (st.countTokens() > 1 && getItemName == null) {
345 logger.debug("appliedPaths: " + appliedPaths + " containsKey? "
346 + appliedPaths.containsKey(path));
347 appliedPaths.put(path, xmlRootElementName);
350 Vector<String> addTypeV = null;
352 String replaceDescription;
353 for (int i = 0; i < xmlElementNodes.getLength(); ++i) {
354 XSDElement xmlElementElement = new XSDElement((Element) xmlElementNodes.item(i));
355 if (!xmlElementElement.getParentNode().isSameNode(parentElement)) {
358 String elementDescription = xmlElementElement.getPathDescriptionProperty();
359 if (getItemName == null) {
360 addTypeV = xmlElementElement.getAddTypes(v.toString());
362 // use alternate name for parameter if already in the path string
363 modifiedName = "/{" + xmlElementElement.getAttribute("name") + "}";
364 if (path.contains(modifiedName)) {
365 modifiedName = path.substring(path.lastIndexOf('/') + 1) + "."
366 + xmlElementElement.getAttribute("name");
368 modifiedName = xmlElementElement.getAttribute("name");
370 if ("true".equals(xmlElementElement.getAttribute("xml-key"))) {
371 path += "/{" + modifiedName + "}";
373 logger.debug("path: " + path);
374 logger.debug("xmlElementElement.getAttribute(required):"
375 + xmlElementElement.getAttribute("required"));
377 if ("true".equals(xmlElementElement.getAttribute("xml-key"))) {
378 sbParameters.append(xmlElementElement.getPathParamYAML(elementDescription));
380 .append(xmlElementElement.getPathParamYAML(elementDescription, modifiedName));
382 if ("true".equals(xmlElementElement.getAttribute("required"))) {
383 if (requiredCnt == 0) {
384 sbRequired.append(" required:\n");
387 if (addTypeV == null || addTypeV.isEmpty()) {
388 sbRequired.append(" - ").append(xmlElementElement.getAttribute("name"))
391 for (int k = 0; k < addTypeV.size(); ++k) {
392 sbRequired.append(" - ")
393 .append(getXmlRootElementName(addTypeV.elementAt(k))).append(":\n");
397 if (indexedProps != null
398 && indexedProps.contains(xmlElementElement.getAttribute("name"))) {
399 containerProps.add(xmlElementElement.getQueryParamYAML());
400 GetOperation.addContainerProps(container, containerProps);
402 if (xmlElementElement.isStandardType()) {
403 boolean isDslStartNode =
404 dslStartNodeProps.contains(xmlElementElement.getAttribute("name"));
405 sbProperties.append(xmlElementElement.getTypePropertyYAML(isDslStartNode));
406 if (!"resource-version".equals(xmlElementElement.getAttribute("name"))) {
407 sbPropertiesPatch.append(xmlElementElement.getTypePropertyYAML(isDslStartNode));
413 StringBuilder newPathParams = new StringBuilder(
414 (pathParams == null ? "" : pathParams.toString()) + sbPathParameters.toString());
416 for (int k = 0; addTypeV != null && k < addTypeV.size(); ++k) {
417 String addType = addTypeV.elementAt(k);
418 namespaceFilter.add(getXmlRootElementName(addType));
419 logger.debug("addType: " + addType);
421 if (opId == null || !opId.contains(addType)) {
422 processJavaTypeElementSwagger(addType, getJavaTypeElementSwagger(addType),
423 pathSb, definitionsSb, path, tag == null ? useTag : tag, useOpId, null,
424 newPathParams, validEdges);
426 // need item name of array
427 String itemName = processJavaTypeElementSwagger(addType,
428 getJavaTypeElementSwagger(addType), pathSb, definitionsSb, path,
429 tag == null ? useTag : tag, useOpId, "array", null, null);
431 if (itemName != null) {
432 if (addType.equals("AaiInternal")) {
433 logger.debug("addType AaiInternal, skip properties");
435 } else if (getItemName == null) {
437 sbProperties.append(" ").append(getXmlRootElementName(addType))
439 if ("RelationshipList".equals(addType)) {
440 sbProperties.append(" type: object\n");
441 sbProperties.append(" $ref: \"#/definitions/").append(itemName)
443 sbPropertiesPatch.append(" ")
444 .append(getXmlRootElementName(addType)).append(":\n");
445 sbPropertiesPatch.append(" type: object\n");
446 sbPropertiesPatch.append(" $ref: \"#/definitions/")
447 .append(itemName).append("\"\n");
450 if ("relationship".equals(itemName)) {
452 v + "-relationship added as array for getItemName null");
454 sbProperties.append(" type: array\n items:\n");
455 sbProperties.append(" $ref: \"#/definitions/")
456 .append("".equals(itemName) ? "inventory-item-data" : itemName)
459 if (StringUtils.isNotEmpty(elementDescription)) {
460 sbProperties.append(" description: ").append(elementDescription)
465 if (("java.util.ArrayList")
466 .equals(xmlElementElement.getAttribute("container-type"))) {
467 // need properties for getXmlRootElementName(addType)
468 namespaceFilter.add(getXmlRootElementName(addType));
469 newPathParams = new StringBuilder(
470 (pathParams == null ? "" : pathParams.toString()) + sbParameters);
471 processJavaTypeElementSwagger(addType, getJavaTypeElementSwagger(addType),
472 pathSb, definitionsSb, path, tag == null ? useTag : tag, useOpId, null,
473 newPathParams, validEdges);
474 useName = getXmlRootElementName(addType);
475 sbProperties.append(" ").append(useName).append(":\n");
476 if ("relationship".equals(useName)) {
477 sbProperties.append(" type: object\n");
478 sbProperties.append(" $ref: \"#/definitions/relationship\"\n");
479 sbPropertiesPatch.append(" type: object\n");
481 .append(" $ref: \"#/definitions/relationship\"\n");
484 sbProperties.append(" type: array\n items: \n");
485 sbProperties.append(" $ref: \"#/definitions/"
486 + getXmlRootElementName(addType) + "\"\n");
487 if (StringUtils.isNotEmpty(elementDescription)) {
488 sbProperties.append(" description: ")
489 .append(elementDescription).append("\n");
494 // Make sure certain types added to the filter don't appear
495 if (!nodeFilter.contains(getXmlRootElementName(addType))) {
496 sbProperties.append(" ").append(getXmlRootElementName(addType))
498 sbProperties.append(" type: object\n");
499 sbProperties.append(" $ref: \"#/definitions/")
500 .append(getXmlRootElementName(addType)).append("\"\n");
503 if (StringUtils.isNotEmpty(elementDescription)) {
504 sbProperties.append(" description: ").append(elementDescription)
512 if (sbParameters.toString().length() > 0) {
513 if (pathParams == null) {
514 pathParams = new StringBuilder();
516 pathParams.append(sbPathParameters);
518 GetOperation get = new GetOperation(useOpId, xmlRootElementName, tag, path,
519 pathParams == null ? "" : pathParams.toString());
521 logger.debug("opId vs useOpId:" + opId + " vs " + useOpId + " PathParams=" + pathParams);
523 PutOperation put = new PutOperation(useOpId, xmlRootElementName, tag, path,
524 pathParams == null ? "" : pathParams.toString(), this.v, this.basePath);
527 PatchOperation patch = new PatchOperation(useOpId, xmlRootElementName, tag, path,
528 pathParams == null ? "" : pathParams.toString(), this.v, this.basePath);
529 patch.setPrefixForPatchRef(patchDefinePrefix);
530 pathSb.append(patch);
532 DeleteOperation del = new DeleteOperation(useOpId, xmlRootElementName, tag, path,
533 pathParams == null ? "" : pathParams.toString());
535 if (generatedJavaType.containsKey(xmlRootElementName)) {
536 logger.debug("xmlRootElementName(1)=" + xmlRootElementName);
540 boolean processingInventoryDef = false;
542 if (xmlRootElementName.equals("inventory")) {
543 // inventory properties for each oxm to be concatenated
544 processingInventoryDef = true;
545 if (inventoryDefSb == null) {
546 inventoryDefSb = new StringBuilder();
547 definitionsSb.append(" ").append(xmlRootElementName).append(":\n");
548 definitionsLocalSb.append(" ").append(xmlRootElementName).append(":\n");
549 definitionsLocalSb.append(" properties:\n");
551 } else if (xmlRootElementName.equals("relationship")) {
552 definitionsSb.append(" " + "relationship-dict" + ":\n");
553 definitionsLocalSb.append(" " + "relationship-dict" + ":\n");
554 dict = getDictionary(xmlRootElementName);
556 definitionsSb.append(" ").append(xmlRootElementName).append(":\n");
557 definitionsLocalSb.append(" ").append(xmlRootElementName).append(":\n");
559 // Collection<EdgeDescription> edges = edgeRuleSet.getEdgeRules(xmlRootElementName );
560 DeleteFootnoteSet footnotes = new DeleteFootnoteSet(xmlRootElementName);
561 StringBuilder sbEdge = new StringBuilder();
562 LinkedHashSet<String> preventDelete = new LinkedHashSet<String>();
563 String prevent = null;
564 String nodeCaption = " ###### Related Nodes\n";
567 new EdgeRuleQuery.Builder(xmlRootElementName).version(v).fromOnly().build();
568 Multimap<String, EdgeRule> results = ei.getRules(q);
569 SortedSet<String> ss = new TreeSet<String>(results.keySet());
570 sbEdge.append(nodeCaption);
572 for (String key : ss) {
573 results.get(key).stream()
574 .filter((i) -> (i.getFrom().equals(xmlRootElementName) && (!i.isPrivateEdge())))
576 logger.info(new String(new StringBuilder(" - TO ").append(i.getTo())
577 .append(i.getDirection().toString()).append(i.getContains())));
579 results.get(key).stream()
580 .filter((i) -> (i.getFrom().equals(xmlRootElementName) && (!i.isPrivateEdge())))
582 sbEdge.append(" - TO ").append(i.getTo());
583 EdgeDescription ed = new EdgeDescription(i);
584 String footnote = ed.getAlsoDeleteFootnote(xmlRootElementName);
585 sbEdge.append(ed.getRelationshipDescription("TO", xmlRootElementName))
586 .append(footnote).append("\n");
587 if (StringUtils.isNotEmpty(footnote)) {
588 footnotes.add(footnote);
591 results.get(key).stream()
592 .filter((i) -> (i.getFrom().equals(xmlRootElementName)
593 && (!i.isPrivateEdge() && i.getPreventDelete().equals("OUT"))))
595 preventDelete.add(i.getTo().toUpperCase());
598 } catch (Exception e) {
599 logger.debug("xmlRootElementName: " + xmlRootElementName + " from edge exception\n", e);
603 new EdgeRuleQuery.Builder(xmlRootElementName).version(v).toOnly().build();
604 Multimap<String, EdgeRule> results = ei.getRules(q1);
605 SortedSet<String> ss = new TreeSet<String>(results.keySet());
606 sbEdge.append(nodeCaption);
607 for (String key : ss) {
608 results.get(key).stream()
609 .filter((i) -> (i.getTo().equals(xmlRootElementName) && (!i.isPrivateEdge())))
611 sbEdge.append(" - FROM ").append(i.getFrom());
612 EdgeDescription ed = new EdgeDescription(i);
613 String footnote = ed.getAlsoDeleteFootnote(xmlRootElementName);
614 sbEdge.append(ed.getRelationshipDescription("FROM", xmlRootElementName))
615 .append(footnote).append("\n");
616 if (StringUtils.isNotEmpty(footnote)) {
617 footnotes.add(footnote);
620 results.get(key).stream()
621 .filter((i) -> (i.getTo().equals(xmlRootElementName) && (!i.isPrivateEdge())))
624 .info(new String(new StringBuilder(" - FROM ").append(i.getFrom())
625 .append(i.getDirection().toString()).append(i.getContains())));
627 results.get(key).stream()
628 .filter((i) -> (i.getTo().equals(xmlRootElementName)
629 && (!i.isPrivateEdge() && i.getPreventDelete().equals("IN"))))
631 preventDelete.add(i.getFrom().toUpperCase());
634 } catch (Exception e) {
635 logger.debug("xmlRootElementName: " + xmlRootElementName + " to edge exception\n", e);
637 if (preventDelete.size() > 0) {
638 prevent = xmlRootElementName.toUpperCase() + " cannot be deleted if related to "
639 + String.join(",", preventDelete);
640 logger.debug(prevent);
643 if (StringUtils.isNotEmpty(prevent)) {
644 footnotes.add(prevent);
646 if (footnotes.footnotes.size() > 0) {
647 sbEdge.append(footnotes.toString());
649 validEdges = sbEdge.toString();
651 // Handle description property. Might have a description OR valid edges OR both OR neither.
652 // Only put a description: tag if there is at least one.
653 if (StringUtils.isNotEmpty(pathDescriptionProperty) || StringUtils.isNotEmpty(validEdges)) {
654 definitionsSb.append(" description: |\n");
655 definitionsLocalSb.append(" description: |\n");
657 if (pathDescriptionProperty != null) {
658 definitionsSb.append(" ").append(pathDescriptionProperty).append("\n");
659 definitionsLocalSb.append(" ").append(pathDescriptionProperty).append("\n");
661 if (StringUtils.isNotEmpty(validEdges)) {
662 definitionsSb.append(validEdges);
663 definitionsLocalSb.append(validEdges);
666 if (patchPropertyCnt > 0) {
667 definitionsLocalPatchSb.append(" " + patchDefinePrefix).append(xmlRootElementName)
669 if (StringUtils.isNotEmpty(pathDescriptionProperty)
670 || StringUtils.isNotEmpty(validEdges)) {
671 definitionsLocalPatchSb.append(" description: |\n");
673 if (pathDescriptionProperty != null) {
674 definitionsLocalPatchSb.append(" ").append(pathDescriptionProperty)
677 if (StringUtils.isNotEmpty(validEdges)) {
678 definitionsLocalPatchSb.append(validEdges);
680 definitionsLocalPatchSb.append(" properties:\n");
683 if (requiredCnt > 0) {
684 definitionsSb.append(sbRequired);
685 definitionsLocalSb.append(sbRequired);
688 if (propertyCnt > 0) {
689 definitionsSb.append(" properties:\n");
690 definitionsSb.append(sbProperties);
691 if (!processingInventoryDef) {
692 definitionsLocalSb.append(" properties:\n");
694 definitionsLocalSb.append(sbProperties);
695 definitionsLocalPatchSb.append(sbPropertiesPatch);
698 namespaceFilter.add(xmlRootElementName);
699 if (xmlRootElementName.equals("inventory")) {
700 // will add to javaTypeDefinitions at end
701 inventoryDefSb.append(definitionsLocalSb.toString());
702 } else if (xmlRootElementName.equals("relationship")) {
703 javaTypeDefinitions.put(xmlRootElementName, dict);
704 javaTypeDefinitions.put(xmlRootElementName + "-dict",
705 definitionsLocalSb.toString());
707 javaTypeDefinitions.put(xmlRootElementName, definitionsLocalSb.toString());
708 if (!"relationship-list".equals(xmlRootElementName)) {
709 javaTypeDefinitions.put(patchDefinePrefix + xmlRootElementName,
710 definitionsLocalPatchSb.toString());
713 } catch (Exception e) {
714 logger.error("Exception adding in javaTypeDefinitions", e);
716 if (xmlRootElementName.equals("inventory")) {
717 logger.trace("skip xmlRootElementName(2)=" + xmlRootElementName);
720 generatedJavaType.put(xmlRootElementName, null);
722 * if( validTag(javaTypeName) && javaTypeName == useTag && tag == null) {
723 * String nameSpaceResult =
724 * getDocumentHeader()+pathSb.toString()+appendDefinitions(namespaceFilter);
725 * writeYAMLfile(javaTypeName, nameSpaceResult);
726 * totalPathSbAccumulator.append(pathSb);
727 * pathSb.delete(0, pathSb.length());
728 * namespaceFilter.clear();
731 logger.trace("xmlRootElementName(2)=" + xmlRootElementName);
735 private void writeYAMLfile(String outfileName, String fileContent) {
736 outfileName = (StringUtils.isEmpty(outfileName)) ? "aai_swagger" : outfileName;
737 outfileName = (outfileName.lastIndexOf(File.separator) == -1)
738 ? yaml_dir + File.separator + outfileName + "_" + v.toString() + "." + generateTypeYAML
740 File outfile = new File(outfileName);
741 File parentDir = outfile.getParentFile();
742 if (parentDir != null && !parentDir.exists()) {
746 if (!outfile.createNewFile()) {
747 logger.error("File {} already exist", outfileName);
749 } catch (IOException e) {
750 logger.error("Exception creating output file " + outfileName, e);
753 Charset charset = StandardCharsets.UTF_8;
754 Path path = Paths.get(outfileName);
755 try (BufferedWriter bw = Files.newBufferedWriter(path, charset)) {
756 bw.write(fileContent);
758 } catch (IOException e) {
759 logger.error("Exception writing output file " + outfileName, e);
763 public boolean validTag(String tag) {
765 // set ignore to true to skip Actions and Search
766 return checkTopLevel(tag, true);