mrglavas    2004/10/28 14:06:19

  Modified:    java/src/org/apache/xerces/impl/xs/traversers
                        XSDAbstractTraverser.java
  Log:
  When an annotation has no <documentation> or <appinfo> children we were
  completely losing the annotation component. This is because the schema DOM
  stores the textual representation of the annotation on the first child of the
  current parent. When <annotation> has element content, that's its first
  child. When <annotation> has no element content, that's its parent's first
  child. The latter is problematic because only if the annotation is the first
  child of its parent will we find the text node there. We need to store the
  string representation in a consistent place so it can be reliably retrieved,
  perhaps as user data.  In the mean time we look for a text child on
  annotation if it has no element content. This works for a large number of
  cases but not all of them.
  
  Revision  Changes    Path
  1.38      +37 -21    
xml-xerces/java/src/org/apache/xerces/impl/xs/traversers/XSDAbstractTraverser.java
  
  Index: XSDAbstractTraverser.java
  ===================================================================
  RCS file: 
/home/cvs/xml-xerces/java/src/org/apache/xerces/impl/xs/traversers/XSDAbstractTraverser.java,v
  retrieving revision 1.37
  retrieving revision 1.38
  diff -u -r1.37 -r1.38
  --- XSDAbstractTraverser.java 6 Oct 2004 15:14:48 -0000       1.37
  +++ XSDAbstractTraverser.java 28 Oct 2004 21:06:19 -0000      1.38
  @@ -105,28 +105,44 @@
           fAttrChecker.returnAttrArray(attrValues, schemaDoc);
   
           String contents = null;
  -        for (Element child = DOMUtil.getFirstChildElement(annotationDecl);
  -            child != null;
  -            child = DOMUtil.getNextSiblingElement(child)) {
  -            String name = DOMUtil.getLocalName(child);
  +        Element child = DOMUtil.getFirstChildElement(annotationDecl);
  +        if (child != null) {
  +             do {
  +                String name = DOMUtil.getLocalName(child);
   
  -            // the only valid children of "annotation" are
  -            // "appinfo" and "documentation"
  -            if (!((name.equals(SchemaSymbols.ELT_APPINFO)) ||
  -                  (name.equals(SchemaSymbols.ELT_DOCUMENTATION)))) {
  -                reportSchemaError("src-annotation", new Object[]{name}, child);
  -            } else { // the annotation, as we currently know it, is a Text child
  -                Node textContent = child.getFirstChild();
  -                if(textContent != null && textContent.getNodeType() == 
Node.TEXT_NODE) {
  -                    contents = ((Text)textContent).getData();
  +                // the only valid children of "annotation" are
  +                // "appinfo" and "documentation"
  +                if (!((name.equals(SchemaSymbols.ELT_APPINFO)) ||
  +                      (name.equals(SchemaSymbols.ELT_DOCUMENTATION)))) {
  +                    reportSchemaError("src-annotation", new Object[]{name}, child);
  +                } else { // the annotation, as we currently know it, is a Text child
  +                    Node textContent = child.getFirstChild();
  +                    if(textContent != null && textContent.getNodeType() == 
Node.TEXT_NODE) {
  +                        contents = ((Text)textContent).getData();
  +                    }
                   }
  -            }
   
  -            // General Attribute Checking
  -            // There is no difference between global or local appinfo/documentation,
  -            // so we assume it's always global.
  -            attrValues = fAttrChecker.checkAttributes(child, true, schemaDoc);
  -            fAttrChecker.returnAttrArray(attrValues, schemaDoc);
  +                // General Attribute Checking
  +                // There is no difference between global or local 
appinfo/documentation,
  +                // so we assume it's always global.
  +                attrValues = fAttrChecker.checkAttributes(child, true, schemaDoc);
  +                fAttrChecker.returnAttrArray(attrValues, schemaDoc);
  +                
  +                child = DOMUtil.getNextSiblingElement(child);
  +             }
  +             while (child != null);
  +        }
  +        // REVISIT: When an annotation has no <documentation> or
  +        // <appinfo> children the text child is stored on the first child of its
  +        // parent. Only if the annotation is the first child will we find the
  +        // text node there. See SchemaDOM. We need to store the string 
representation
  +        // in a consistent place so it can be reliably retrieved, perhaps as 
  +        // user data. -- mrglavas
  +        else {
  +            Node textContent = annotationDecl.getFirstChild();
  +            if(textContent != null && textContent.getNodeType() == Node.TEXT_NODE) {
  +                contents = ((Text)textContent).getData();
  +            }
           }
           // if contents was null, must have been some kind of error;
           // nothing to contribute to PSVI
  
  
  

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

Reply via email to