-/*\r
- * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved.\r
- *\r
- * This program and the accompanying materials are made available under the\r
- * terms of the Eclipse Public License v1.0 which accompanies this distribution,\r
- * and is available at http://www.eclipse.org/legal/epl-v10.html\r
- */\r
-package org.opendaylight.yangtools.yang.data.impl;\r
-\r
-import groovy.lang.Binding;\r
-import groovy.lang.GroovyShell;\r
-import groovy.lang.Script;\r
-\r
-import java.io.ByteArrayInputStream;\r
-import java.io.ByteArrayOutputStream;\r
-import java.io.IOException;\r
-import java.io.InputStream;\r
-import java.io.InputStreamReader;\r
-import java.io.PrintStream;\r
-import java.io.Reader;\r
-import java.io.StringWriter;\r
-import java.lang.reflect.Method;\r
-import java.text.MessageFormat;\r
-import java.util.ArrayList;\r
-import java.util.List;\r
-import java.util.Set;\r
-\r
-import javax.xml.transform.OutputKeys;\r
-import javax.xml.transform.Transformer;\r
-import javax.xml.transform.TransformerFactory;\r
-import javax.xml.transform.dom.DOMSource;\r
-import javax.xml.transform.stream.StreamResult;\r
-\r
-import org.custommonkey.xmlunit.Diff;\r
-import org.junit.Assert;\r
-import org.opendaylight.yangtools.yang.common.QName;\r
-import org.opendaylight.yangtools.yang.data.api.CompositeNode;\r
-import org.opendaylight.yangtools.yang.data.api.Node;\r
-import org.opendaylight.yangtools.yang.model.api.Module;\r
-import org.opendaylight.yangtools.yang.model.api.SchemaContext;\r
-import org.opendaylight.yangtools.yang.model.parser.api.YangModelParser;\r
-import org.opendaylight.yangtools.yang.parser.impl.YangParserImpl;\r
-import org.slf4j.Logger;\r
-import org.slf4j.LoggerFactory;\r
-import org.w3c.dom.Document;\r
-import org.xml.sax.SAXException;\r
-\r
-/**\r
- * @author michal.rehak\r
- *\r
- */\r
-public abstract class NodeHelper {\r
-\r
- private static final Logger LOG = LoggerFactory.getLogger(NodeHelper.class);\r
-\r
- /** xml source of example network configuration */\r
- public static final String NETWORK_XML =\r
- "<network xmlns=\"urn:opendaylight:controller:network\">\n" +\r
- //"<network>\n" +\r
- " <topologies>\n" +\r
- " <topology>\n" +\r
- " <topology-id>topId_01</topology-id>\n" +\r
- " <nodes>\n" +\r
- " <node>\n" +\r
- " <node-id>nodeId_02</node-id>\n" +\r
- " <supporting-ne>networkId_02</supporting-ne>\n" +\r
- " <termination-points>\n" +\r
- " <termination-point>\n" +\r
- " <tp-id>tpId_03</tp-id>\n" +\r
- " </termination-point>\n" +\r
- " </termination-points>\n" +\r
- " </node>\n" +\r
- " <node>\n" +\r
- " <node-id>nodeId_16</node-id>\n" +\r
- " <supporting-ne>networkId_17</supporting-ne>\n" +\r
- " <termination-points>\n" +\r
- " <termination-point>\n" +\r
- " <tp-id>tpId_18</tp-id>\n" +\r
- " </termination-point>\n" +\r
- " </termination-points>\n" +\r
- " </node>\n" +\r
- " <node>\n" +\r
- " <node-id>nodeId_19</node-id>\n" +\r
- " <supporting-ne>networkId_20</supporting-ne>\n" +\r
- " <termination-points>\n" +\r
- " <termination-point>\n" +\r
- " <tp-id>tpId_18</tp-id>\n" +\r
- " </termination-point>\n" +\r
- " <termination-point>\n" +\r
- " <tp-id>tpId_19</tp-id>\n" +\r
- " </termination-point>\n" +\r
- " </termination-points>\n" +\r
- " </node>\n" +\r
- " </nodes>\n" +\r
- " <links>\n" +\r
- " <link>\n" +\r
- " <link-id>linkId_04</link-id>\n" +\r
- " <source>\n" +\r
- " <source-node>nodeId_05</source-node>\n" +\r
- " <source-tp>tpId_06</source-tp>\n" +\r
- " </source>\n" +\r
- " <destination>\n" +\r
- " <dest-node>nodeId_07</dest-node>\n" +\r
- " <dest-tp>tpId_08</dest-tp>\n" +\r
- " </destination>\n" +\r
- " </link>\n" +\r
- " <link>\n" +\r
- " <link-id>linkId_11</link-id>\n" +\r
- " <source>\n" +\r
- " <source-node>nodeId_12</source-node>\n" +\r
- " <source-tp>tpId_13</source-tp>\n" +\r
- " </source>\n" +\r
- " <destination>\n" +\r
- " <dest-node>nodeId_14</dest-node>\n" +\r
- " <dest-tp>tpId_15</dest-tp>\n" +\r
- " </destination>\n" +\r
- " </link>\n" +\r
- " </links>\n" +\r
- " </topology>\n" +\r
- " </topologies>\n" +\r
- " <network-elements>\n" +\r
- " <network-element>\n" +\r
- " <element-id>ntElementId_09</element-id>\n" +\r
- " </network-element>\n" +\r
- " <network-element>\n" +\r
- " <element-id>ntElementId_10</element-id>\n" +\r
- " </network-element>\n" +\r
- " </network-elements>\n" +\r
- "</network>";\r
-\r
- /**\r
- * @param domTree\r
- * @param out\r
- * @throws Exception\r
- */\r
- public static void dumpDoc(Document domTree, PrintStream out) throws Exception {\r
- TransformerFactory transformerFact = TransformerFactory.newInstance();\r
- transformerFact.setAttribute("indent-number", 4);\r
- Transformer transformer = transformerFact.newTransformer();\r
- transformer.setOutputProperty(OutputKeys.INDENT, "yes");\r
- //initialize StreamResult with File object to save to file\r
- StreamResult result = new StreamResult(new StringWriter());\r
- DOMSource source = new DOMSource(domTree);\r
- transformer.transform(source, result);\r
- String xmlString = result.getWriter().toString();\r
- out.println(xmlString);\r
- }\r
-\r
- /**\r
- * @param qName\r
- * @return example tree, see {@link #NETWORK_XML}\r
- */\r
- public static CompositeNode buildTestConfigTree(QName qName) {\r
- List<Node<?>> value = new ArrayList<Node<?>>();\r
- value.add(NodeFactory.createImmutableSimpleNode(new QName(qName, "element-id"), null, "ntElementId_09"));\r
- CompositeNode ntElementNode1 = NodeFactory.createImmutableCompositeNode(new QName(qName, "network-element"), null, value);\r
- assignParentToChildren(ntElementNode1);\r
-\r
- value = new ArrayList<Node<?>>();\r
- value.add(NodeFactory.createImmutableSimpleNode(new QName(qName, "element-id"), null, "ntElementId_10"));\r
- CompositeNode ntElementNode2 = NodeFactory.createImmutableCompositeNode(new QName(qName, "network-element"), null, value);\r
- assignParentToChildren(ntElementNode2);\r
-\r
- value = new ArrayList<Node<?>>();\r
- value.add(ntElementNode1);\r
- value.add(ntElementNode2);\r
- CompositeNode ntElementsNode = NodeFactory.createImmutableCompositeNode(\r
- new QName(qName, "network-elements"), null, value);\r
- assignParentToChildren(ntElementsNode);\r
-\r
- value = new ArrayList<Node<?>>();\r
- value.add(NodeFactory.createImmutableSimpleNode(new QName(qName, "dest-node"), null, "nodeId_07"));\r
- value.add(NodeFactory.createImmutableSimpleNode(new QName(qName, "dest-tp"), null, "tpId_08"));\r
- CompositeNode destination = NodeFactory.createImmutableCompositeNode(\r
- new QName(qName, "destination"), null, value);\r
- assignParentToChildren(destination);\r
-\r
- value = new ArrayList<Node<?>>();\r
- value.add(NodeFactory.createImmutableSimpleNode(new QName(qName, "source-node"), null, "nodeId_05"));\r
- value.add(NodeFactory.createImmutableSimpleNode(new QName(qName, "source-tp"), null, "tpId_06"));\r
- CompositeNode source = NodeFactory.createImmutableCompositeNode(\r
- new QName(qName, "source"), null, value);\r
- assignParentToChildren(source);\r
-\r
- value = new ArrayList<Node<?>>();\r
- value.add(NodeFactory.createImmutableSimpleNode(new QName(qName, "link-id"), null, "linkId_04"));\r
- value.add(source);\r
- value.add(destination);\r
- CompositeNode link1 = NodeFactory.createImmutableCompositeNode(\r
- new QName(qName, "link"), null, value);\r
- assignParentToChildren(link1);\r
-\r
- value = new ArrayList<Node<?>>();\r
- value.add(NodeFactory.createImmutableSimpleNode(new QName(qName, "dest-node"), null, "nodeId_14"));\r
- value.add(NodeFactory.createImmutableSimpleNode(new QName(qName, "dest-tp"), null, "tpId_15"));\r
- destination = NodeFactory.createImmutableCompositeNode(\r
- new QName(qName, "destination"), null, value);\r
- assignParentToChildren(destination);\r
-\r
- value = new ArrayList<Node<?>>();\r
- value.add(NodeFactory.createImmutableSimpleNode(new QName(qName, "source-node"), null, "nodeId_12"));\r
- value.add(NodeFactory.createImmutableSimpleNode(new QName(qName, "source-tp"), null, "tpId_13"));\r
- source = NodeFactory.createImmutableCompositeNode(\r
- new QName(qName, "source"), null, value);\r
- assignParentToChildren(source);\r
-\r
- value = new ArrayList<Node<?>>();\r
- value.add(NodeFactory.createImmutableSimpleNode(new QName(qName, "link-id"), null, "linkId_11"));\r
- value.add(source);\r
- value.add(destination);\r
- CompositeNode link2 = NodeFactory.createImmutableCompositeNode(\r
- new QName(qName, "link"), null, value);\r
- assignParentToChildren(link2);\r
-\r
- value = new ArrayList<Node<?>>();\r
- value.add(link1);\r
- value.add(link2);\r
- CompositeNode links = NodeFactory.createImmutableCompositeNode(\r
- new QName(qName, "links"), null, value);\r
- assignParentToChildren(links);\r
-\r
-\r
- value = new ArrayList<Node<?>>();\r
- value.add(NodeFactory.createImmutableSimpleNode(new QName(qName, "tp-id"), null, "tpId_03"));\r
- CompositeNode terminationPointNode1 = NodeFactory.createImmutableCompositeNode(\r
- new QName(qName, "termination-point"), null, value);\r
- assignParentToChildren(terminationPointNode1);\r
-\r
- value = new ArrayList<Node<?>>();\r
- value.add(terminationPointNode1);\r
- CompositeNode terminationPointsNode = NodeFactory.createImmutableCompositeNode(\r
- new QName(qName, "termination-points"), null, value);\r
- assignParentToChildren(terminationPointsNode);\r
-\r
- value = new ArrayList<Node<?>>();\r
- value.add(NodeFactory.createImmutableSimpleNode(new QName(qName, "node-id"), null, "nodeId_02"));\r
- value.add(NodeFactory.createImmutableSimpleNode(new QName(qName, "supporting-ne"), null, "networkId_02"));\r
- value.add(terminationPointsNode);\r
- CompositeNode node1Node = NodeFactory.createImmutableCompositeNode(\r
- new QName(qName, "node"), null, value);\r
- assignParentToChildren(node1Node);\r
-\r
- value = new ArrayList<Node<?>>();\r
- value.add(NodeFactory.createImmutableSimpleNode(new QName(qName, "tp-id"), null, "tpId_18"));\r
- terminationPointNode1 = NodeFactory.createImmutableCompositeNode(\r
- new QName(qName, "termination-point"), null, value);\r
- assignParentToChildren(terminationPointNode1);\r
-\r
- value = new ArrayList<Node<?>>();\r
- value.add(terminationPointNode1);\r
- terminationPointsNode = NodeFactory.createImmutableCompositeNode(\r
- new QName(qName, "termination-points"), null, value);\r
- assignParentToChildren(terminationPointsNode);\r
-\r
- value = new ArrayList<Node<?>>();\r
- value.add(NodeFactory.createImmutableSimpleNode(new QName(qName, "node-id"), null, "nodeId_16"));\r
- value.add(NodeFactory.createImmutableSimpleNode(new QName(qName, "supporting-ne"), null, "networkId_17"));\r
- value.add(terminationPointsNode);\r
- CompositeNode node2Node = NodeFactory.createImmutableCompositeNode(\r
- new QName(qName, "node"), null, value);\r
- assignParentToChildren(node2Node);\r
-\r
- value = new ArrayList<Node<?>>();\r
- value.add(NodeFactory.createImmutableSimpleNode(new QName(qName, "tp-id"), null, "tpId_18"));\r
- terminationPointNode1 = NodeFactory.createImmutableCompositeNode(\r
- new QName(qName, "termination-point"), null, value);\r
- assignParentToChildren(terminationPointNode1);\r
-\r
- value = new ArrayList<Node<?>>();\r
- value.add(NodeFactory.createImmutableSimpleNode(new QName(qName, "tp-id"), null, "tpId_19"));\r
- CompositeNode terminationPointNode2 = NodeFactory.createImmutableCompositeNode(\r
- new QName(qName, "termination-point"), null, value);\r
- assignParentToChildren(terminationPointNode2);\r
-\r
- value = new ArrayList<Node<?>>();\r
- value.add(terminationPointNode1);\r
- value.add(terminationPointNode2);\r
- terminationPointsNode = NodeFactory.createImmutableCompositeNode(\r
- new QName(qName, "termination-points"), null, value);\r
- assignParentToChildren(terminationPointsNode);\r
-\r
- value = new ArrayList<Node<?>>();\r
- value.add(NodeFactory.createImmutableSimpleNode(new QName(qName, "node-id"), null, "nodeId_19"));\r
- value.add(NodeFactory.createImmutableSimpleNode(new QName(qName, "supporting-ne"), null, "networkId_20"));\r
- value.add(terminationPointsNode);\r
- CompositeNode node3Node = NodeFactory.createImmutableCompositeNode(\r
- new QName(qName, "node"), null, value);\r
- assignParentToChildren(node3Node);\r
-\r
- value = new ArrayList<Node<?>>();\r
- value.add(node1Node);\r
- value.add(node2Node);\r
- value.add(node3Node);\r
- CompositeNode nodesNode = NodeFactory.createImmutableCompositeNode(\r
- new QName(qName, "nodes"), null, value);\r
- assignParentToChildren(nodesNode);\r
-\r
- value = new ArrayList<Node<?>>();\r
- value.add(links);\r
- value.add(nodesNode);\r
- value.add(NodeFactory.createImmutableSimpleNode(new QName(qName, "topology-id"), null, "topId_01"));\r
- CompositeNode topology = NodeFactory.createImmutableCompositeNode(\r
- new QName(qName, "topology"), null, value);\r
- assignParentToChildren(topology);\r
-\r
- value = new ArrayList<Node<?>>();\r
- value.add(topology);\r
- CompositeNode topologies = NodeFactory.createImmutableCompositeNode(\r
- new QName(qName, "topologies"), null, value);\r
- assignParentToChildren(topologies);\r
-\r
- value = new ArrayList<Node<?>>();\r
- value.add(topologies);\r
- value.add(ntElementsNode);\r
- CompositeNode network = NodeFactory.createImmutableCompositeNode(\r
- new QName(qName, "network"), null, value);\r
- assignParentToChildren(network);\r
-\r
- return network;\r
- }\r
-\r
- /**\r
- * @param parentNode\r
- */\r
- public static void assignParentToChildren(CompositeNode parentNode) {\r
- for (Node<?> child : parentNode.getChildren()) {\r
- ((AbstractNodeTO<?>) child).setParent(parentNode);\r
- }\r
- }\r
-\r
- /**\r
- * @return schema context of controller-network.yang\r
- */\r
- public static SchemaContext loadSchemaContext() {\r
- YangModelParser yParser = new YangParserImpl();\r
- List<InputStream> yangInputStreams = new ArrayList<>();\r
- yangInputStreams.add(NodeHelper.class.getResourceAsStream(\r
- "/controller-network.yang"));\r
- yangInputStreams.add(NodeHelper.class.getResourceAsStream(\r
- "/ietf-inet-types@2010-09-24.yang"));\r
- Set<Module> modules = yParser\r
- .parseYangModelsFromStreams(yangInputStreams);\r
- return yParser.resolveSchemaContext(modules);\r
- }\r
-\r
- /**\r
- * @param scriptName\r
- * @return tree root\r
- * @throws Exception\r
- */\r
- public static CompositeNode loadConfigByGroovy(String scriptName) throws Exception {\r
- InputStream configStream = NodeHelper.class.getResourceAsStream(scriptName);\r
- Binding binding = new Binding();\r
- GroovyShell gShell = new GroovyShell(binding);\r
- LOG.debug("groovy: starting script parse.. " + scriptName);\r
- Script configScript = gShell.parse(new InputStreamReader(configStream));\r
- LOG.debug("groovy: starting script.. " + scriptName);\r
- configScript.run();\r
- LOG.debug("groovy: digging result");\r
- Object xmlGen = binding.getVariable("xmlGen");\r
- LOG.debug("xmlGen = " + xmlGen);\r
- Method getter = xmlGen.getClass().getDeclaredMethod("getBuilder", new Class[0]);\r
- MyNodeBuilder builder = (MyNodeBuilder) getter.invoke(xmlGen, new Object[0]);\r
-\r
- return builder.getRootNode();\r
- }\r
-\r
- /**\r
- * @param pattern , e.g.: <pre>"//{0}:network/{1}:xx[text() = 'sss']"</pre>\r
- * @param nsArg , e.g.: <pre>{"uri:ns1", "uri:ns2"}</pre>\r
- * @return pattern with namespaces: <pre>//uri:ns1:network/uri:ns2:xx[text() = ''sss'']"</pre>\r
- */\r
- public static String AddNamespaceToPattern(String pattern, Object... nsArg) {\r
- Object[] ns = nsArg;\r
- String patternNs = pattern.replaceAll("'", "''");\r
- if (ns == null) {\r
- ns = new Object[]{""};\r
- } else {\r
- // add ':' into pattern after placeholders\r
- patternNs = patternNs.replaceAll("(\\{[0-9]+\\})", "$1:");\r
- }\r
-\r
- return MessageFormat.format(patternNs, ns);\r
- }\r
-\r
- /**\r
- * @param tree\r
- * @param xmlFile\r
- * @param clazz\r
- * @throws Exception\r
- * @throws SAXException\r
- * @throws IOException\r
- */\r
- public static void compareXmlTree(Document tree, String xmlFile, Class<?> clazz) throws Exception,\r
- SAXException, IOException {\r
- ByteArrayOutputStream actualRaw = new ByteArrayOutputStream();\r
- dumpDoc(tree, new PrintStream(actualRaw));\r
- Reader actualReader = new InputStreamReader(new ByteArrayInputStream(actualRaw.toByteArray()));\r
-\r
- Reader expectedReader = new InputStreamReader(clazz.getResourceAsStream(xmlFile));\r
- Diff myDiff = new Diff(expectedReader, actualReader);\r
- myDiff.overrideDifferenceListener(new IgnoreWhiteCharsDiffListener());\r
-\r
- boolean similar = myDiff.similar();\r
- if (! similar) {\r
- System.out.println(new String(actualRaw.toByteArray()));\r
- }\r
- Assert.assertEquals(myDiff.toString(), true, similar);\r
- }\r
-\r
-}\r
+/*
+ * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.yangtools.yang.data.impl;
+
+import groovy.lang.Binding;
+import groovy.lang.GroovyShell;
+import groovy.lang.Script;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.PrintStream;
+import java.io.Reader;
+import java.io.StringWriter;
+import java.lang.reflect.Method;
+import java.text.MessageFormat;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Set;
+
+import javax.xml.transform.OutputKeys;
+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 org.custommonkey.xmlunit.Diff;
+import org.junit.Assert;
+import org.opendaylight.yangtools.yang.common.QName;
+import org.opendaylight.yangtools.yang.data.api.CompositeNode;
+import org.opendaylight.yangtools.yang.data.api.Node;
+import org.opendaylight.yangtools.yang.data.impl.schema.NormalizedNodeUtils;
+import org.opendaylight.yangtools.yang.model.api.Module;
+import org.opendaylight.yangtools.yang.model.api.SchemaContext;
+import org.opendaylight.yangtools.yang.model.parser.api.YangModelParser;
+import org.opendaylight.yangtools.yang.parser.impl.YangParserImpl;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.w3c.dom.Document;
+import org.xml.sax.SAXException;
+
+/**
+ * @author michal.rehak
+ *
+ * @deprecated Use {@link NormalizedNodeUtils} instead.
+ */
+@Deprecated
+public abstract class NodeHelper {
+
+ private static final Logger LOG = LoggerFactory.getLogger(NodeHelper.class);
+
+ /** xml source of example network configuration */
+ public static final String NETWORK_XML =
+ "<network xmlns=\"urn:opendaylight:controller:network\">\n" +
+ //"<network>\n" +
+ " <topologies>\n" +
+ " <topology>\n" +
+ " <topology-id>topId_01</topology-id>\n" +
+ " <nodes>\n" +
+ " <node>\n" +
+ " <node-id>nodeId_02</node-id>\n" +
+ " <supporting-ne>networkId_02</supporting-ne>\n" +
+ " <termination-points>\n" +
+ " <termination-point>\n" +
+ " <tp-id>tpId_03</tp-id>\n" +
+ " </termination-point>\n" +
+ " </termination-points>\n" +
+ " </node>\n" +
+ " <node>\n" +
+ " <node-id>nodeId_16</node-id>\n" +
+ " <supporting-ne>networkId_17</supporting-ne>\n" +
+ " <termination-points>\n" +
+ " <termination-point>\n" +
+ " <tp-id>tpId_18</tp-id>\n" +
+ " </termination-point>\n" +
+ " </termination-points>\n" +
+ " </node>\n" +
+ " <node>\n" +
+ " <node-id>nodeId_19</node-id>\n" +
+ " <supporting-ne>networkId_20</supporting-ne>\n" +
+ " <termination-points>\n" +
+ " <termination-point>\n" +
+ " <tp-id>tpId_18</tp-id>\n" +
+ " </termination-point>\n" +
+ " <termination-point>\n" +
+ " <tp-id>tpId_19</tp-id>\n" +
+ " </termination-point>\n" +
+ " </termination-points>\n" +
+ " </node>\n" +
+ " </nodes>\n" +
+ " <links>\n" +
+ " <link>\n" +
+ " <link-id>linkId_04</link-id>\n" +
+ " <source>\n" +
+ " <source-node>nodeId_05</source-node>\n" +
+ " <source-tp>tpId_06</source-tp>\n" +
+ " </source>\n" +
+ " <destination>\n" +
+ " <dest-node>nodeId_07</dest-node>\n" +
+ " <dest-tp>tpId_08</dest-tp>\n" +
+ " </destination>\n" +
+ " </link>\n" +
+ " <link>\n" +
+ " <link-id>linkId_11</link-id>\n" +
+ " <source>\n" +
+ " <source-node>nodeId_12</source-node>\n" +
+ " <source-tp>tpId_13</source-tp>\n" +
+ " </source>\n" +
+ " <destination>\n" +
+ " <dest-node>nodeId_14</dest-node>\n" +
+ " <dest-tp>tpId_15</dest-tp>\n" +
+ " </destination>\n" +
+ " </link>\n" +
+ " </links>\n" +
+ " </topology>\n" +
+ " </topologies>\n" +
+ " <network-elements>\n" +
+ " <network-element>\n" +
+ " <element-id>ntElementId_09</element-id>\n" +
+ " </network-element>\n" +
+ " <network-element>\n" +
+ " <element-id>ntElementId_10</element-id>\n" +
+ " </network-element>\n" +
+ " </network-elements>\n" +
+ "</network>";
+
+ private static String domTreeString(final Document domTree) throws TransformerException {
+ TransformerFactory transformerFact = TransformerFactory.newInstance();
+ transformerFact.setAttribute("indent-number", 4);
+ Transformer transformer = transformerFact.newTransformer();
+ transformer.setOutputProperty(OutputKeys.INDENT, "yes");
+ //initialize StreamResult with File object to save to file
+ StreamResult result = new StreamResult(new StringWriter());
+ DOMSource source = new DOMSource(domTree);
+ transformer.transform(source, result);
+ return result.getWriter().toString();
+ }
+
+ /**
+ * @param domTree
+ * @param out
+ * @throws Exception
+ */
+ private static void dumpDoc(final Document domTree, final PrintStream out) throws Exception {
+ out.println(domTreeString(domTree));
+ }
+
+ public static void dumpDoc(final Document domTree, final Logger logger) throws TransformerException {
+ logger.info("{}", domTreeString(domTree));
+ }
+
+ /**
+ * @param qName
+ * @return example tree, see {@link #NETWORK_XML}
+ */
+ public static CompositeNode buildTestConfigTree(final QName qName) {
+ List<Node<?>> value = new ArrayList<Node<?>>();
+ value.add(NodeFactory.createImmutableSimpleNode(QName.create(qName, "element-id"), null, "ntElementId_09"));
+ CompositeNode ntElementNode1 = NodeFactory.createImmutableCompositeNode(QName.create(qName, "network-element"),
+ null, value);
+ assignParentToChildren(ntElementNode1);
+
+ value = new ArrayList<Node<?>>();
+ value.add(NodeFactory.createImmutableSimpleNode(QName.create(qName, "element-id"), null, "ntElementId_10"));
+ CompositeNode ntElementNode2 = NodeFactory.createImmutableCompositeNode(QName.create(qName, "network-element"),
+ null, value);
+ assignParentToChildren(ntElementNode2);
+
+ value = new ArrayList<Node<?>>();
+ value.add(ntElementNode1);
+ value.add(ntElementNode2);
+ CompositeNode ntElementsNode = NodeFactory.createImmutableCompositeNode(
+ QName.create(qName, "network-elements"), null, value);
+ assignParentToChildren(ntElementsNode);
+
+ value = new ArrayList<Node<?>>();
+ value.add(NodeFactory.createImmutableSimpleNode(QName.create(qName, "dest-node"), null, "nodeId_07"));
+ value.add(NodeFactory.createImmutableSimpleNode(QName.create(qName, "dest-tp"), null, "tpId_08"));
+ CompositeNode destination = NodeFactory.createImmutableCompositeNode(
+ QName.create(qName, "destination"), null,
+ value);
+ assignParentToChildren(destination);
+
+ value = new ArrayList<Node<?>>();
+ value.add(NodeFactory.createImmutableSimpleNode(QName.create(qName, "source-node"), null, "nodeId_05"));
+ value.add(NodeFactory.createImmutableSimpleNode(QName.create(qName, "source-tp"), null, "tpId_06"));
+ CompositeNode source = NodeFactory.createImmutableCompositeNode(
+ QName.create(qName, "source"), null, value);
+ assignParentToChildren(source);
+
+ value = new ArrayList<Node<?>>();
+ value.add(NodeFactory.createImmutableSimpleNode(QName.create(qName, "link-id"), null, "linkId_04"));
+ value.add(source);
+ value.add(destination);
+ CompositeNode link1 = NodeFactory.createImmutableCompositeNode(
+ QName.create(qName, "link"), null, value);
+ assignParentToChildren(link1);
+
+ value = new ArrayList<Node<?>>();
+ value.add(NodeFactory.createImmutableSimpleNode(QName.create(qName, "dest-node"), null, "nodeId_14"));
+ value.add(NodeFactory.createImmutableSimpleNode(QName.create(qName, "dest-tp"), null, "tpId_15"));
+ destination = NodeFactory.createImmutableCompositeNode(
+ QName.create(qName, "destination"), null, value);
+ assignParentToChildren(destination);
+
+ value = new ArrayList<Node<?>>();
+ value.add(NodeFactory.createImmutableSimpleNode(QName.create(qName, "source-node"), null, "nodeId_12"));
+ value.add(NodeFactory.createImmutableSimpleNode(QName.create(qName, "source-tp"), null, "tpId_13"));
+ source = NodeFactory.createImmutableCompositeNode(
+ QName.create(qName, "source"), null, value);
+ assignParentToChildren(source);
+
+ value = new ArrayList<Node<?>>();
+ value.add(NodeFactory.createImmutableSimpleNode(QName.create(qName, "link-id"), null, "linkId_11"));
+ value.add(source);
+ value.add(destination);
+ CompositeNode link2 = NodeFactory.createImmutableCompositeNode(
+ QName.create(qName, "link"), null, value);
+ assignParentToChildren(link2);
+
+ value = new ArrayList<Node<?>>();
+ value.add(link1);
+ value.add(link2);
+ CompositeNode links = NodeFactory.createImmutableCompositeNode(
+ QName.create(qName, "links"), null, value);
+ assignParentToChildren(links);
+
+
+ value = new ArrayList<Node<?>>();
+ value.add(NodeFactory.createImmutableSimpleNode(QName.create(qName, "tp-id"), null, "tpId_03"));
+ CompositeNode terminationPointNode1 = NodeFactory.createImmutableCompositeNode(
+ QName.create(qName, "termination-point"), null, value);
+ assignParentToChildren(terminationPointNode1);
+
+ value = new ArrayList<Node<?>>();
+ value.add(terminationPointNode1);
+ CompositeNode terminationPointsNode = NodeFactory.createImmutableCompositeNode(
+ QName.create(qName, "termination-points"), null, value);
+ assignParentToChildren(terminationPointsNode);
+
+ value = new ArrayList<Node<?>>();
+ value.add(NodeFactory.createImmutableSimpleNode(QName.create(qName, "node-id"), null, "nodeId_02"));
+ value.add(NodeFactory.createImmutableSimpleNode(QName.create(qName, "supporting-ne"), null, "networkId_02"));
+ value.add(terminationPointsNode);
+ CompositeNode node1Node = NodeFactory.createImmutableCompositeNode(
+ QName.create(qName, "node"), null, value);
+ assignParentToChildren(node1Node);
+
+ value = new ArrayList<Node<?>>();
+ value.add(NodeFactory.createImmutableSimpleNode(QName.create(qName, "tp-id"), null, "tpId_18"));
+ terminationPointNode1 = NodeFactory.createImmutableCompositeNode(
+ QName.create(qName, "termination-point"),
+ null, value);
+ assignParentToChildren(terminationPointNode1);
+
+ value = new ArrayList<Node<?>>();
+ value.add(terminationPointNode1);
+ terminationPointsNode = NodeFactory.createImmutableCompositeNode(
+ QName.create(qName, "termination-points"),
+ null, value);
+ assignParentToChildren(terminationPointsNode);
+
+ value = new ArrayList<Node<?>>();
+ value.add(NodeFactory.createImmutableSimpleNode(QName.create(qName, "node-id"), null, "nodeId_16"));
+ value.add(NodeFactory.createImmutableSimpleNode(QName.create(qName, "supporting-ne"), null, "networkId_17"));
+ value.add(terminationPointsNode);
+ CompositeNode node2Node = NodeFactory.createImmutableCompositeNode(
+ QName.create(qName, "node"), null, value);
+ assignParentToChildren(node2Node);
+
+ value = new ArrayList<Node<?>>();
+ value.add(NodeFactory.createImmutableSimpleNode(QName.create(qName, "tp-id"), null, "tpId_18"));
+ terminationPointNode1 = NodeFactory.createImmutableCompositeNode(
+ QName.create(qName, "termination-point"),
+ null, value);
+ assignParentToChildren(terminationPointNode1);
+
+ value = new ArrayList<Node<?>>();
+ value.add(NodeFactory.createImmutableSimpleNode(QName.create(qName, "tp-id"), null, "tpId_19"));
+ CompositeNode terminationPointNode2 = NodeFactory.createImmutableCompositeNode(
+ QName.create(qName, "termination-point"), null, value);
+ assignParentToChildren(terminationPointNode2);
+
+ value = new ArrayList<Node<?>>();
+ value.add(terminationPointNode1);
+ value.add(terminationPointNode2);
+ terminationPointsNode = NodeFactory.createImmutableCompositeNode(
+ QName.create(qName, "termination-points"),
+ null, value);
+ assignParentToChildren(terminationPointsNode);
+
+ value = new ArrayList<Node<?>>();
+ value.add(NodeFactory.createImmutableSimpleNode(QName.create(qName, "node-id"), null, "nodeId_19"));
+ value.add(NodeFactory.createImmutableSimpleNode(QName.create(qName, "supporting-ne"), null, "networkId_20"));
+ value.add(terminationPointsNode);
+ CompositeNode node3Node = NodeFactory.createImmutableCompositeNode(
+ QName.create(qName, "node"), null, value);
+ assignParentToChildren(node3Node);
+
+ value = new ArrayList<Node<?>>();
+ value.add(node1Node);
+ value.add(node2Node);
+ value.add(node3Node);
+ CompositeNode nodesNode = NodeFactory.createImmutableCompositeNode(
+ QName.create(qName, "nodes"), null, value);
+ assignParentToChildren(nodesNode);
+
+ value = new ArrayList<Node<?>>();
+ value.add(links);
+ value.add(nodesNode);
+ value.add(NodeFactory.createImmutableSimpleNode(QName.create(qName, "topology-id"), null, "topId_01"));
+ CompositeNode topology = NodeFactory.createImmutableCompositeNode(
+ QName.create(qName, "topology"), null, value);
+ assignParentToChildren(topology);
+
+ value = new ArrayList<Node<?>>();
+ value.add(topology);
+ CompositeNode topologies = NodeFactory.createImmutableCompositeNode(
+ QName.create(qName, "topologies"), null,
+ value);
+ assignParentToChildren(topologies);
+
+ value = new ArrayList<Node<?>>();
+ value.add(topologies);
+ value.add(ntElementsNode);
+ CompositeNode network = NodeFactory.createImmutableCompositeNode(
+ QName.create(qName, "network"), null, value);
+ assignParentToChildren(network);
+
+ return network;
+ }
+
+ /**
+ * @param parentNode
+ */
+ public static void assignParentToChildren(final CompositeNode parentNode) {
+ for (Node<?> child : parentNode.getValue()) {
+ ((AbstractNodeTO<?>) child).setParent(parentNode);
+ }
+ }
+
+ /**
+ * @return schema context of controller-network.yang
+ */
+ public static SchemaContext loadSchemaContext() {
+ YangModelParser yParser = new YangParserImpl();
+ List<InputStream> yangInputStreams = new ArrayList<>();
+ yangInputStreams.add(NodeHelper.class.getResourceAsStream(
+ "/controller-network.yang"));
+ yangInputStreams.add(NodeHelper.class.getResourceAsStream(
+ "/ietf-inet-types@2010-09-24.yang"));
+ Set<Module> modules = yParser
+ .parseYangModelsFromStreams(yangInputStreams);
+ return yParser.resolveSchemaContext(modules);
+ }
+
+ /**
+ * @param scriptName
+ * @return tree root
+ * @throws Exception
+ */
+ public static CompositeNode loadConfigByGroovy(final String scriptName) throws Exception {
+ InputStream configStream = NodeHelper.class.getResourceAsStream(scriptName);
+ Binding binding = new Binding();
+ GroovyShell gShell = new GroovyShell(binding);
+ LOG.debug("groovy: starting script parse.. {}", scriptName);
+ Script configScript = gShell.parse(new InputStreamReader(configStream));
+ LOG.debug("groovy: starting script.. {}", scriptName);
+ configScript.run();
+ LOG.debug("groovy: digging result");
+ Object xmlGen = binding.getVariable("xmlGen");
+ LOG.debug("xmlGen = {}", xmlGen);
+ Method getter = xmlGen.getClass().getDeclaredMethod("getBuilder", new Class[0]);
+ MyNodeBuilder builder = (MyNodeBuilder) getter.invoke(xmlGen, new Object[0]);
+
+ return builder.getRootNode();
+ }
+
+ /**
+ * @param pattern , e.g.: <pre>"//{0}:network/{1}:xx[text() = 'sss']"</pre>
+ * @param nsArg , e.g.: <pre>{"uri:ns1", "uri:ns2"}</pre>
+ * @return pattern with namespaces: <pre>//uri:ns1:network/uri:ns2:xx[text() = ''sss'']"</pre>
+ */
+ public static String AddNamespaceToPattern(final String pattern, final Object... nsArg) {
+ Object[] ns = nsArg;
+ String patternNs = pattern.replaceAll("'", "''");
+ if (ns == null) {
+ ns = new Object[]{""};
+ } else {
+ // add ':' into pattern after placeholders
+ patternNs = patternNs.replaceAll("(\\{[0-9]+\\})", "$1:");
+ }
+
+ return MessageFormat.format(patternNs, ns);
+ }
+
+ /**
+ * @param tree
+ * @param xmlFile
+ * @param clazz
+ * @throws Exception
+ * @throws SAXException
+ * @throws IOException
+ */
+ public static void compareXmlTree(final Document tree, final String xmlFile, final Class<?> clazz) throws Exception,
+ SAXException, IOException {
+ ByteArrayOutputStream actualRaw = new ByteArrayOutputStream();
+ dumpDoc(tree, new PrintStream(actualRaw));
+ Reader actualReader = new InputStreamReader(new ByteArrayInputStream(actualRaw.toByteArray()));
+
+ Reader expectedReader = new InputStreamReader(clazz.getResourceAsStream(xmlFile));
+ Diff myDiff = new Diff(expectedReader, actualReader);
+ myDiff.overrideDifferenceListener(new IgnoreWhiteCharsDiffListener());
+
+ boolean similar = myDiff.similar();
+ if (! similar) {
+ LOG.info("{}", new String(actualRaw.toByteArray()));
+ }
+ Assert.assertEquals(myDiff.toString(), true, similar);
+ }
+}