001: /*
002: ******************************************************************
003: Copyright (c) 2001, Jeff Martin, Tim Bacon
004: All rights reserved.
005:
006: Redistribution and use in source and binary forms, with or without
007: modification, are permitted provided that the following conditions
008: are met:
009:
010: * Redistributions of source code must retain the above copyright
011: notice, this list of conditions and the following disclaimer.
012: * Redistributions in binary form must reproduce the above
013: copyright notice, this list of conditions and the following
014: disclaimer in the documentation and/or other materials provided
015: with the distribution.
016: * Neither the name of the xmlunit.sourceforge.net nor the names
017: of its contributors may be used to endorse or promote products
018: derived from this software without specific prior written
019: permission.
020:
021: THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
022: "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
023: LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
024: FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
025: COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
026: INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
027: BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
028: LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
029: CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
030: LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
031: ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
032: POSSIBILITY OF SUCH DAMAGE.
033:
034: ******************************************************************
035: */
036:
037: package org.custommonkey.xmlunit;
038:
039: import org.w3c.dom.Element;
040: import org.w3c.dom.Node;
041: import org.w3c.dom.NodeList;
042: import org.w3c.dom.Text;
043:
044: /**
045: * More complex interface implementation that tests two elements for tag name
046: * and text content comparability.
047: * <br />Examples and more at
048: * <a href="http://xmlunit.sourceforge.net"/>xmlunit.sourceforge.net</a>
049: * @see DifferenceEngine#compareNodeList(NodeList, NodeList, int, DifferenceListener, ElementQualifier)
050: * @see Diff#overrideElementQualifier(ElementQualifier)
051: */
052: public class ElementNameAndTextQualifier extends ElementNameQualifier {
053: /**
054: * Determine whether two elements qualify for further Difference comparison.
055: * @param control
056: * @param test
057: * @return true if the two elements qualify for further comparison based on
058: * both the superclass qualification (namespace URI and non- namespaced tag
059: * name), and the qualification of the text nodes contained within the
060: * elements; false otherwise
061: */
062: public boolean qualifyForComparison(Element control, Element test) {
063: if (super .qualifyForComparison(control, test)) {
064: return similar(extractText(control), extractText(test));
065: }
066: return false;
067: }
068:
069: /**
070: * Determine whether the text nodes contain similar values
071: * @param control
072: * @param test
073: * @return true if text nodes are similar, false otherwise
074: */
075: protected boolean similar(Text control, Text test) {
076: if (control == null) {
077: return test == null;
078: } else if (test == null) {
079: return false;
080: }
081: return control.getNodeValue().equals(test.getNodeValue());
082: }
083:
084: /**
085: * Extract the normalized text from within an element
086: * @param fromElement
087: * @return extracted Text node (could be null)
088: */
089: protected Text extractText(Element fromElement) {
090: fromElement.normalize();
091: NodeList fromNodeList = fromElement.getChildNodes();
092: Node currentNode;
093: for (int i = 0; i < fromNodeList.getLength(); ++i) {
094: currentNode = fromNodeList.item(i);
095: if (currentNode.getNodeType() == Node.TEXT_NODE) {
096: return (Text) currentNode;
097: }
098: }
099: return null;
100: }
101:
102: }
|