venu        2003/11/11 10:15:20

  Modified:    java/src/org/apache/xerces/dom DOMNormalizer.java
  Log:
  Thanks to Kohsuke Kawaguchi for the patch .
  
  Revision  Changes    Path
  1.34      +53 -68    xml-xerces/java/src/org/apache/xerces/dom/DOMNormalizer.java
  
  Index: DOMNormalizer.java
  ===================================================================
  RCS file: /home/cvs/xml-xerces/java/src/org/apache/xerces/dom/DOMNormalizer.java,v
  retrieving revision 1.33
  retrieving revision 1.34
  diff -u -r1.33 -r1.34
  --- DOMNormalizer.java        8 May 2003 19:52:40 -0000       1.33
  +++ DOMNormalizer.java        11 Nov 2003 18:15:20 -0000      1.34
  @@ -149,7 +149,7 @@
   
       /** symbol table */
       protected SymbolTable fSymbolTable;
  -    /** error handler */
  +    /** error handler. may be null. */
       protected DOMErrorHandler fErrorHandler;
   
       // Validation against namespace aware grammar
  @@ -167,8 +167,6 @@
       /** list of attributes */
       protected final Vector fAttributeList = new Vector(5,10);
   
  -    /** DOM Error object */
  -    protected final DOMErrorImpl fDOMError = new DOMErrorImpl();
   
       /** DOM Locator -  for namespace fixup algorithm */
       protected final DOMLocatorImpl fLocator = new DOMLocatorImpl();
  @@ -180,6 +178,12 @@
       // attribute value normalization
       final XMLString fNormalizedValue = new XMLString(new char[16], 0, 0);
   
  +    /**
  +     * If the user stops the normalization process, this exception will be thrown.
  +     */
  +    private static final RuntimeException abort = new RuntimeException();
  +    
  +    
       // 
       // Constructor
       // 
  @@ -250,16 +254,9 @@
                        }
                }
                catch (RuntimeException e) {
  -                     // fatal error occured
  -                     modifyDOMError(
  -                             "Runtime exception: " + e.getMessage(),
  -                             DOMError.SEVERITY_FATAL_ERROR,
  -                             null);
  -
  -                     this.fErrorHandler.handleError(fDOMError);
  -                     if (true) {
  -                             e.printStackTrace();
  -                     }
  +            if( e==abort )
  +                return; // processing aborted by the user
  +            throw e;    // otherwise re-throw.
                }
   
        }
  @@ -463,17 +460,19 @@
   
                   if ((fConfiguration.features & DOMConfigurationImpl.SPLITCDATA) != 
0) {
                       String value = node.getNodeValue();
  -                    int index = value.indexOf("]]>");
  -                    if (index >= 0) {
  -                        // REVISIT: issue warning
  -                    }
  +                    int index;
                       Node parent = node.getParentNode();
  -                    while ( index >= 0 ) {
  +                    while ( (index=value.indexOf("]]>")) >= 0 ) {
                           node.setNodeValue(value.substring(0, index+2));
                           value = value.substring(index +2);
  -                        node = fDocument.createCDATASection(value);
  -                        parent.insertBefore(node, node.getNextSibling());
  -                        index = value.indexOf("]]>");
  +                        Node newChild = fDocument.createCDATASection(value);
  +                        parent.insertBefore(newChild, node.getNextSibling());
  +                        node = newChild;
  +                       
  +                        // issue warning
  +                        reportDOMError(
  +                            "CDATA sections containing the CDATA section 
termination marker ']]>'",
  +                            DOMError.SEVERITY_WARNING, node,  
"cdata-sections-splitted");
                       }
                   }
                   break;
  @@ -565,7 +564,7 @@
           //
           // ------------------------------------
   
  -        String localUri, value, name, uri, prefix;
  +        String value, name, uri, prefix;
           if (attributes != null) {
   
               // Record all valid local declarations
  @@ -581,15 +580,8 @@
   
                       // Check for invalid namespace declaration:
                       if (value.equals(NamespaceContext.XMLNS_URI)) {
  -                        if (fErrorHandler != null) {
  -                            modifyDOMError("No prefix other than 'xmlns' can be 
bound to 'http://www.w3.org/2000/xmlns/' namespace name", 
  -                                           DOMError.SEVERITY_ERROR, attr);
  -                            boolean continueProcess = 
fErrorHandler.handleError(fDOMError);
  -                            if (!continueProcess) {
  -                                // stop the namespace fixup and validation
  -                                throw new RuntimeException("Stopped at user 
request");
  -                            }
  -                        }
  +                        reportDOMError("No prefix other than 'xmlns' can be bound 
to 'http://www.w3.org/2000/xmlns/' namespace name", 
  +                                       DOMError.SEVERITY_ERROR, attr, null);
                       } else {
                           // XML 1.0 Attribute value normalization
                           // value = normalizeAttributeValue(value, attr);
  @@ -659,19 +651,10 @@
           } else { // Element has no namespace
               if (element.getLocalName() == null) {
                   //  Error: DOM Level 1 node!
  -                boolean continueProcess = true;
  -                if (fErrorHandler != null) {
  -                    if (fNamespaceValidation) {
  -                        modifyDOMError("DOM Level 1 node: "+element.getNodeName(), 
DOMError.SEVERITY_FATAL_ERROR, element);
  -                        fErrorHandler.handleError(fDOMError);
  -                    } else {
  -                        modifyDOMError("DOM Level 1 node: "+element.getNodeName(), 
DOMError.SEVERITY_ERROR, element);
  -                        continueProcess = fErrorHandler.handleError(fDOMError);
  -                    }
  -                }
  -                if (fNamespaceValidation || !continueProcess) {
  -                    // stop the namespace fixup and validation
  -                    throw new RuntimeException("DOM Level 1 node: 
"+element.getNodeName());
  +                if (fNamespaceValidation) {
  +                    reportDOMError("DOM Level 1 node: "+element.getNodeName(), 
DOMError.SEVERITY_FATAL_ERROR, element, null);
  +                } else {
  +                    reportDOMError("DOM Level 1 node: "+element.getNodeName(), 
DOMError.SEVERITY_ERROR, element, null);
                   }
               } else { // uri=null and no colon (DOM L2 node)
                   uri = fNamespaceContext.getURI(XMLSymbols.EMPTY_STRING);
  @@ -714,7 +697,7 @@
                       prefix = attr.getPrefix();
                       prefix = (prefix == null || 
                                 prefix.length() == 0) ? XMLSymbols.EMPTY_STRING 
:fSymbolTable.addSymbol(prefix);
  -                    String localpart = fSymbolTable.addSymbol( attr.getLocalName());
  +                    /*String localpart =*/ fSymbolTable.addSymbol( 
attr.getLocalName());
   
                       // ---------------------------------------
                       // skip namespace declarations 
  @@ -797,21 +780,11 @@
   
                       if (attr.getLocalName() == null) {
                           // It is an error if document has DOM L1 nodes.
  -                        boolean continueProcess = true;
  -                        if (fErrorHandler != null) {
  -                            if (fNamespaceValidation) {
  -                                modifyDOMError("DOM Level 1 node: "+name, 
DOMError.SEVERITY_FATAL_ERROR, attr);
  -                                fErrorHandler.handleError(fDOMError);
  -                            } else {
  -                                modifyDOMError("DOM Level 1 node: "+name, 
DOMError.SEVERITY_ERROR, attr);
  -                                continueProcess = 
fErrorHandler.handleError(fDOMError);
  -                            }
  -                        }
  -                        if (fNamespaceValidation || !continueProcess) {
  -                            // stop the namespace fixup and validation
  -                            throw new RuntimeException("DOM Level 1 node");
  +                        if (fNamespaceValidation) {
  +                            reportDOMError("DOM Level 1 node: "+name, 
DOMError.SEVERITY_FATAL_ERROR, attr, null);
  +                        } else {
  +                            reportDOMError("DOM Level 1 node: "+name, 
DOMError.SEVERITY_ERROR, attr, null );
                           }
  -
                       } else {
                           // uri=null and no colon
                           // no fix up is needed: default namespace decl does not 
  @@ -871,14 +844,26 @@
       }
       */
   
  -
  -    protected final DOMError modifyDOMError(String message, short severity, Node 
node){
  -        fDOMError.reset();
  -        fDOMError.fMessage = message;
  -        fDOMError.fSeverity = severity;
  -        fDOMError.fLocator = fLocator;
  -        fLocator.fRelatedNode = node;
  -        return fDOMError;
  +    /**
  +     * Reports a DOM error to the user handler.
  +     * 
  +     * If the error is fatal, the processing will be always aborted.
  +     */
  +    protected final void reportDOMError(String message, short severity, Node node, 
String type ){
  +        if( fErrorHandler!=null ) {
  +            DOMErrorImpl error = new DOMErrorImpl();
  +            error.reset();
  +            error.fMessage = message;
  +            error.fSeverity = severity;
  +            error.fLocator = fLocator;
  +            error.fType = type;
  +            fLocator.fRelatedNode = node;
  +    
  +            if(!fErrorHandler.handleError(error))
  +                throw abort;
  +        }
  +        if( severity==DOMError.SEVERITY_FATAL_ERROR )
  +            throw abort;
       }
   
       protected final void updateQName (Node node, QName qname){
  
  
  

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

Reply via email to