Class DocumentComparator


  • public class DocumentComparator
    extends java.lang.Object
    XML document comparator. This uses XMLPull parsers to read a pair of documents in parallel, comparing the streams of components seen from the two documents. The comparison ignores differences in whitespace separating elements, but in non-schema mode treats whitespace as significant within elements with only character data content.
    Author:
    Dennis M. Sosnoski
    • Field Summary

      Fields 
      Modifier and Type Field Description
      protected java.io.PrintStream m_differencePrint
      Print stream for reporting differences.
      protected XmlPullParser m_parserA
      Parser for first document.
      protected XmlPullParser m_parserB
      Parser for second document.
      protected boolean m_schemaCompare
      Compare using schema data value adjustments flag.
    • Constructor Summary

      Constructors 
      Constructor Description
      DocumentComparator​(java.io.PrintStream print)
      Constructor.
      DocumentComparator​(java.io.PrintStream print, boolean schema)
      Constructor with schema adjustments flag specified.
    • Method Summary

      All Methods Static Methods Instance Methods Concrete Methods 
      Modifier and Type Method Description
      protected static java.lang.String buildName​(java.lang.String ns, java.lang.String name)
      Build name string.
      protected static java.lang.String buildPositionString​(XmlPullParser parser)
      Build parse input position description.
      boolean compare​(java.io.Reader rdra, java.io.Reader rdrb)
      Compares a pair of documents by reading them in parallel from a pair of parsers.
      protected boolean equalValues​(java.lang.String texta, java.lang.String textb)
      Check for equal values.
      private static boolean isSchemaLocation​(java.lang.String name, java.lang.String ns)
      Check if a name/namespace pair matches a schema namespace location attribute.
      protected boolean matchAttributes()
      Verifies that the attributes on the current start tags match.
      protected boolean matchNames()
      Verifies that the current start or end tag names match.
      protected boolean matchText​(java.lang.String texta, java.lang.String textb, java.lang.String lead)
      Check if two text strings match, ignoring leading and trailing spaces.
      private static java.lang.String normalizeDecimal​(java.lang.String text)
      Normalize a decimal value for comparison.
      protected void printError​(java.lang.String msg)
      Prints error description text.
      • Methods inherited from class java.lang.Object

        clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
    • Field Detail

      • m_parserA

        protected XmlPullParser m_parserA
        Parser for first document.
      • m_parserB

        protected XmlPullParser m_parserB
        Parser for second document.
      • m_differencePrint

        protected java.io.PrintStream m_differencePrint
        Print stream for reporting differences.
      • m_schemaCompare

        protected boolean m_schemaCompare
        Compare using schema data value adjustments flag.
    • Constructor Detail

      • DocumentComparator

        public DocumentComparator​(java.io.PrintStream print,
                                  boolean schema)
                           throws XmlPullParserException
        Constructor with schema adjustments flag specified. Builds the actual parsers and sets up for comparisons.
        Parameters:
        print - print stream for reporting differences
        schema - use schema adjustments in comparisons flag
        Throws:
        XmlPullParserException - on error creating parsers
      • DocumentComparator

        public DocumentComparator​(java.io.PrintStream print)
                           throws XmlPullParserException
        Constructor. Builds the actual parser.
        Parameters:
        print - print stream for reporting differences
        Throws:
        XmlPullParserException - on error creating parsers
    • Method Detail

      • buildPositionString

        protected static java.lang.String buildPositionString​(XmlPullParser parser)
        Build parse input position description.
        Parameters:
        parser - for which to build description
        Returns:
        text description of current parse position
      • buildName

        protected static java.lang.String buildName​(java.lang.String ns,
                                                    java.lang.String name)
        Build name string.
        Parameters:
        ns - namespace URI
        name - local name
        Returns:
        printable names string
      • printError

        protected void printError​(java.lang.String msg)
        Prints error description text. The generated text include position information from both documents.
        Parameters:
        msg - error message text
      • isSchemaLocation

        private static boolean isSchemaLocation​(java.lang.String name,
                                                java.lang.String ns)
        Check if a name/namespace pair matches a schema namespace location attribute.
        Parameters:
        name -
        ns -
        Returns:
        true if a schema namespace location, false if not
      • normalizeDecimal

        private static java.lang.String normalizeDecimal​(java.lang.String text)
        Normalize a decimal value for comparison. A leading '+' sign is ignored, while a leading '-' is kept. If no non-zero digits are seen a "0" value is returned; otherwise, all significant digits are kept and returned (including a decimal point only if there are fraction digits)
        Parameters:
        text -
        Returns:
        normalized value
      • equalValues

        protected boolean equalValues​(java.lang.String texta,
                                      java.lang.String textb)
        Check for equal values. If the schema compare flag is configured, this applies some basic schema rules in the comparisons, allowing '0' to match 'false' and '1' to match 'true', and comparing values using date or dateTime structure as decoded values.
        Parameters:
        texta -
        textb -
        Returns:
        true if values match, false if not
      • matchAttributes

        protected boolean matchAttributes()
        Verifies that the attributes on the current start tags match. Any mismatches are printed immediately.
        Returns:
        true if the attributes match, false if not
      • matchText

        protected boolean matchText​(java.lang.String texta,
                                    java.lang.String textb,
                                    java.lang.String lead)
        Check if two text strings match, ignoring leading and trailing spaces. Any mismatch is printed immediately, with the supplied lead text.
        Parameters:
        texta -
        textb -
        lead - error text lead
        Returns:
        true if the texts match, false if not
      • matchNames

        protected boolean matchNames()
        Verifies that the current start or end tag names match.
        Returns:
        true if the names match, false if not
      • compare

        public boolean compare​(java.io.Reader rdra,
                               java.io.Reader rdrb)
        Compares a pair of documents by reading them in parallel from a pair of parsers. The comparison ignores differences in whitespace separating elements, but treats whitespace as significant within elements with only character data content.
        Parameters:
        rdra - reader for first document to be compared
        rdrb - reader for second document to be compared
        Returns:
        true if the documents are the same, false if they're different