001: /*
002: ******************************************************************
003: Copyright (c) 2001-2007, 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 java.util.List;
040: import java.util.ArrayList;
041:
042: /**
043: * Compares and describes all the differences between two XML documents.
044: * The document comparison does not stop once the first unrecoverable difference
045: * is found, unlike the Diff class.
046: * Note that because the differences are described relative to some control XML
047: * the list of all differences when <i>A</i> is compared to <i>B</i> will not
048: * necessarily be the same as when <i>B</i> is compared to <i>A</i>.
049: * <br />Examples and more at <a href="http://xmlunit.sourceforge.net"/>xmlunit.sourceforge.net</a>
050: */
051: public class DetailedDiff extends Diff {
052: private final List allDifferences;
053:
054: /**
055: * Create a new instance based on a prototypical Diff instance
056: * @param prototype the Diff instance for which more detailed difference
057: * information is required
058: */
059: public DetailedDiff(Diff prototype) {
060: super (prototype);
061: allDifferences = new ArrayList();
062: }
063:
064: /**
065: * DifferenceListener implementation.
066: * Add the difference to the list of all differences
067: * @param expected
068: * @param actual
069: * @param control
070: * @param test
071: * @param comparingWhat
072: * @return the value supplied by the superclass implementation
073: */
074: public int differenceFound(Difference difference) {
075: final int returnValue = super .differenceFound(difference);
076: switch (returnValue) {
077: case RETURN_IGNORE_DIFFERENCE_NODES_IDENTICAL:
078: return returnValue;
079: case RETURN_ACCEPT_DIFFERENCE:
080: break;
081: case RETURN_IGNORE_DIFFERENCE_NODES_SIMILAR:
082: difference.setRecoverable(true);
083: break;
084: default:
085: throw new IllegalArgumentException(returnValue
086: + " is not a defined " + " DifferenceListener"
087: + ".RETURN_... value");
088: }
089: allDifferences.add(difference);
090: return returnValue;
091: }
092:
093: /**
094: * ComparisonController implementation.
095: * @param afterDifference
096: * @return false always as this class wants to see all differences
097: */
098: public boolean haltComparison(Difference afterDifference) {
099: return false;
100: }
101:
102: /**
103: * Obtain all the differences found by this instance
104: * @return a list of {@link Difference differences}
105: */
106: public List getAllDifferences() {
107: compare();
108: return allDifferences;
109: }
110: }
|