2 * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved.
4 * This program and the accompanying materials are made available under the
5 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6 * and is available at http://www.eclipse.org/legal/epl-v10.html
9 package org.opendaylight.controller.netconf.util.test;
11 import org.custommonkey.xmlunit.ElementNameAndTextQualifier;
12 import org.custommonkey.xmlunit.ElementQualifier;
13 import org.w3c.dom.Element;
14 import org.w3c.dom.Node;
15 import org.w3c.dom.NodeList;
18 * Custom xmlunit qualifier that doesn't care about order when deeper in the recursion
19 * defaults to comparing element name and text content
21 public class NetconfXmlUnitRecursiveQualifier implements ElementQualifier {
23 private final ElementQualifier qualifier;
25 public NetconfXmlUnitRecursiveQualifier() {
26 this.qualifier = new ElementNameAndTextQualifier();
29 public NetconfXmlUnitRecursiveQualifier(final ElementQualifier qualifier) {
30 this.qualifier = qualifier;
34 public boolean qualifyForComparison(Element currentControl,
35 Element currentTest) {
36 return compareNodes(currentControl, currentTest);
39 private boolean compareNodes(Node currentControl, Node currentTest) {
42 if (!qualifier.qualifyForComparison((Element) currentControl,
43 (Element) currentTest)) {
47 NodeList controlNodes;
50 if (currentControl.hasChildNodes() && currentTest.hasChildNodes()) {
51 controlNodes = currentControl.getChildNodes();
52 testNodes = currentTest.getChildNodes();
54 return !(currentControl.hasChildNodes() || currentTest.hasChildNodes());
57 return (countNodesWithoutConsecutiveTextNodes(controlNodes) == countNodesWithoutConsecutiveTextNodes(testNodes))
58 && checkChildren(controlNodes, testNodes);
60 } catch (Exception e) {
65 private boolean checkChildren(NodeList controlNodes, NodeList testNodes) {
66 for (int i = 0; i < controlNodes.getLength(); i++) {
67 boolean matchFound = false;
68 for (int j = 0; j < testNodes.getLength(); j++) {
69 Node controlNode = controlNodes.item(i);
70 Node testNode = testNodes.item(j);
72 if (controlNode.getNodeType() != testNode.getNodeType()) {
76 if (controlNode.getNodeType() == Node.TEXT_NODE) {
77 if (concatenateText(controlNode).equals(concatenateText(testNode))) {
82 } else if (compareNodes(controlNode, testNode)) {
95 private static String concatenateText(Node textNode) {
96 StringBuilder builder = new StringBuilder();
100 if (next.getNodeValue() != null) {
101 builder.append(next.getNodeValue().trim());
102 next = next.getNextSibling();
104 } while (next != null && next.getNodeType() == Node.TEXT_NODE);
106 return builder.toString();
109 private static int countNodesWithoutConsecutiveTextNodes(NodeList l) {
111 boolean lastNodeWasText = false;
112 final int length = l.getLength();
113 for (int i = 0; i < length; i++) {
115 if (!lastNodeWasText || n.getNodeType() != Node.TEXT_NODE) {
118 lastNodeWasText = n.getNodeType() == Node.TEXT_NODE;