/** * ============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 java.io.File; import java.io.FileNotFoundException; import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import javax.xml.parsers.ParserConfigurationException; import org.onap.aai.edges.EdgeIngestor; 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.slf4j.Logger; import org.slf4j.LoggerFactory; import org.w3c.dom.Attr; import org.w3c.dom.Element; import org.w3c.dom.NamedNodeMap; import org.w3c.dom.NodeList; import org.xml.sax.SAXException; public class HTMLfromOXM extends OxmFileProcessor { private static final Logger logger = LoggerFactory.getLogger("HTMLfromOXM.class"); private String maxOccurs; public HTMLfromOXM(String maxOccurs, SchemaConfigVersions schemaConfigVersions, NodeIngestor ni, EdgeIngestor ei) { super(schemaConfigVersions, ni, ei); this.maxOccurs = maxOccurs; } public void setOxmVersion(File oxmFile, SchemaVersion v) { super.setOxmVersion(oxmFile, v); this.v = v; } public void setXmlVersion(String xml, SchemaVersion v) { super.setXmlVersion(xml, v); this.v = v; } public void setVersion(SchemaVersion v) { super.setVersion(v); this.v = v; } @Override public String getDocumentHeader() { StringBuilder sb = new StringBuilder(); logger.trace("processing starts"); sb.append("") .append(LINE_SEPARATOR); String namespace = "org.onap"; if (v.compareTo(getSchemaConfigVersions().getNamespaceChangeVersion()) < 0) { namespace = "org.openecomp"; } sb.append( "").append(DOUBLE_LINE_SEPARATOR); return sb.toString(); } @Override public String process() throws ParserConfigurationException, SAXException, IOException, FileNotFoundException, EdgeRuleNotFoundException { StringBuilder sb = new StringBuilder(); try { init(); } catch (Exception e) { logger.error("Error initializing " + this.getClass()); throw e; } sb.append(getDocumentHeader()); StringBuilder sbInventory = 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"); if (!"Inventory".equals(javaTypeName)) { if (generatedJavaType.containsKey(javaTypeName)) { continue; } // will combine all matching java-types elem = getJavaTypeElement(javaTypeName, false); } XSDElement javaTypeElement = new XSDElement(elem, maxOccurs); // javaTypeName = javaTypeElement.name(); if (javaTypeName == null) { String msg = "Invalid OXM file: has no name attribute in " + oxmFile; logger.error(msg); throw new SAXException(msg); } if ("Nodes".equals(javaTypeName)) { logger.debug("skipping Nodes entry (temporary feature)"); continue; } logger.debug(getXmlRootElementName(javaTypeName) + " vs " + javaTypeName + ":" + generatedJavaType.containsKey(getXmlRootElementName(javaTypeName))); if (!"Inventory".equals(javaTypeName)) { generatedJavaType.put(javaTypeName, null); } sb.append(processJavaTypeElement(javaTypeName, javaTypeElement, sbInventory)); } sb.append(sbInventory); sb.append(" " + LINE_SEPARATOR); sb.append(" " + LINE_SEPARATOR); sb.append(" " + LINE_SEPARATOR); sb.append("" + LINE_SEPARATOR); return sb.toString(); } protected boolean isValidName(String name) { if (name == null || name.length() == 0) { return false; } String pattern = "^[a-z0-9-]*$"; return name.matches(pattern); } protected boolean skipCheck(String javaAttribute) { if (javaAttribute.equals("model") || javaAttribute.equals("eventHeader")) { return true; } return false; } public String processJavaTypeElement(String javaTypeName, Element javaType_Element, StringBuilder sbInventory) { String xmlRootElementName = getXMLRootElementName(javaType_Element); NodeList parentNodes = javaType_Element.getElementsByTagName("java-attributes"); StringBuilder sb = new StringBuilder(); if (parentNodes.getLength() == 0) { logger.trace("no java-attributes for java-type " + javaTypeName); return ""; } Element parentElement = (Element) parentNodes.item(0); NodeList xmlElementNodes = parentElement.getElementsByTagName("xml-element"); // support for multiple inventory elements across oxm files boolean processingInventory = false; boolean hasPreviousInventory = false; if ("inventory".equals(xmlRootElementName) && sbInventory != null) { processingInventory = true; if (sbInventory.toString().contains("xs:complexType")) { hasPreviousInventory = true; } } StringBuilder sb1 = new StringBuilder(); if (xmlElementNodes.getLength() > 0) { if (!processingInventory || !hasPreviousInventory) { sb1.append(" ") .append(LINE_SEPARATOR); sb1.append(" ").append(LINE_SEPARATOR); XSDElement javaTypeElement = new XSDElement(javaType_Element, maxOccurs); logger.debug("XSDElement name: " + javaTypeElement.name()); sb1.append(javaTypeElement.getHTMLAnnotation("class", " ")); sb1.append(" ").append(LINE_SEPARATOR); } Element javatypeElement; for (int i = 0; i < xmlElementNodes.getLength(); ++i) { XSDElement xmlElementElement = new XSDElement((Element) xmlElementNodes.item(i), maxOccurs); // String elementName = xmlElementElement.getAttribute("name"); String elementType = xmlElementElement.getAttribute("type"); // No simple types; only AAI custom types String addType = elementType.contains("." + v.toString() + ".") ? elementType.substring(elementType.lastIndexOf('.') + 1) : null; if (elementType.contains("." + v.toString() + ".") && !generatedJavaType.containsKey(addType)) { generatedJavaType.put(addType, elementType); javatypeElement = getJavaTypeElement(addType, processingInventory); sb.append(processJavaTypeElement(addType, javatypeElement, null)); } if ("Nodes".equals(addType)) { logger.trace("Skipping nodes, temporary testing"); continue; } // assembles the basic sb1.append(xmlElementElement.getHTMLElement(v, true, this)); } if (!processingInventory) { sb1.append(" " + LINE_SEPARATOR); sb1.append(" " + LINE_SEPARATOR); sb1.append(" " + LINE_SEPARATOR); } } if (xmlElementNodes.getLength() < 1) { sb.append(" " + LINE_SEPARATOR); sb.append(" " + LINE_SEPARATOR); sb.append(" " + LINE_SEPARATOR); sb.append(" " + LINE_SEPARATOR); sb.append(" " + LINE_SEPARATOR); generatedJavaType.put(javaTypeName, null); return sb.toString(); } if (processingInventory && sbInventory != null) { sbInventory.append(sb1); } else { sb.append(sb1); } return sb.toString(); } private Element getJavaTypeElement(String javaTypeName, boolean processingInventory) { String attrName, attrValue; Attr attr; Element javaTypeElement; List combineElementList = new ArrayList(); for (int i = 0; i < javaTypeNodes.getLength(); ++i) { javaTypeElement = (Element) javaTypeNodes.item(i); NamedNodeMap attributes = javaTypeElement.getAttributes(); for (int j = 0; j < attributes.getLength(); ++j) { attr = (Attr) attributes.item(j); attrName = attr.getNodeName(); attrValue = attr.getNodeValue(); if (attrName.equals("name") && attrValue.equals(javaTypeName)) { if (processingInventory) { return javaTypeElement; } else { combineElementList.add(javaTypeElement); } } } } if (combineElementList.size() == 0) { logger.error("oxm file format error, missing java-type " + javaTypeName); return (Element) null; } else if (combineElementList.size() > 1) { // need to combine java-attributes return combineElements(javaTypeName, combineElementList); } return combineElementList.get(0); } }