[prev in list] [next in list] [prev in thread] [next in thread] 

List:       xerces-cvs
Subject:    cvs commit: xml-xerces/java/src/org/apache/xerces/impl/dv/xs XSSimpleTypeDecl.java
From:       mrglavas () apache ! org
Date:       2005-06-24 3:47:28
Message-ID: 20050624034728.265.qmail () minotaur ! apache ! org
[Download RAW message or body]

mrglavas    2005/06/23 20:47:28

  Modified:    java/src/org/apache/xerces/impl/dv/xs XSSimpleTypeDecl.java
  Log:
  Bug fix: When checking enumerations, two values are comparable if they're in the \
same value space.  
  Revision  Changes    Path
  1.73      +58 -19    \
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.72
  retrieving revision 1.73
  diff -u -r1.72 -r1.73
  --- XSSimpleTypeDecl.java	13 Jun 2005 20:44:08 -0000	1.72
  +++ XSSimpleTypeDecl.java	24 Jun 2005 03:47:28 -0000	1.73
  @@ -1616,28 +1616,50 @@
   		}
   		
   		//enumeration
  -		if ( ((fFacetsDefined & FACET_ENUMERATION) != 0 ) ) {
  -			boolean present = false;
  -			for (int i = 0; i < fEnumeration.size(); i++) {
  -				if (fEnumerationType[i] == type && fEnumeration.elementAt(i).equals(ob)) {
  -                    if(type == XSConstants.LIST_DT || type == \
XSConstants.LISTOFUNION_DT) {  +        if ( ((fFacetsDefined & FACET_ENUMERATION) != \
0 ) ) {  +            boolean present = false;
  +            final int enumSize = fEnumeration.size();
  +            for (int i = 0; i < enumSize; i++) {
  +                final short primitiveType1 = \
convertToPrimitiveKind(fEnumerationType[i]);  +                final short \
primitiveType2 = convertToPrimitiveKind(type);  +                if ((primitiveType1 \
== primitiveType2 ||  +                     primitiveType1 == \
XSConstants.ANYSIMPLETYPE_DT && primitiveType2 == XSConstants.STRING_DT ||  +         \
primitiveType1 == XSConstants.STRING_DT && primitiveType2 == \
XSConstants.ANYSIMPLETYPE_DT)  +                     && \
fEnumeration.elementAt(i).equals(ob)) {  +                    if (primitiveType1 == \
                XSConstants.LIST_DT || primitiveType1 == XSConstants.LISTOFUNION_DT) \
                {
                           ShortList enumItemType = fEnumerationItemType[i];
  -                        if(enumItemType.equals(itemType)) {
  -                            present = true;
  -                            break;
  +                        final int typeList1Length = itemType != null ? \
itemType.getLength() : 0;  +                        final int typeList2Length = \
enumItemType != null ? enumItemType.getLength() : 0;  +                        if \
(typeList1Length == typeList2Length) {  +                            int j;
  +                            for (j = 0; j < typeList1Length; ++j) {
  +                                final short primitiveItem1 = \
convertToPrimitiveKind(itemType.item(j));  +                                final \
short primitiveItem2 = convertToPrimitiveKind(enumItemType.item(j));  +               \
if (primitiveItem1 != primitiveItem2) {  +                                    if \
(primitiveItem1 == XSConstants.ANYSIMPLETYPE_DT && primitiveItem2 == \
XSConstants.STRING_DT ||  +                                        primitiveItem1 == \
XSConstants.STRING_DT && primitiveItem2 == XSConstants.ANYSIMPLETYPE_DT) {  +         \
continue;  +                                    }
  +                                    break;
  +                                }
  +                            }
  +                            if (j == typeList1Length) {
  +                                present = true;
  +                                break;
  +                            }
                           }
  -                     }
  +                    }
                       else {
  -    					present = true;
  -    					break;
  +                        present = true;
  +                        break;
                       }
  -				}
  -			}
  -			if(!present){
  -				throw new InvalidDatatypeValueException("cvc-enumeration-valid",
  -						new Object [] {content, fEnumeration.toString()});
  -			}
  -		}
  +                }
  +            }
  +            if(!present){
  +                throw new InvalidDatatypeValueException("cvc-enumeration-valid",
  +                        new Object [] {content, fEnumeration.toString()});
  +            }
  +        }
   		
   		//fractionDigits
   		if ((fFacetsDefined & FACET_FRACTIONDIGITS) != 0) {
  @@ -3212,6 +3234,23 @@
       public boolean isDerivedFrom(String typeNamespaceArg, String typeNameArg, int \
                derivationMethod) {
           return isDOMDerivedFrom(typeNamespaceArg, typeNameArg, derivationMethod);
       }
  +    
  +    private short convertToPrimitiveKind(short valueType) {
  +        /** Primitive datatypes. */
  +        if (valueType <= XSConstants.NOTATION_DT) {
  +            return valueType;
  +        }
  +        /** Types derived from string. */
  +        if (valueType <= XSConstants.ENTITY_DT) {
  +            return XSConstants.STRING_DT;
  +        }
  +        /** Types derived from decimal. */
  +        if (valueType <= XSConstants.POSITIVEINTEGER_DT) {
  +            return XSConstants.DECIMAL_DT;
  +        }
  +        /** Other types. */
  +        return valueType;
  +    }
   	
   } // class XSSimpleTypeDecl
   
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@xerces.apache.org
For additional commands, e-mail: commits-help@xerces.apache.org


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic