You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@xerces.apache.org by ne...@apache.org on 2001/10/06 00:28:17 UTC

cvs commit: xml-xerces/java/src/org/apache/xerces/impl/v2/xpath XPath.java

neilg       01/10/05 15:28:17

  Modified:    java/src/org/apache/xerces/impl/v2 XSDHandler.java
                        XSDElementTraverser.java
                        SchemaNamespaceSupport.java
               java/src/org/apache/xerces/impl/v2/xpath XPath.java
  Log:
  fixed some bugs; generally prepared the way for dropping in the changes to the validator to accomodate Identity Constraints.
  
  Revision  Changes    Path
  1.37      +72 -4     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.36
  retrieving revision 1.37
  diff -u -r1.36 -r1.37
  --- XSDHandler.java	2001/10/04 14:19:19	1.36
  +++ XSDHandler.java	2001/10/05 22:28:16	1.37
  @@ -97,7 +97,7 @@
    * schema, other grammars may be constructed as a side-effect.
    *
    * @author Neil Graham, IBM
  - * @version $Id: XSDHandler.java,v 1.36 2001/10/04 14:19:19 neilg Exp $
  + * @version $Id: XSDHandler.java,v 1.37 2001/10/05 22:28:16 neilg Exp $
    */
   
   class XSDHandler {
  @@ -230,6 +230,20 @@
       private int[] fAllContext;
       private String [][] fLocalElemNamespaceContext;
   
  +    // these data members are needed for the deferred traversal
  +    // of keyrefs.
  +
  +    // the initial size of the array to store deferred keyrefs
  +    private static final int INIT_KEYREF_STACK = 2;
  +    // the incremental size of the array to store deferred keyrefs
  +    private static final int INC_KEYREF_STACK_AMOUNT = 2;
  +    // current position of the array (# of deferred keyrefs)
  +    private int fKeyrefStackPos;
  +
  +    private Element [] fKeyrefs;
  +    private XSElementDecl [] fKeyrefElems;
  +    private String [][] fKeyrefNamespaceContext;
  +
       // Constructors
   
       // it should be possible to use the same XSDHandler to parse
  @@ -287,7 +301,7 @@
           traverseLocalElements();
   
           // fifth phase:  handle Keyrefs
  -//        resolveKeyRefs();
  +        resolveKeyRefs();
   
           // sixth phase:  handle derivation constraint checking
           // and UPA, and validate attribute of non-schema namespaces
  @@ -318,6 +332,7 @@
               if(currSchemaInfo.fTargetNamespace == null) {
                   currSchemaInfo.fTargetNamespace = callerTNS;
               } else if(callerTNS != currSchemaInfo.fTargetNamespace) {
  +                System.err.println(callerTNS + " and " + currSchemaInfo.fTargetNamespace);
                   fElementTraverser.reportSchemaError("src-include.2", new Object [] {callerTNS, currSchemaInfo.fTargetNamespace});
               }
           }
  @@ -767,8 +782,51 @@
       // from the elementTraverser class (which must ignore keyrefs),
       // but there seems to be no efficient way around this...
       protected void resolveKeyRefs() {
  +        for (int i=0; i<fKeyrefStackPos; i++) {
  +            Document keyrefDoc = DOMUtil.getDocument(fKeyrefs[i]);
  +            XSDocumentInfo keyrefSchemaDoc = (XSDocumentInfo)fDoc2XSDocumentMap.get(keyrefDoc);
  +            keyrefSchemaDoc.fNamespaceSupport.makeGlobal();
  +            keyrefSchemaDoc.fNamespaceSupport.setEffectiveContext( fKeyrefNamespaceContext[i] );
  +            SchemaGrammar keyrefGrammar = fGrammarResolver.getGrammar(keyrefSchemaDoc.fTargetNamespace);
  +            fKeyrefTraverser.traverse(fKeyrefs[i], fKeyrefElems[i], keyrefSchemaDoc, keyrefGrammar);
  +        }
       } // end resolveKeyRefs
   
  +    // an accessor method.  Just makes sure callers
  +    // who want the Identity constraint registry vaguely know what they're about.
  +    protected Hashtable getIDRegistry() {
  +        return fUnparsedIdentityConstraintRegistry;
  +    }
  +
  +    // This method squirrels away <keyref> declarations--along with the element
  +    // decls and namespace bindings they might find handy.  
  +    protected void storeKeyRef (Element keyrefToStore, XSDocumentInfo schemaDoc, 
  +            XSElementDecl currElemDecl) {
  +        String keyrefName = DOMUtil.getAttrValue(keyrefToStore, SchemaSymbols.ATT_NAME);
  +        if(keyrefName.length() != 0) {
  +            String keyrefQName = schemaDoc.fTargetNamespace == null?
  +                "," + keyrefName: schemaDoc.fTargetNamespace+","+keyrefName;
  +            checkForDuplicateNames(keyrefQName, fUnparsedIdentityConstraintRegistry, keyrefToStore, schemaDoc);
  +        }
  +        // now set up all the registries we'll need...
  +        
  +        // check array sizes
  +        if(fKeyrefStackPos == fKeyrefs.length) {
  +            Element [] elemArray = new Element [fKeyrefStackPos + INC_KEYREF_STACK_AMOUNT];
  +            System.arraycopy(fKeyrefs, 0, elemArray, 0, fKeyrefStackPos);
  +            fKeyrefs = elemArray;
  +            XSElementDecl [] declArray = new XSElementDecl [fKeyrefStackPos + INC_KEYREF_STACK_AMOUNT];
  +            System.arraycopy(fKeyrefElems, 0, declArray, 0, fKeyrefStackPos);
  +            fKeyrefElems = declArray;
  +            String[][] stringArray = new String [fKeyrefStackPos + INC_KEYREF_STACK_AMOUNT][];
  +            System.arraycopy(fKeyrefNamespaceContext, 0, stringArray, 0, fKeyrefStackPos);
  +            fKeyrefNamespaceContext = stringArray;
  +        }
  +        fKeyrefs[fKeyrefStackPos] = keyrefToStore;
  +        fKeyrefElems[fKeyrefStackPos] = currElemDecl;
  +        fKeyrefNamespaceContext[fKeyrefStackPos++] = schemaDoc.fNamespaceSupport.getEffectiveLocalContext();
  +    } // storeKeyref (Element, XSDocumentInfo, XSElementDecl): void
  +
       // This method is responsible for schema resolution.  If it finds
       // a schema document that the XMLEntityResolver resolves to with
       // the given namespace and hint, it returns it.  It returns true
  @@ -873,6 +931,12 @@
           // err on the small side for num. of local namespaces declared...
           fLocalElemNamespaceContext = new String [INIT_STACK_SIZE][1];
   
  +        // and do same for keyrefs.
  +        fKeyrefStackPos = 0;
  +        fKeyrefs = new Element[INIT_KEYREF_STACK];
  +        fKeyrefElems = new XSElementDecl [INIT_KEYREF_STACK];;
  +        fKeyrefNamespaceContext = new String[INIT_KEYREF_STACK][1];
  +
           // reset traversers
           fAttributeChecker.reset(fErrorReporter, fSymbolTable);
           fAttributeGroupTraverser.reset(fErrorReporter, fSymbolTable);
  @@ -939,10 +1003,12 @@
        * right schema.  It then renames the component correctly.  If it
        * detects a collision--a duplicate definition--then it complains.
        */
  -    private void checkForDuplicateNames(String qName,
  +    void checkForDuplicateNames(String qName,
               Hashtable registry, Element currComp,
               XSDocumentInfo currSchema) {
           Object objElem = null;
  +        // REVISIT:  when we add derivation checking, we'll have to make
  +        // sure that ID constraint collisions don't necessarily result in error messages.
           if((objElem = registry.get(qName)) == null) {
               // just add it in!
               registry.put(qName, currComp);
  @@ -1224,7 +1290,9 @@
       public static void main (String args[]) throws Exception {
           DefaultHandler handler = new DefaultHandler();
           XSDHandler me = new XSDHandler(new XSGrammarResolver());
  -        me.reset(new XMLErrorReporter(), new EntityResolverWrapper(new org.apache.xerces.impl.v2.XSDHandler.DummyResolver()), new SymbolTable());
  +        XMLErrorReporter rep = new XMLErrorReporter();
  +        rep.putMessageFormatter(XSMessageFormatter.SCHEMA_DOMAIN, new XSMessageFormatter());
  +        me.reset(rep, new EntityResolverWrapper(new org.apache.xerces.impl.v2.XSDHandler.DummyResolver()), new SymbolTable());
           me.parseSchema(args[0], args[1]);
           Enumeration types = me.fUnparsedTypeRegistry.keys();
           String name = null;
  
  
  
  1.21      +17 -25    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.20
  retrieving revision 1.21
  diff -u -r1.20 -r1.21
  --- XSDElementTraverser.java	2001/10/03 18:10:54	1.20
  +++ XSDElementTraverser.java	2001/10/05 22:28:17	1.21
  @@ -89,7 +89,7 @@
    *
    * @author Sandy Gao, IBM
    *
  - * @version $Id: XSDElementTraverser.java,v 1.20 2001/10/03 18:10:54 elena Exp $
  + * @version $Id: XSDElementTraverser.java,v 1.21 2001/10/05 22:28:17 neilg Exp $
    */
   class XSDElementTraverser extends XSDAbstractTraverser {
   
  @@ -335,42 +335,34 @@
   
           element.fType = elementType;
   
  -        // get 'identity constaint'
  +        // get 'identity constraint'
   
           // see if there's something here; it had better be key, keyref or unique.
           if (child != null) {
  -            String childName = DOMUtil.getLocalName(child);
  +            String childName = fSymbolTable.addSymbol(DOMUtil.getLocalName(child));
               while (child != null &&
                      (childName.equals(SchemaSymbols.ELT_KEY) ||
                       childName.equals(SchemaSymbols.ELT_KEYREF) ||
                       childName.equals(SchemaSymbols.ELT_UNIQUE))) {
  +                if(childName == SchemaSymbols.ELT_KEY ||
  +                        childName == SchemaSymbols.ELT_UNIQUE) {
  +                    fSchemaHandler.fUniqueOrKeyTraverser.traverse(child, element, schemaDoc, grammar);
  +                    if(DOMUtil.getAttrValue(child, SchemaSymbols.ATT_NAME).length() != 0 ) {
  +                        fSchemaHandler.checkForDuplicateNames(
  +                            (schemaDoc.fTargetNamespace == null) ? ","+DOMUtil.getAttrValue(child, SchemaSymbols.ATT_NAME)
  +                            : schemaDoc.fTargetNamespace+","+ DOMUtil.getAttrValue(child, SchemaSymbols.ATT_NAME),
  +                            fSchemaHandler.getIDRegistry(),
  +                            child, schemaDoc);
  +                    }
  +                } else if (childName == SchemaSymbols.ELT_KEYREF) {
  +                    fSchemaHandler.storeKeyRef(child, schemaDoc, element);
  +                }
                   child = DOMUtil.getNextSiblingElement(child);
                   if (child != null) {
  -                    childName = DOMUtil.getLocalName(child);
  +                    childName = fSymbolTable.addSymbol(DOMUtil.getLocalName(child));
                   }
               }
           }
  -
  -        //
  -        // REVISIT: key/keyref/unique processing
  -        //
  -
  -        /*Element ic = XUtil.getFirstChildElementNS(elementDecl, IDENTITY_CONSTRAINTS);
  -        if (ic != null) {
  -            XInt elementIndexObj = XIntPool.getXInt(elementIndex);
  -            Vector identityConstraints = (Vector)fIdentityConstraints.get(elementIndexObj);
  -            if (identityConstraints == null) {
  -                identityConstraints = new Vector();
  -                fIdentityConstraints.put(elementIndexObj, identityConstraints);
  -            }
  -            while (ic != null) {
  -                if (DEBUG_IC_DATATYPES) {
  -                    System.out.println("<ICD>: adding ic for later traversal: "+ic);
  -                }
  -                identityConstraints.addElement(ic);
  -                ic = XUtil.getNextSiblingElementNS(ic, IDENTITY_CONSTRAINTS);
  -            }
  -        }*/
   
           // Step 2: register the element decl to the grammar
           if (nameAtt != null)
  
  
  
  1.3       +2 -1      xml-xerces/java/src/org/apache/xerces/impl/v2/SchemaNamespaceSupport.java
  
  Index: SchemaNamespaceSupport.java
  ===================================================================
  RCS file: /home/cvs/xml-xerces/java/src/org/apache/xerces/impl/v2/SchemaNamespaceSupport.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- SchemaNamespaceSupport.java	2001/10/02 21:42:57	1.2
  +++ SchemaNamespaceSupport.java	2001/10/05 22:28:17	1.3
  @@ -66,7 +66,7 @@
    *
    * @author Neil Graham, IBM
    *
  - * @version $Id: SchemaNamespaceSupport.java,v 1.2 2001/10/02 21:42:57 neilg Exp $
  + * @version $Id: SchemaNamespaceSupport.java,v 1.3 2001/10/05 22:28:17 neilg Exp $
    */
   public class SchemaNamespaceSupport 
       extends NamespaceSupport {
  @@ -91,6 +91,7 @@
        * being imported had better be using the same SymbolTable.
        */
       void setEffectiveContext (String [] namespaceDecls) {
  +        if(namespaceDecls == null || namespaceDecls.length == 0) return;
           if(fCurrentContext == fContext.length) {
               // expand size of fContext
               int[] newContext = new int[fContext.length*2];
  
  
  
  1.3       +5 -5      xml-xerces/java/src/org/apache/xerces/impl/v2/xpath/XPath.java
  
  Index: XPath.java
  ===================================================================
  RCS file: /home/cvs/xml-xerces/java/src/org/apache/xerces/impl/v2/xpath/XPath.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- XPath.java	2001/09/21 16:22:30	1.2
  +++ XPath.java	2001/10/05 22:28:17	1.3
  @@ -66,7 +66,7 @@
    * Bare minimum XPath parser.
    *
    * @author Andy Clark, IBM
  - * @version $Id: XPath.java,v 1.2 2001/09/21 16:22:30 sandygao Exp $
  + * @version $Id: XPath.java,v 1.3 2001/10/05 22:28:17 neilg Exp $
    */
   public class XPath {
   
  @@ -780,7 +780,7 @@
        * @author Glenn Marcy, IBM
        * @author Andy Clark, IBM
        *
  -     * @version $Id: XPath.java,v 1.2 2001/09/21 16:22:30 sandygao Exp $
  +     * @version $Id: XPath.java,v 1.3 2001/10/05 22:28:17 neilg Exp $
        */
       private static final class Tokens {
   
  @@ -1262,7 +1262,7 @@
        * @author Glenn Marcy, IBM
        * @author Andy Clark, IBM
        *
  -     * @version $Id: XPath.java,v 1.2 2001/09/21 16:22:30 sandygao Exp $
  +     * @version $Id: XPath.java,v 1.3 2001/10/05 22:28:17 neilg Exp $
        */
       private static class Scanner {
   
  @@ -1828,7 +1828,7 @@
                       nameHandle = symbolTable.addSymbol(data.substring(nameOffset, currentOffset));
                       boolean isNameTestNCName = false;
                       boolean isAxisName = false;
  -                    prefixHandle = null;
  +                    prefixHandle = "";
                       if (ch == ':') {
                           if (++currentOffset == endOffset) {
                   // System.out.println("abort 5");
  @@ -2230,7 +2230,7 @@
        * @author Glenn Marcy, IBM
        * @author Andy Clark, IBM
        *
  -     * @version $Id: XPath.java,v 1.2 2001/09/21 16:22:30 sandygao Exp $
  +     * @version $Id: XPath.java,v 1.3 2001/10/05 22:28:17 neilg Exp $
        */
       /***
       public static class XPathExprParser {
  
  
  

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