sandygao    2002/11/18 15:10:12

  Modified:    java/src/org/apache/xerces/impl/dv ValidatedInfo.java
               java/src/org/apache/xerces/impl/dv/util Base64.java
                        HexBin.java
               java/src/org/apache/xerces/impl/dv/xs
                        AbstractDateTimeDV.java AnyURIDV.java
                        Base64BinaryDV.java BaseDVFactory.java DateDV.java
                        DateTimeDV.java DayDV.java DecimalDV.java
                        DoubleDV.java DurationDV.java FloatDV.java
                        HexBinaryDV.java ListDV.java MonthDV.java
                        MonthDayDV.java QNameDV.java
                        SchemaDVFactoryImpl.java TimeDV.java
                        TypeValidator.java XSSimpleTypeDecl.java
                        YearDV.java YearMonthDV.java
  Added:       java/src/org/apache/xerces/impl/dv/xs IntegerDV.java
  Log:
  1. Provide canonical representations of Schema datatypes;
  2. Provide more accurate equality checking for union types.
  
  Revision  Changes    Path
  1.5       +12 -1     xml-xerces/java/src/org/apache/xerces/impl/dv/ValidatedInfo.java
  
  Index: ValidatedInfo.java
  ===================================================================
  RCS file: 
/home/cvs/xml-xerces/java/src/org/apache/xerces/impl/dv/ValidatedInfo.java,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- ValidatedInfo.java        18 Sep 2002 21:55:41 -0000      1.4
  +++ ValidatedInfo.java        18 Nov 2002 23:10:09 -0000      1.5
  @@ -102,4 +102,15 @@
           this.memberType = null;
           this.memberTypes = null;
       }
  +    
  +    /**
  +     * Return a string representation of the value. If there is an actual
  +     * value, use toString; otherwise, use the normalized value.
  +     */
  +    public String stringValue() {
  +        if (actualValue == null)
  +            return normalizedValue;
  +        else
  +            return actualValue.toString();
  +    }
   }
  
  
  
  1.7       +86 -92    xml-xerces/java/src/org/apache/xerces/impl/dv/util/Base64.java
  
  Index: Base64.java
  ===================================================================
  RCS file: /home/cvs/xml-xerces/java/src/org/apache/xerces/impl/dv/util/Base64.java,v
  retrieving revision 1.6
  retrieving revision 1.7
  diff -u -r1.6 -r1.7
  --- Base64.java       9 Jul 2002 20:46:04 -0000       1.6
  +++ Base64.java       18 Nov 2002 23:10:10 -0000      1.7
  @@ -84,10 +84,10 @@
       static private final int  SIXBIT             = 6;
       static private final int  FOURBYTE           = 4;
       static private final int  SIGN               = -128;
  -    static private final byte PAD                = ( byte ) '=';
  +    static private final char PAD                = '=';
       static private final boolean fDebug          = false;
       static final private byte [] base64Alphabet        = new byte[BASELENGTH];
  -    static final private byte [] lookUpBase64Alphabet  = new byte[LOOKUPLENGTH];
  +    static final private char [] lookUpBase64Alphabet  = new char[LOOKUPLENGTH];
   
       static {
   
  @@ -109,31 +109,31 @@
           base64Alphabet['/']  = 63;
   
           for (int i = 0; i<=25; i++)
  -            lookUpBase64Alphabet[i] = (byte) ('A'+i );
  +            lookUpBase64Alphabet[i] = (char)('A'+i);
   
           for (int i = 26,  j = 0; i<=51; i++, j++)
  -            lookUpBase64Alphabet[i] = (byte) ('a'+ j );
  +            lookUpBase64Alphabet[i] = (char)('a'+ j);
   
           for (int i = 52,  j = 0; i<=61; i++, j++)
  -            lookUpBase64Alphabet[i] = (byte) ('0' + j );
  -        lookUpBase64Alphabet[62] = (byte) '+';
  -        lookUpBase64Alphabet[63] = (byte) '/';
  +            lookUpBase64Alphabet[i] = (char)('0' + j);
  +        lookUpBase64Alphabet[62] = (char)'+';
  +        lookUpBase64Alphabet[63] = (char)'/';
   
       }
   
  -    protected static boolean isWhiteSpace(byte octect) {
  +    protected static boolean isWhiteSpace(char octect) {
           return (octect == 0x20 || octect == 0xd || octect == 0xa || octect == 0x9);
       }
   
  -    protected static boolean isPad(byte octect) {
  +    protected static boolean isPad(char octect) {
           return (octect == PAD);
       }
   
  -    protected static boolean isData(byte octect) {
  +    protected static boolean isData(char octect) {
           return (base64Alphabet[octect] != -1);
       }
   
  -    protected static boolean isBase64(byte octect) {
  +    protected static boolean isBase64(char octect) {
           return (isWhiteSpace(octect) || isPad(octect) || isData(octect));
       }
   
  @@ -143,20 +143,23 @@
        * @param binaryData Array containing binaryData
        * @return Encoded Base64 array
        */
  -    public static byte[] encode(byte[] binaryData) {
  +    public static String encode(byte[] binaryData) {
   
           if (binaryData == null)
               return null;
   
           int      lengthDataBits    = binaryData.length*EIGHTBIT;
  +        if (lengthDataBits == 0) {
  +            return "";
  +        }
  +        
           int      fewerThan24bits   = lengthDataBits%TWENTYFOURBITGROUP;
           int      numberTriplets    = lengthDataBits/TWENTYFOURBITGROUP;
  -        byte     encodedData[]     = null;
  +        int      numberQuartet     = fewerThan24bits != 0 ? numberTriplets+1 : 
numberTriplets;
  +        int      numberLines       = (numberQuartet-1)/19+1;
  +        char     encodedData[]     = null;
   
  -        if (fewerThan24bits != 0) //data not divisible by 24 bit
  -            encodedData = new byte[ (numberTriplets + 1 )*4  ];
  -        else // 16 or 8 bit
  -            encodedData = new byte[ numberTriplets*4 ];
  +        encodedData = new char[numberQuartet*4+numberLines];
   
           byte k=0, l=0, b1=0,b2=0,b3=0;
   
  @@ -166,12 +169,45 @@
           if (fDebug) {
               System.out.println("number of triplets = " + numberTriplets );
           }
  -        for (i = 0; i<numberTriplets; i++) {
   
  -            dataIndex = i*3;
  -            b1 = binaryData[dataIndex];
  -            b2 = binaryData[dataIndex + 1];
  -            b3 = binaryData[dataIndex + 2];
  +        for (int line = 0; line < numberLines-1; line++) {
  +            for (int quartet = 0; quartet < 19; quartet++) {
  +                b1 = binaryData[dataIndex++];
  +                b2 = binaryData[dataIndex++];
  +                b3 = binaryData[dataIndex++];
  +
  +                if (fDebug) {
  +                    System.out.println( "b1= " + b1 +", b2= " + b2 + ", b3= " + b3 
);
  +                }
  +
  +                l  = (byte)(b2 & 0x0f);
  +                k  = (byte)(b1 & 0x03);
  +
  +                byte val1 = ((b1 & SIGN)==0)?(byte)(b1>>2):(byte)((b1)>>2^0xc0);
  +
  +                byte val2 = ((b2 & SIGN)==0)?(byte)(b2>>4):(byte)((b2)>>4^0xf0);
  +                byte val3 = ((b3 & SIGN)==0)?(byte)(b3>>6):(byte)((b3)>>6^0xfc);
  +
  +                if (fDebug) {
  +                    System.out.println( "val2 = " + val2 );
  +                    System.out.println( "k4   = " + (k<<4));
  +                    System.out.println( "vak  = " + (val2 | (k<<4)));
  +                }
  +
  +                encodedData[encodedIndex++] = lookUpBase64Alphabet[ val1 ];
  +                encodedData[encodedIndex++] = lookUpBase64Alphabet[ val2 | ( k<<4 
)];
  +                encodedData[encodedIndex++] = lookUpBase64Alphabet[ (l <<2 ) | val3 
];
  +                encodedData[encodedIndex++] = lookUpBase64Alphabet[ b3 & 0x3f ];
  +
  +                i++;
  +            }
  +            encodedData[encodedIndex++] = 0xa;
  +        }
  +
  +        for (; i<numberTriplets; i++) {
  +            b1 = binaryData[dataIndex++];
  +            b2 = binaryData[dataIndex++];
  +            b3 = binaryData[dataIndex++];
   
               if (fDebug) {
                   System.out.println( "b1= " + b1 +", b2= " + b2 + ", b3= " + b3 );
  @@ -180,27 +216,24 @@
               l  = (byte)(b2 & 0x0f);
               k  = (byte)(b1 & 0x03);
   
  -            encodedIndex = i*4;
               byte val1 = ((b1 & SIGN)==0)?(byte)(b1>>2):(byte)((b1)>>2^0xc0);
   
               byte val2 = ((b2 & SIGN)==0)?(byte)(b2>>4):(byte)((b2)>>4^0xf0);
               byte val3 = ((b3 & SIGN)==0)?(byte)(b3>>6):(byte)((b3)>>6^0xfc);
   
  -            encodedData[encodedIndex]   = lookUpBase64Alphabet[ val1 ];
               if (fDebug) {
                   System.out.println( "val2 = " + val2 );
                   System.out.println( "k4   = " + (k<<4));
                   System.out.println( "vak  = " + (val2 | (k<<4)));
               }
   
  -            encodedData[encodedIndex+1] = lookUpBase64Alphabet[ val2 | ( k<<4 )];
  -            encodedData[encodedIndex+2] = lookUpBase64Alphabet[ (l <<2 ) | val3 ];
  -            encodedData[encodedIndex+3] = lookUpBase64Alphabet[ b3 & 0x3f ];
  +            encodedData[encodedIndex++] = lookUpBase64Alphabet[ val1 ];
  +            encodedData[encodedIndex++] = lookUpBase64Alphabet[ val2 | ( k<<4 )];
  +            encodedData[encodedIndex++] = lookUpBase64Alphabet[ (l <<2 ) | val3 ];
  +            encodedData[encodedIndex++] = lookUpBase64Alphabet[ b3 & 0x3f ];
           }
   
           // form integral number of 6-bit groups
  -        dataIndex    = i*3;
  -        encodedIndex = i*4;
           if (fewerThan24bits == EIGHTBIT) {
               b1 = binaryData[dataIndex];
               k = (byte) ( b1 &0x03 );
  @@ -209,12 +242,11 @@
                   System.out.println("b1<<2 = " + (b1>>2) );
               }
               byte val1 = ((b1 & SIGN)==0)?(byte)(b1>>2):(byte)((b1)>>2^0xc0);
  -            encodedData[encodedIndex]     = lookUpBase64Alphabet[ val1 ];
  -            encodedData[encodedIndex + 1] = lookUpBase64Alphabet[ k<<4 ];
  -            encodedData[encodedIndex + 2] = PAD;
  -            encodedData[encodedIndex + 3] = PAD;
  +            encodedData[encodedIndex++] = lookUpBase64Alphabet[ val1 ];
  +            encodedData[encodedIndex++] = lookUpBase64Alphabet[ k<<4 ];
  +            encodedData[encodedIndex++] = PAD;
  +            encodedData[encodedIndex++] = PAD;
           } else if (fewerThan24bits == SIXTEENBIT) {
  -
               b1 = binaryData[dataIndex];
               b2 = binaryData[dataIndex +1 ];
               l = ( byte ) ( b2 &0x0f );
  @@ -223,13 +255,15 @@
               byte val1 = ((b1 & SIGN)==0)?(byte)(b1>>2):(byte)((b1)>>2^0xc0);
               byte val2 = ((b2 & SIGN)==0)?(byte)(b2>>4):(byte)((b2)>>4^0xf0);
   
  -            encodedData[encodedIndex]     = lookUpBase64Alphabet[ val1 ];
  -            encodedData[encodedIndex + 1] = lookUpBase64Alphabet[ val2 | ( k<<4 )];
  -            encodedData[encodedIndex + 2] = lookUpBase64Alphabet[ l<<2 ];
  -            encodedData[encodedIndex + 3] = PAD;
  +            encodedData[encodedIndex++] = lookUpBase64Alphabet[ val1 ];
  +            encodedData[encodedIndex++] = lookUpBase64Alphabet[ val2 | ( k<<4 )];
  +            encodedData[encodedIndex++] = lookUpBase64Alphabet[ l<<2 ];
  +            encodedData[encodedIndex++] = PAD;
           }
   
  -        return encodedData;
  +        encodedData[encodedIndex] = 0xa;
  +        
  +        return new String(encodedData);
       }
   
       /**
  @@ -238,29 +272,28 @@
        * @param binaryData Byte array containing Base64 data
        * @return Array containind decoded data.
        */
  -    public static byte[] decode(byte[] base64Data) {
  +    public static byte[] decode(String encoded) {
   
  -        if (base64Data == null)
  +        if (encoded == null)
               return null;
   
  +        char[] base64Data = encoded.toCharArray();
           // remove white spaces
  -        base64Data = removeWhiteSpace(base64Data);
  +        int len = removeWhiteSpace(base64Data);
           
  -        if (base64Data.length%FOURBYTE != 0) {
  +        if (len%FOURBYTE != 0) {
               return null;//should be divisible by four
           }
   
  -        int      numberQuadruple    = (base64Data.length/FOURBYTE );
  +        int      numberQuadruple    = (len/FOURBYTE );
   
           if (numberQuadruple == 0)
               return new byte[0];
   
           byte     decodedData[]      = null;
           byte     b1=0,b2=0,b3=0, b4=0, marker0=0, marker1=0;
  -        byte     d1=0,d2=0,d3=0,d4=0;
  +        char     d1=0,d2=0,d3=0,d4=0;
   
  -        // Throw away anything not in normalizedBase64Data
  -        // Adjust size
           int i = 0;
           int encodedIndex = 0;
           int dataIndex    = 0;
  @@ -328,61 +361,22 @@
       }
   
       /**
  -     * Decodes Base64 data into octects
  -     *
  -     * @param base64Data String containing Base64 data
  -     * @return string containing decoded data.
  -     */
  -    public static String decode(String base64Data) {
  -        if (base64Data == null)
  -            return null;
  -
  -            byte[] decoded = null;   
  -            try {
  -                decoded = decode(base64Data.getBytes("utf-8"));
  -            }
  -            catch(UnsupportedEncodingException e) {  
  -            }
  -            finally {
  -                String retVal = null;
  -                try {
  -                    retVal = decoded == null ? null : new String(decoded, "8859_1");
  -                } catch (UnsupportedEncodingException e) {
  -                }
  -                return retVal;
  -            }
  -    }
  -
  -    /**
        * remove WhiteSpace from MIME containing encoded Base64 data.
        * 
        * @param data  the byte array of base64 data (with WS)
  -     * @return      the byte array of base64 data (without WS)
  +     * @return      the new length
        */
  -    protected static byte[] removeWhiteSpace(byte[] data) {
  +    protected static int removeWhiteSpace(char[] data) {
           if (data == null)
  -            return null;
  +            return 0;
   
           // count characters that's not whitespace
           int newSize = 0;
           int len = data.length;
           for (int i = 0; i < len; i++) {
               if (!isWhiteSpace(data[i]))
  -                newSize++;
  -        }
  -
  -        // if no whitespace, just return the input array
  -        if (newSize == len)
  -            return data;
  -
  -        // create the array to return
  -        byte[] newArray = new byte[newSize];
  -
  -        int j = 0;
  -        for (int i = 0; i < len; i++) {
  -            if (!isWhiteSpace(data[i]))
  -                newArray[j++] = data[i];
  +                data[newSize++] = data[i];
           }
  -        return newArray;
  +        return newSize;
       }
   }
  
  
  
  1.7       +34 -55    xml-xerces/java/src/org/apache/xerces/impl/dv/util/HexBin.java
  
  Index: HexBin.java
  ===================================================================
  RCS file: /home/cvs/xml-xerces/java/src/org/apache/xerces/impl/dv/util/HexBin.java,v
  retrieving revision 1.6
  retrieving revision 1.7
  diff -u -r1.6 -r1.7
  --- HexBin.java       9 Jul 2002 20:46:04 -0000       1.6
  +++ HexBin.java       18 Nov 2002 23:10:10 -0000      1.7
  @@ -69,7 +69,7 @@
       static private final int  BASELENGTH   = 255;
       static private final int  LOOKUPLENGTH = 16;
       static final private byte [] hexNumberTable    = new byte[BASELENGTH];
  -    static final private byte [] lookUpHexAlphabet = new byte[LOOKUPLENGTH];
  +    static final private char [] lookUpHexAlphabet = new char[LOOKUPLENGTH];
   
   
       static {
  @@ -87,81 +87,60 @@
           }
   
           for(int i = 0; i<10; i++ )
  -            lookUpHexAlphabet[i] = (byte) ('0'+i );
  +            lookUpHexAlphabet[i] = (char)('0'+i);
           for(int i = 10; i<=15; i++ )
  -            lookUpHexAlphabet[i] = (byte) ('A'+i -10);
  +            lookUpHexAlphabet[i] = (char)('A'+i -10);
       }
   
       /**
  -     * byte to be tested if it is Base64 alphabet
  +     * Encode a byte array to hex string
        *
  -     * @param octect
  -     * @return
  +     * @param binaryData  array of byte to encode
  +     * @return return     encoded string
        */
  -    static boolean isHex(byte octect) {
  -        return (hexNumberTable[octect] != -1);
  -    }
  -
  -    /**
  -     * array of byte to encode
  -     *
  -     * @param binaryData
  -     * @return return encode binary array
  -     */
  -    static public byte[] encode(byte[] binaryData) {
  +    static public String encode(byte[] binaryData) {
           if (binaryData == null)
               return null;
           int lengthData   = binaryData.length;
           int lengthEncode = lengthData * 2;
  -        byte[] encodedData = new byte[lengthEncode];
  -        for( int i = 0; i<lengthData; i++ ){
  -            encodedData[i*2] = lookUpHexAlphabet[ binaryData[i] >> 4];
  -            encodedData[i*2+1] = lookUpHexAlphabet[ binaryData[i] & 0xf];
  +        char[] encodedData = new char[lengthEncode];
  +        int temp;
  +        for (int i = 0; i < lengthData; i++) {
  +            temp = binaryData[i];
  +            if (temp < 0)
  +                temp += 256;
  +            encodedData[i*2] = lookUpHexAlphabet[temp >> 4];
  +            encodedData[i*2+1] = lookUpHexAlphabet[temp & 0xf];
           }
  -        return encodedData;
  +        return new String(encodedData);
       }
   
  -    static public byte[] decode(byte[] binaryData) {
  -        if (binaryData == null)
  +    /**
  +     * Decode hex string to a byte array
  +     *
  +     * @param binaryData  encoded string
  +     * @return return     array of byte to encode
  +     */
  +    static public byte[] decode(String encoded) {
  +        if (encoded == null)
               return null;
  -        int lengthData   = binaryData.length;
  +        int lengthData = encoded.length();
           if (lengthData % 2 != 0)
               return null;
   
  +        char[] binaryData = encoded.toCharArray();
           int lengthDecode = lengthData / 2;
           byte[] decodedData = new byte[lengthDecode];
  +        byte temp1, temp2;
           for( int i = 0; i<lengthDecode; i++ ){
  -            if (!isHex(binaryData[i*2]) || !isHex(binaryData[i*2+1])) {
  +            temp1 = hexNumberTable[binaryData[i*2]];
  +            if (temp1 == -1)
                   return null;
  -            }
  -            decodedData[i] = (byte)((hexNumberTable[binaryData[i*2]] << 4) | 
hexNumberTable[binaryData[i*2+1]]);
  +            temp2 = hexNumberTable[binaryData[i*2+1]];
  +            if (temp2 == -1)
  +                return null;
  +            decodedData[i] = (byte)((temp1 << 4) | temp2);
           }
           return decodedData;
  -    }
  -
  -    /**
  -     * Decodes Hex data into octects
  -     *
  -     * @param binaryData String containing Hex data
  -     * @return string containing decoded data.
  -     */
  -    public static String decode(String binaryData) {
  -        if (binaryData == null)
  -            return null;
  -
  -         byte[] decoded = null;
  -         try {
  -          decoded = decode(binaryData.getBytes("utf-8"));
  -         }
  -         catch(UnsupportedEncodingException e) {
  -         }
  -         finally {
  -            String retVal = null;
  -            try {
  -                retVal = decoded == null ? null : new String(decoded, "8859_1");
  -            } catch (UnsupportedEncodingException e) {
  -            }
  -            return retVal;
  -         }
       }
   }
  
  
  
  1.7       +31 -9     
xml-xerces/java/src/org/apache/xerces/impl/dv/xs/AbstractDateTimeDV.java
  
  Index: AbstractDateTimeDV.java
  ===================================================================
  RCS file: 
/home/cvs/xml-xerces/java/src/org/apache/xerces/impl/dv/xs/AbstractDateTimeDV.java,v
  retrieving revision 1.6
  retrieving revision 1.7
  diff -u -r1.6 -r1.7
  --- AbstractDateTimeDV.java   20 Aug 2002 23:03:20 -0000      1.6
  +++ AbstractDateTimeDV.java   18 Nov 2002 23:10:10 -0000      1.7
  @@ -102,15 +102,9 @@
       }//getAllowedFacets()
   
       // the parameters are in compiled form (from getActualValue)
  -    public boolean isEqual(Object value1, Object value2){
  -        if (!(value1 instanceof int[]) || !(value2 instanceof int[]))
  -            return false;
  -        return compareDates((int[])value1,(int[])value2, true)==0;
  -    }//IsEqual()
  -
  -    // the parameters are in compiled form (from getActualValue)
       public int compare (Object value1, Object value2) {
  -        return compareDates((int[])value1, (int[])value2, true);
  +        return compareDates(((DateTimeData)value1).data,
  +                            ((DateTimeData)value2).data, true);
       }//compare()
   
       /**
  @@ -721,4 +715,32 @@
           System.arraycopy(finalValue, 0, tempDate, 0, TOTAL_SIZE);
       }
   
  +    /**
  +     * Represents date time data
  +     */
  +    static final class DateTimeData {
  +        // actual data stored in an int array
  +        final int[] data;
  +        // a pointer to the type that was used go generate this data
  +        // note that this is not the actual simple type, but one of the
  +        // statically created XXXDV objects, so this won't cause any GC problem.
  +        final AbstractDateTimeDV type;
  +        private String canonical;
  +        public DateTimeData(int[] data, AbstractDateTimeDV type) {
  +            this.data = data;
  +            this.type = type;
  +        }
  +        public boolean equals(Object obj) {
  +            if (!(obj instanceof DateTimeData))
  +                return false;
  +            int[] odata = ((DateTimeData)obj).data;
  +            return type.compareDates(data, odata, true)==0;
  +        }
  +        public synchronized String toString() {
  +            if (canonical == null) {
  +                canonical = type.dateToString(data);
  +            }
  +            return canonical;
  +        }
  +    }
   }
  
  
  
  1.4       +5 -6      xml-xerces/java/src/org/apache/xerces/impl/dv/xs/AnyURIDV.java
  
  Index: AnyURIDV.java
  ===================================================================
  RCS file: /home/cvs/xml-xerces/java/src/org/apache/xerces/impl/dv/xs/AnyURIDV.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- AnyURIDV.java     18 Jul 2002 20:48:43 -0000      1.3
  +++ AnyURIDV.java     18 Nov 2002 23:10:10 -0000      1.4
  @@ -71,12 +71,14 @@
    */
   public class AnyURIDV extends TypeValidator {
   
  -    private static URI BASE_URI = null;
  +    private static final URI BASE_URI;
       static {
  +        URI uri = null;
           try {
  -            BASE_URI = new URI("http://www.template.com";);
  +            uri = new URI("abc://def.ghi.jkl");
           } catch (URI.MalformedURIException ex) {
           }
  +        BASE_URI = uri;
       }
   
       public short getAllowedFacets(){
  @@ -101,8 +103,5 @@
           // REVISIT: do we need to return the new URI object?
           return content;
       }
  -
  -    // REVISIT: do we need to compare based on URI, or based on String?
  -    // public boolean isEqual(Object value1, Object value2);
   
   } // class AnyURIDV
  
  
  
  1.4       +42 -3     
xml-xerces/java/src/org/apache/xerces/impl/dv/xs/Base64BinaryDV.java
  
  Index: Base64BinaryDV.java
  ===================================================================
  RCS file: 
/home/cvs/xml-xerces/java/src/org/apache/xerces/impl/dv/xs/Base64BinaryDV.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- Base64BinaryDV.java       18 Jul 2002 20:48:43 -0000      1.3
  +++ Base64BinaryDV.java       18 Nov 2002 23:10:10 -0000      1.4
  @@ -76,11 +76,50 @@
       }
   
       public Object getActualValue(String content, ValidationContext context) throws 
InvalidDatatypeValueException {
  -        String decoded = Base64.decode(content);
  +        byte[] decoded = Base64.decode(content);
           if (decoded == null)
               throw new InvalidDatatypeValueException("cvc-datatype-valid.1.2.1", new 
Object[]{content, "base64Binary"});
   
  -        return decoded;
  +        return new XBase64(decoded);
       }
   
  +    // length of a binary type is the number of bytes
  +    public int getDataLength(Object value) {
  +        return ((XBase64)value).length();
  +    }
  +
  +    /**
  +     * represent base64 data
  +     */
  +    private static final class XBase64 {
  +        // actually data stored in a byte array
  +        final byte[] data;
  +        // canonical representation of the data
  +        private String canonical;
  +        public XBase64(byte[] data) {
  +            this.data = data;
  +        }
  +        public synchronized String toString() {
  +            if (canonical == null) {
  +                canonical = Base64.encode(data);
  +            }
  +            return canonical;
  +        }
  +        public int length() {
  +            return data.length;
  +        }
  +        public boolean equals(Object obj) {
  +            if (!(obj instanceof XBase64))
  +                return false;
  +            byte[] odata = ((XBase64)obj).data;
  +            int len = data.length;
  +            if (len != odata.length)
  +                return false;
  +            for (int i = 0; i < len; i++) {
  +                if (data[i] != odata[i])
  +                    return false;
  +            }
  +            return true;
  +        }
  +    }
   } // class Base64BinaryDV
  
  
  
  1.2       +2 -4      
xml-xerces/java/src/org/apache/xerces/impl/dv/xs/BaseDVFactory.java
  
  Index: BaseDVFactory.java
  ===================================================================
  RCS file: 
/home/cvs/xml-xerces/java/src/org/apache/xerces/impl/dv/xs/BaseDVFactory.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- BaseDVFactory.java        30 Jul 2002 23:12:29 -0000      1.1
  +++ BaseDVFactory.java        18 Nov 2002 23:10:10 -0000      1.2
  @@ -206,9 +206,7 @@
           types.put(DAY, new XSSimpleTypeDecl(anySimpleType, DAY, 
XSSimpleTypeDecl.DV_GDAY, XSSimpleType.ORDERED_PARTIAL, false, false, false, true));
           types.put(MONTH, new XSSimpleTypeDecl(anySimpleType, MONTH, 
XSSimpleTypeDecl.DV_GMONTH, XSSimpleType.ORDERED_PARTIAL, false, false, false, true));
   
  -        facets.fractionDigits = 0;
  -        XSSimpleTypeDecl integerDV = new XSSimpleTypeDecl(decimalDV, INTEGER, 
URI_SCHEMAFORSCHEMA, (short)0, false);
  -        integerDV.applyFacets1(facets , XSSimpleType.FACET_FRACTIONDIGITS, 
(short)0, XSSimpleTypeDecl.SPECIAL_PATTERN_INTEGER);
  +        XSSimpleTypeDecl integerDV = new XSSimpleTypeDecl(decimalDV, INTEGER, 
XSSimpleTypeDecl.DV_INTEGER, XSSimpleType.ORDERED_TOTAL, false, false, true, true);
           types.put(INTEGER, integerDV);
   
           facets.maxInclusive = "0";
  
  
  
  1.6       +2 -2      xml-xerces/java/src/org/apache/xerces/impl/dv/xs/DateDV.java
  
  Index: DateDV.java
  ===================================================================
  RCS file: /home/cvs/xml-xerces/java/src/org/apache/xerces/impl/dv/xs/DateDV.java,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- DateDV.java       18 Jul 2002 20:48:43 -0000      1.5
  +++ DateDV.java       18 Nov 2002 23:10:10 -0000      1.6
  @@ -72,7 +72,7 @@
   
       public Object getActualValue(String content) throws 
InvalidDatatypeValueException {
           try{
  -            return parse(content);
  +            return new DateTimeData(parse(content), this);
           } catch(Exception ex){
               throw new InvalidDatatypeValueException("cvc-datatype-valid.1.2.1", new 
Object[]{content, "date"});
           }
  
  
  
  1.6       +2 -2      xml-xerces/java/src/org/apache/xerces/impl/dv/xs/DateTimeDV.java
  
  Index: DateTimeDV.java
  ===================================================================
  RCS file: 
/home/cvs/xml-xerces/java/src/org/apache/xerces/impl/dv/xs/DateTimeDV.java,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- DateTimeDV.java   18 Jul 2002 20:48:43 -0000      1.5
  +++ DateTimeDV.java   18 Nov 2002 23:10:10 -0000      1.6
  @@ -72,7 +72,7 @@
   
       public Object getActualValue(String content, ValidationContext context) throws 
InvalidDatatypeValueException {
           try{
  -            return parse(content);
  +            return new DateTimeData(parse(content), this);
           } catch(Exception ex){
               throw new InvalidDatatypeValueException("cvc-datatype-valid.1.2.1", new 
Object[]{content, "dateTime"});
           }
  
  
  
  1.6       +2 -2      xml-xerces/java/src/org/apache/xerces/impl/dv/xs/DayDV.java
  
  Index: DayDV.java
  ===================================================================
  RCS file: /home/cvs/xml-xerces/java/src/org/apache/xerces/impl/dv/xs/DayDV.java,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- DayDV.java        18 Jul 2002 20:48:43 -0000      1.5
  +++ DayDV.java        18 Nov 2002 23:10:10 -0000      1.6
  @@ -74,7 +74,7 @@
   
       public Object getActualValue(String content, ValidationContext context) throws 
InvalidDatatypeValueException {
           try{
  -            return parse(content);
  +            return new DateTimeData(parse(content), this);
           } catch(Exception ex){
               throw new InvalidDatatypeValueException("cvc-datatype-valid.1.2.1", new 
Object[]{content, "gDay"});
           }
  
  
  
  1.6       +112 -34   xml-xerces/java/src/org/apache/xerces/impl/dv/xs/DecimalDV.java
  
  Index: DecimalDV.java
  ===================================================================
  RCS file: /home/cvs/xml-xerces/java/src/org/apache/xerces/impl/dv/xs/DecimalDV.java,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- DecimalDV.java    25 Oct 2002 20:28:42 -0000      1.5
  +++ DecimalDV.java    18 Nov 2002 23:10:10 -0000      1.6
  @@ -72,40 +72,34 @@
    */
   public class DecimalDV extends TypeValidator {
   
  -    public short getAllowedFacets(){
  +    public final short getAllowedFacets(){
           return ( XSSimpleTypeDecl.FACET_PATTERN | XSSimpleTypeDecl.FACET_WHITESPACE 
| XSSimpleTypeDecl.FACET_ENUMERATION |XSSimpleTypeDecl.FACET_MAXINCLUSIVE 
|XSSimpleTypeDecl.FACET_MININCLUSIVE | XSSimpleTypeDecl.FACET_MAXEXCLUSIVE  | 
XSSimpleTypeDecl.FACET_MINEXCLUSIVE | XSSimpleTypeDecl.FACET_TOTALDIGITS | 
XSSimpleTypeDecl.FACET_FRACTIONDIGITS);
       }
   
       public Object getActualValue(String content, ValidationContext context) throws 
InvalidDatatypeValueException {
           try {
  -            return new MyDecimal(content);
  +            return new XDecimal(content);
           } catch (NumberFormatException nfe) {
               throw new InvalidDatatypeValueException("cvc-datatype-valid.1.2.1", new 
Object[]{content, "decimal"});
           }
       }
   
  -    public boolean isEqual(Object value1, Object value2) {
  -        if (!(value1 instanceof MyDecimal) || !(value2 instanceof MyDecimal))
  -            return false;
  -        return ((MyDecimal)value1).equals((MyDecimal)value2);
  -    }
  -
  -    public int compare(Object value1, Object value2){
  -        return ((MyDecimal)value1).compareTo((MyDecimal)value2);
  +    public final int compare(Object value1, Object value2){
  +        return ((XDecimal)value1).compareTo((XDecimal)value2);
       }
   
  -    public int getTotalDigits(Object value){
  -        return ((MyDecimal)value).totalDigits;
  +    public final int getTotalDigits(Object value){
  +        return ((XDecimal)value).totalDigits;
       }
   
  -    public int getFractionDigits(Object value){
  -        return ((MyDecimal)value).fracDigits;
  +    public final int getFractionDigits(Object value){
  +        return ((XDecimal)value).fracDigits;
       }
       
   } // class DecimalDV
   
   // Avoid using the heavy-weight java.math.BigDecimal
  -class MyDecimal {
  +class XDecimal {
       // sign: 0 for vlaue 0; 1 for positive values; -1 for negative values
       int sign = 1;
       // total digits. >= 1
  @@ -118,11 +112,19 @@
       String ivalue = "";
       // the string representing the fraction part
       String fvalue = "";
  +    // whether the canonical form contains decimal point
  +    boolean integer = false;
       
  -    MyDecimal(String content) throws NumberFormatException {
  -        if (content.equals("0")) {
  -            int i = 0;
  -        }
  +    XDecimal(String content) throws NumberFormatException {
  +        initD(content);
  +    }
  +    XDecimal(String content, boolean integer) throws NumberFormatException {
  +        if (integer)
  +            initI(content);
  +        else
  +            initD(content);
  +    }
  +    void initD(String content) throws NumberFormatException {
           int len = content.length();
           if (len == 0)
               throw new NumberFormatException();
  @@ -198,28 +200,82 @@
               }
           }
       }
  -    public boolean equals(MyDecimal val) {
  -        if (val == null)
  -            return false;
  +    void initI(String content) throws NumberFormatException {
  +        int len = content.length();
  +        if (len == 0)
  +            throw new NumberFormatException();
  +
  +        // these 2 variables are used to indicate where the integre start/end.
  +        int intStart = 0, intEnd = 0;
  +
  +        // Deal with leading sign symbol if present
  +        if (content.charAt(0) == '+') {
  +            // skip '+', so intStart should be 1
  +            intStart = 1;
  +        }
  +        else if (content.charAt(0) == '-') {
  +            // keep '-', so intStart is stil 0
  +            intStart = 1;
  +            sign = -1;
  +        }
  +
  +        // skip leading zeroes in integer part
  +        int actualIntStart = intStart;
  +        while (actualIntStart < len && content.charAt(actualIntStart) == '0') {
  +            actualIntStart++;
  +        }
  +
  +        // Find the ending position of the integer part
  +        for (intEnd = actualIntStart;
  +             intEnd < len && TypeValidator.isDigit(content.charAt(intEnd));
  +             intEnd++);
  +
  +        // Not reached the end yet, error
  +        if (intEnd < len)
  +            throw new NumberFormatException();
  +
  +        // no integer part, error.
  +        if (intStart == intEnd)
  +            throw new NumberFormatException();
  +
  +        intDigits = intEnd - actualIntStart;
  +        fracDigits = 0;
  +        totalDigits = intDigits == 0 ? 1 : intDigits;
  +
  +        if (intDigits > 0) {
  +            ivalue = content.substring(actualIntStart, intEnd);
  +        }
  +        else {
  +            // "00", treat it as "0"
  +            sign = 0;
  +        }
  +        
  +        integer = true;
  +    }
  +    public boolean equals(Object val) {
           if (val == this)
               return true;
  +
  +        if (!(val instanceof XDecimal))
  +            return false;
  +        XDecimal oval = (XDecimal)val;
           
  -        if (sign != val.sign)
  +        if (sign != oval.sign)
              return false;
           if (sign == 0)
               return true;
           
  -        return intDigits == val.intDigits && fracDigits == val.fracDigits &&
  -               ivalue.equals(val.ivalue) && fvalue.equals(val.fvalue);
  +        return intDigits == oval.intDigits && fracDigits == oval.fracDigits &&
  +               ivalue.equals(oval.ivalue) && fvalue.equals(oval.fvalue);
       }
  -    public int compareTo(MyDecimal val) {
  +    public int compareTo(XDecimal val) {
           if (sign != val.sign)
               return sign > val.sign ? 1 : -1;
           if (sign == 0)
               return 0;
           return sign * intComp(val);
       }
  -    private int intComp(MyDecimal val) {
  +    private int intComp(XDecimal val) {
           if (intDigits != val.intDigits)
               return intDigits > val.intDigits ? 1 : -1;
           int ret = ivalue.compareTo(val.ivalue);
  @@ -228,9 +284,26 @@
           ret = fvalue.compareTo(val.fvalue);
           return ret == 0 ? 0 : (ret > 0 ? 1 : -1);
       }
  -    public String toString() {
  -        if (sign == 0)
  -            return "0";
  +    private String canonical;
  +    public synchronized String toString() {
  +        if (canonical == null) {
  +            makeCanonical();
  +        }
  +        return canonical;
  +    }
  +    
  +    private void makeCanonical() {
  +        if (sign == 0) {
  +            if (integer)
  +                canonical = "0";
  +            else
  +                canonical = "0.0";
  +            return;
  +        }
  +        if (integer && sign > 0) {
  +            canonical = ivalue;
  +            return;
  +        }
           StringBuffer buffer = new StringBuffer(totalDigits+2);
           if (sign == -1)
               buffer.append('-');
  @@ -238,10 +311,15 @@
               buffer.append(ivalue);
           else
               buffer.append('0');
  -        if (fracDigits != 0) {
  +        if (!integer) {
               buffer.append('.');
  -            buffer.append(fvalue);
  +            if (fracDigits != 0) {
  +                buffer.append(fvalue);
  +            }
  +            else {
  +                buffer.append('0');
  +            }
           }
  -        return buffer.toString();
  +        canonical = buffer.toString();
       }
   }
  
  
  
  1.4       +70 -41    xml-xerces/java/src/org/apache/xerces/impl/dv/xs/DoubleDV.java
  
  Index: DoubleDV.java
  ===================================================================
  RCS file: /home/cvs/xml-xerces/java/src/org/apache/xerces/impl/dv/xs/DoubleDV.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- DoubleDV.java     18 Jul 2002 20:48:43 -0000      1.3
  +++ DoubleDV.java     18 Nov 2002 23:10:10 -0000      1.4
  @@ -77,57 +77,86 @@
       //convert a String to Double form, we have to take care of cases specified in 
spec like INF, -INF and NaN
       public Object getActualValue(String content, ValidationContext context) throws 
InvalidDatatypeValueException {
           try{
  -            return dValueOf(content);
  -        } catch (Exception ex){
  +            return new XDouble(content);
  +        } catch (NumberFormatException ex){
               throw new InvalidDatatypeValueException("cvc-datatype-valid.1.2.1", new 
Object[]{content, "double"});
           }
       }//getActualValue()
   
       // Can't call Double#compareTo method, because it's introduced in jdk 1.2
       public int compare(Object value1, Object value2) {
  -        return compareDoubles((Double)value1, (Double)value2);
  +        return ((XDouble)value1).compareTo((XDouble)value2);
       }//compare()
   
  -    //
  -    // private methods
  -    //
  -    private static Double dValueOf(String s) throws NumberFormatException {
  -        Double d;
  -        try {
  -            d = Double.valueOf(s);
  -        }
  -        catch ( NumberFormatException nfe ) {
  -            if ( s.equals("INF") ) {
  -                d = new Double(Double.POSITIVE_INFINITY);
  -            }
  -            else if ( s.equals("-INF") ) {
  -                d = new Double (Double.NEGATIVE_INFINITY);
  -            }
  -            else if ( s.equals("NaN" ) ) {
  -                d = new Double (Double.NaN);
  +    private static final class XDouble {
  +        private double value;
  +        public XDouble(String s) throws NumberFormatException {
  +            try {
  +                value = Double.parseDouble(s);
               }
  -            else {
  -                throw nfe;
  +            catch ( NumberFormatException nfe ) {
  +                if ( s.equals("INF") ) {
  +                    value = Double.POSITIVE_INFINITY;
  +                }
  +                else if ( s.equals("-INF") ) {
  +                    value = Double.NEGATIVE_INFINITY;
  +                }
  +                else if ( s.equals("NaN" ) ) {
  +                    value = Double.NaN;
  +                }
  +                else {
  +                    throw nfe;
  +                }
               }
           }
  -        return d;
  -    }//dValueOf()
   
  -    private int compareDoubles(Double value, Double anotherValue) {
  -        double thisVal = value.doubleValue();
  -        double anotherVal = anotherValue.doubleValue();
  -
  -        if (thisVal < anotherVal)
  -            return -1;                // Neither val is NaN, thisVal is smaller
  -        if (thisVal > anotherVal)
  -            return 1;                 // Neither val is NaN, thisVal is larger
  -
  -        long thisBits = Double.doubleToLongBits(thisVal);
  -        long anotherBits = Double.doubleToLongBits(anotherVal);
  -
  -        return (thisBits == anotherBits ?  0 : // Values are equal
  -                (thisBits < anotherBits ? -1 : // (-0.0, 0.0) or (!NaN, NaN)
  -                 1));                          // (0.0, -0.0) or (NaN, !NaN)
  -    }
  +        public boolean equals(Object val) {
  +            if (val == this)
  +                return true;
  +    
  +            if (!(val instanceof XDouble))
  +                return false;
  +            XDouble oval = (XDouble)val;
  +
  +            if (value == oval.value)
  +                return true;
  +            
  +            if (value != value && oval.value != oval.value)
  +                return true;
  +
  +            return false;
  +        }
   
  +        private int compareTo(XDouble val) {
  +            double oval = val.value;
  +
  +            // this < other
  +            if (value < oval)
  +                return -1;
  +            // this > other
  +            if (value > oval)
  +                return 1;
  +
  +            // get the bits
  +            long bits = Double.doubleToLongBits(value);
  +            long obits = Double.doubleToLongBits(oval);
  +
  +            // equal, or one is NaN, which is always smaller
  +            return (bits == obits ?  0 :
  +                    (bits < obits ? -1 :
  +                     1));
  +        }
  +        private String canonical;
  +        public synchronized String toString() {
  +            if (canonical == null) {
  +                if (value == Double.POSITIVE_INFINITY)
  +                    canonical = "INF";
  +                else if (value == Double.NEGATIVE_INFINITY)
  +                    canonical = "-INF";
  +                else
  +                    canonical = Double.toString(value);
  +            }
  +            return canonical;
  +        }
  +    }
   } // class DoubleDV
  
  
  
  1.6       +2 -2      xml-xerces/java/src/org/apache/xerces/impl/dv/xs/DurationDV.java
  
  Index: DurationDV.java
  ===================================================================
  RCS file: 
/home/cvs/xml-xerces/java/src/org/apache/xerces/impl/dv/xs/DurationDV.java,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- DurationDV.java   18 Jul 2002 20:48:43 -0000      1.5
  +++ DurationDV.java   18 Nov 2002 23:10:10 -0000      1.6
  @@ -85,7 +85,7 @@
   
       public Object getActualValue(String content, ValidationContext context) throws 
InvalidDatatypeValueException{
           try{
  -            return parse(content);
  +            return new DateTimeData(parse(content), this);
           } catch (Exception ex) {
               throw new InvalidDatatypeValueException("cvc-datatype-valid.1.2.1", new 
Object[]{content, "duration"});
           }
  
  
  
  1.4       +70 -39    xml-xerces/java/src/org/apache/xerces/impl/dv/xs/FloatDV.java
  
  Index: FloatDV.java
  ===================================================================
  RCS file: /home/cvs/xml-xerces/java/src/org/apache/xerces/impl/dv/xs/FloatDV.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- FloatDV.java      18 Jul 2002 20:48:43 -0000      1.3
  +++ FloatDV.java      18 Nov 2002 23:10:10 -0000      1.4
  @@ -77,55 +77,86 @@
       //convert a String to Float form, we have to take care of cases specified in 
spec like INF, -INF and NaN
       public Object getActualValue(String content, ValidationContext context) throws 
InvalidDatatypeValueException {
           try{
  -            return fValueOf(content);
  -        } catch (Exception ex){
  +            return new XFloat(content);
  +        } catch (NumberFormatException ex){
               throw new InvalidDatatypeValueException("cvc-datatype-valid.1.2.1", new 
Object[]{content, "float"});
           }
       }//getActualValue()
   
       // Can't call Float#compareTo method, because it's introduced in jdk 1.2
       public int compare(Object value1, Object value2){
  -        return compareFloats((Float)value1, (Float)value2);
  +        return ((XFloat)value1).compareTo((XFloat)value2);
       }//compare()
   
  -    //takes care of special values positive, negative infinity and Not a Number as 
per the spec.
  -    private static Float fValueOf(String s) throws NumberFormatException {
  -        Float f=null;
  -        try {
  -            f = Float.valueOf(s);
  -        }
  -        catch ( NumberFormatException nfe ) {
  -            if ( s.equals("INF") ) {
  -                f = new Float(Float.POSITIVE_INFINITY);
  -            }
  -            else if ( s.equals("-INF") ) {
  -                f = new Float (Float.NEGATIVE_INFINITY);
  +    private static final class XFloat {
  +        private float value;
  +        public XFloat(String s) throws NumberFormatException {
  +            try {
  +                value = Float.parseFloat(s);
               }
  -            else if ( s.equals("NaN" ) ) {
  -                f = new Float (Float.NaN);
  -            }
  -            else {
  -                throw nfe;
  +            catch ( NumberFormatException nfe ) {
  +                if ( s.equals("INF") ) {
  +                    value = Float.POSITIVE_INFINITY;
  +                }
  +                else if ( s.equals("-INF") ) {
  +                    value = Float.NEGATIVE_INFINITY;
  +                }
  +                else if ( s.equals("NaN" ) ) {
  +                    value = Float.NaN;
  +                }
  +                else {
  +                    throw nfe;
  +                }
               }
           }
  -        return f;
  -    }
   
  -    private int compareFloats(Float value, Float anotherValue){
  -        float thisVal = value.floatValue();
  -        float anotherVal = anotherValue.floatValue();
  -
  -        if (thisVal < anotherVal)
  -            return -1;                // Neither val is NaN, thisVal is smaller
  -        if (thisVal > anotherVal)
  -            return 1;                 // Neither val is NaN, thisVal is larger
  -
  -        int thisBits = Float.floatToIntBits(thisVal);
  -        int anotherBits = Float.floatToIntBits(anotherVal);
  -
  -        return (thisBits == anotherBits ?  0 : // Values are equal
  -                (thisBits < anotherBits ? -1 : // (-0.0, 0.0) or (!NaN, NaN)
  -                 1));                          // (0.0, -0.0) or (NaN, !NaN)
  -    }
  +        public boolean equals(Object val) {
  +            if (val == this)
  +                return true;
  +
  +            if (!(val instanceof XFloat))
  +                return false;
  +            XFloat oval = (XFloat)val;
  +
  +            if (value == oval.value)
  +                return true;
  +
  +            if (value != value && oval.value != oval.value)
  +                return true;
   
  +            return false;
  +        }
  +
  +        private int compareTo(XFloat val) {
  +            float oval = val.value;
  +
  +            // this < other
  +            if (value < oval)
  +                return -1;
  +            // this > other
  +            if (value > oval)
  +                return 1;
  +
  +            // get the bits
  +            int bits = Float.floatToIntBits(value);
  +            int obits = Float.floatToIntBits(oval);
  +
  +            // equal, or one is NaN, which is always smaller
  +            return (bits == obits ?  0 :
  +                    (bits < obits ? -1 :
  +                     1));
  +        }
  +        private String canonical;
  +        public synchronized String toString() {
  +            if (canonical == null) {
  +                if (value == Float.POSITIVE_INFINITY)
  +                    canonical = "INF";
  +                else if (value == Float.NEGATIVE_INFINITY)
  +                    canonical = "-INF";
  +                else
  +                    canonical = Float.toString(value);
  +            }
  +            return canonical;
  +        }
  +    }
   } // class FloatDV
  
  
  
  1.4       +39 -3     
xml-xerces/java/src/org/apache/xerces/impl/dv/xs/HexBinaryDV.java
  
  Index: HexBinaryDV.java
  ===================================================================
  RCS file: 
/home/cvs/xml-xerces/java/src/org/apache/xerces/impl/dv/xs/HexBinaryDV.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- HexBinaryDV.java  18 Jul 2002 20:48:43 -0000      1.3
  +++ HexBinaryDV.java  18 Nov 2002 23:10:10 -0000      1.4
  @@ -76,11 +76,47 @@
       }
   
       public Object getActualValue(String content, ValidationContext context) throws 
InvalidDatatypeValueException {
  -        String decoded = HexBin.decode(content);
  +        byte[] decoded = HexBin.decode(content);
           if (decoded == null)
               throw new InvalidDatatypeValueException("cvc-datatype-valid.1.2.1", new 
Object[]{content, "hexBinary"});
   
  -        return decoded;
  +        return new XHex(decoded);
       }
   
  +    // length of a binary type is the number of bytes
  +    public int getDataLength(Object value) {
  +        return ((XHex)value).length();
  +    }
  +
  +    private static final class XHex {
  +        // actually data stored in a byte array
  +        final byte[] data;
  +        // canonical representation of the data
  +        private String canonical;
  +        public XHex(byte[] data) {
  +            this.data = data;
  +        }
  +        public synchronized String toString() {
  +            if (canonical == null) {
  +                canonical = HexBin.encode(data);
  +            }
  +            return canonical;
  +        }
  +        public int length() {
  +            return data.length;
  +        }
  +        public boolean equals(Object obj) {
  +            if (!(obj instanceof XHex))
  +                return false;
  +            byte[] odata = ((XHex)obj).data;
  +            int len = data.length;
  +            if (len != odata.length)
  +                return false;
  +            for (int i = 0; i < len; i++) {
  +                if (data[i] != odata[i])
  +                    return false;
  +            }
  +            return true;
  +        }
  +    }
   }
  
  
  
  1.4       +48 -2     xml-xerces/java/src/org/apache/xerces/impl/dv/xs/ListDV.java
  
  Index: ListDV.java
  ===================================================================
  RCS file: /home/cvs/xml-xerces/java/src/org/apache/xerces/impl/dv/xs/ListDV.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- ListDV.java       18 Jul 2002 20:48:43 -0000      1.3
  +++ ListDV.java       18 Nov 2002 23:10:10 -0000      1.4
  @@ -82,6 +82,52 @@
   
       // length of a list type is the number of items in the list
       public int getDataLength(Object value) {
  -        return ((Object[])value).length;
  +        return ((ListData)value).length();
       }
   } // class ListDV
  +
  +final class ListData {
  +    final Object[] data;
  +    private String canonical;
  +    public ListData(Object[] data) {
  +        this.data = data;
  +    }
  +    public synchronized String toString() {
  +        if (canonical == null) {
  +            int len = data.length;
  +            StringBuffer buf = new StringBuffer();
  +            if (len > 0) {
  +                buf.append(data[0].toString());
  +            }
  +            for (int i = 1; i < len; i++) {
  +                buf.append(' ');
  +                buf.append(data[i].toString());
  +            }
  +            canonical = buf.toString();
  +        }
  +        return canonical;
  +    }
  +    public int length() {
  +        return data.length;
  +    }
  +    public Object item(int index) {
  +        return data[index];
  +    }
  +    public boolean equals(Object obj) {
  +        if (!(obj instanceof ListData))
  +            return false;
  +        Object[] odata = ((ListData)obj).data;
  +
  +        int count = data.length;
  +        if (count != odata.length)
  +            return false;
  +
  +        for (int i = 0 ; i < count ; i++) {
  +            if (!data[i].equals(odata[i]))
  +                return false;
  +        }//end of loop
  +
  +        //everything went fine.
  +        return true;
  +    }
  +}
  
  
  
  1.8       +2 -2      xml-xerces/java/src/org/apache/xerces/impl/dv/xs/MonthDV.java
  
  Index: MonthDV.java
  ===================================================================
  RCS file: /home/cvs/xml-xerces/java/src/org/apache/xerces/impl/dv/xs/MonthDV.java,v
  retrieving revision 1.7
  retrieving revision 1.8
  diff -u -r1.7 -r1.8
  --- MonthDV.java      20 Aug 2002 23:03:21 -0000      1.7
  +++ MonthDV.java      18 Nov 2002 23:10:10 -0000      1.8
  @@ -79,7 +79,7 @@
        */
       public Object getActualValue(String content, ValidationContext context) throws 
InvalidDatatypeValueException{
           try{
  -            return parse(content);
  +            return new DateTimeData(parse(content), this);
           } catch(Exception ex){
               throw new InvalidDatatypeValueException("cvc-datatype-valid.1.2.1", new 
Object[]{content, "gMonth"});
           }
  
  
  
  1.6       +2 -2      xml-xerces/java/src/org/apache/xerces/impl/dv/xs/MonthDayDV.java
  
  Index: MonthDayDV.java
  ===================================================================
  RCS file: 
/home/cvs/xml-xerces/java/src/org/apache/xerces/impl/dv/xs/MonthDayDV.java,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- MonthDayDV.java   18 Jul 2002 20:48:43 -0000      1.5
  +++ MonthDayDV.java   18 Nov 2002 23:10:10 -0000      1.6
  @@ -82,7 +82,7 @@
        */
       public Object getActualValue(String content, ValidationContext context) throws 
InvalidDatatypeValueException {
           try{
  -            return parse(content);
  +            return new DateTimeData(parse(content), this);
           } catch(Exception ex){
               throw new InvalidDatatypeValueException("cvc-datatype-valid.1.2.1", new 
Object[]{content, "gMonthDay"});
           }
  
  
  
  1.5       +36 -3     xml-xerces/java/src/org/apache/xerces/impl/dv/xs/QNameDV.java
  
  Index: QNameDV.java
  ===================================================================
  RCS file: /home/cvs/xml-xerces/java/src/org/apache/xerces/impl/dv/xs/QNameDV.java,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- QNameDV.java      30 Aug 2002 02:53:04 -0000      1.4
  +++ QNameDV.java      18 Nov 2002 23:10:10 -0000      1.5
  @@ -105,14 +105,47 @@
           if (prefix.length() > 0 && uri == null)
               throw new InvalidDatatypeValueException("UndeclaredPrefix", new 
Object[]{content, prefix});
   
  -        return new QName(prefix, context.getSymbol(localpart), 
context.getSymbol(content), uri);
  +        return new XQName(prefix, context.getSymbol(localpart), 
context.getSymbol(content), uri);
   
       }
   
       // REVISIT: qname and notation shouldn't support length facets.
       //          now we just return the length of the rawname
       public int getDataLength(Object value) {
  -        return ((QName)value).rawname.length();
  +        return ((XQName)value).rawname.length();
       }
   
  +    /**
  +     * represent QName data
  +     */
  +    private static final class XQName extends QName {
  +        /** Constructs a QName with the specified values. */
  +        public XQName(String prefix, String localpart, String rawname, String uri) {
  +            setValues(prefix, localpart, rawname, uri);
  +        } // <init>(String,String,String,String)
  +
  +        /** Returns true if the two objects are equal. */
  +        public boolean equals(Object object) {
  +            if (object instanceof QName) {
  +                QName qname = (QName)object;
  +                return uri == qname.uri && localpart == qname.localpart;
  +            }
  +            return false;
  +        } // equals(Object):boolean
  +
  +        // canonical representation of the data
  +        private String canonical;
  +        public synchronized String toString() {
  +            // REVISIT: what's the canonical form for QName?
  +            if (canonical == null) {
  +                if (prefix == null) {
  +                    canonical = localpart;
  +                }
  +                else {
  +                    canonical = prefix + ':' + localpart;
  +                }
  +            }
  +            return canonical;
  +        }
  +    }
   } // class QNameDVDV
  
  
  
  1.10      +2 -4      
xml-xerces/java/src/org/apache/xerces/impl/dv/xs/SchemaDVFactoryImpl.java
  
  Index: SchemaDVFactoryImpl.java
  ===================================================================
  RCS file: 
/home/cvs/xml-xerces/java/src/org/apache/xerces/impl/dv/xs/SchemaDVFactoryImpl.java,v
  retrieving revision 1.9
  retrieving revision 1.10
  diff -u -r1.9 -r1.10
  --- SchemaDVFactoryImpl.java  8 Nov 2002 16:46:39 -0000       1.9
  +++ SchemaDVFactoryImpl.java  18 Nov 2002 23:10:10 -0000      1.10
  @@ -241,9 +241,7 @@
           fBuiltInTypes.put(DAY, new XSSimpleTypeDecl(anySimpleType, DAY, 
XSSimpleTypeDecl.DV_GDAY, XSSimpleType.ORDERED_PARTIAL, false, false, false, true));
           fBuiltInTypes.put(MONTH, new XSSimpleTypeDecl(anySimpleType, MONTH, 
XSSimpleTypeDecl.DV_GMONTH, XSSimpleType.ORDERED_PARTIAL, false, false, false, true));
   
  -        facets.fractionDigits = 0;
  -        XSSimpleTypeDecl integerDV = new XSSimpleTypeDecl(decimalDV, INTEGER, 
URI_SCHEMAFORSCHEMA, (short)0, false);
  -        integerDV.applyFacets1(facets , XSSimpleType.FACET_FRACTIONDIGITS, 
(short)0, XSSimpleTypeDecl.SPECIAL_PATTERN_INTEGER);
  +        XSSimpleTypeDecl integerDV = new XSSimpleTypeDecl(decimalDV, INTEGER, 
XSSimpleTypeDecl.DV_INTEGER, XSSimpleType.ORDERED_TOTAL, false, false, true, true);
           fBuiltInTypes.put(INTEGER, integerDV);
   
           facets.maxInclusive = "0";
  
  
  
  1.6       +2 -2      xml-xerces/java/src/org/apache/xerces/impl/dv/xs/TimeDV.java
  
  Index: TimeDV.java
  ===================================================================
  RCS file: /home/cvs/xml-xerces/java/src/org/apache/xerces/impl/dv/xs/TimeDV.java,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- TimeDV.java       18 Jul 2002 20:48:43 -0000      1.5
  +++ TimeDV.java       18 Nov 2002 23:10:10 -0000      1.6
  @@ -78,7 +78,7 @@
        */
       public Object getActualValue(String content, ValidationContext context) throws 
InvalidDatatypeValueException{
           try{
  -            return parse(content);
  +            return new DateTimeData(parse(content), this);
           } catch(Exception ex){
               throw new InvalidDatatypeValueException("cvc-datatype-valid.1.2.1", new 
Object[]{content, "time"});
           }
  
  
  
  1.5       +2 -8      
xml-xerces/java/src/org/apache/xerces/impl/dv/xs/TypeValidator.java
  
  Index: TypeValidator.java
  ===================================================================
  RCS file: 
/home/cvs/xml-xerces/java/src/org/apache/xerces/impl/dv/xs/TypeValidator.java,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- TypeValidator.java        18 Jul 2002 20:48:43 -0000      1.4
  +++ TypeValidator.java        18 Nov 2002 23:10:10 -0000      1.5
  @@ -61,7 +61,7 @@
   import org.apache.xerces.impl.dv.ValidationContext;
   
   /**
  - * All primitive types plus ID/IDREF/ENTITY are derived from this abstract
  + * All primitive types plus ID/IDREF/ENTITY/INTEGER are derived from this abstract
    * class. It provides extra information XSSimpleTypeDecl requires from each
    * type: allowed facets, converting String to actual value, check equality,
    * comparison, etc.
  @@ -87,12 +87,6 @@
       // checked to be valid with respect to both lexical representation and
       // facets
       public void checkExtraRules(Object value, ValidationContext context) throws 
InvalidDatatypeValueException {
  -    }
  -
  -    // whether two values are equal
  -    // the parameters are in compiled form (from getActualValue)
  -    public boolean isEqual(Object value1, Object value2) {
  -        return value1.equals(value2);
       }
   
       // the following methods might not be supported by every DV.
  
  
  
  1.23      +62 -98    
xml-xerces/java/src/org/apache/xerces/impl/dv/xs/XSSimpleTypeDecl.java
  
  Index: XSSimpleTypeDecl.java
  ===================================================================
  RCS file: 
/home/cvs/xml-xerces/java/src/org/apache/xerces/impl/dv/xs/XSSimpleTypeDecl.java,v
  retrieving revision 1.22
  retrieving revision 1.23
  diff -u -r1.22 -r1.23
  --- XSSimpleTypeDecl.java     4 Nov 2002 18:36:18 -0000       1.22
  +++ XSSimpleTypeDecl.java     18 Nov 2002 23:10:10 -0000      1.23
  @@ -106,8 +106,9 @@
       static final short DV_ID            = DV_NOTATION + 1;
       static final short DV_IDREF         = DV_NOTATION + 2;
       static final short DV_ENTITY        = DV_NOTATION + 3;
  -    static final short DV_LIST          = DV_NOTATION + 4;
  -    static final short DV_UNION         = DV_NOTATION + 5;
  +    static final short DV_INTEGER       = DV_NOTATION + 4;
  +    static final short DV_LIST          = DV_NOTATION + 5;
  +    static final short DV_UNION         = DV_NOTATION + 6;
   
       static final TypeValidator[] fDVs = {
           new AnySimpleDV(),
  @@ -133,6 +134,7 @@
           new IDDV(),
           new IDREFDV(),
           new EntityDV(),
  +        new IntegerDV(),
           new ListDV(),
           new UnionDV()
       };
  @@ -164,6 +166,7 @@
           NORMALIZE_TRIM, //IDDV(),
           NORMALIZE_TRIM, //IDREFDV(),
           NORMALIZE_TRIM, //EntityDV(),
  +        NORMALIZE_TRIM, //IntegerDV(),
           NORMALIZE_FULL, //ListDV(),
           NORMALIZE_NONE, //UnionDV()
       };
  @@ -172,7 +175,6 @@
       static final short SPECIAL_PATTERN_NMTOKEN  = 1;
       static final short SPECIAL_PATTERN_NAME     = 2;
       static final short SPECIAL_PATTERN_NCNAME   = 3;
  -    static final short SPECIAL_PATTERN_INTEGER  = 4;
   
       static final String[] SPECIAL_PATTERN_STRING   = {
           "NONE", "NMTOKEN", "Name", "NCName", "integer"
  @@ -259,7 +261,7 @@
       // default constructor
       public XSSimpleTypeDecl(){}
   
  -    //Create a new built-in primitive types (and id/idref/entity)
  +    //Create a new built-in primitive types (and id/idref/entity/integer)
       protected XSSimpleTypeDecl(XSSimpleTypeDecl base, String name, short validateDV,
                                  short ordered, boolean bounded,
                                  boolean finite, boolean numeric, boolean 
isImmutable) {
  @@ -520,8 +522,10 @@
   
       public short getPrimitiveKind() {
           if (fVariety == VARIETY_ATOMIC && fValidationDV != DV_ANYSIMPLETYPE) {
  -            if (fVariety == DV_ID || fVariety == DV_IDREF || fVariety == DV_ENTITY)
  +            if (fValidationDV == DV_ID || fValidationDV == DV_IDREF || 
fValidationDV == DV_ENTITY)
                   return DV_STRING;
  +            else if (fValidationDV == DV_INTEGER)
  +                return DV_DECIMAL;
               else
                   return fValidationDV;
           }
  @@ -737,7 +741,7 @@
                   if (((fBase.fFacetsDefined & FACET_MAXINCLUSIVE) != 0)) {
                       result = fDVs[fValidationDV].compare(fMaxInclusive, 
fBase.fMaxInclusive);
                       if ((fBase.fFixedFacet & FACET_MAXINCLUSIVE) != 0 && result != 
0) {
  -                        reportError( "FixedFacetValue", new 
Object[]{"maxInclusive", getStringValue(fMaxInclusive), 
getStringValue(fBase.fMaxInclusive)});
  +                        reportError( "FixedFacetValue", new 
Object[]{"maxInclusive", fMaxInclusive, fBase.fMaxInclusive});
                       }
                       if (result == 0) {
                           needCheckBase = false;
  @@ -754,6 +758,7 @@
           }
   
           // maxExclusive
  +        needCheckBase = true;
           if ((presentFacet & FACET_MAXEXCLUSIVE) != 0) {
               if ((allowedFacet & FACET_MAXEXCLUSIVE) == 0) {
                   reportError("cos-applicable-facets", new Object[]{"maxExclusive"});
  @@ -771,7 +776,7 @@
                   if (((fBase.fFacetsDefined & FACET_MAXEXCLUSIVE) != 0)) {
                       result = fDVs[fValidationDV].compare(fMaxExclusive, 
fBase.fMaxExclusive);
                       if ((fBase.fFixedFacet & FACET_MAXEXCLUSIVE) != 0 && result != 
0) {
  -                        reportError( "FixedFacetValue", new 
Object[]{"maxExclusive", facets.maxExclusive, getStringValue(fBase.fMaxExclusive)});
  +                        reportError( "FixedFacetValue", new 
Object[]{"maxExclusive", facets.maxExclusive, fBase.fMaxExclusive});
                       }
                       if (result == 0) {
                           needCheckBase = false;
  @@ -787,6 +792,7 @@
               }
           }
           // minExclusive
  +        needCheckBase = true;
           if ((presentFacet & FACET_MINEXCLUSIVE) != 0) {
               if ((allowedFacet & FACET_MINEXCLUSIVE) == 0) {
                   reportError("cos-applicable-facets", new Object[]{"minExclusive"});
  @@ -804,7 +810,7 @@
                   if (((fBase.fFacetsDefined & FACET_MINEXCLUSIVE) != 0)) {
                       result = fDVs[fValidationDV].compare(fMinExclusive, 
fBase.fMinExclusive);
                       if ((fBase.fFixedFacet & FACET_MINEXCLUSIVE) != 0 && result != 
0) {
  -                        reportError( "FixedFacetValue", new 
Object[]{"minExclusive", facets.minExclusive, getStringValue(fBase.fMinExclusive)});
  +                        reportError( "FixedFacetValue", new 
Object[]{"minExclusive", facets.minExclusive, fBase.fMinExclusive});
                       }
                       if (result == 0) {
                           needCheckBase = false;
  @@ -820,6 +826,7 @@
               }
           }
           // minInclusive
  +        needCheckBase = true;
           if ((presentFacet & FACET_MININCLUSIVE) != 0) {
               if ((allowedFacet & FACET_MININCLUSIVE) == 0) {
                   reportError("cos-applicable-facets", new Object[]{"minInclusive"});
  @@ -837,7 +844,7 @@
                   if (((fBase.fFacetsDefined & FACET_MININCLUSIVE) != 0)) {
                       result = fDVs[fValidationDV].compare(fMinInclusive, 
fBase.fMinInclusive);
                       if ((fBase.fFixedFacet & FACET_MININCLUSIVE) != 0 && result != 
0) {
  -                        reportError( "FixedFacetValue", new 
Object[]{"minInclusive", facets.minInclusive, getStringValue(fBase.fMinInclusive)});
  +                        reportError( "FixedFacetValue", new 
Object[]{"minInclusive", facets.minInclusive, fBase.fMinInclusive});
                       }
                       if (result == 0) {
                           needCheckBase = false;
  @@ -913,26 +920,26 @@
               if (((fFacetsDefined &  FACET_MAXINCLUSIVE) != 0) && ((fFacetsDefined & 
FACET_MININCLUSIVE) != 0)) {
                 result = fDVs[fValidationDV].compare(fMinInclusive, fMaxInclusive);
                 if (result != -1 && result != 0)
  -                reportError("minInclusive-less-than-equal-to-maxInclusive", new 
Object[]{getStringValue(fMinInclusive), getStringValue(fMaxInclusive)});
  +                reportError("minInclusive-less-than-equal-to-maxInclusive", new 
Object[]{fMinInclusive, fMaxInclusive});
               }
   
               // check 4.3.8.c2 must: minExclusive <= maxExclusive ??? minExclusive < 
maxExclusive
               if (((fFacetsDefined & FACET_MAXEXCLUSIVE) != 0) && ((fFacetsDefined & 
FACET_MINEXCLUSIVE) != 0)) {
                 result = fDVs[fValidationDV].compare(fMinExclusive, fMaxExclusive);
                 if (result != -1 && result != 0)
  -                reportError( "minExclusive-less-than-equal-to-maxExclusive", new 
Object[]{getStringValue(fMinExclusive), getStringValue(fMaxExclusive)});
  +                reportError( "minExclusive-less-than-equal-to-maxExclusive", new 
Object[]{fMinExclusive, fMaxExclusive});
               }
   
               // check 4.3.9.c2 must: minExclusive < maxInclusive
               if (((fFacetsDefined & FACET_MAXINCLUSIVE) != 0) && ((fFacetsDefined & 
FACET_MINEXCLUSIVE) != 0)) {
                 if (fDVs[fValidationDV].compare(fMinExclusive, fMaxInclusive) != -1)
  -                reportError( "minExclusive-less-than-maxInclusive", new 
Object[]{getStringValue(fMinExclusive), getStringValue(fMaxInclusive)});
  +                reportError( "minExclusive-less-than-maxInclusive", new 
Object[]{fMinExclusive, fMaxInclusive});
               }
   
               // check 4.3.10.c1 must: minInclusive < maxExclusive
               if (((fFacetsDefined & FACET_MAXEXCLUSIVE) != 0) && ((fFacetsDefined & 
FACET_MININCLUSIVE) != 0)) {
                 if (fDVs[fValidationDV].compare(fMinInclusive, fMaxExclusive) != -1)
  -                reportError( "minInclusive-less-than-maxExclusive", new 
Object[]{getStringValue(fMinInclusive), getStringValue(fMaxExclusive)});
  +                reportError( "minInclusive-less-than-maxExclusive", new 
Object[]{fMinInclusive, fMaxExclusive});
               }
   
               // check 4.3.12.c1 must: fractionDigits <= totalDigits
  @@ -1013,27 +1020,27 @@
                   if (((fBase.fFacetsDefined & FACET_MAXINCLUSIVE) != 0)) {
                       result = fDVs[fValidationDV].compare(fMaxInclusive, 
fBase.fMaxInclusive);
                       if ((fBase.fFixedFacet & FACET_MAXINCLUSIVE) != 0 && result != 
0) {
  -                        reportError( "FixedFacetValue", new 
Object[]{"maxInclusive", getStringValue(fMaxInclusive), 
getStringValue(fBase.fMaxInclusive)});
  +                        reportError( "FixedFacetValue", new 
Object[]{"maxInclusive", fMaxInclusive), fBase.fMaxInclusive)});
                       }
                       if (result != -1 && result != 0) {
  -                        reportError( "maxInclusive-valid-restriction.1", new 
Object[]{getStringValue(fMaxInclusive), getStringValue(fBase.fMaxInclusive)});
  +                        reportError( "maxInclusive-valid-restriction.1", new 
Object[]{fMaxInclusive), fBase.fMaxInclusive)});
                       }
                   }
                   if (((fBase.fFacetsDefined & FACET_MAXEXCLUSIVE) != 0) &&
                       fDVs[fValidationDV].compare(fMaxInclusive, fBase.fMaxExclusive) 
!= -1){
  -                        reportError( "maxInclusive-valid-restriction.1", new 
Object[]{getStringValue(fMaxInclusive), getStringValue(fBase.fMaxExclusive)});
  +                        reportError( "maxInclusive-valid-restriction.1", new 
Object[]{fMaxInclusive), fBase.fMaxExclusive)});
                   }
   
                   if ((( fBase.fFacetsDefined & FACET_MININCLUSIVE) != 0)) {
                       result = fDVs[fValidationDV].compare(fMaxInclusive, 
fBase.fMinInclusive);
                       if (result != 1 && result != 0) {
  -                        reportError( "maxInclusive-valid-restriction.1", new 
Object[]{getStringValue(fMaxInclusive), getStringValue(fBase.fMinInclusive)});
  +                        reportError( "maxInclusive-valid-restriction.1", new 
Object[]{fMaxInclusive), fBase.fMinInclusive)});
                       }
                   }
   
                   if ((( fBase.fFacetsDefined & FACET_MINEXCLUSIVE) != 0) &&
                       fDVs[fValidationDV].compare(fMaxInclusive, fBase.fMinExclusive 
) != 1)
  -                    reportError( "maxInclusive-valid-restriction.1", new 
Object[]{getStringValue(fMaxInclusive), getStringValue(fBase.fMinExclusive)});
  +                    reportError( "maxInclusive-valid-restriction.1", new 
Object[]{fMaxInclusive), fBase.fMinExclusive)});
               }
   
               // check 4.3.8.c3 error:
  @@ -1045,27 +1052,27 @@
                   if ((( fBase.fFacetsDefined & FACET_MAXEXCLUSIVE) != 0)) {
                       result= fDVs[fValidationDV].compare(fMaxExclusive, 
fBase.fMaxExclusive);
                       if ((fBase.fFixedFacet & FACET_MAXEXCLUSIVE) != 0 &&  result != 
0) {
  -                        reportError( "FixedFacetValue", new 
Object[]{"maxExclusive", getStringValue(fMaxExclusive), 
getStringValue(fBase.fMaxExclusive)});
  +                        reportError( "FixedFacetValue", new 
Object[]{"maxExclusive", fMaxExclusive), fBase.fMaxExclusive)});
                       }
                       if (result != -1 && result != 0) {
  -                        reportError( "maxExclusive-valid-restriction.1", new 
Object[]{getStringValue(fMaxExclusive), getStringValue(fBase.fMaxExclusive)});
  +                        reportError( "maxExclusive-valid-restriction.1", new 
Object[]{fMaxExclusive), fBase.fMaxExclusive)});
                       }
                   }
   
                   if ((( fBase.fFacetsDefined & FACET_MAXINCLUSIVE) != 0)) {
                       result= fDVs[fValidationDV].compare(fMaxExclusive, 
fBase.fMaxInclusive);
                       if (result != -1 && result != 0) {
  -                        reportError( "maxExclusive-valid-restriction.2", new 
Object[]{getStringValue(fMaxExclusive), getStringValue(fBase.fMaxInclusive)});
  +                        reportError( "maxExclusive-valid-restriction.2", new 
Object[]{fMaxExclusive), fBase.fMaxInclusive)});
                       }
                   }
   
                   if ((( fBase.fFacetsDefined & FACET_MINEXCLUSIVE) != 0) &&
                       fDVs[fValidationDV].compare(fMaxExclusive, fBase.fMinExclusive 
) != 1)
  -                    reportError( "maxExclusive-valid-restriction.3", new 
Object[]{getStringValue(fMaxExclusive), getStringValue(fBase.fMinExclusive)});
  +                    reportError( "maxExclusive-valid-restriction.3", new 
Object[]{fMaxExclusive), fBase.fMinExclusive)});
   
                   if ((( fBase.fFacetsDefined & FACET_MININCLUSIVE) != 0) &&
                       fDVs[fValidationDV].compare(fMaxExclusive, fBase.fMinInclusive) 
!= 1)
  -                    reportError( "maxExclusive-valid-restriction.4", new 
Object[]{getStringValue(fMaxExclusive), getStringValue(fBase.fMinInclusive)});
  +                    reportError( "maxExclusive-valid-restriction.4", new 
Object[]{fMaxExclusive), fBase.fMinInclusive)});
               }
   
               // check 4.3.9.c3 error:
  @@ -1077,10 +1084,10 @@
                   if ((( fBase.fFacetsDefined & FACET_MINEXCLUSIVE) != 0)) {
                       result= fDVs[fValidationDV].compare(fMinExclusive, 
fBase.fMinExclusive);
                       if ((fBase.fFixedFacet & FACET_MINEXCLUSIVE) != 0 && result != 
0) {
  -                        reportError( "FixedFacetValue", new 
Object[]{"minExclusive", getStringValue(fMinExclusive), 
getStringValue(fBase.fMinExclusive)});
  +                        reportError( "FixedFacetValue", new 
Object[]{"minExclusive", fMinExclusive), fBase.fMinExclusive)});
                       }
                       if (result != 1 && result != 0) {
  -                        reportError( "minExclusive-valid-restriction.1", new 
Object[]{getStringValue(fMinExclusive), getStringValue(fBase.fMinExclusive)});
  +                        reportError( "minExclusive-valid-restriction.1", new 
Object[]{fMinExclusive), fBase.fMinExclusive)});
                       }
                   }
   
  @@ -1088,7 +1095,7 @@
                       result=fDVs[fValidationDV].compare(fMinExclusive, 
fBase.fMaxInclusive);
   
                       if (result != -1 && result != 0) {
  -                        reportError( "minExclusive-valid-restriction.2", new 
Object[]{getStringValue(fMinExclusive), getStringValue(fBase.fMaxInclusive)});
  +                        reportError( "minExclusive-valid-restriction.2", new 
Object[]{fMinExclusive), fBase.fMaxInclusive)});
                       }
                   }
   
  @@ -1096,13 +1103,13 @@
                       result = fDVs[fValidationDV].compare(fMinExclusive, 
fBase.fMinInclusive);
   
                       if (result != 1 && result != 0) {
  -                        reportError( "minExclusive-valid-restriction.3", new 
Object[]{getStringValue(fMinExclusive), getStringValue(fBase.fMinInclusive)});
  +                        reportError( "minExclusive-valid-restriction.3", new 
Object[]{fMinExclusive), fBase.fMinInclusive)});
                       }
                   }
   
                   if ((( fBase.fFacetsDefined & FACET_MAXEXCLUSIVE) != 0) &&
                       fDVs[fValidationDV].compare(fMinExclusive, fBase.fMaxExclusive) 
!= -1)
  -                    reportError( "minExclusive-valid-restriction.4", new 
Object[]{getStringValue(fMinExclusive), getStringValue(fBase.fMaxExclusive)});
  +                    reportError( "minExclusive-valid-restriction.4", new 
Object[]{fMinExclusive), fBase.fMaxExclusive)});
               }
   
               // check 4.3.10.c2 error:
  @@ -1115,24 +1122,24 @@
                       result = fDVs[fValidationDV].compare(fMinInclusive, 
fBase.fMinInclusive);
   
                       if ((fBase.fFixedFacet & FACET_MININCLUSIVE) != 0 && result != 
0) {
  -                        reportError( "FixedFacetValue", new 
Object[]{"minInclusive", getStringValue(fMinInclusive), 
getStringValue(fBase.fMinInclusive)});
  +                        reportError( "FixedFacetValue", new 
Object[]{"minInclusive", fMinInclusive), fBase.fMinInclusive)});
                       }
                       if (result != 1 && result != 0) {
  -                        reportError( "minInclusive-valid-restriction.1", new 
Object[]{getStringValue(fMinInclusive), getStringValue(fBase.fMinInclusive)});
  +                        reportError( "minInclusive-valid-restriction.1", new 
Object[]{fMinInclusive), fBase.fMinInclusive)});
                       }
                   }
                   if ((( fBase.fFacetsDefined & FACET_MAXINCLUSIVE) != 0)) {
                       result=fDVs[fValidationDV].compare(fMinInclusive, 
fBase.fMaxInclusive);
                       if (result != -1 && result != 0) {
  -                        reportError( "minInclusive-valid-restriction.2", new 
Object[]{getStringValue(fMinInclusive), getStringValue(fBase.fMaxInclusive)});
  +                        reportError( "minInclusive-valid-restriction.2", new 
Object[]{fMinInclusive), fBase.fMaxInclusive)});
                       }
                   }
                   if ((( fBase.fFacetsDefined & FACET_MINEXCLUSIVE) != 0) &&
                       fDVs[fValidationDV].compare(fMinInclusive, fBase.fMinExclusive 
) != 1)
  -                    reportError( "minInclusive-valid-restriction.3", new 
Object[]{getStringValue(fMinInclusive), getStringValue(fBase.fMinExclusive)});
  +                    reportError( "minInclusive-valid-restriction.3", new 
Object[]{fMinInclusive), fBase.fMinExclusive)});
                   if ((( fBase.fFacetsDefined & FACET_MAXEXCLUSIVE) != 0) &&
                       fDVs[fValidationDV].compare(fMinInclusive, fBase.fMaxExclusive) 
!= -1)
  -                    reportError( "minInclusive-valid-restriction.4", new 
Object[]{getStringValue(fMinInclusive), getStringValue(fBase.fMaxExclusive)});
  +                    reportError( "minInclusive-valid-restriction.4", new 
Object[]{fMinInclusive), fBase.fMaxExclusive)});
               }
   */
               // check 4.3.11.c1 error: totalDigits > fBase.totalDigits
  @@ -1362,7 +1369,7 @@
           if ( ((fFacetsDefined & FACET_ENUMERATION) != 0 ) ) {
               boolean present = false;
               for (int i = 0; i < fEnumeration.size(); i++) {
  -                if (isEqual(ob, fEnumeration.elementAt(i))) {
  +                if (fEnumeration.elementAt(i).equals(ob)) {
                       present = true;
                       break;
                   }
  @@ -1441,19 +1448,20 @@
   
           } else if (fVariety == VARIETY_LIST) {
   
  -            Object[] values = (Object[])ob;
  +            ListData values = (ListData)ob;
  +            int len = values.length();
               if (fItemType.fVariety == VARIETY_UNION) {
                   XSSimpleTypeDecl[] memberTypes = 
(XSSimpleTypeDecl[])validatedInfo.memberTypes;
                   XSSimpleType memberType = validatedInfo.memberType;
  -                for (int i = values.length-1; i >= 0; i--) {
  -                    validatedInfo.actualValue = values[i];
  +                for (int i = len-1; i >= 0; i--) {
  +                    validatedInfo.actualValue = values.item(i);
                       validatedInfo.memberType = memberTypes[i];
                       fItemType.checkExtraRules(context, validatedInfo);
                   }
                   validatedInfo.memberType = memberType;
               } else { // (fVariety == VARIETY_ATOMIC)
  -                for (int i = values.length-1; i >= 0; i--) {
  -                    validatedInfo.actualValue = values[i];
  +                for (int i = len-1; i >= 0; i--) {
  +                    validatedInfo.actualValue = values.item(i);
                       fItemType.checkExtraRules(context, validatedInfo);
                   }
               }
  @@ -1508,12 +1516,6 @@
                       // PATTERN "[\\i-[:]][\\c-[:]]*"
                       seenErr = !XMLChar.isValidNCName(nvalue);
                   }
  -                else if (fPatternType == SPECIAL_PATTERN_INTEGER) {
  -                    // REVISIT: the pattern is not published yet
  -                    // we only need to worry about the period '.'
  -                    // other parts are taken care of by the DecimalDV
  -                    seenErr = nvalue.indexOf('.') >= 0;
  -                }
                   if (seenErr) {
                       throw new 
InvalidDatatypeValueException("cvc-datatype-valid.1.2.1",
                                                               new Object[]{nvalue, 
SPECIAL_PATTERN_STRING[fPatternType]});
  @@ -1547,12 +1549,13 @@
                   memberTypes[i] = (XSSimpleTypeDecl)validatedInfo.memberType;
               }
   
  -            validatedInfo.actualValue = avalue;
  +            ListData v = new ListData(avalue);
  +            validatedInfo.actualValue = v;
               validatedInfo.memberType = null;
               validatedInfo.memberTypes = memberTypes;
               validatedInfo.normalizedValue = nvalue;
     
  -            return avalue;
  +            return v;
   
           } else { // (fVariety == VARIETY_UNION)
               for(int i = 0 ; i < fMemberTypes.length; i++) {
  @@ -1580,41 +1583,10 @@
   
       }//getActualValue()
   
  -
       public boolean isEqual(Object value1, Object value2) {
  -
  -        if (fVariety == VARIETY_ATOMIC)
  -            return fDVs[fValidationDV].isEqual(value1,value2);
  -
  -        else if (fVariety == VARIETY_LIST) {
  -            if (!(value1 instanceof Object[]) || !(value2 instanceof Object[]))
  -                return false;
  -
  -            Object[] v1 = (Object[])value1;
  -            Object[] v2 = (Object[])value2;
  -
  -            int count = v1.length;
  -            if (count != v2.length)
  -                return false;
  -
  -            for (int i = 0 ; i < count ; i++) {
  -                if (!fItemType.isEqual(v1[i], v2[i]))
  -                    return false;
  -            }//end of loop
  -
  -            //everything went fine.
  -            return true;
  -
  -        } else if (fVariety == VARIETY_UNION) {
  -            for (int i = fMemberTypes.length-1; i >= 0; i--) {
  -                if (fMemberTypes[i].isEqual(value1,value2)){
  -                    return true;
  -                }
  -            }
  +        if (value1 == null)
               return false;
  -        }
  -
  -        return false;
  +        return value1.equals(value2);
       }//isEqual()
   
       // normalize the string according to the whiteSpace facet
  @@ -1734,17 +1706,6 @@
           return WS_FACET_STRING[ws];
       }
   
  -    public String getStringValue(Object value){
  -        if(value != null) {
  -            if (fDVs[fValidationDV] instanceof AbstractDateTimeDV)
  -                return 
((AbstractDateTimeDV)fDVs[fValidationDV]).dateToString((int[])value);
  -            else
  -                return value.toString();
  -        } else {
  -            return null;
  -        }
  -    }
  -
       public short getOrdered() {
           return fOrdered;
       }
  @@ -1788,13 +1749,13 @@
           case FACET_WHITESPACE:
               return WS_FACET_STRING[fWhiteSpace];
           case FACET_MAXINCLUSIVE:
  -            return getStringValue(fMaxInclusive);
  +            return fMaxInclusive.toString();
           case FACET_MAXEXCLUSIVE:
  -            return getStringValue(fMaxExclusive);
  +            return fMaxExclusive.toString();
           case FACET_MINEXCLUSIVE:
  -            return getStringValue(fMinExclusive);
  +            return fMinExclusive.toString();
           case FACET_MININCLUSIVE:
  -            return getStringValue(fMinInclusive);
  +            return fMinInclusive.toString();
           case FACET_TOTALDIGITS:
               return Integer.toString(fTotalDigits);
           case FACET_FRACTIONDIGITS:
  @@ -1811,7 +1772,7 @@
           int size = fEnumeration.size();
           String[] strs = new String[size];
           for (int i = 0; i < size; i++)
  -            strs[i] = getStringValue(fEnumeration.elementAt(i));
  +            strs[i] = fEnumeration.elementAt(i).toString();
           return new StringListImpl(strs, size);
       }
   
  @@ -2008,7 +1969,10 @@
           if (validationDV == DV_ID || validationDV == DV_IDREF || validationDV == 
DV_ENTITY){
               return DV_STRING;
           }
  -        else{
  +        else if (validationDV == DV_INTEGER) {
  +            return DV_DECIMAL;
  +        }
  +        else {
               return validationDV;
           }
   
  
  
  
  1.6       +2 -2      xml-xerces/java/src/org/apache/xerces/impl/dv/xs/YearDV.java
  
  Index: YearDV.java
  ===================================================================
  RCS file: /home/cvs/xml-xerces/java/src/org/apache/xerces/impl/dv/xs/YearDV.java,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- YearDV.java       18 Jul 2002 20:48:43 -0000      1.5
  +++ YearDV.java       18 Nov 2002 23:10:11 -0000      1.6
  @@ -79,7 +79,7 @@
        */
       public Object getActualValue(String content, ValidationContext context) throws 
InvalidDatatypeValueException{
           try{
  -            return parse(content);
  +            return new DateTimeData(parse(content), this);
           } catch(Exception ex){
               throw new InvalidDatatypeValueException("cvc-datatype-valid.1.2.1", new 
Object[]{content, "gYear"});
           }
  
  
  
  1.6       +2 -2      
xml-xerces/java/src/org/apache/xerces/impl/dv/xs/YearMonthDV.java
  
  Index: YearMonthDV.java
  ===================================================================
  RCS file: 
/home/cvs/xml-xerces/java/src/org/apache/xerces/impl/dv/xs/YearMonthDV.java,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- YearMonthDV.java  18 Jul 2002 20:48:43 -0000      1.5
  +++ YearMonthDV.java  18 Nov 2002 23:10:11 -0000      1.6
  @@ -78,7 +78,7 @@
        */
       public Object getActualValue(String content, ValidationContext context) throws 
InvalidDatatypeValueException{
           try{
  -            return parse(content);
  +            return new DateTimeData(parse(content), this);
           } catch(Exception ex){
               throw new InvalidDatatypeValueException("cvc-datatype-valid.1.2.1", new 
Object[]{content, "gYearMonth"});
           }
  
  
  
  1.1                  xml-xerces/java/src/org/apache/xerces/impl/dv/xs/IntegerDV.java
  
  Index: IntegerDV.java
  ===================================================================
  /*
   * The Apache Software License, Version 1.1
   *
   *
   * Copyright (c) 2002 The Apache Software Foundation.  All rights
   * reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
   *    notice, this list of conditions and the following disclaimer.
   *
   * 2. Redistributions in binary form must reproduce the above copyright
   *    notice, this list of conditions and the following disclaimer in
   *    the documentation and/or other materials provided with the
   *    distribution.
   *
   * 3. The end-user documentation included with the redistribution,
   *    if any, must include the following acknowledgment:
   *       "This product includes software developed by the
   *        Apache Software Foundation (http://www.apache.org/)."
   *    Alternately, this acknowledgment may appear in the software itself,
   *    if and wherever such third-party acknowledgments normally appear.
   *
   * 4. The names "Xerces" and "Apache Software Foundation" must
   *    not be used to endorse or promote products derived from this
   *    software without prior written permission. For written
   *    permission, please contact [EMAIL PROTECTED]
   *
   * 5. Products derived from this software may not be called "Apache",
   *    nor may "Apache" appear in their name, without prior written
   *    permission of the Apache Software Foundation.
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   * SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Software Foundation and was
   * originally based on software copyright (c) 2001, International
   * Business Machines, Inc., http://www.apache.org.  For more
   * information on the Apache Software Foundation, please see
   * <http://www.apache.org/>.
   */
  
  package org.apache.xerces.impl.dv.xs;
  
  import org.apache.xerces.impl.dv.InvalidDatatypeValueException;
  import org.apache.xerces.impl.dv.ValidationContext;
  
  /**
   * Represent the schema type "integer"
   *
   * @author Sandy Gao, IBM
   *
   * @version $Id: IntegerDV.java,v 1.1 2002/11/18 23:10:10 sandygao Exp $
   */
  public class IntegerDV extends DecimalDV {
  
      public Object getActualValue(String content, ValidationContext context) throws 
InvalidDatatypeValueException {
          try {
              return new XDecimal(content, true);
          } catch (NumberFormatException nfe) {
              throw new InvalidDatatypeValueException("cvc-datatype-valid.1.2.1", new 
Object[]{content, "integer"});
          }
      }
      
  } // class EntityDV
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to