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/16 18:00:35 UTC

cvs commit: xml-xerces/java/src/org/apache/xerces/impl/v2 XSAttributeChecker.java XSDHandler.java XSDocumentInfo.java

neilg       01/10/16 09:00:35

  Modified:    java/src/org/apache/xerces/impl/v2 XSAttributeChecker.java
                        XSDHandler.java XSDocumentInfo.java
  Log:
  several fixes:
  1.  Applied a patch from Rahul Srivastava to handle an error condition more gracefully.
  2.  Clean up valid redefine cases (we now pass all 19 cases in our internal valid <redefine> bucket).
  3.  Handle chameleon includes correctly.
  
  Revision  Changes    Path
  1.29      +8 -4      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.28
  retrieving revision 1.29
  diff -u -r1.28 -r1.29
  --- XSAttributeChecker.java	2001/10/16 15:11:38	1.28
  +++ XSAttributeChecker.java	2001/10/16 16:00:35	1.29
  @@ -89,7 +89,7 @@
    * - use symbol table instead of many hashtables
    *
    * @author Sandy Gao, IBM
  - * @version $Id: XSAttributeChecker.java,v 1.28 2001/10/16 15:11:38 elena Exp $
  + * @version $Id: XSAttributeChecker.java,v 1.29 2001/10/16 16:00:35 neilg Exp $
    */
   
   public class XSAttributeChecker {
  @@ -1092,7 +1092,7 @@
                       // the object representation of the value.
                       switch (oneAttr.dvIndex) {
                       case DT_QNAME:
  -                        retValue = resolveQName(attrVal, schemaDoc.fNamespaceSupport);
  +                        retValue = resolveQName(attrVal, schemaDoc);
                           break;
                       default:
                           retValue = attrVal;
  @@ -1302,7 +1302,7 @@
                       retValue = fExtraDVs[DT_QNAME].validate(token, null);
                       // REVISIT: should have the datatype validators return
                       // the object representation of the value.
  -                    retValue = resolveQName(token, schemaDoc.fNamespaceSupport);
  +                    retValue = resolveQName(token, schemaDoc);
                       memberType.addElement(retValue);
                   }
                   retValue = memberType;
  @@ -1526,7 +1526,8 @@
           return sb.toString();
       }
   
  -    protected QName resolveQName (String attrVal, SchemaNamespaceSupport nsSupport) {
  +    protected QName resolveQName (String attrVal, XSDocumentInfo currSchema) {
  +        SchemaNamespaceSupport nsSupport = currSchema.fNamespaceSupport;
           String prefix = fSchemaHandler.EMPTY_STRING;
           String localpart = attrVal;
           int colonptr = attrVal.indexOf(":");
  @@ -1535,6 +1536,9 @@
               localpart = attrVal.substring(colonptr+1);
           }
           String uri = nsSupport.getURI(prefix);
  +        // kludge to handle chameleon includes/redefines...
  +        if(prefix == fSchemaHandler.EMPTY_STRING && uri == null && currSchema.fIsChameleonSchema)
  +            uri = currSchema.fTargetNamespace;
           return new QName(prefix, localpart, attrVal, uri);
       }
   
  
  
  
  1.41      +43 -21    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.40
  retrieving revision 1.41
  diff -u -r1.40 -r1.41
  --- XSDHandler.java	2001/10/15 22:55:16	1.40
  +++ XSDHandler.java	2001/10/16 16:00:35	1.41
  @@ -97,7 +97,7 @@
    * schema, other grammars may be constructed as a side-effect.
    *
    * @author Neil Graham, IBM
  - * @version $Id: XSDHandler.java,v 1.40 2001/10/15 22:55:16 sandygao Exp $
  + * @version $Id: XSDHandler.java,v 1.41 2001/10/16 16:00:35 neilg Exp $
    */
   
   class XSDHandler {
  @@ -341,6 +341,7 @@
               // only set if we were included or redefined in.
               if(currSchemaInfo.fTargetNamespace == null) {
                   currSchemaInfo.fTargetNamespace = callerTNS;
  +                currSchemaInfo.fIsChameleonSchema = true;
               } else if(callerTNS != currSchemaInfo.fTargetNamespace) {
                   fElementTraverser.reportSchemaError("src-include.2", new Object [] {callerTNS, currSchemaInfo.fTargetNamespace});
               }
  @@ -458,13 +459,13 @@
                   } else if(DOMUtil.getLocalName(globalComp).equals(SchemaSymbols.ELT_INCLUDE) ||
                           DOMUtil.getLocalName(globalComp).equals(SchemaSymbols.ELT_IMPORT)) {
                       if(!dependenciesCanOccur) {
  -                        fElementTraverser.reportSchemaError("schema-props-correct.1", new Object [] {DOMUtil.getLocalName(globalComp)});
  +                        fElementTraverser.reportSchemaError("sch-props-correct.1", new Object [] {DOMUtil.getLocalName(globalComp)});
                       }
                       // we've dealt with this; mark as traversed
                       DOMUtil.setHidden(globalComp);
                   } else if(DOMUtil.getLocalName(globalComp).equals(SchemaSymbols.ELT_REDEFINE)) {
                       if(!dependenciesCanOccur) {
  -                        fElementTraverser.reportSchemaError("schema-props-correct.1", new Object [] {DOMUtil.getLocalName(globalComp)});
  +                        fElementTraverser.reportSchemaError("sch-props-correct.1", new Object [] {DOMUtil.getLocalName(globalComp)});
                       }
                       for(Element redefineComp = DOMUtil.getFirstChildElement(globalComp);
                               redefineComp != null;
  @@ -533,7 +534,7 @@
                       } else if(componentType.equals(SchemaSymbols.ELT_NOTATION)) {
                           checkForDuplicateNames(qName, fUnparsedNotationRegistry, globalComp, currSchemaDoc);
                       } else {
  -                        fElementTraverser.reportSchemaError("schema-props-correct.1", new Object [] {DOMUtil.getLocalName(globalComp)});
  +                        fElementTraverser.reportSchemaError("sch-props-correct.1", new Object [] {DOMUtil.getLocalName(globalComp)});
                       }
                   }
               } // end for
  @@ -742,8 +743,13 @@
           if (retObj != null)
               return retObj;
   
  -        // decl must not be null if we're here...
  -        if (DOMUtil.isHidden(decl)) {
  +		 // decl can be null, if the grammar picked was SG_SchemaNS
  +		 if (decl == null) {
  +		         fElementTraverser.reportGenericSchemaError("Could not locate a component corresponding to " +declToTraverse.uri+":"+declToTraverse.localpart);
  +		 		 return null;
  +		 }
  +        else if (DOMUtil.isHidden(decl)) {
  +            // decl must not be null if we're here...
               //REVISIT: report an error: circular reference
               fElementTraverser.reportGenericSchemaError("Circular reference detected in schema component named " + declToTraverse.prefix+":"+declToTraverse.localpart);
               return null;
  @@ -1037,27 +1043,39 @@
               XSDocumentInfo redefinedSchema = null;
               // case where we've collided with a redefining element
               // (the parent of the colliding element is a redefine)
  +            boolean collidedWithRedefine = true;
               if((DOMUtil.getLocalName((elemParent = DOMUtil.getParent(collidingElem))).equals(SchemaSymbols.ELT_REDEFINE))) {
                   redefinedSchema = (XSDocumentInfo)(fRedefine2XSDMap.get(elemParent));
               // case where we're a redefining element.
               } else if((DOMUtil.getLocalName(DOMUtil.getParent(currComp)).equals(SchemaSymbols.ELT_REDEFINE))){
                   redefinedSchema = (XSDocumentInfo)(fDoc2XSDocumentMap.get(DOMUtil.getDocument(collidingElem)));
  +                collidedWithRedefine = false;
               }
               if(redefinedSchema != null) { //redefinition involved somehow
  +                String newName = qName.substring(qName.lastIndexOf(',')+1)+REDEF_IDENTIFIER;
                   if(redefinedSchema == currSchema) { // object comp. okay here
                       // now have to do some renaming...
  -                    String newName = qName.substring(qName.lastIndexOf(',')+1)+REDEF_IDENTIFIER;
                       currComp.setAttribute(SchemaSymbols.ATT_NAME, newName);
  -                    registry.put(qName+REDEF_IDENTIFIER, currComp);
  +                    if(currSchema.fTargetNamespace == null) 
  +                        registry.put(","+newName, currComp);
  +                    else
  +                        registry.put(currSchema.fTargetNamespace+","+newName, currComp); 
                       // and take care of nested redefines by calling recursively:
                       if(currSchema.fTargetNamespace == null)
                           checkForDuplicateNames(","+newName, registry, currComp, currSchema);
                       else
                           checkForDuplicateNames(currSchema.fTargetNamespace+","+newName, registry, currComp, currSchema);
  -                } else { // we're apparently redefining the wrong schema
  -                    // REVISIT:  error that redefined element in wrong schema
  -                    fElementTraverser.reportSchemaError("src-redefine.1", new Object [] {qName});
  -                }
  +                } else { // we may be redefining the wrong schema
  +                    if(collidedWithRedefine) {
  +                        if(currSchema.fTargetNamespace == null) 
  +                            checkForDuplicateNames(","+newName, registry, currComp, currSchema);
  +                        else 
  +                            checkForDuplicateNames(currSchema.fTargetNamespace+","+newName, registry, currComp, currSchema);
  +                    } else {
  +                        // REVISIT:  error that redefined element in wrong schema
  +                        fElementTraverser.reportSchemaError("src-redefine.1", new Object [] {qName});
  +                    }
  +                } 
               } else { // we've just got a flat-out collision
                   fElementTraverser.reportSchemaError("sch-props-correct.2", new Object []{qName});
               }
  @@ -1112,7 +1130,7 @@
                       fElementTraverser.reportSchemaError("src-redefine.5", null);
                   } else {
                       String derivedBase = grandKid.getAttribute( SchemaSymbols.ATT_BASE );
  -                    String processedDerivedBase = findQName(derivedBase, currNSMap);
  +                    String processedDerivedBase = findQName(derivedBase, currSchema);
                       if(!processedTypeName.equals(processedDerivedBase)) {
                           // fRedefineSucceeded = false;
                           fElementTraverser.reportSchemaError("src-redefine.5", null);
  @@ -1163,7 +1181,7 @@
                               fElementTraverser.reportSchemaError("src-redefine.5", null);
                           } else {
                               String derivedBase = greatGrandKid.getAttribute( SchemaSymbols.ATT_BASE );
  -                            String processedDerivedBase = findQName(derivedBase, currSchema.fNamespaceSupport);
  +                            String processedDerivedBase = findQName(derivedBase, currSchema);
                               if(!processedTypeName.equals(processedDerivedBase)) {
                                   // fRedefineSucceeded = false;
                                   fElementTraverser.reportSchemaError("src-redefine.5", null);
  @@ -1185,7 +1203,7 @@
           } else if (componentType.equals(SchemaSymbols.ELT_ATTRIBUTEGROUP)) {
               String processedBaseName = (currSchema.fTargetNamespace == null)?
                   ","+oldName:currSchema.fTargetNamespace+","+oldName;
  -            int attGroupRefsCount = changeRedefineGroup(processedBaseName, componentType, newName, child, currSchema.fNamespaceSupport);
  +            int attGroupRefsCount = changeRedefineGroup(processedBaseName, componentType, newName, child, currSchema);
               if(attGroupRefsCount > 1) {
                   // fRedefineSucceeded = false;
                   fElementTraverser.reportSchemaError("src-redefine.7.1", new Object []{new Integer(attGroupRefsCount)});
  @@ -1199,7 +1217,7 @@
           } else if (componentType.equals(SchemaSymbols.ELT_GROUP)) {
               String processedBaseName = (currSchema.fTargetNamespace == null)?
                   ","+oldName:currSchema.fTargetNamespace+","+oldName;
  -            int groupRefsCount = changeRedefineGroup(processedBaseName, componentType, newName, child, currSchema.fNamespaceSupport);
  +            int groupRefsCount = changeRedefineGroup(processedBaseName, componentType, newName, child, currSchema);
               if(groupRefsCount > 1) {
                   // fRedefineSucceeded = false;
                   fElementTraverser.reportSchemaError("src-redefine.6.1.1", new Object []{new Integer(groupRefsCount)});
  @@ -1224,17 +1242,20 @@
       // to by a in the current SchemaNamespaceSupport object, and returns this
       // information in the form (nsURI,b) suitable for lookups in the global
       // decl Hashtables.
  -    private String findQName(String name, SchemaNamespaceSupport currNSMap) {
  +    private String findQName(String name, XSDocumentInfo schemaDoc) {
  +        SchemaNamespaceSupport currNSMap = schemaDoc.fNamespaceSupport;
           int colonPtr = name.indexOf(':');
           String prefix = EMPTY_STRING;
           if (colonPtr > 0)
               prefix = name.substring(0, colonPtr);
           String uri = currNSMap.getURI(fSymbolTable.addSymbol(prefix));
           String localpart = (colonPtr == 0)?name:name.substring(colonPtr+1);
  +        if(prefix == this.EMPTY_STRING && uri == null && schemaDoc.fIsChameleonSchema) 
  +            uri = schemaDoc.fTargetNamespace; 
           if(uri == null)
               return ","+localpart;
           return uri+","+localpart;
  -    } // findQName(String, SchemaNamespaceSupport):  String
  +    } // findQName(String, XSDocumentInfo):  String
   
       // This function looks among the children of curr for an element of type elementSought.
       // If it finds one, it evaluates whether its ref attribute contains a reference
  @@ -1244,17 +1265,18 @@
       // It also resets the value of ref so that it will refer to the renamed type from the schema
       // being redefined.
       private int changeRedefineGroup(String originalQName, String elementSought,
  -            String newName, Element curr, SchemaNamespaceSupport currNSMap) {
  +            String newName, Element curr, XSDocumentInfo schemaDoc) {
  +        SchemaNamespaceSupport currNSMap = schemaDoc.fNamespaceSupport;
           int result = 0;
           for (Element child = DOMUtil.getFirstChildElement(curr);
                   child != null; child = DOMUtil.getNextSiblingElement(child)) {
               String name = child.getLocalName();
               if (!name.equals(elementSought))
  -                result += changeRedefineGroup(originalQName, elementSought, newName, child, currNSMap);
  +                result += changeRedefineGroup(originalQName, elementSought, newName, child, schemaDoc);
               else {
                   String ref = child.getAttribute( SchemaSymbols.ATT_REF );
                   if (ref.length() != 0) {
  -                    String processedRef = findQName(ref, currNSMap);
  +                    String processedRef = findQName(ref, schemaDoc);
                       if(originalQName.equals(processedRef)) {
                           String prefix = EMPTY_STRING;
                           String localpart = ref;
  
  
  
  1.15      +5 -1      xml-xerces/java/src/org/apache/xerces/impl/v2/XSDocumentInfo.java
  
  Index: XSDocumentInfo.java
  ===================================================================
  RCS file: /home/cvs/xml-xerces/java/src/org/apache/xerces/impl/v2/XSDocumentInfo.java,v
  retrieving revision 1.14
  retrieving revision 1.15
  diff -u -r1.14 -r1.15
  --- XSDocumentInfo.java	2001/10/16 15:11:38	1.14
  +++ XSDocumentInfo.java	2001/10/16 16:00:35	1.15
  @@ -74,7 +74,7 @@
    * affect the contents of that schema document alone.
    *
    * @author Neil Graham, IBM
  - * @version $Id: XSDocumentInfo.java,v 1.14 2001/10/16 15:11:38 elena Exp $
  + * @version $Id: XSDocumentInfo.java,v 1.15 2001/10/16 16:00:35 neilg Exp $
    */
   
   class XSDocumentInfo {
  @@ -98,6 +98,9 @@
       // targetNamespace
       protected String fTargetNamespace;
   
  +    // represents whether this is a chameleon schema (i.e., whether its TNS is natural or comes from without)
  +    protected boolean fIsChameleonSchema;
  +
       // the root of the schema Document tree itself
       protected Document fSchemaDoc;
   
  @@ -108,6 +111,7 @@
       XSDocumentInfo (Document schemaDoc, XSAttributeChecker attrChecker, SymbolTable symbolTable) {
           fSchemaDoc = schemaDoc;
           fNamespaceSupport = new SchemaNamespaceSupport();
  +        fIsChameleonSchema = false;
   
           if(schemaDoc != null) {
               Element root = DOMUtil.getRoot(schemaDoc);
  
  
  

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