Index: src/org/apache/xerces/impl/dv/xs/AbstractDateTimeDV.java =================================================================== RCS file: /home/cvspublic/xml-xerces/java/src/org/apache/xerces/impl/dv/xs/AbstractDateTimeDV.java,v retrieving revision 1.17 diff -u -r1.17 AbstractDateTimeDV.java --- src/org/apache/xerces/impl/dv/xs/AbstractDateTimeDV.java 28 Sep 2004 21:12:33 -0000 1.17 +++ src/org/apache/xerces/impl/dv/xs/AbstractDateTimeDV.java 30 Sep 2004 18:28:12 -0000 @@ -52,6 +52,25 @@ public short getAllowedFacets(){ return ( XSSimpleTypeDecl.FACET_PATTERN | XSSimpleTypeDecl.FACET_WHITESPACE | XSSimpleTypeDecl.FACET_ENUMERATION |XSSimpleTypeDecl.FACET_MAXINCLUSIVE |XSSimpleTypeDecl.FACET_MININCLUSIVE | XSSimpleTypeDecl.FACET_MAXEXCLUSIVE | XSSimpleTypeDecl.FACET_MINEXCLUSIVE ); }//getAllowedFacets() + + + // distinguishes between identity and equality for date/time values + // ie: two values representing the same "moment in time" but with different + // remembered timezones are now equal but not identical. + public boolean isIdentical (Object value1, Object value2) { + if (!(value1 instanceof DateTimeData) || !(value2 instanceof DateTimeData)) + return false; + + DateTimeData v1 = (DateTimeData)value1; + DateTimeData v2 = (DateTimeData)value2; + + // original timezones must be the same in addition to date/time values + // being 'equal' + if ((v1.timezoneHr == v2.timezoneHr) && (v1.timezoneMin == v2.timezoneMin)) + return v1.equals(v2); + + return false; + }//isIdentical() // the parameters are in compiled form (from getActualValue) public int compare (Object value1, Object value2) { Index: src/org/apache/xerces/impl/dv/xs/DoubleDV.java =================================================================== RCS file: /home/cvspublic/xml-xerces/java/src/org/apache/xerces/impl/dv/xs/DoubleDV.java,v retrieving revision 1.8 diff -u -r1.8 DoubleDV.java --- src/org/apache/xerces/impl/dv/xs/DoubleDV.java 15 Sep 2004 05:12:23 -0000 1.8 +++ src/org/apache/xerces/impl/dv/xs/DoubleDV.java 30 Sep 2004 18:28:12 -0000 @@ -47,6 +47,15 @@ public int compare(Object value1, Object value2) { return ((XDouble)value1).compareTo((XDouble)value2); }//compare() + + //distinguishes between identity and equality for double datatype + //0.0 is equal but not identical to -0.0 + public boolean isIdentical (Object value1, Object value2) { + if (value2 instanceof XDouble) + return ((XDouble)value1).isIdentical((XDouble)value2); + + return false; + }//isIdentical() private static final class XDouble implements XSDouble { private double value; @@ -86,6 +95,18 @@ return true; return false; + } + + // NOTE: 0.0 is equal but not identical to -0.0 + public boolean isIdentical (XDouble val) { + if (val == this) + return true; + + Double d1 = new Double(value); + Double d2 = new Double(val.value); + + //Double values of 0.0 and -0.0 return false for Double#equals method + return d1.equals(d2); } private int compareTo(XDouble val) { Index: src/org/apache/xerces/impl/dv/xs/FloatDV.java =================================================================== RCS file: /home/cvspublic/xml-xerces/java/src/org/apache/xerces/impl/dv/xs/FloatDV.java,v retrieving revision 1.8 diff -u -r1.8 FloatDV.java --- src/org/apache/xerces/impl/dv/xs/FloatDV.java 15 Sep 2004 05:12:23 -0000 1.8 +++ src/org/apache/xerces/impl/dv/xs/FloatDV.java 30 Sep 2004 18:28:12 -0000 @@ -47,6 +47,15 @@ public int compare(Object value1, Object value2){ return ((XFloat)value1).compareTo((XFloat)value2); }//compare() + + //distinguishes between identity and equality for float datatype + //0.0 is equal but not identical to -0.0 + public boolean isIdentical (Object value1, Object value2) { + if (value2 instanceof XFloat) + return ((XFloat)value1).isIdentical((XFloat)value2); + + return false; + }//isIdentical() private static final class XFloat implements XSFloat { @@ -87,6 +96,18 @@ return true; return false; + } + + // NOTE: 0.0 is equal but not identical to -0.0 + public boolean isIdentical (XFloat val) { + if (val == this) + return true; + + Float f1 = new Float(value); + Float f2 = new Float(val.value); + + //Float values of 0.0 and -0.0 return false for Float#equals method + return f1.equals(f2); } private int compareTo(XFloat val) { Index: src/org/apache/xerces/impl/dv/xs/TypeValidator.java =================================================================== RCS file: /home/cvspublic/xml-xerces/java/src/org/apache/xerces/impl/dv/xs/TypeValidator.java,v retrieving revision 1.6 diff -u -r1.6 TypeValidator.java --- src/org/apache/xerces/impl/dv/xs/TypeValidator.java 24 Feb 2004 22:44:24 -0000 1.6 +++ src/org/apache/xerces/impl/dv/xs/TypeValidator.java 30 Sep 2004 18:28:12 -0000 @@ -58,6 +58,14 @@ public static final short EQUAL = 0; public static final short GREATER_THAN = 1; public static final short INDETERMINATE = 2; + + // where there is distinction between identity and equality, this method + // will be overwritten + // checks whether the two values are identical; for ex, this distinguishes + // -0.0 from 0.0 + public boolean isIdentical (Object value1, Object value2) { + return value1.equals(value2); + } // check the order relation between the two values // the parameters are in compiled form (from getActualValue) Index: src/org/apache/xerces/impl/dv/xs/XSSimpleTypeDecl.java =================================================================== RCS file: /home/cvspublic/xml-xerces/java/src/org/apache/xerces/impl/dv/xs/XSSimpleTypeDecl.java,v retrieving revision 1.55 diff -u -r1.55 XSSimpleTypeDecl.java --- src/org/apache/xerces/impl/dv/xs/XSSimpleTypeDecl.java 30 Sep 2004 04:19:33 -0000 1.55 +++ src/org/apache/xerces/impl/dv/xs/XSSimpleTypeDecl.java 30 Sep 2004 18:28:13 -0000 @@ -1784,6 +1784,13 @@ return false; return value1.equals(value2); }//isEqual() + + // determine whether the two values are identical + public boolean isIdentical (Object value1, Object value2) { + if (value1 == null) + return false; + return fDVs[fValidationDV].isIdentical(value1, value2); + }//isIdentical() // normalize the string according to the whiteSpace facet public static String normalize(String content, short ws) {