You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@xerces.apache.org by sa...@apache.org on 2001/09/05 23:16:03 UTC

cvs commit: xml-xerces/java/src/org/apache/xerces/impl/v2/datatypes AbstractDatatypeValidator.java AbstractStringValidator.java IDDatatypeValidator.java IDREFDatatypeValidator.java QNameDatatypeValidator.java

sandygao    01/09/05 14:16:03

  Modified:    java/src/org/apache/xerces/impl/v2 SchemaGrammar.java
                        SchemaSymbols.java SchemaValidator.java
                        XSAttributeChecker.java XSDAbstractTraverser.java
                        XSDElementTraverser.java XSDHandler.java
                        XSDSimpleTypeTraverser.java XSType.java
               java/src/org/apache/xerces/impl/v2/datatypes
                        AbstractDatatypeValidator.java
                        AbstractStringValidator.java
                        IDDatatypeValidator.java
                        IDREFDatatypeValidator.java
                        QNameDatatypeValidator.java
  Log:
  Again lots of changes. Now we can validate a simple element against a simple simpleType. Cheers.
  
  Revision  Changes    Path
  1.6       +80 -35    xml-xerces/java/src/org/apache/xerces/impl/v2/SchemaGrammar.java
  
  Index: SchemaGrammar.java
  ===================================================================
  RCS file: /home/cvs/xml-xerces/java/src/org/apache/xerces/impl/v2/SchemaGrammar.java,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- SchemaGrammar.java	2001/09/05 18:06:31	1.5
  +++ SchemaGrammar.java	2001/09/05 21:16:02	1.6
  @@ -66,7 +66,7 @@
   import java.util.Hashtable;
   import java.util.Vector;
   /**
  - * @version $Id: SchemaGrammar.java,v 1.5 2001/09/05 18:06:31 neilg Exp $
  + * @version $Id: SchemaGrammar.java,v 1.6 2001/09/05 21:16:02 sandygao Exp $
    */
   
   public class SchemaGrammar {
  @@ -101,10 +101,10 @@
       private String fElementDeclTypeNS[][];
       private int fElementDeclTypeDecl[][];
       private short fElementDeclMiscFlags[][];
  -    private int fElementDeclBlockSet[][];
  -    private int fElementDeclFinalSet[][];
  +    private short fElementDeclBlockSet[][];
  +    private short fElementDeclFinalSet[][];
       private String fElementDeclDefault[][];
  -    private int fElementDeclSubGroupNS[][];
  +    private String fElementDeclSubGroupNS[][];
       private int fElementDeclSubGroupIdx[][];
       private Vector fElementDeclUnique[][];
       private Vector fElementDeclKey[][];
  @@ -161,18 +161,18 @@
           fSymbolTable = symbolTable;
   
           // element decl
  -        fElementDeclName = new QName[INITIAL_CHUNK_COUNT][];
  -        fElementDeclTypeNS = new String[INITIAL_CHUNK_COUNT][];
  -        fElementDeclTypeDecl = new int[INITIAL_CHUNK_COUNT][];
  -        fElementDeclMiscFlags = new short[INITIAL_CHUNK_COUNT][];
  -        fElementDeclBlockSet = new int[INITIAL_CHUNK_COUNT][];
  -        fElementDeclFinalSet = new int[INITIAL_CHUNK_COUNT][];
  -        fElementDeclDefault = new String[INITIAL_CHUNK_COUNT][];
  -        fElementDeclSubGroupNS = new int[INITIAL_CHUNK_COUNT][];
  -        fElementDeclSubGroupIdx = new int[INITIAL_CHUNK_COUNT][];
  -        fElementDeclUnique = new Vector[INITIAL_CHUNK_COUNT][];
  -        fElementDeclKey = new Vector[INITIAL_CHUNK_COUNT][];
  -        fElementDeclKeyRef = new Vector[INITIAL_CHUNK_COUNT][];
  +        fElementDeclName = new QName[INITIAL_CHUNK_COUNT][CHUNK_SIZE];
  +        fElementDeclTypeNS = new String[INITIAL_CHUNK_COUNT][CHUNK_SIZE];
  +        fElementDeclTypeDecl = new int[INITIAL_CHUNK_COUNT][CHUNK_SIZE];
  +        fElementDeclMiscFlags = new short[INITIAL_CHUNK_COUNT][CHUNK_SIZE];
  +        fElementDeclBlockSet = new short[INITIAL_CHUNK_COUNT][CHUNK_SIZE];
  +        fElementDeclFinalSet = new short[INITIAL_CHUNK_COUNT][CHUNK_SIZE];
  +        fElementDeclDefault = new String[INITIAL_CHUNK_COUNT][CHUNK_SIZE];
  +        fElementDeclSubGroupNS = new String[INITIAL_CHUNK_COUNT][CHUNK_SIZE];
  +        fElementDeclSubGroupIdx = new int[INITIAL_CHUNK_COUNT][CHUNK_SIZE];
  +        fElementDeclUnique = new Vector[INITIAL_CHUNK_COUNT][CHUNK_SIZE];
  +        fElementDeclKey = new Vector[INITIAL_CHUNK_COUNT][CHUNK_SIZE];
  +        fElementDeclKeyRef = new Vector[INITIAL_CHUNK_COUNT][CHUNK_SIZE];
   
           // attribute declarations
           fAttributeDeclName = new QName[INITIAL_CHUNK_COUNT][];
  @@ -197,8 +197,8 @@
   
           //REVISIT: as temporary solution store complexTypes/simpleTypes as objects
           // Add XML Schema datatypes 
  -        fTypeDeclQName = new QName[INITIAL_CHUNK_COUNT][];
  -        fTypeDeclType = new XSType[INITIAL_CHUNK_COUNT][];
  +        fTypeDeclQName = new QName[INITIAL_CHUNK_COUNT][CHUNK_SIZE];
  +        fTypeDeclType = new XSType[INITIAL_CHUNK_COUNT][CHUNK_SIZE];
   
       } // <init>(SymbolTable)
   
  @@ -331,8 +331,6 @@
               topLevelTypeDecls.put(SchemaSymbols.ATTVAL_HEXBINARY, new Integer(typeIndex++));
               fTypeDeclType[0][typeIndex] = new NOTATIONDatatypeValidator(anySimpleType, null, false);
               topLevelTypeDecls.put(SchemaSymbols.ATTVAL_NOTATION, new Integer(typeIndex++));
  -            fTypeDeclType[0][typeIndex] = new QNameDatatypeValidator(anySimpleType, null, false);
  -            topLevelTypeDecls.put(SchemaSymbols.ATTVAL_QNAME, new Integer(typeIndex++));
               
               facets.clear();
               facets.put(SchemaSymbols.ELT_WHITESPACE, SchemaSymbols.ATTVAL_REPLACE);
  @@ -346,7 +344,8 @@
               topLevelTypeDecls.put(SchemaSymbols.ATTVAL_TOKEN, new Integer(typeIndex++));
               facets.clear();
               facets.put(SchemaSymbols.ELT_WHITESPACE, SchemaSymbols.ATTVAL_COLLAPSE);
  -            facets.put(SchemaSymbols.ELT_PATTERN , "([a-zA-Z]{2}|[iI]-[a-zA-Z]+|[xX]-[a-zA-Z]+)(-[a-zA-Z]+)*" );
  +            //REVISIT: won't run: regexparser, locale, resource bundle
  +            //facets.put(SchemaSymbols.ELT_PATTERN , "([a-zA-Z]{2}|[iI]-[a-zA-Z]+|[xX]-[a-zA-Z]+)(-[a-zA-Z]+)*");
               fTypeDeclType[0][typeIndex] = new StringDatatypeValidator(tokenDV, facets, false);
               topLevelTypeDecls.put(SchemaSymbols.ATTVAL_LANGUAGE, new Integer(typeIndex++));
               facets.clear();
  @@ -361,6 +360,10 @@
               DatatypeValidator ncnameDV = new StringDatatypeValidator(nameDV, facets, false);
               fTypeDeclType[0][typeIndex] = ncnameDV;
               topLevelTypeDecls.put(SchemaSymbols.ATTVAL_NCNAME, new Integer(typeIndex++));
  +            DatatypeValidator qnameDV = new QNameDatatypeValidator(anySimpleType, null, false);
  +            ((QNameDatatypeValidator)qnameDV).setNCNameValidator(ncnameDV);
  +            fTypeDeclType[0][typeIndex] = qnameDV;
  +            topLevelTypeDecls.put(SchemaSymbols.ATTVAL_QNAME, new Integer(typeIndex++));
               fTypeDeclType[0][typeIndex] = new IDDatatypeValidator(ncnameDV, null, false);
               topLevelTypeDecls.put(SchemaSymbols.ATTVAL_ID, new Integer(typeIndex++));
               DatatypeValidator idrefDV = new IDREFDatatypeValidator(ncnameDV, null, false);
  @@ -402,19 +405,6 @@
   
   
       /**
  -     * getElementIndex
  -     * 
  -     * @param elementName
  -     * 
  -     * @return REVISIT: previously if failed returned false 
  -     */
  -    public int getElementIndex(String elementName) {
  -        Integer elementIndex = (Integer)topLevelElemDecls.get(elementName);
  -        return elementIndex == null ? -1 : elementIndex.intValue();
  -    } // getElementDecl(int,XSElementDecl):XSElementDecl
  -
  -
  -    /**
        * addElementDecl
        * 
        * @param name
  @@ -428,7 +418,15 @@
           int elementIndex = fElementDeclCount++;
           int chunk = elementIndex >> CHUNK_SHIFT;
           int index = elementIndex & CHUNK_MASK;
  -        fElementDeclName[chunk][index].setValues(element.fQName);
  +        fElementDeclName[chunk][index] = new QName(element.fQName);
  +        fElementDeclTypeNS[chunk][index] = element.fTypeNS;
  +        fElementDeclTypeDecl[chunk][index] = element.fTypeIdx;
  +        fElementDeclMiscFlags[chunk][index] = element.fElementMiscFlags;
  +        fElementDeclBlockSet[chunk][index] = element.fBlock;
  +        fElementDeclFinalSet[chunk][index] = element.fFinal;
  +        fElementDeclDefault[chunk][index] = element.fDefault;
  +        fElementDeclSubGroupNS[chunk][index] = element.fSubGroupNS;
  +        fElementDeclSubGroupIdx[chunk][index] = element.fSubGroupIdx;
           //REVISIT: other fields
           
           topLevelElemDecls.put(element.fQName.localpart, new Integer(elementIndex));
  @@ -437,6 +435,19 @@
       }
   
       /**
  +     * getElementIndex
  +     * 
  +     * @param elementName
  +     * 
  +     * @return REVISIT: previously if failed returned false 
  +     */
  +    public int getElementIndex(String elementName) {
  +        Integer elementIndex = (Integer)topLevelElemDecls.get(elementName);
  +        return elementIndex == null ? -1 : elementIndex.intValue();
  +    } // getElementDecl(int,XSElementDecl):XSElementDecl
  +
  +
  +    /**
        * getElementDecl
        * 
        * @param elementDeclIndex 
  @@ -455,6 +466,14 @@
           int index = elementDeclIndex &  CHUNK_MASK;
   
           elementDecl.fQName.setValues(fElementDeclName[chunk][index]);
  +        elementDecl.fTypeNS = fElementDeclTypeNS[chunk][index];
  +        elementDecl.fTypeIdx = fElementDeclTypeDecl[chunk][index];
  +        elementDecl.fElementMiscFlags = fElementDeclMiscFlags[chunk][index];
  +        elementDecl.fBlock = fElementDeclBlockSet[chunk][index];
  +        elementDecl.fFinal = fElementDeclFinalSet[chunk][index];
  +        elementDecl.fDefault = fElementDeclDefault[chunk][index];
  +        elementDecl.fSubGroupNS = fElementDeclSubGroupNS[chunk][index];
  +        elementDecl.fSubGroupIdx = fElementDeclSubGroupIdx[chunk][index];
   
           // REVISIT: 
           // add code
  @@ -480,6 +499,19 @@
   
   
       /**
  +     * getAttributeIndex
  +     * 
  +     * @param attributeName
  +     * 
  +     * @return REVISIT: previously if failed returned false 
  +     */
  +    public int getAttributeIndex(String attributeName) {
  +        Integer attributeIndex = (Integer)topLevelAttrDecls.get(attributeName);
  +        return attributeIndex == null ? -1 : attributeIndex.intValue();
  +    } // getAttributeIndex(String):int
  +
  +
  +    /**
        * getAttributeDecl
        * 
        * @param attributeDeclIndex 
  @@ -499,6 +531,19 @@
           //REVISIT: add code
   
           return attributeDecl;
  +    } // getAttributeDecl
  +
  +    /**
  +     * getAttributeDecl
  +     * 
  +     * @param attributeName 
  +     * @param attributeDecl The values of this structure are set by this call.
  +     * 
  +     * @return REVISIT: previously if failed returned false
  +     */
  +    public XSAttributeDecl getAttributeDecl(String attributeName, XSAttributeDecl attributeDecl) {
  +        int attributeDeclIndex = getAttributeIndex(attributeName);
  +        return getAttributeDecl(attributeDeclIndex, attributeDecl);
       } // getAttributeDecl
   
       /**
  
  
  
  1.6       +1 -9      xml-xerces/java/src/org/apache/xerces/impl/v2/SchemaSymbols.java
  
  Index: SchemaSymbols.java
  ===================================================================
  RCS file: /home/cvs/xml-xerces/java/src/org/apache/xerces/impl/v2/SchemaSymbols.java,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- SchemaSymbols.java	2001/09/05 18:06:31	1.5
  +++ SchemaSymbols.java	2001/09/05 21:16:02	1.6
  @@ -62,7 +62,7 @@
    * Collection of symbols used to parse a Schema Grammar.
    *
    * @author jeffrey rodriguez
  - * @version $Id: SchemaSymbols.java,v 1.5 2001/09/05 18:06:31 neilg Exp $
  + * @version $Id: SchemaSymbols.java,v 1.6 2001/09/05 21:16:02 sandygao Exp $
    */
   public final  class SchemaSymbols {
       // schema namespaces
  @@ -228,14 +228,6 @@
       public static final String ATTVAL_UNSIGNEDSHORT     = "unsignedShort";
       public static final String ATTVAL_YEAR              = "year";
       public static final String ATTVAL_YEARMONTH         = "yearMonth";
  -
  -    // from default value
  -    public static final int FROM_DEFAULT  = 0x40000000;
  -    public static final int REAL_VALUE    = 0x3fffffff;
  -
  -    // boolean true/false
  -    public static final int BOOLEAN_FALSE = 0;
  -    public static final int BOOLEAN_TRUE  = 1;
   
       // block/final values
       public static final int EMPTY_SET    = 0;
  
  
  
  1.4       +36 -11    xml-xerces/java/src/org/apache/xerces/impl/v2/SchemaValidator.java
  
  Index: SchemaValidator.java
  ===================================================================
  RCS file: /home/cvs/xml-xerces/java/src/org/apache/xerces/impl/v2/SchemaValidator.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- SchemaValidator.java	2001/09/04 22:43:17	1.3
  +++ SchemaValidator.java	2001/09/05 21:16:02	1.4
  @@ -62,7 +62,10 @@
   import org.apache.xerces.impl.Constants;
   import org.apache.xerces.impl.XMLErrorReporter;
   import org.apache.xerces.impl.msg.XMLMessageFormatter;
  +import org.apache.xerces.xni.parser.XMLEntityResolver;
  +import org.apache.xerces.xni.parser.XMLInputSource;
   
  +import java.io.IOException;
   import org.apache.xerces.util.SymbolTable;
   import org.apache.xerces.util.XMLChar;
   
  @@ -107,7 +110,7 @@
    * @author Andy Clark, IBM
    * @author Jeffrey Rodriguez IBM
    *
  - * @version $Id: SchemaValidator.java,v 1.3 2001/09/04 22:43:17 sandygao Exp $
  + * @version $Id: SchemaValidator.java,v 1.4 2001/09/05 21:16:02 sandygao Exp $
    */
   public class SchemaValidator
       implements XMLComponent, XMLDocumentHandler {
  @@ -180,7 +183,10 @@
   
       /** Error reporter. */
       protected XMLErrorReporter fErrorReporter;
  -
  +    
  +    /** Entity resolver */
  +    protected XMLEntityResolver fEntityResolver;
  +    
       // handlers
   
       /** Document handler. */
  @@ -391,10 +397,21 @@
           // get needed components
           fErrorReporter = (XMLErrorReporter)componentManager.getProperty(Constants.XERCES_PROPERTY_PREFIX+Constants.ERROR_REPORTER_PROPERTY);
           fSymbolTable = (SymbolTable)componentManager.getProperty(Constants.XERCES_PROPERTY_PREFIX+Constants.SYMBOL_TABLE_PROPERTY);
  +        fEntityResolver = (XMLEntityResolver)componentManager.getProperty(Constants.XERCES_PROPERTY_PREFIX+Constants.ENTITY_RESOLVER_PROPERTY);
  +        if (fEntityResolver == null)
  +            fEntityResolver = new XMLEntityResolver() {
  +                public XMLInputSource resolveEntity(String publicId, String systemId,
  +                                                    String baseSystemId)
  +                    throws XNIException, IOException {
  +                    return new XMLInputSource(null, systemId, baseSystemId);
  +                }
  +            };
   
  +
           fGrammarResolver = new XSGrammarResolver();
  +        fGrammarResolver.putGrammar(SchemaSymbols.URI_SCHEMAFORSCHEMA, SchemaGrammar.SG_SchemaNS);
           fSchemaHandler = new XSDHandler(fGrammarResolver, fErrorReporter,
  -                                        null,//fEntityResolver,
  +                                        fEntityResolver,
                                           fSymbolTable);
           
           fElementDepth = -1;
  @@ -693,14 +710,21 @@
           //???handleEndElement(element, false);
           System.out.println("endElement: " + element.rawname);
           
  -        SchemaGrammar grammar = fGrammarResolver.getGrammar(fTempElementDecl.fTypeNS);
  -        XSType elemType = grammar.getTypeDecl(fTempElementDecl.fTypeIdx);
  -        if (elemType.getXSType() == XSType.SIMPLE_TYPE)
  -            try {
  -                ((DatatypeValidator)elemType).validate(fBuffer.toString(), null);
  -            } catch (InvalidDatatypeValueException e) {
  -                System.out.println("error: " + e.toString());
  +        SchemaGrammar grammar = null;
  +        if (fTempElementDecl.fTypeNS != null)
  +            grammar = fGrammarResolver.getGrammar(fTempElementDecl.fTypeNS);
  +        if (grammar != null) {
  +            XSType elemType = grammar.getTypeDecl(fTempElementDecl.fTypeIdx);
  +            if (elemType.getXSType() == XSType.SIMPLE_TYPE) {
  +                try {
  +                    DatatypeValidator dv = (DatatypeValidator)elemType;
  +                    String content = XSAttributeChecker.normalize(fBuffer.toString(), dv.getWSFacet());
  +                    dv.validate(content, null);
  +                } catch (InvalidDatatypeValueException e) {
  +                    System.out.println("error: " + e.toString());
  +                }
               }
  +       }
           
           if (fDocumentHandler != null) {
               fDocumentHandler.endElement(element);
  @@ -1222,7 +1246,8 @@
           }
           
           fSchemaGrammar = fGrammarResolver.getGrammar(element.uri);
  -        fTempElementDecl = fSchemaGrammar.getElementDecl(element.localpart, fTempElementDecl);
  +        if (fSchemaGrammar != null)
  +            fTempElementDecl = fSchemaGrammar.getElementDecl(element.localpart, fTempElementDecl);
   
           fBuffer.setLength(0);
       }
  
  
  
  1.10      +105 -53   xml-xerces/java/src/org/apache/xerces/impl/v2/XSAttributeChecker.java
  
  Index: XSAttributeChecker.java
  ===================================================================
  RCS file: /home/cvs/xml-xerces/java/src/org/apache/xerces/impl/v2/XSAttributeChecker.java,v
  retrieving revision 1.9
  retrieving revision 1.10
  diff -u -r1.9 -r1.10
  --- XSAttributeChecker.java	2001/09/04 22:43:17	1.9
  +++ XSAttributeChecker.java	2001/09/05 21:16:02	1.10
  @@ -82,13 +82,13 @@
    * is present.
    *
    * Things need revisiting:
  - * - Checking on non-schema namespace attributes
  + * - Whether to return non-schema attributes/values
    * - We need NamespaceScope to generate QName
    * - Do we need to update NamespaceScope and ErrorReporter when reset()?
    * - Should have the datatype validators return compiled value
    * - Should return compiled form for wildcard namespace
    *
  - * @version $Id: XSAttributeChecker.java,v 1.9 2001/09/04 22:43:17 sandygao Exp $
  + * @version $Id: XSAttributeChecker.java,v 1.10 2001/09/05 21:16:02 sandygao Exp $
    */
   
   public class XSAttributeChecker {
  @@ -129,29 +129,15 @@
       public static final int ATTIDX_VERSION         = ATTIDX_COUNT++;
       public static final int ATTIDX_XPATH           = ATTIDX_COUNT++;
       public static final int ATTIDX_FROMDEFAULT     = ATTIDX_COUNT++;
  -    public static final int ATTIDX_OTHERVALUES     = ATTIDX_COUNT++;
  +    //public static final int ATTIDX_OTHERVALUES     = ATTIDX_COUNT++;
  +    public static final int ATTIDX_ISRETURNED      = ATTIDX_COUNT++;
   
       // constants to return
  -    private static Integer[] INTD_CONSTANTS   = {new Integer(0 | SchemaSymbols.FROM_DEFAULT),
  -                                                 new Integer(1 | SchemaSymbols.FROM_DEFAULT),
  -                                                 new Integer(2 | SchemaSymbols.FROM_DEFAULT)};
  -    private static Integer INTD_ONE           = INTD_CONSTANTS[1];
  -    private static Integer INTD_TRUE          = INTD_CONSTANTS[SchemaSymbols.BOOLEAN_TRUE];
  -    private static Integer INTD_FALSE         = INTD_CONSTANTS[SchemaSymbols.BOOLEAN_FALSE];
  -    private static Integer INTD_QUALIFIED     = INTD_CONSTANTS[SchemaSymbols.FORM_QUALIFIED];
  -    private static Integer INTD_UNQUALIFIED   = INTD_CONSTANTS[SchemaSymbols.FORM_UNQUALIFIED];
  -    private static Integer INTD_EMPTY_SET     = INTD_CONSTANTS[SchemaSymbols.EMPTY_SET];
  -    private static Integer INTD_ANY_STRICT    = INTD_CONSTANTS[SchemaSymbols.ANY_STRICT];
  -    private static Integer INTD_USE_OPTIONAL  = INTD_CONSTANTS[SchemaSymbols.USE_OPTIONAL];
  -
  -    // integer values
       private static Integer[] INT_CONSTANTS    = {new Integer(0),
                                                    new Integer(1),
                                                    new Integer(2)};
  -    private static Integer INT_ZERO           = INT_CONSTANTS[1];
  +    private static Integer INT_ZERO           = INT_CONSTANTS[0];
       private static Integer INT_ONE            = INT_CONSTANTS[1];
  -    private static Integer INT_TRUE           = INT_CONSTANTS[SchemaSymbols.BOOLEAN_TRUE];
  -    private static Integer INT_FALSE          = INT_CONSTANTS[SchemaSymbols.BOOLEAN_FALSE];
       private static Integer INT_QUALIFIED      = INT_CONSTANTS[SchemaSymbols.FORM_QUALIFIED];
       private static Integer INT_UNQUALIFIED    = INT_CONSTANTS[SchemaSymbols.FORM_UNQUALIFIED];
       private static Integer INT_EMPTY_SET      = INT_CONSTANTS[SchemaSymbols.EMPTY_SET];
  @@ -164,7 +150,7 @@
       private static Integer INT_WS_PRESERVE    = INT_CONSTANTS[SchemaSymbols.WS_PRESERVE];
       private static Integer INT_WS_REPLACE     = INT_CONSTANTS[SchemaSymbols.WS_REPLACE];
       private static Integer INT_WS_COLLAPSE    = INT_CONSTANTS[SchemaSymbols.WS_COLLAPSE];
  -    private static Integer INT_UNBOUNDED      = INT_CONSTANTS[SchemaSymbols.OCCURRENCE_UNBOUNDED];
  +    private static Integer INT_UNBOUNDED      = new Integer(SchemaSymbols.OCCURRENCE_UNBOUNDED);
   
       // the prefix to distinguish gloval vs. local; name vs. ref
       protected static String PRE_GLOBAL      = "G_";
  @@ -288,11 +274,11 @@
           allAttrs[ATT_ABSTRACT_D]        =   new OneAttr(SchemaSymbols.ATT_ABSTRACT,
                                                           DT_BOOLEAN,
                                                           ATTIDX_ABSTRACT,
  -                                                        INTD_FALSE);
  +                                                        Boolean.FALSE);
           allAttrs[ATT_ATTRIBUTE_FD_D]    =   new OneAttr(SchemaSymbols.ATT_ATTRIBUTEFORMDEFAULT,
                                                           DT_FORM,
                                                           ATTIDX_AFORMDEFAULT,
  -                                                        INTD_UNQUALIFIED);
  +                                                        INT_UNQUALIFIED);
           allAttrs[ATT_BASE_R]            =   new OneAttr(SchemaSymbols.ATT_BASE,
                                                           DT_QNAME,
                                                           ATTIDX_BASE,
  @@ -312,7 +298,7 @@
           allAttrs[ATT_BLOCK_D_D]         =   new OneAttr(SchemaSymbols.ATT_BLOCKDEFAULT,
                                                           DT_BLOCK,
                                                           ATTIDX_BLOCKDEFAULT,
  -                                                        INTD_EMPTY_SET);
  +                                                        INT_EMPTY_SET);
           allAttrs[ATT_DEFAULT_N]         =   new OneAttr(SchemaSymbols.ATT_DEFAULT,
                                                           DT_STRING,
                                                           ATTIDX_DEFAULT,
  @@ -320,7 +306,7 @@
           allAttrs[ATT_ELEMENT_FD_D]      =   new OneAttr(SchemaSymbols.ATT_ELEMENTFORMDEFAULT,
                                                           DT_FORM,
                                                           ATTIDX_EFORMDEFAULT,
  -                                                        INTD_UNQUALIFIED);
  +                                                        INT_UNQUALIFIED);
           allAttrs[ATT_FINAL_N]           =   new OneAttr(SchemaSymbols.ATT_FINAL,
                                                           DT_FINAL,
                                                           ATTIDX_FINAL,
  @@ -332,7 +318,7 @@
           allAttrs[ATT_FINAL_D_D]         =   new OneAttr(SchemaSymbols.ATT_FINALDEFAULT,
                                                           DT_FINAL,
                                                           ATTIDX_FINALDEFAULT,
  -                                                        INTD_EMPTY_SET);
  +                                                        INT_EMPTY_SET);
           allAttrs[ATT_FIXED_N]           =   new OneAttr(SchemaSymbols.ATT_FIXED,
                                                           DT_STRING,
                                                           ATTIDX_FIXED,
  @@ -340,7 +326,7 @@
           allAttrs[ATT_FIXED_D]           =   new OneAttr(SchemaSymbols.ATT_FIXED,
                                                           DT_BOOLEAN,
                                                           ATTIDX_FIXED,
  -                                                        INTD_FALSE);
  +                                                        Boolean.FALSE);
           allAttrs[ATT_FORM_N]            =   new OneAttr(SchemaSymbols.ATT_FORM,
                                                           DT_FORM,
                                                           ATTIDX_FORM,
  @@ -356,11 +342,11 @@
           allAttrs[ATT_MAXOCCURS_D]       =   new OneAttr(SchemaSymbols.ATT_MAXOCCURS,
                                                           DT_MAXOCCURS,
                                                           ATTIDX_MAXOCCURS,
  -                                                        INTD_ONE);
  +                                                        INT_ONE);
           allAttrs[ATT_MAXOCCURS1_D]      =   new OneAttr(SchemaSymbols.ATT_MAXOCCURS,
                                                           DT_MAXOCCURS1,
                                                           ATTIDX_MAXOCCURS,
  -                                                        INTD_ONE);
  +                                                        INT_ONE);
           allAttrs[ATT_MEMBER_T_N]        =   new OneAttr(SchemaSymbols.ATT_MEMBERTYPES,
                                                           DT_MEMBERTYPES,
                                                           ATTIDX_MEMBERTYPES,
  @@ -368,15 +354,15 @@
           allAttrs[ATT_MINOCCURS_D]       =   new OneAttr(SchemaSymbols.ATT_MINOCCURS,
                                                           DT_NONNEGINT,
                                                           ATTIDX_MINOCCURS,
  -                                                        INTD_ONE);
  +                                                        INT_ONE);
           allAttrs[ATT_MINOCCURS1_D]      =   new OneAttr(SchemaSymbols.ATT_MINOCCURS,
                                                           DT_MINOCCURS1,
                                                           ATTIDX_MINOCCURS,
  -                                                        INTD_ONE);
  +                                                        INT_ONE);
           allAttrs[ATT_MIXED_D]           =   new OneAttr(SchemaSymbols.ATT_MIXED,
                                                           DT_BOOLEAN,
                                                           ATTIDX_MIXED,
  -                                                        INTD_FALSE);
  +                                                        Boolean.FALSE);
           allAttrs[ATT_MIXED_N]           =   new OneAttr(SchemaSymbols.ATT_MIXED,
                                                           DT_BOOLEAN,
                                                           ATTIDX_MIXED,
  @@ -396,11 +382,11 @@
           allAttrs[ATT_NILLABLE_D]        =   new OneAttr(SchemaSymbols.ATT_NILLABLE,
                                                           DT_BOOLEAN,
                                                           ATTIDX_NILLABLE,
  -                                                        INTD_FALSE);
  +                                                        Boolean.FALSE);
           allAttrs[ATT_PROCESS_C_D]       =   new OneAttr(SchemaSymbols.ATT_PROCESSCONTENTS,
                                                           DT_PROCESSCONTENTS,
                                                           ATTIDX_PROCESSCONTENTS,
  -                                                        INTD_ANY_STRICT);
  +                                                        INT_ANY_STRICT);
           allAttrs[ATT_PUBLIC_R]          =   new OneAttr(SchemaSymbols.ATT_PUBLIC,
                                                           DT_PUBLIC,
                                                           ATTIDX_PUBLIC,
  @@ -444,7 +430,7 @@
           allAttrs[ATT_USE_D]             =   new OneAttr(SchemaSymbols.ATT_USE,
                                                           DT_USE,
                                                           ATTIDX_USE,
  -                                                        INTD_USE_OPTIONAL);
  +                                                        INT_USE_OPTIONAL);
           allAttrs[ATT_VALUE_NNI_N]       =   new OneAttr(SchemaSymbols.ATT_VALUE,
                                                           DT_NONNEGINT,
                                                           ATTIDX_VALUE,
  @@ -988,11 +974,15 @@
           fNonSchemaAttrs.clear();
       }
   
  -    // check whether the specified element conforms to the attributes restriction
  -    // @param: element    - which element to check
  -    // @param: isGlobal   - whether a child of <schema> or <redefine>
  -    // @return: Hashtable - list of attributes and values
  -    //public Hashtable checkAttributes(Element element, boolean isGlobal) {
  +    /**
  +     * check whether the specified element conforms to the attributes restriction
  +     * an array of attribute values is returned. the caller must call
  +     * <code>returnAttrArray</code> to return that array.
  +     * 
  +     * @param: element    - which element to check
  +     * @param: isGlobal   - whether a child of <schema> or <redefine>
  +     * @return: Hashtable - list of attributes and values
  +     */
       public Object[] checkAttributes(Element element, boolean isGlobal) {
           if (element == null)
               return null;
  @@ -1027,8 +1017,8 @@
           }
   
           //Hashtable attrValues = new Hashtable();
  -        Object[] attrValues = new Object[ATTIDX_COUNT];
  -        Hashtable otherValues = new Hashtable();
  +        Object[] attrValues = getAvailableArray();
  +        //Hashtable otherValues = new Hashtable();
           long fromDefault = 0;
           Hashtable attrList = oneEle.attrList;
   
  @@ -1038,14 +1028,15 @@
           for (int i = 0; i < attrs.length; i++) {
               sattr = attrs[i++];
               // get the attribute name/value
  -            String attrName = DOMUtil.getLocalName(sattr);
  +            //String attrName = DOMUtil.getLocalName(sattr);
  +            String attrName = sattr.getName();
               String attrVal = DOMUtil.getValue(sattr);
   
               // skip anything starts with x/X m/M l/L
               // simply put their values in the return hashtable
               if (attrName.toLowerCase().startsWith("xml")) {
                   //attrValues.put(attrName, attrVal);
  -                otherValues.put(attrName, attrVal);
  +                //otherValues.put(attrName, attrVal);
                   continue;
               }
   
  @@ -1064,7 +1055,7 @@
                       // for attributes from other namespace
                       // store them in a list, and TRY to validate them after
                       // schema traversal (because it's "lax")
  -                    otherValues.put(attrName, attrVal);
  +                    //otherValues.put(attrName, attrVal);
                       String attrRName = attrURI + "," + attrName;
                       Vector values = (Vector)fNonSchemaAttrs.get(attrRName);
                       if (values == null) {
  @@ -1115,7 +1106,7 @@
                       case DT_BOOLEAN:
                           retValue = attrVal.equals(SchemaSymbols.ATTVAL_TRUE) ||
                                      attrVal.equals(SchemaSymbols.ATTVAL_TRUE_1) ?
  -                                   INT_TRUE : INT_FALSE;
  +                                   Boolean.TRUE : Boolean.FALSE;
                           break;
                       case DT_NONNEGINT:
                           retValue = new Integer(attrVal);
  @@ -1154,7 +1145,7 @@
               // if the attribute didn't apprear, and
               // if the attribute is optional with default value, apply it
               if (oneAttr.dfltValue != null &&
  -                DOMUtil.getAttr(element, oneAttr.name) != null) {
  +                DOMUtil.getAttr(element, oneAttr.name) == null) {
                   //attrValues.put(oneAttr.name, oneAttr.dfltValue);
                   attrValues[oneAttr.valueIndex] = oneAttr.dfltValue;
                   fromDefault |= (1<<oneAttr.valueIndex);
  @@ -1162,7 +1153,7 @@
           }
   
           attrValues[ATTIDX_FROMDEFAULT] = new Long(fromDefault);
  -        attrValues[ATTIDX_OTHERVALUES] = otherValues;
  +        //attrValues[ATTIDX_OTHERVALUES] = otherValues;
   
           return attrValues;
       }
  @@ -1397,11 +1388,11 @@
           }
       }
   
  -    // REVISIT: enable it later.
       // validate attriubtes from non-schema namespaces
  -    /*public void checkNonSchemaAttributes(XSGrammarResolver grammarResolver) throws Exception {
  +    public void checkNonSchemaAttributes(XSGrammarResolver grammarResolver) throws Exception {
           // for all attributes
           Enumeration enum = fNonSchemaAttrs.keys();
  +        XSAttributeDecl tempAttrDecl = new XSAttributeDecl();
           while (enum.hasMoreElements()) {
               // get name, uri, localpart
               String attrRName = (String)enum.nextElement();
  @@ -1412,10 +1403,13 @@
               if (sGrammar == null)
                   continue;
               // and get the datatype validator, if there is one
  -            XSAttributeDecl tempAttrDecl = sGrammar.getGlobalAttrDecl(attrLocal);
  +            tempAttrDecl = sGrammar.getAttributeDecl(attrLocal, tempAttrDecl);
               if (tempAttrDecl == null)
  +                continue;
  +            sGrammar = grammarResolver.getGrammar(tempAttrDecl.fTypeNS);
  +            if (sGrammar == null)
                   continue;
  -            DatatypeValidator dv = tempAttrDecl.datatypeValidator;
  +            DatatypeValidator dv = (DatatypeValidator)sGrammar.getTypeDecl(tempAttrDecl.fType);
               if (dv == null)
                   continue;
   
  @@ -1438,10 +1432,11 @@
                   }
               }
           }
  -    }*/
  +    }
   
       // normalize the string according to the whiteSpace facet
  -    private String normalize(String content, short ws) {
  +    // REVISIT: should move this to a util class/method
  +    public static String normalize(String content, short ws) {
           int len = content == null ? 0 : content.length();
           if (len == 0 || ws == DatatypeValidator.PRESERVE)
               return content;
  @@ -1497,7 +1492,64 @@
               localpart = attrVal.substring(colonptr+1);
           }
           String uri = fSchemaHandler.resolvePrefixToURI(prefix);
  +        //REVISIT: how to resolve prefix to uri
  +        uri = SchemaSymbols.URI_SCHEMAFORSCHEMA;
           return new QName(prefix, localpart, attrVal, uri);
  +    }
  +
  +    // the following part implements an attribute-value-array pool.
  +    // when checkAttribute is called, it calls getAvailableArray to get
  +    // an array from the pool; when the caller is done with the array,
  +    // it calls returnAttrArray to return that array to the pool.
  +    
  +    // initial size of the array pool. 10 is big enough
  +    static final int INIT_POOL_SIZE = 10;
  +    // the incremental size of the array pool
  +    static final int INC_POOL_SIZE  = 10;
  +    // the array pool
  +    Object[][] fArrayPool = new Object[INIT_POOL_SIZE][ATTIDX_COUNT];
  +    // current position of the array pool (# of arrays not returned)
  +    int fPoolPos = 0;
  +    
  +    // get the next available array
  +    protected Object[] getAvailableArray() {
  +        // if no array left in the pool, increase the pool size
  +        if (fArrayPool.length == fPoolPos) {
  +            // increase size
  +            fArrayPool = new Object[fPoolPos+INC_POOL_SIZE][];
  +            // initialize each *new* array
  +            for (int i = fPoolPos; i < fArrayPool.length; i++)
  +                fArrayPool[i] = new Object[ATTIDX_COUNT];
  +        }
  +        // get the next available one
  +        Object[] retArray = fArrayPool[fPoolPos];
  +        // clear it from the pool. this is for GC: if a caller forget to
  +        // return the array, we want that array to be GCed.
  +        fArrayPool[fPoolPos++] = null;
  +        // to make sure that one array is not returned twice, we use
  +        // the last entry to indicate whether an array is already returned
  +        // now set it to false.
  +        retArray[ATTIDX_ISRETURNED] = Boolean.FALSE;
  +        
  +        return retArray;
  +    }
  +    
  +    // return an array back to the pool
  +    public void returnAttrArray (Object[] attrArray) {
  +        // if 1. the pool is full; 2. the array is null;
  +        // 3. the array is of wrong size; 4. the array is already returned
  +        // then we can't accept this array to be returned
  +        if (fPoolPos == 0 ||
  +            attrArray == null ||
  +            attrArray.length != ATTIDX_COUNT ||
  +            ((Boolean)attrArray[ATTIDX_ISRETURNED]).booleanValue()) {
  +            return;
  +        }
  +        
  +        // mark this array as returned
  +        attrArray[ATTIDX_ISRETURNED] = Boolean.TRUE;
  +        // and put it into the pool
  +        fArrayPool[--fPoolPos] = attrArray;
       }
   }
   
  
  
  
  1.10      +6 -8      xml-xerces/java/src/org/apache/xerces/impl/v2/XSDAbstractTraverser.java
  
  Index: XSDAbstractTraverser.java
  ===================================================================
  RCS file: /home/cvs/xml-xerces/java/src/org/apache/xerces/impl/v2/XSDAbstractTraverser.java,v
  retrieving revision 1.9
  retrieving revision 1.10
  diff -u -r1.9 -r1.10
  --- XSDAbstractTraverser.java	2001/09/04 22:43:17	1.9
  +++ XSDAbstractTraverser.java	2001/09/05 21:16:02	1.10
  @@ -68,7 +68,7 @@
    * other <code>XSD???Traverser</code>s. It holds the common data and provide
    * a unified way to initialize these data.
    *
  - * @version $Id: XSDAbstractTraverser.java,v 1.9 2001/09/04 22:43:17 sandygao Exp $
  + * @version $Id: XSDAbstractTraverser.java,v 1.10 2001/09/05 21:16:02 sandygao Exp $
    */
   abstract class XSDAbstractTraverser {
   
  @@ -78,8 +78,6 @@
       protected XSAttributeChecker    fAttrChecker = null;
       protected XMLErrorReporter      fErrorReporter = null;
   
  -    //REVISIT: should we add global fSchemaGrammar field
  -
       XSDAbstractTraverser (XSDHandler handler,
                             XMLErrorReporter errorReporter,
                             XSAttributeChecker attrChecker) {        
  @@ -100,11 +98,10 @@
   
       // traver the annotation declaration
       // REVISIT: store annotation information for PSVI
  -    int traverseAnnotationDecl(Element annotationDecl, Object[] parentAttrs) {
  +    int traverseAnnotationDecl(Element annotationDecl, Object[] parentAttrs, boolean isGlobal) {
           // General Attribute Checking
  -        // There is no difference between global or local annotation,
  -        // so we assume it's always global.
  -        Object[] attrValues = fAttrChecker.checkAttributes(annotationDecl, true);
  +        Object[] attrValues = fAttrChecker.checkAttributes(annotationDecl, isGlobal);
  +        fAttrChecker.returnAttrArray(attrValues);
   
           for(Element child = DOMUtil.getFirstChildElement(annotationDecl);
               child != null;
  @@ -122,6 +119,7 @@
               // There is no difference between global or local appinfo/documentation,
               // so we assume it's always global.
               attrValues = fAttrChecker.checkAttributes(child, true);
  +            fAttrChecker.returnAttrArray(attrValues);
           }
   
           // REVISIT: an annotation index should be returned when we support PSVI
  @@ -147,6 +145,6 @@
       //         should call traverseAnnotationDecl() directly, and store the
       //         returned value.
       Element checkContent( Element elm, Element content, boolean isEmpty ) {
  -        return null;
  +        return content;
       }
   }
  
  
  
  1.6       +10 -8     xml-xerces/java/src/org/apache/xerces/impl/v2/XSDElementTraverser.java
  
  Index: XSDElementTraverser.java
  ===================================================================
  RCS file: /home/cvs/xml-xerces/java/src/org/apache/xerces/impl/v2/XSDElementTraverser.java,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- XSDElementTraverser.java	2001/09/04 22:43:17	1.5
  +++ XSDElementTraverser.java	2001/09/05 21:16:02	1.6
  @@ -84,7 +84,7 @@
    *   Content: (annotation?, ((simpleType | complexType)?, (unique | key | keyref)*))
    * </element>
    *
  - * @version $Id: XSDElementTraverser.java,v 1.5 2001/09/04 22:43:17 sandygao Exp $
  + * @version $Id: XSDElementTraverser.java,v 1.6 2001/09/05 21:16:02 sandygao Exp $
    */
   class XSDElementTraverser extends XSDAbstractTraverser{
   
  @@ -159,8 +159,10 @@
   
           // General Attribute Checking
           Object[] attrValues = fAttrChecker.checkAttributes(elmDecl, true);
  +        int elemIdx = traverseNamedElement(elmDecl, attrValues, schemaDoc, grammar, true);
  +        fAttrChecker.returnAttrArray(attrValues);
   
  -        return traverseNamedElement(elmDecl, attrValues, schemaDoc, grammar, true);
  +        return elemIdx;
       }
   
       /**
  @@ -179,14 +181,14 @@
                                SchemaGrammar grammar,
                                boolean isGlobal) {
   
  -        Integer abstractAtt  = (Integer) attrValues[XSAttributeChecker.ATTIDX_ABSTRACT];
  +        Boolean abstractAtt  = (Boolean) attrValues[XSAttributeChecker.ATTIDX_ABSTRACT];
           Integer blockAtt     = (Integer) attrValues[XSAttributeChecker.ATTIDX_BLOCK];
           String  defaultAtt   = (String)  attrValues[XSAttributeChecker.ATTIDX_DEFAULT];
           Integer finalAtt     = (Integer) attrValues[XSAttributeChecker.ATTIDX_FINAL];
           String  fixedAtt     = (String)  attrValues[XSAttributeChecker.ATTIDX_FIXED];
           Integer formAtt      = (Integer) attrValues[XSAttributeChecker.ATTIDX_FORM];
           String  nameAtt      = (String)  attrValues[XSAttributeChecker.ATTIDX_NAME];
  -        Integer nillableAtt  = (Integer) attrValues[XSAttributeChecker.ATTIDX_NILLABLE];
  +        Boolean nillableAtt  = (Boolean) attrValues[XSAttributeChecker.ATTIDX_NILLABLE];
           QName   refAtt       = (QName)   attrValues[XSAttributeChecker.ATTIDX_REF];
           QName   subGroupAtt  = (QName)   attrValues[XSAttributeChecker.ATTIDX_SUBSGROUP];
           QName   typeAtt      = (QName)   attrValues[XSAttributeChecker.ATTIDX_TYPE];
  @@ -211,9 +213,9 @@
           short blockSet = blockAtt == null ? SchemaSymbols.EMPTY_SET : blockAtt.shortValue();
           short finalSet = finalAtt == null ? SchemaSymbols.EMPTY_SET : finalAtt.shortValue();
           short elementMiscFlags = 0;
  -        if ((nillableAtt.intValue() & SchemaSymbols.REAL_VALUE) == SchemaSymbols.BOOLEAN_TRUE)
  +        if (nillableAtt.booleanValue())
               elementMiscFlags |= XSElementDecl.NILLABLE;
  -        if ((abstractAtt.intValue() & SchemaSymbols.REAL_VALUE) == SchemaSymbols.BOOLEAN_TRUE)
  +        if (abstractAtt.booleanValue())
               elementMiscFlags |= XSElementDecl.ABSTRACT;
           // make the property of the element's value being fixed also appear in elementMiscFlags
           if (fixedAtt != null)
  @@ -223,7 +225,7 @@
           Element child = DOMUtil.getFirstChildElement(elmDecl);
   
           if(child != null && DOMUtil.getLocalName(child).equals(SchemaSymbols.ELT_ANNOTATION)) {
  -			traverseAnnotationDecl(child, attrValues);
  +			traverseAnnotationDecl(child, attrValues, false);
               child = DOMUtil.getNextSiblingElement(child);
   		}
           if(child != null && DOMUtil.getLocalName(child).equals(SchemaSymbols.ELT_ANNOTATION))
  @@ -462,7 +464,7 @@
               namespace = schemaDoc.fTargetNamespace;
           }
           else if (formAtt != null) {
  -            if ((formAtt.intValue() & SchemaSymbols.REAL_VALUE) == SchemaSymbols.FORM_QUALIFIED)
  +            if (formAtt.intValue() == SchemaSymbols.FORM_QUALIFIED)
                   namespace = schemaDoc.fTargetNamespace;
           } else if (schemaDoc.fAreLocalElementsQualified) {
               namespace = schemaDoc.fTargetNamespace;
  
  
  
  1.15      +57 -14    xml-xerces/java/src/org/apache/xerces/impl/v2/XSDHandler.java
  
  Index: XSDHandler.java
  ===================================================================
  RCS file: /home/cvs/xml-xerces/java/src/org/apache/xerces/impl/v2/XSDHandler.java,v
  retrieving revision 1.14
  retrieving revision 1.15
  diff -u -r1.14 -r1.15
  --- XSDHandler.java	2001/09/05 18:06:31	1.14
  +++ XSDHandler.java	2001/09/05 21:16:02	1.15
  @@ -89,7 +89,7 @@
    * schema, other grammars may be constructed as a side-effect.
    *
    * @author Neil Graham, IBM
  - * @version $Id: XSDHandler.java,v 1.14 2001/09/05 18:06:31 neilg Exp $
  + * @version $Id: XSDHandler.java,v 1.15 2001/09/05 21:16:02 sandygao Exp $
    */
   
   class XSDHandler {
  @@ -185,9 +185,6 @@
       // the GrammarResolver
       private XSGrammarResolver fGrammarResolver;
   
  -    // REVISIT:  old kind of DatatypeValidator...
  -    private DatatypeValidatorFactoryImpl fDatatypeRegistry = null;
  -
       //************ Traversers **********
       XSDAttributeGroupTraverser fAttributeGroupTraverser;
       XSDAttributeTraverser fAttributeTraverser;
  @@ -211,10 +208,6 @@
           fErrorReporter = errorReporter;
           fGrammarResolver = gResolver;
           fSymbolTable = symbolTable;
  -        //REVISIT: get schema grammar instead of validator factory
  -        //SchemaGrammar fGrammar4Schema = fGrammarResolver.getGrammar(SchemaSymbols.URI_SCHEMAFORSCHEMA);
  -        fDatatypeRegistry = new DatatypeValidatorFactoryImpl();
  -        fDatatypeRegistry.expandRegistryToFullSchemaSet();
           createTraversers();
       } // end constructor
   
  @@ -227,6 +220,9 @@
       SchemaGrammar parseSchema(String schemaNamespace,
                                 String schemaHint) {
   
  +        // reset all traversers and SchemaHandler
  +        reset();
  +
           // first phase:  construct trees.
           Document schemaRoot = getSchema(schemaNamespace, schemaHint);
           fRoot = constructTrees(schemaRoot);
  @@ -248,8 +244,12 @@
           // fifth phase:  handle derivation constraint checking
           // and UPA
   
  -        // reset all traversers and SchemaHandler
  -        reset();
  +        //revisit: just for testing
  +        SchemaGrammar sg = new SchemaGrammar(fSymbolTable);
  +        fGrammarResolver.putGrammar("http://www.ara.com/base", sg);
  +        Element root = (Element)DOMUtil.getRoot(schemaRoot);
  +        Element child = DOMUtil.getFirstChildElement(root);
  +        fElementTraverser.traverseGlobal(child, fRoot, sg);
   
           // and return.
           return fGrammarResolver.getGrammar(fRoot.fTargetNamespace);
  @@ -272,6 +272,21 @@
                                           XSDocumentInfo(schemaRoot);
           Vector dependencies = new Vector();
           Element rootNode = DOMUtil.getRoot(schemaRoot);
  +        
  +        Object[] schemaAttrs = fAttributeChecker.checkAttributes(rootNode, true);
  +        currSchemaInfo.fAreLocalAttributesQualified =
  +            ((Integer)schemaAttrs[XSAttributeChecker.ATTIDX_AFORMDEFAULT]).intValue() == SchemaSymbols.FORM_QUALIFIED;
  +        currSchemaInfo.fAreLocalElementsQualified =
  +            ((Integer)schemaAttrs[XSAttributeChecker.ATTIDX_EFORMDEFAULT]).intValue() == SchemaSymbols.FORM_QUALIFIED;
  +        currSchemaInfo.fBlockDefault =
  +            ((Integer)schemaAttrs[XSAttributeChecker.ATTIDX_BLOCKDEFAULT]).intValue();
  +        currSchemaInfo.fFinalDefault =
  +            ((Integer)schemaAttrs[XSAttributeChecker.ATTIDX_FINALDEFAULT]).intValue();
  +        currSchemaInfo.fTargetNamespace =
  +            (String)schemaAttrs[XSAttributeChecker.ATTIDX_TARGETNAMESPACE];
  +        if (currSchemaInfo.fTargetNamespace == null)
  +            currSchemaInfo.fTargetNamespace = EMPTY_STRING;
  +            
           String schemaNamespace=EMPTY_STRING;
           String schemaHint=null;
           Document newSchemaRoot = null;
  @@ -474,6 +489,10 @@
       protected int getComponentDecl(XSDocumentInfo currSchema,
                                      int declType,
                                      QName declToTraverse) {
  +        if (declToTraverse.uri == SchemaSymbols.URI_SCHEMAFORSCHEMA) {
  +            return SchemaGrammar.SG_SchemaNS.getTypeIndex(declToTraverse.localpart);
  +        }
  +        
           String declKey = null;
           if (declToTraverse.uri != null) {
               declKey = declToTraverse.uri+","+declToTraverse.localpart;
  @@ -537,6 +556,25 @@
       } // getComponentDecl(XSDocumentInfo, int, QName):  int
   
       protected Object getDecl(String namespace, int declType, int declIndex) {
  +        SchemaGrammar sGrammar = fGrammarResolver.getGrammar(namespace);
  +        if (sGrammar == null)
  +            return null;
  +        switch (declType) {
  +        case ATTRIBUTE_TYPE :
  +            return null;
  +        case ATTRIBUTEGROUP_TYPE :
  +            return null;
  +        case ELEMENT_TYPE :
  +            return null;
  +        case GROUP_TYPE :
  +            return null;
  +        case IDENTITYCONSTRAINT_TYPE :
  +            return null;
  +        case NOTATION_TYPE :
  +            return null;
  +        case TYPEDECL_TYPE :
  +            return sGrammar.getTypeDecl(declIndex);
  +        }
           return null;
       } // end getDecl
   
  @@ -557,13 +595,18 @@
           // contents of this method will depend on the system we adopt for entity resolution--i.e., XMLEntityHandler, EntityHandler, etc.
           XMLInputSource schemaSource=null;
           try {
  -            schemaSource = fEntityResolver.resolveEntity(schemaNamespace, schemaHint, null);
  +            schemaSource = fEntityResolver.resolveEntity("", schemaHint, null);
               if (schemaSource != null) {
                   DOMParser schemaParser = new DOMParser(fSymbolTable);
                   // set ErrorHandler and EntityResolver (doesn't seem that
                   // XMLErrorHandler or XMLEntityResolver will work with
                   // standard DOMParser...
  -
  +                //REVISIT: shouldn't we reuse the same domparser, instead of
  +                //create a new one for each document?
  +                //REVISIT: disable deferred dom expansion. there are bugs.
  +                try {
  +                    schemaParser.setFeature("http://apache.org/xml/features/dom/defer-node-expansion", false);
  +                } catch (Exception e) {}
                   // set appropriate features
                   schemaParser.parse(schemaSource);
                   return schemaParser.getDocument();
  @@ -572,6 +615,7 @@
           }
           catch (IOException ex) {
               // REVISIT: report an error!
  +            ex.printStackTrace();
           }
   
           return null;
  @@ -580,6 +624,7 @@
       // initialize all the traversers.
       // this should only need to be called once during the construction
       // of this object; it creates the traversers that will be used to
  +
       // construct schemaGrammars.
       private void createTraversers() {
           fAttributeChecker = new XSAttributeChecker(this, fErrorReporter);
  @@ -616,8 +661,6 @@
           fDependencyMap.clear();
           fTraversed.removeAllElements();
           fRoot = null;
  -
  -        fDatatypeRegistry = null;
   
           // reset traversers
           fAttributeChecker.reset();
  
  
  
  1.9       +15 -6     xml-xerces/java/src/org/apache/xerces/impl/v2/XSDSimpleTypeTraverser.java
  
  Index: XSDSimpleTypeTraverser.java
  ===================================================================
  RCS file: /home/cvs/xml-xerces/java/src/org/apache/xerces/impl/v2/XSDSimpleTypeTraverser.java,v
  retrieving revision 1.8
  retrieving revision 1.9
  diff -u -r1.8 -r1.9
  --- XSDSimpleTypeTraverser.java	2001/09/04 22:43:17	1.8
  +++ XSDSimpleTypeTraverser.java	2001/09/05 21:16:02	1.9
  @@ -107,7 +107,7 @@
    * 
    * @author Elena Litani
    * @author IBM
  - * @version $Id: XSDSimpleTypeTraverser.java,v 1.8 2001/09/04 22:43:17 sandygao Exp $
  + * @version $Id: XSDSimpleTypeTraverser.java,v 1.9 2001/09/05 21:16:02 sandygao Exp $
    */
   class XSDSimpleTypeTraverser extends XSDAbstractTraverser {
   
  @@ -141,6 +141,8 @@
           int typeIndex = traverseSimpleTypeDecl (elmNode, attrValues);
           if (nameAtt != null)
               fSimpleTypeNameStack.pop();
  +        fAttrChecker.returnAttrArray(attrValues);
  +
           return typeIndex;
       }
   
  @@ -149,9 +151,12 @@
                    SchemaGrammar grammar) {
           fSchemaDoc = schemaDoc;
           fGrammar = grammar;
  -        Object[] attrValues = fAttrChecker.checkAttributes(elmNode, true);
  +        
  +        Object[] attrValues = fAttrChecker.checkAttributes(elmNode, false);
  +        int typeIndex = traverseSimpleTypeDecl (elmNode, attrValues);
  +        fAttrChecker.returnAttrArray(attrValues);
   
  -        return traverseSimpleTypeDecl (elmNode, attrValues);
  +        return typeIndex;
       }
   
       private int traverseSimpleTypeDecl(Element simpleTypeDecl, Object[] attrValues) {
  @@ -214,6 +219,8 @@
   
           // General Attribute Checking
           Object[] contentAttrs = fAttrChecker.checkAttributes(content, false);
  +        // REVISIT: when to return the array
  +        fAttrChecker.returnAttrArray(contentAttrs);
   
           //----------------------------------------------------------------------
           //use content.getLocalName for the cases there "xsd:" is a prefix, ei. "xsd:list"
  @@ -248,7 +255,7 @@
               union = true;
               memberTypes = (Vector)contentAttrs[XSAttributeChecker.ATTIDX_MEMBERTYPES];
               //content.getAttribute( SchemaSymbols.ATT_MEMBERTYPES);
  -            if (memberTypes != null && memberTypes.size() > 0) {
  +            if (memberTypes != null) {
                   size = memberTypes.size();
               }
               else {
  @@ -269,7 +276,7 @@
   
           DatatypeValidator baseValidator = null;
           int simpleTypeIndex = -1;
  -        if (memberTypes == null || memberTypes.size() == 0) {
  +        if (baseTypeQNameProperty == null && memberTypes == null) {
               //---------------------------
               //must 'see' <simpleType>
               //---------------------------
  @@ -424,6 +431,8 @@
                   if (content.getNodeType() == Node.ELEMENT_NODE) {
                       // General Attribute Checking
                       Object[] attrs = fAttrChecker.checkAttributes(content, false);
  +                    // REVISIT: when to return the array
  +                    fAttrChecker.returnAttrArray(attrs);
                       numFacets++;
                       facet = DOMUtil.getLocalName(content);
                       if (facet.equals(SchemaSymbols.ELT_ENUMERATION)) {
  @@ -537,7 +546,7 @@
               if (flags != 0) {
                   fFacetData.put(DatatypeValidator.FACET_FIXED, new Short(flags));
               }
  -            fPattern.setLength(0);
  +            fPattern = null;
           }
           else if (list && content!=null) {
               // report error - must not have any children!
  
  
  
  1.2       +6 -6      xml-xerces/java/src/org/apache/xerces/impl/v2/XSType.java
  
  Index: XSType.java
  ===================================================================
  RCS file: /home/cvs/xml-xerces/java/src/org/apache/xerces/impl/v2/XSType.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- XSType.java	2001/08/24 23:10:57	1.1
  +++ XSType.java	2001/09/05 21:16:02	1.2
  @@ -60,15 +60,15 @@
   
   /**
    * The base type interface for XML Schema types.
  - * @version $Id: XSType.java,v 1.1 2001/08/24 23:10:57 elena Exp $
  + * @version $Id: XSType.java,v 1.2 2001/09/05 21:16:02 sandygao Exp $
    */
   public interface XSType {
   
  -   public static final short COMPLEX_TYPE   = 0;
  -   public static final short SIMPLE_TYPE    = 1;
  -   public static final short ANY_TYPE       = 2;
  -   public static final short ANYSIMPLE_TYPE = 3;
  -   public static final short DATATYPE_TYPE  = 4;
  +   public static final short COMPLEX_TYPE   = 1;
  +   public static final short SIMPLE_TYPE    = 2;
  +   public static final short UR_TYPE        = 4;
  +   public static final short ANY_TYPE       = UR_TYPE | COMPLEX_TYPE;
  +   public static final short ANYSIMPLE_TYPE = UR_TYPE | SIMPLE_TYPE;
   
      public short getXSType();
     
  
  
  
  1.4       +2 -2      xml-xerces/java/src/org/apache/xerces/impl/v2/datatypes/AbstractDatatypeValidator.java
  
  Index: AbstractDatatypeValidator.java
  ===================================================================
  RCS file: /home/cvs/xml-xerces/java/src/org/apache/xerces/impl/v2/datatypes/AbstractDatatypeValidator.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- AbstractDatatypeValidator.java	2001/09/04 22:43:18	1.3
  +++ AbstractDatatypeValidator.java	2001/09/05 21:16:03	1.4
  @@ -57,7 +57,7 @@
   
   
   /**
  - * @version $Id: AbstractDatatypeValidator.java,v 1.3 2001/09/04 22:43:18 sandygao Exp $
  + * @version $Id: AbstractDatatypeValidator.java,v 1.4 2001/09/05 21:16:03 sandygao Exp $
    * @author  Elena Litani
    * @author  Jeffrey Rodriguez
   */
  @@ -132,7 +132,7 @@
           fLocale = locale;
       }
       public short getXSType (){
  -        return XSType.DATATYPE_TYPE;
  +        return XSType.SIMPLE_TYPE;
       }
   
       protected int fFinalSet = 0;
  
  
  
  1.4       +2 -2      xml-xerces/java/src/org/apache/xerces/impl/v2/datatypes/AbstractStringValidator.java
  
  Index: AbstractStringValidator.java
  ===================================================================
  RCS file: /home/cvs/xml-xerces/java/src/org/apache/xerces/impl/v2/datatypes/AbstractStringValidator.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- AbstractStringValidator.java	2001/08/24 23:10:58	1.3
  +++ AbstractStringValidator.java	2001/09/05 21:16:03	1.4
  @@ -71,7 +71,7 @@
    * hexBinary, base64Binary, QName and Notation datatypes.
    *
    * @author Elena Litani
  - * @version $Id: AbstractStringValidator.java,v 1.3 2001/08/24 23:10:58 elena Exp $
  + * @version $Id: AbstractStringValidator.java,v 1.4 2001/09/05 21:16:03 sandygao Exp $
    */
   public abstract class AbstractStringValidator extends AbstractDatatypeValidator {
   
  @@ -373,7 +373,7 @@
       private void checkContent( String content, Object state, boolean asBase )
       throws InvalidDatatypeValueException {
           // validate against parent type if any
  -        if ( this.fBaseValidator != null ) {
  +        if ( fBaseValidator instanceof AbstractStringValidator ) {
               // validate content as a base type
               ((AbstractStringValidator)fBaseValidator).checkContent(content, state, true);
           }
  
  
  
  1.3       +4 -4      xml-xerces/java/src/org/apache/xerces/impl/v2/datatypes/IDDatatypeValidator.java
  
  Index: IDDatatypeValidator.java
  ===================================================================
  RCS file: /home/cvs/xml-xerces/java/src/org/apache/xerces/impl/v2/datatypes/IDDatatypeValidator.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- IDDatatypeValidator.java	2001/09/05 18:06:31	1.2
  +++ IDDatatypeValidator.java	2001/09/05 21:16:03	1.3
  @@ -70,7 +70,7 @@
    * standalone code as well as plugins to the validator architecture.
    * @author Jeffrey Rodriguez
    * @author Mark Swinkles - List Validation refactoring
  - * @version $Id: IDDatatypeValidator.java,v 1.2 2001/09/05 18:06:31 neilg Exp $
  + * @version $Id: IDDatatypeValidator.java,v 1.3 2001/09/05 21:16:03 sandygao Exp $
    */
   public class IDDatatypeValidator extends StringDatatypeValidator {
       private static Object                   fNullValue      = new Object();
  @@ -90,9 +90,9 @@
               return;
   
           // the type is NAME by default
  -        // REVISIT:  should have special handling when base is a genuine IDDatatypeValidator
  -        if (base != null && base instanceof AbstractStringValidator)
  -            setTokenType(((AbstractStringValidator)base).fTokenType);
  +        // REVISIT: how to set token type for id/idref derived types
  +        if (base instanceof IDDatatypeValidator)
  +            setTokenType(((IDDatatypeValidator)base).fTokenType);
           else
               setTokenType(SPECIAL_TOKEN_IDNAME);
       }
  
  
  
  1.3       +4 -4      xml-xerces/java/src/org/apache/xerces/impl/v2/datatypes/IDREFDatatypeValidator.java
  
  Index: IDREFDatatypeValidator.java
  ===================================================================
  RCS file: /home/cvs/xml-xerces/java/src/org/apache/xerces/impl/v2/datatypes/IDREFDatatypeValidator.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- IDREFDatatypeValidator.java	2001/09/05 18:06:31	1.2
  +++ IDREFDatatypeValidator.java	2001/09/05 21:16:03	1.3
  @@ -71,7 +71,7 @@
    *
    * @author Jeffrey Rodriguez-
    * @author Mark Swinkles - List Validation refactoring
  - * @version $Id: IDREFDatatypeValidator.java,v 1.2 2001/09/05 18:06:31 neilg Exp $
  + * @version $Id: IDREFDatatypeValidator.java,v 1.3 2001/09/05 21:16:03 sandygao Exp $
    */
   public class IDREFDatatypeValidator extends StringDatatypeValidator {
       private static Object                   fNullValue      = new Object();
  @@ -94,9 +94,9 @@
               return;
   
           // the type is NAME by default
  -        // REVISIT:  as in IDDatatypeValidator, handle other types of AbstractStringValidator differently.
  -        if (base != null && base instanceof AbstractStringValidator)
  -            setTokenType(((AbstractStringValidator)base).fTokenType);
  +        // REVISIT: how to set token type for id/idref derived types
  +        if (base instanceof IDREFDatatypeValidator)
  +            setTokenType(((IDREFDatatypeValidator)base).fTokenType);
           else
               setTokenType(SPECIAL_TOKEN_IDREFNAME);
       }
  
  
  
  1.2       +2 -2      xml-xerces/java/src/org/apache/xerces/impl/v2/datatypes/QNameDatatypeValidator.java
  
  Index: QNameDatatypeValidator.java
  ===================================================================
  RCS file: /home/cvs/xml-xerces/java/src/org/apache/xerces/impl/v2/datatypes/QNameDatatypeValidator.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- QNameDatatypeValidator.java	2001/08/24 22:26:29	1.1
  +++ QNameDatatypeValidator.java	2001/09/05 21:16:03	1.2
  @@ -74,7 +74,7 @@
    *
    * @author Jeffrey Rodriguez
    * @author Mark Swinkles - List Validation refactoring
  - * @version $Id: QNameDatatypeValidator.java,v 1.1 2001/08/24 22:26:29 elena Exp $
  + * @version $Id: QNameDatatypeValidator.java,v 1.2 2001/09/05 21:16:03 sandygao Exp $
    */
   public class QNameDatatypeValidator extends  AbstractStringValidator {
   
  @@ -120,7 +120,7 @@
           return collator.compare( content, facetValue );
       }
   
  -    protected static void setNCNameValidator (DatatypeValidator dv) {
  +    public static void setNCNameValidator (DatatypeValidator dv) {
           // make a string validator for NCName
           if ( fgStrValidator == null) {
               fgStrValidator = dv;
  
  
  

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