sandygao    2002/08/09 08:14:34

  Modified:    java/src/org/apache/xerces/impl/xs/dom DOMParser.java
  Log:
  Report an error when non-whitespace characters appear in
  schema elements other than xs:appinfo or xs:documentation.
  Only these 2 elements have mixed content; all others are element-only.
  
  Revision  Changes    Path
  1.4       +87 -2     xml-xerces/java/src/org/apache/xerces/impl/xs/dom/DOMParser.java
  
  Index: DOMParser.java
  ===================================================================
  RCS file: 
/home/cvs/xml-xerces/java/src/org/apache/xerces/impl/xs/dom/DOMParser.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- DOMParser.java    3 Apr 2002 23:48:27 -0000       1.3
  +++ DOMParser.java    9 Aug 2002 15:14:34 -0000       1.4
  @@ -57,13 +57,18 @@
   
   package org.apache.xerces.impl.xs.dom;
   
  -import org.apache.xerces.impl.Constants;
   import org.apache.xerces.parsers.NonValidatingConfiguration;
  +import org.apache.xerces.impl.Constants;
  +import org.apache.xerces.impl.XMLErrorReporter;
   import org.apache.xerces.impl.xs.SchemaSymbols;
  +import org.apache.xerces.impl.xs.XSMessageFormatter;
   import org.apache.xerces.xni.XMLLocator;
   import org.apache.xerces.xni.QName;
   import org.apache.xerces.xni.Augmentations;
  +import org.apache.xerces.xni.XMLAttributes;
  +import org.apache.xerces.xni.XMLString;
   import org.apache.xerces.xni.XNIException;
  +import org.apache.xerces.util.XMLChar;
   
   import org.w3c.dom.Element;
   
  @@ -88,6 +93,10 @@
       protected static final String DEFER_EXPANSION = 
           Constants.XERCES_FEATURE_PREFIX + Constants.DEFER_NODE_EXPANSION_FEATURE;
       
  +    /** Property identifier: error reporter. */
  +    public static final String ERROR_REPORTER =
  +    Constants.XERCES_PROPERTY_PREFIX + Constants.ERROR_REPORTER_PROPERTY;
  +
       // the locator containing line/column information
       protected XMLLocator   fLocator;
       
  @@ -145,7 +154,83 @@
           fLocator = locator;
   
       } // startDocument(XMLLocator,String,Augmentations)
  +
  +    // Where xs:appinfo or xs:documentation starts;
  +    // -1 means not in the scope of either of the two elements.
  +    private int fAnnotationDepth = -1;
  +    // The current element depth
  +    private int fDepth = -1;
  +    // Use to report the error when characters are not allowed.
  +    XMLErrorReporter fErrorReporter;
  +
  +    // override startElement method to check whether it's one of
  +    // xs:appinfo or xs:documentation
  +    public void startElement(QName element, XMLAttributes attributes, Augmentations 
augs)
  +        throws XNIException {
  +        super.startElement(element, attributes, augs);
  +        fDepth++;
  +        // if it's not within either element, check whether it's one of them
  +        // if so, record the current depth, so that any element with larger
  +        // depth is allowed to have character data.
  +        if (fAnnotationDepth == -1) {
  +            if (element.uri == SchemaSymbols.URI_SCHEMAFORSCHEMA &&
  +                (element.localpart == SchemaSymbols.ELT_APPINFO ||
  +                 element.localpart == SchemaSymbols.ELT_DOCUMENTATION)) {
  +                fAnnotationDepth = fDepth;
  +            }
  +        }
  +    }
       
  +    // override this method to check whether there are non-whitespace characters
  +    public void characters(XMLString text, Augmentations augs) throws XNIException {
  +        // when it's not within xs:appinfo or xs:documentation
  +        if (fAnnotationDepth == -1) {
  +            for (int i=text.offset; i<text.offset+text.length; i++) {
  +                // and there is a non-whitespace character
  +                if (!XMLChar.isSpace(text.ch[i])) {
  +                    // only get the error reporter when reporting an error
  +                    if (fErrorReporter == null) {
  +                        try {
  +                            fErrorReporter = 
(XMLErrorReporter)getProperty(ERROR_REPORTER);
  +                        } catch (Exception e) {
  +                            //ignore the excpetion
  +                        }
  +                        if 
(fErrorReporter.getMessageFormatter(XSMessageFormatter.SCHEMA_DOMAIN) == null) {
  +                            XSMessageFormatter xmft = new XSMessageFormatter();
  +                            
fErrorReporter.putMessageFormatter(XSMessageFormatter.SCHEMA_DOMAIN, xmft);
  +                        }
  +                    }
  +                    // the string we saw: starting from the first non-whitespace 
character.
  +                    String txt = new String(text.ch, i, text.length+text.offset-i);
  +                    // report an error
  +                    fErrorReporter.reportError(XSMessageFormatter.SCHEMA_DOMAIN,
  +                                               "s4s-elt-character",
  +                                               new Object[]{txt},
  +                                               XMLErrorReporter.SEVERITY_ERROR);
  +                    break;
  +                }
  +            }
  +            // don't call super.characters() when it's not within one of the 2
  +            // annotation elements: the traversers ignore them anyway. We can
  +            // save time/memory creating the text nodes.
  +        }
  +        // when it's not within either of the 2 elements, characters are allowed
  +        // and we need to call super.characters().
  +        else {
  +            super.characters(text, augs);
  +        }
  +    }
  +    
  +    // override this method to update the depth variables
  +    public void endElement(QName element, Augmentations augs) throws XNIException {
  +        super.endElement(element, augs);
  +        // when we reach the endElement of xs:appinfo or xs:documentation,
  +        // change fAnnotationDepth to -1
  +        if (fAnnotationDepth == fDepth)
  +            fAnnotationDepth = -1;
  +        fDepth--;
  +    }
  +
       // override this method to store line/column information in Element created
       protected Element createElementNode(QName element) {
           // create an element containing line/column information
  
  
  

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

Reply via email to