/*- * ============LICENSE_START======================================================= * org.openecomp.aai * ================================================================================ * Copyright (C) 2017 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.openecomp.aai.workarounds; import com.google.common.base.CaseFormat; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.xml.XMLConstants; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerException; import javax.xml.transform.TransformerFactory; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; import javax.xml.xpath.XPath; import javax.xml.xpath.XPathConstants; import javax.xml.xpath.XPathExpression; import javax.xml.xpath.XPathExpressionException; import javax.xml.xpath.XPathFactory; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.xml.sax.SAXException; public class ModifyOXMProperties { private static String[] versions = new String[]{"v8"}; /** * The main method. * * @param args the arguments * @throws SAXException the SAX exception * @throws IOException Signals that an I/O exception has occurred. * @throws ParserConfigurationException the parser configuration exception * @throws XPathExpressionException the x path expression exception * @throws TransformerException the transformer exception */ public static void main(String[] args) throws SAXException, IOException, ParserConfigurationException, XPathExpressionException, TransformerException { for (String version : versions) { process(version); } } /** * Process. * * @param version the version * @throws SAXException the SAX exception * @throws IOException Signals that an I/O exception has occurred. * @throws ParserConfigurationException the parser configuration exception * @throws XPathExpressionException the x path expression exception * @throws TransformerException the transformer exception */ private static void process(String version) throws SAXException, IOException, ParserConfigurationException, XPathExpressionException, TransformerException { String filepath = "bundleconfig-local/etc/oxm/aai_oxm_" + version + ".xml"; DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance(); docFactory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true); DocumentBuilder docBuilder = docFactory.newDocumentBuilder(); Document doc = docBuilder.parse(filepath); XPath xpath = XPathFactory.newInstance().newXPath(); //Find namespaces - restrict to inventory //XPathExpression expr = xpath.compile("//java-type[java-attributes[count(xml-element[contains(@type, 'aai.openecomp.org')])=count(./xml-element)][count(xml-element) > 1]]/xml-root-element"); XPathExpression expr = xpath.compile("//java-type[@name='Inventory']/java-attributes/xml-element/@name"); Object result = expr.evaluate(doc, XPathConstants.NODESET); NodeList nodes = (NodeList) result; List itemsUnderInventory = new ArrayList<>(); for (int i = 0; i < nodes.getLength(); i++) { itemsUnderInventory.add(nodes.item(i).getTextContent()); } Map namespaces = new HashMap<>(); itemsUnderInventory.remove("Search"); for (String item : itemsUnderInventory) { expr = xpath.compile("//java-type[xml-root-element/@name='" + item + "']"); result = expr.evaluate(doc, XPathConstants.NODESET); nodes = (NodeList) result; handleItemsUnderInventory(nodes, namespaces, xpath, item); } //go through plurals expr = xpath.compile( "//java-type[java-attributes[count(xml-element) = 1]/xml-element[contains(@type, 'aai.openecomp.org')]]/xml-root-element"); result = expr.evaluate(doc, XPathConstants.NODESET); nodes = (NodeList) result; List children = new ArrayList<>(); for (int i = 0; i < nodes.getLength(); i++) { XPathExpression expr2 = xpath .compile("../java-attributes/xml-element[1]/@type[contains(.,'aai.openecomp.org')]"); Object result2 = expr2.evaluate(nodes.item(i), XPathConstants.NODESET); NodeList node2 = (NodeList) result2; String[] temp = node2.item(0).getTextContent().split("\\."); String containerName = nodes.item(i).getAttributes().getNamedItem("name").getTextContent(); String childrenTuple = containerName + "," + temp[temp.length - 1]; if (namespaces.containsKey(CaseFormat.LOWER_HYPHEN.to(CaseFormat.UPPER_CAMEL, containerName))) { childrenTuple += "," + namespaces.get(CaseFormat.LOWER_HYPHEN.to(CaseFormat.UPPER_CAMEL, containerName)); } children.add(childrenTuple); } //match types up with plurals handleChildrenNodes(children, xpath, doc); filepath = "bundleconfig-local/etc/oxm/aai_oxm_" + version + ".xml"; TransformerFactory transformerFactory = TransformerFactory.newInstance(); transformerFactory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true); Transformer transformer = transformerFactory.newTransformer(); DOMSource source = new DOMSource(doc); StreamResult file = new StreamResult(new File(filepath)); transformer.transform(source, file); } private static void handleItemsUnderInventory(NodeList nodes, Map namespaces, XPath xpath, String item) throws XPathExpressionException { String[] temp; for (int i = 0; i < nodes.getLength(); i++) { String a = "java-attributes/xml-element/@type[contains(.,'aai.openecomp.org')]"; XPathExpression expr2 = xpath.compile(a); Object result2 = expr2.evaluate(nodes.item(i), XPathConstants.NODESET); NodeList node2 = (NodeList) result2; for (int j = 0; j < node2.getLength(); j++) { temp = node2.item(j).getTextContent().split("\\."); namespaces.put(temp[temp.length - 1], item); } } } private static void handleChildrenNodes(List children, XPath xpath, Document doc) throws XPathExpressionException { NodeList nodes; XPathExpression expr; Object result; String[] split; for (String s : children) { split = s.split(","); expr = xpath.compile("//java-type[@name='" + split[1] + "']/xml-properties"); result = expr.evaluate(doc, XPathConstants.NODESET); nodes = (NodeList) result; if (nodes.getLength() > 0) { if (!hasChild(nodes.item(0), "name", "container")) { Element property = doc.createElement("xml-property"); property.setAttribute("name", "container"); property.setAttribute("value", split[0]); nodes.item(0).appendChild(property); } if (split.length == 3) { Element property; if (!hasChild(nodes.item(0), "name", "namespace")) { property = doc.createElement("xml-property"); property.setAttribute("name", "namespace"); property.setAttribute("value", split[2]); nodes.item(0).appendChild(property); } } } } } /** * Checks for child. * * @param node the node * @param name the name * @param value the value * @return true, if successful */ private static boolean hasChild(Node node, String name, String value) { boolean result = false; NodeList list = node.getChildNodes(); Node temp = null; for (int i = 0; i < list.getLength(); i++) { if (list.item(i).hasAttributes()) { temp = list.item(i).getAttributes().getNamedItem(name); } if (temp != null && temp.getTextContent().equals(value)) { result = true; } } return result; } }