blob: d2341a8350db419db2cf74722d26c452a8615d43 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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.
*/
package org.tempuri.elementQualifier;
import org.custommonkey.xmlunit.ElementQualifier;
import org.w3c.dom.Element;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
/**
* This interface implementation determines whether two elements should be compared
* when comparing WSDL files. The nodes are intended for comparison when they are
* defined by the same namespace URI, have the same tag name (without namespace),
* and have the same name attribute.
*/
public class WSDLElementQualifier implements ElementQualifier {
/**
* Determine whether two elements are comparable
* @param control an Element from the control XML NodeList
* @param test an Element from the test XML NodeList
* @return true if the elements are comparable, otherwise return false. Two
* elements should be compared if they have the same namespace URI, the same
* tag name (with namespace not present) and the same name attribute.
*/
public boolean qualifyForComparison(Element control, Element test) {
return control != null
&& test != null
&& sameNamespaceURI(control, test)
&& sameTagName(control, test)
&& sameNameAttribute(control, test);
}
/**
* Determine whether two nodes are associated with the same namespace URI
* @param control an Element from the control XML NodeList
* @param test an Element from the test XML NodeList
* @return true if the two nodes are associated with the same namespace URI,
* otherwise return false
*/
protected boolean sameNamespaceURI(Node control, Node test) {
String controlNS = control.getNamespaceURI();
String testNS = test.getNamespaceURI();
if (controlNS == null) {
return testNS == null;
}
return controlNS.equals(testNS);
}
/**
* Determine whether two nodes have the same tag name once any
* namespace information is removed
* @param control an Element from the control XML NodeList
* @param test an Element from the test XML NodeList
* @return true if the two nodes have the same tag name not including
* namespace information (if present), otherwise return false
*/
protected boolean sameTagName(Node control, Node test) {
return getTagWithoutNamespace(control).equals(getTagWithoutNamespace(test));
}
/**
* Remove any namespace information from a tag name
* @param node an Element from an XML NodeList
* @return the localName if the node includes namespace information,
* otherwise return the nodeName
*/
protected String getTagWithoutNamespace(Node node) {
String name = node.getLocalName();
if (name == null) {
return node.getNodeName();
}
return name;
}
/**
* Determine whether two nodes have the same name attribute
* @param control an Element from the control XML NodeList
* @param test an Element from the test XML NodeList
* @return true if the two nodes have the same name attribute
* (with the absence of a name attribute considered a specific
* name attribute), otherwise return false
*/
protected boolean sameNameAttribute(Node control, Node test) {
return getNameAttribute(control).equals(getNameAttribute(test));
}
/**
* Obtain the name attribute for the node
* @param node an Element for which the Name attribute is sought
* @return the name attribute for the node if the "name" attribute
* exists, otherwise return ""
*/
protected String getNameAttribute(Node node) {
NamedNodeMap nnMap = node.getAttributes();
if (nnMap.getLength() == 0) {
return "";
}
Node nameAttrNode = nnMap.getNamedItem("name");
if (nameAttrNode == null) {
return "";
}
return nameAttrNode.getNodeValue();
}
}