elena       2002/08/08 15:38:16

  Modified:    java/src/org/apache/xml/serialize XMLSerializer.java
                        BaseMarkupSerializer.java
  Log:
  More changes to namespace fixup algorithm.
  During serialization we need to have additional checks to make sure we don't
  output duplicate namespace declarations.
  
  Revision  Changes    Path
  1.39      +215 -270  xml-xerces/java/src/org/apache/xml/serialize/XMLSerializer.java
  
  Index: XMLSerializer.java
  ===================================================================
  RCS file: /home/cvs/xml-xerces/java/src/org/apache/xml/serialize/XMLSerializer.java,v
  retrieving revision 1.38
  retrieving revision 1.39
  diff -u -r1.38 -r1.39
  --- XMLSerializer.java        23 Jul 2002 19:51:53 -0000      1.38
  +++ XMLSerializer.java        8 Aug 2002 22:38:15 -0000       1.39
  @@ -126,14 +126,14 @@
    * @see Serializer
    */
   public class XMLSerializer
  -extends BaseMarkupSerializer{
  +extends BaseMarkupSerializer {
   
       //
       // constants
       //
   
       protected static final boolean DEBUG = false;
  -                              
  +
       // 
       // data
       //
  @@ -159,6 +159,7 @@
       protected boolean fDOML1 = false;
       // counter for new prefix names
       protected int fNamespaceCounter = 1;
  +    protected final static String PREFIX = "NS";
   
       /**
        * Controls whether namespace fixup should be performed during
  @@ -228,7 +229,7 @@
           super.setOutputFormat( format != null ? format : new OutputFormat( 
Method.XML, null, false ) );
       }
   
  -    
  +
   
   
       //-----------------------------------------//
  @@ -266,8 +267,7 @@
                   // to that of the output format.
                   if (! _started)
                       startDocument( ( localName == null || localName.length() == 0 ) 
? rawName : localName );
  -            }
  -            else {
  +            } else {
                   // For any other element, if first in parent, then
                   // close parent's opening tag and use the parnet's
                   // space preserving.
  @@ -305,8 +305,7 @@
                           rawName = prefix + ":" + localName;
                       else
                           rawName = localName;
  -                }
  -                else
  +                } else
                       rawName = localName;
                   addNSAttr = true;
               }
  @@ -370,8 +369,7 @@
                           _printer.printText( "xmlns=\"" );
                           printEscaped( value );
                           _printer.printText( '"' );
  -                    }
  -                    else {
  +                    } else {
                           _printer.printText( "xmlns:" );
                           _printer.printText( name );
                           _printer.printText( "=\"" );
  @@ -388,8 +386,7 @@
               name = ( localName == null || localName.length() == 0 ) ? rawName : 
namespaceURI + "^" + localName;
               state.doCData = _format.isCDataElement( name );
               state.unescaped = _format.isNonEscapingElement( name );
  -        }
  -        catch (IOException except) {
  +        } catch (IOException except) {
               throw new SAXException( except );
           }
       }
  @@ -401,8 +398,7 @@
       {
           try {
               endElementIO( namespaceURI, localName, rawName );
  -        }
  -        catch (IOException except) {
  +        } catch (IOException except) {
               throw new SAXException( except );
           }
       }
  @@ -423,8 +419,7 @@
           state = getElementState();
           if (state.empty) {
               _printer.printText( "/>" );
  -        }
  -        else {
  +        } else {
               // Must leave CData section first
               if (state.inCData)
                   _printer.printText( "]]>" );
  @@ -481,8 +476,7 @@
                   // to that of the output format.
                   if (! _started)
                       startDocument( tagName );
  -            }
  -            else {
  +            } else {
                   // For any other element, if first in parent, then
                   // close parent's opening tag and use the parnet's
                   // space preserving.
  @@ -541,8 +535,7 @@
               state = enterElementState( null, null, tagName, preserveSpace );
               state.doCData = _format.isCDataElement( tagName );
               state.unescaped = _format.isNonEscapingElement( tagName );
  -        }
  -        catch (IOException except) {
  +        } catch (IOException except) {
               throw new SAXException( except );
           }
   
  @@ -622,12 +615,10 @@
                               _printer.breakLine();
                               for (i = 0 ; i < 18 + rootTagName.length() ; ++i)
                                   _printer.printText( " " );
  -                        }
  -                        else
  +                        } else
                               _printer.printText( " " );
                           printDoctypeURL( _docTypeSystemId );
  -                    }
  -                    else {
  +                    } else {
                           _printer.printText( " SYSTEM " );
                           printDoctypeURL( _docTypeSystemId );
                       }
  @@ -642,8 +633,7 @@
   
                       _printer.printText( ">" );
                       _printer.breakLine();
  -                }
  -                else if (dtd != null && dtd.length() > 0) {
  +                } else if (dtd != null && dtd.length() > 0) {
                       _printer.printText( "<!DOCTYPE " );
                       _printer.printText( rootTagName );
                       _printer.printText( " [" );
  @@ -676,10 +666,10 @@
           String       value;
           String       tagName;
   
  -        String prefix;
  +        String prefix, localUri;
           String uri;
           if (fNamespaces) {
  -        
  +
               // reset local binder
               fLocalNSBinder.reset(fSymbolTable);
               // note: the values that added to namespace binder
  @@ -706,8 +696,7 @@
               if (! _started) {
                   startDocument( tagName);
               }
  -        }
  -        else {
  +        } else {
               // For any other element, if first in parent, then
               // close parent's opening tag and use the parent's
               // space preserving.
  @@ -730,22 +719,22 @@
           // This only happens in endElement().
           fPreserveSpace = state.preserveSpace;
   
  -        
  +
           int length = 0;
           attrMap = null;
           // retrieve attributes 
           if (elem.hasAttributes()) {
  -          attrMap = elem.getAttributes();
  -          length = attrMap.getLength();
  +            attrMap = elem.getAttributes();
  +            length = attrMap.getLength();
           }
   
           if (!fNamespaces) { // no namespace fixup should be perform                 
   
  -           
  +
               // serialize element name
               _printer.printText( '<' );
               _printer.printText( tagName );
               _printer.indent();
  -            
  +
               // For each attribute print it's name and value as one part,
               // separated with a space so the element can be broken on
               // multiple lines.
  @@ -772,9 +761,64 @@
                           fPreserveSpace = _format.getPreserveSpace();
                   }
               }
  -        }
  -        else { // do namespace fixup
  -            
  +        } else { // do namespace fixup
  +
  +            // REVISIT: some optimization could probably be done to avoid 
traversing 
  +            //          attributes twice.
  +            //
  +
  +            // ---------------------------------------
  +            // record all valid namespace declarations
  +            // before attempting to fix element's namespace
  +            // ---------------------------------------
  +            for (i = 0;i < length;i++) {
  +
  +                attr = (Attr) attrMap.item( i );
  +                uri = attr.getNamespaceURI();
  +                // check if attribute is a namespace decl 
  +                if (uri != null && uri.equals(NamespaceSupport.XMLNS_URI)) {
  +
  +                    value = attr.getNodeValue();
  +                    if (value == null) {
  +                        value=fEmptySymbol;
  +                    }
  +
  +                    if (value.equals(NamespaceSupport.XMLNS_URI)) {
  +                        if (fDOMErrorHandler != 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 = 
fDOMErrorHandler.handleError(fDOMError);
  +                            if (!continueProcess) {
  +                                // stop the namespace fixup and validation
  +                                throw new RuntimeException("Stopped at user 
request");
  +                            }
  +                        }
  +                    } else {
  +                        prefix = attr.getPrefix();
  +                        prefix = (prefix == null || 
  +                                  prefix.length() == 0) ? fEmptySymbol 
:fSymbolTable.addSymbol(prefix);
  +                        String localpart = fSymbolTable.addSymbol( 
attr.getLocalName());
  +                        if (prefix == fXmlnsSymbol) { //xmlns:prefix
  +                            value = fSymbolTable.addSymbol(value);
  +                            // record valid decl
  +                            if (value.length() != 0) {
  +                                fNSBinder.declarePrefix(localpart, value);
  +                            } else {
  +                                // REVISIT: issue error on invalid declarations
  +                                //          xmlns:foo = ""
  +                            }
  +                            continue;
  +                        } else { // xmlns
  +                            // empty prefix is always bound ("" or some string)
  +
  +                            value = fSymbolTable.addSymbol(value);
  +                            fNSBinder.declarePrefix(fEmptySymbol, value);
  +                            continue;
  +                        }
  +                    }  // end-else: valid declaration
  +                } // end-if: namespace declaration 
  +            }  // end-for
  +
               //-----------------------
               // get element uri/prefix
               //-----------------------
  @@ -788,21 +832,19 @@
               // REVISIT: this could be removed if we always convert empty string to 
null
               //          for the namespaces.
               if ((uri !=null && prefix !=null ) && uri.length() == 0 && 
prefix.length()!=0) {
  -                 // uri is an empty string and element has some prefix
  +                // uri is an empty string and element has some prefix
                   // the namespace alg later will fix up the namespace attributes
                   // remove element prefix 
                   prefix = null; 
                   _printer.printText( '<' );
                   _printer.printText( elem.getLocalName() );
                   _printer.indent();
  -            }
  -            else {
  +            } else {
                   _printer.printText( '<' );
                   _printer.printText( tagName );
                   _printer.indent();
               }
   
  -            // REVISIT: should we report error/warning if DOM 1 nodes mix with DOM 
2 nodes?
   
               // ---------------------------------------------------------
               // Fix up namespaces for element: per DOM L3 
  @@ -819,84 +861,69 @@
               // We need to bind default namespace to empty string, to be able to 
               // omit duplicate declarations for the same element
               //
  +            // case 3: <xsl:stylesheet xmlns:xsl="http://xsl";>
  +            // We create another element body bound to the "http://xsl"; namespace
  +            // as well as namespace attribute rebounding xsl to another namespace.
  +            // <xsl:body xmlns:xsl="http://another";>
  +            // Need to make sure that the new namespace decl value is changed to 
  +            // "http://xsl";
  +            //
               // ---------------------------------------------------------
               // check if prefix/namespace is correct for current element
               // ---------------------------------------------------------
  +
  +
               if (uri != null) {  // Element has a namespace
                   uri = fSymbolTable.addSymbol(uri);
                   prefix = (prefix == null || 
                             prefix.length() == 0) ? fEmptySymbol 
:fSymbolTable.addSymbol(prefix);
                   if (fNSBinder.getURI(prefix) == uri) {
  -                // The xmlns:prefix=namespace or xmlns="default" was declared at 
parent.
  -                // The binder always stores mapping of empty prefix to "".
  -                // (NOTE: local binder does not store this kind of binding!)
  -                // Thus the case where element was declared with uri="" (with or 
without a prefix)
  -                // will be covered here.
  +                    // The xmlns:prefix=namespace or xmlns="default" was declared 
at parent.
  +                    // The binder always stores mapping of empty prefix to "".
  +                    // (NOTE: local binder does not store this kind of binding!)
  +                    // Thus the case where element was declared with uri="" (with 
or without a prefix)
  +                    // will be covered here.
   
  -                }
  -                else {
  +                } else {
                       // the prefix is either undeclared 
                       // or
                       // conflict: the prefix is bound to another URI
                       printNamespaceAttr(prefix, uri);
                       fLocalNSBinder.declarePrefix(prefix, uri);
  -                    fNSBinder.declarePrefix(prefix, uri);
  +                    //fNSBinder.declarePrefix(prefix, uri);
                   }
  -            }
  -            else { // Element has no namespace
  +            } else { // Element has no namespace
                   int colon = tagName.indexOf(':');
                   if (colon > -1) {
                       //  DOM Level 1 node!
  -                    int colon2 = tagName.lastIndexOf(':');
  -                    if (colon != colon2) {
  -                        //not a QName: report an error
  -                        if (fDOMErrorHandler != null) {
  -                            String msg = 
DOMMessageFormatter.formatMessage(DOMMessageFormatter.SERIALIZER_DOMAIN, 
"ElementQName", new Object[]{tagName});
  -                            modifyDOMError(msg, DOMError.SEVERITY_ERROR);
  -                            boolean continueProcess = 
fDOMErrorHandler.handleError(fDOMError);
  -                            // REVISIT: should we terminate upon request?           
             
  -                        }
  -                    }
  -                    else {
  -                        // if we got here no namespace processing was performed
  -                        // report warnings
  -                        if (fDOMErrorHandler != null) {
  -                            String msg = 
DOMMessageFormatter.formatMessage(DOMMessageFormatter.SERIALIZER_DOMAIN, 
"ElementPrefix", new Object[]{tagName});
  -                            modifyDOMError(msg, DOMError.SEVERITY_WARNING);
  -                            boolean continueProcess = 
fDOMErrorHandler.handleError(fDOMError);
  +
  +                    if (fDOMErrorHandler != null) {
  +                        String msg = 
DOMMessageFormatter.formatMessage(DOMMessageFormatter.SERIALIZER_DOMAIN, 
"ElementQName", new Object[]{tagName});
  +                        modifyDOMError(msg, DOMError.SEVERITY_ERROR, elem);
  +                        boolean continueProcess = 
fDOMErrorHandler.handleError(fDOMError);
  +                        // REVISIT: should we terminate upon request?
  +                        if (!continueProcess) {
  +                            throw new RuntimeException("Process stoped at user 
request");
                           }
                       }
  -                }
  -                else { // uri=null and no colon (DOM L2 node)
  +                } else { // uri=null and no colon (DOM L2 node)
                       uri = fNSBinder.getURI(fEmptySymbol);
  -                    
  +
                       if (uri !=null && uri.length() > 0) {
                           // there is a default namespace decl that is bound to
                           // non-zero length uri, output xmlns=""
                           printNamespaceAttr(fEmptySymbol, fEmptySymbol);
                           fLocalNSBinder.declarePrefix(fEmptySymbol, fEmptySymbol);
  -                        fNSBinder.declarePrefix(fEmptySymbol, fEmptySymbol);
  +                        //fNSBinder.declarePrefix(fEmptySymbol, fEmptySymbol);
                       }
                   }
               }
   
  +
               // -----------------------------------------
               // Fix up namespaces for attributes: per DOM L3 
               // check if prefix/namespace is correct the attributes
               // -----------------------------------------
  -            String localUri;
  -
  -            // REVISIT: common code for handling namespace attributes for DOM L2 
nodes
  -            //          and DOM L1 nodes. Currently because we don't skip invalid 
declarations
  -            //          for L1, we might output more namespace declarations than we 
would have
  -            //          if namespace processing was performed (duplicate decls on 
different elements)
  -            // Open issues:
  -            // 1. Is it allowed to mix DOM L1 with DOM L2 nodes
  -            // 2. Should we skip invalid namespace declarations or attributes not 
with QName
  -            //    [what should be the default behaviour]
  -            // 3. What should happen if the tree is DOM L1 tree (no namespace 
processing was
  -            //    performed)? Should we attempt any fixup??
  -            //
   
               for (i = 0; i < length; i++) {
   
  @@ -926,44 +953,48 @@
                       String localpart = fSymbolTable.addSymbol( attr.getLocalName());
   
   
  -                    // check if attribute is a namespace decl 
  -                    if (prefix == fXmlnsSymbol) { //xmlns:prefix
  -                        uri =  fNSBinder.getURI(localpart); // global prefix mapping
  -                        localUri = fLocalNSBinder.getURI(localpart);  // local 
prefix mapping
  -                        value = fSymbolTable.addSymbol(value);
  -                        // REVISIT: don't output local declaration which is 
identical to the 
  -                        // global declaration  
  -                        // uri == null || ( localUri == null && !uri.equals(value)
  -                        if (uri == null || localUri == null) {
  -                            // REVISIT: we are skipping invalid decls
  -                            //          xmlns:foo = ""
  -                            if (value.length() != 0) { 
  -                                printNamespaceAttr(localpart, value);
  -                                fNSBinder.declarePrefix(localpart, value);
  -                                fLocalNSBinder.declarePrefix(localpart, value);
  +
  +                    // ---------------------------------------------------
  +                    // print namespace declarations namespace declarations 
  +                    // ---------------------------------------------------
  +                    if (uri != null && uri.equals(NamespaceSupport.XMLNS_URI)) {
  +                        // check if we need to output this declaration
  +                        prefix = attr.getPrefix();
  +                        prefix = (prefix == null || 
  +                                  prefix.length() == 0) ? fEmptySymbol 
:fSymbolTable.addSymbol(prefix);
  +                        localpart = fSymbolTable.addSymbol( attr.getLocalName());
  +                        if (prefix == fXmlnsSymbol) { //xmlns:prefix
  +                            localUri = fLocalNSBinder.getURI(localpart);  // local 
prefix mapping
  +                            value = fSymbolTable.addSymbol(value);
  +                            if (value.length() != 0 ) {
  +                                // add declaration to the global binder.
  +                                if (localUri != null) {
  +                                    // declaration was redeclared and printed above
  +                                    fNSBinder.declarePrefix(localpart, localUri);
  +                                } else {
  +                                    printNamespaceAttr(localpart, value);
  +                                }
  +                            } else {
  +                                // REVISIT: issue error on invalid declarations
  +                                //          xmlns:foo = ""
                               }
  +                            continue;
  +                        } else { // xmlns
  +                            // empty prefix is always bound ("" or some string)
  +
  +                            uri = fNSBinder.getURI(fEmptySymbol);
  +                            localUri=fLocalNSBinder.getURI(fEmptySymbol);
  +                            value = fSymbolTable.addSymbol(value);
  +                            if (localUri != null) {
  +                                // declaration was redeclared and printed above
  +                                fNSBinder.declarePrefix(fEmptySymbol, value);
  +                            } else {
  +                                printNamespaceAttr(fEmptySymbol, value);
  +                            }
  +                            continue;
                           }
  -                        continue;
  -                    }
  -                    else if (localpart == fXmlnsSymbol && prefix == fEmptySymbol) { 
// xmlns
  -                        // empty prefix is always bound ("" or some string)
  -                        uri = fNSBinder.getURI(fEmptySymbol);
  -                        localUri=fLocalNSBinder.getURI(fEmptySymbol);
  -                        value = fSymbolTable.addSymbol(value);
  -                        if (localUri == null) {
  -                            // there was no local default ns decl
  -
  -                            // REVISIT: should we output duplicate xmlns="" decls?
  -                            //if (value.length() !=0 && !uri.equals(value)) {
  -                            
  -                            printNamespaceAttr(fEmptySymbol, value);
  -                            fLocalNSBinder.declarePrefix(fEmptySymbol, value);
  -                            fNSBinder.declarePrefix(fEmptySymbol, value);
  -                            
  -                        }
  -                        continue;
  -                    }
   
  +                    }
                       uri = fSymbolTable.addSymbol(uri);
   
                       // find if for this prefix a URI was already declared
  @@ -979,143 +1010,70 @@
                           name  = attr.getNodeName();
                           // Find if any prefix for attributes namespace URI is 
available
                           // in the scope
  -                        String declaredPrefix = fNSBinder.getPrefix(uri);
  -                        if (declaredPrefix == null || declaredPrefix == 
fEmptySymbol) {
  -                            // could not find a prefix/prefix is empty string
  +
  +                        String declaredPrefix = fLocalNSBinder.getPrefix(uri);
  +                        if (declaredPrefix == null) {
  +                            declaredPrefix = fNSBinder.getPrefix(uri);
  +
  +                        }
  +
  +                        if (declaredPrefix !=null && declaredPrefix !=fEmptySymbol) 
{
  +                            // use the prefix that was found
  +                            prefix = declaredPrefix;
  +                            name=prefix+":"+localpart;
  +                        } else {
                               if (DEBUG) {
                                   System.out.println("==> cound not find prefix for 
the attribute: " +prefix);
                               }
  -                            if (prefix != fEmptySymbol) {
  -                                // no need to create a new prefix:
  -                                // use the one on the attribute
  -                            }
  -                            else {
  -                                // create new prefix
  -                                prefix = "NS" +fNamespaceCounter++; 
  +
  +                            if (prefix != fEmptySymbol && 
fLocalNSBinder.getURI(prefix) == null) {
  +                                // the current prefix is not null and it has no in 
scope declaration
  +
  +                                // use this prefix
  +                            } else {
  +                                // find a prefix following the pattern "NS" +index 
(starting at 1)
  +                                // make sure this prefix is not declared in the 
current scope.
  +                                prefix = fSymbolTable.addSymbol(PREFIX 
+fNamespaceCounter++);
  +                                while (fLocalNSBinder.getURI(prefix)!=null) {
  +                                    prefix = fSymbolTable.addSymbol(PREFIX 
+fNamespaceCounter++);
  +                                }
  +                                name=prefix+":"+localpart;
                               }
                               // add declaration for the new prefix
                               printNamespaceAttr(prefix, uri);
                               value = fSymbolTable.addSymbol(value);
                               fLocalNSBinder.declarePrefix(prefix, value);
                               fNSBinder.declarePrefix(prefix, uri);
  -                        }
  -                        else {
  -                            // use the prefix that was found (declared previously 
for this URI
  -                            prefix = declaredPrefix;
  -                        }
  -                        name=prefix+":"+localpart;
  +                        }                        
  +
                           // change prefix for this attribute
                       }
   
                       printAttribute (name, (value==null)?fEmptySymbol:value, 
attr.getSpecified());
  -                }
  -                else { // attribute uri == null
  +                } else { // attribute uri == null
   
                       // data
                       int colon = name.indexOf(':');
  -                    int colon2 = name.lastIndexOf(':');
  -                    //
  -                    // process namespace declarations
  -                    //
  -                    if (name.startsWith(fXmlnsSymbol)) {
  -                        //
  -                        //  DOM Level 1 node!
  -                        // 
  -                        if (colon < 0) {  // xmlns decl
  -                            // empty prefix is always bound ("" or some string)
  -                            uri = fNSBinder.getURI(fEmptySymbol); 
  -                            localUri=fLocalNSBinder.getURI(fEmptySymbol);
  -                            if (localUri == null) {
  -                            
  -                              // REVISIT: should we output duplicate xmlns="" decls?
  -                              //if (value.length() !=0 && !uri.equals(value)) {
  -
  -                                value = fSymbolTable.addSymbol(value);
  -                                fNSBinder.declarePrefix(fEmptySymbol, value);
  -                                fLocalNSBinder.declarePrefix(fEmptySymbol, value);
  -                                printAttribute (name, value, attr.getSpecified());
  -                            }
  -                            continue;
  -                        }
  -                        else if (colon == colon2) { // xmlns:prefix decl
  -                            // get prefix
  -                            prefix = name.substring(6);
  -                            prefix = (prefix.length() ==0) ? fEmptySymbol 
:fSymbolTable.addSymbol(prefix);
  -                            if (prefix.length() == 0) {
  -                                // report an error - invalid namespace declaration
  -                                if (fDOMErrorHandler != null) {
  -                                    String msg = 
DOMMessageFormatter.formatMessage(DOMMessageFormatter.SERIALIZER_DOMAIN, 
"InvalidNSDecl", new Object[]{name});
  -                                    modifyDOMError(msg, DOMError.SEVERITY_ERROR);
  -                                    boolean continueProcess = 
fDOMErrorHandler.handleError(fDOMError);
  -                                }
  -                                // REVISIT: skip invalid declaration?
  -                                // report an error later on
  -                                //continue;
  -
  -                            }
  -                            else if (value.length() == 0) {
  -                                if (fDOMErrorHandler != null) {
  -                                    String msg = 
DOMMessageFormatter.formatMessage(DOMMessageFormatter.SERIALIZER_DOMAIN, 
"InvalidNSDecl", new Object[]{name});
  -                                    modifyDOMError(msg, DOMError.SEVERITY_ERROR);
  -                                    boolean continueProcess = 
fDOMErrorHandler.handleError(fDOMError);
  -                                }
  -                                // REVISIT: skip invalid declaration?
  -                                // report an error later on
  -                                //continue;
  -                            }
  -
  -                            uri =  fNSBinder.getURI(prefix);           // global 
prefix mapping
  -                            localUri = fLocalNSBinder.getURI(prefix);  // local 
prefix mapping
  -                            if (uri == null || localUri == null) {
  -                                // REVISIT: we are skipping invalid decls
  -                                //          xmlns:foo = ""
  -                                if (value.length() != 0) { 
  -                                    //printNamespaceAttr(prefix, value);
  -
  -                                    value = fSymbolTable.addSymbol(value);
  -                                    fNSBinder.declarePrefix(prefix, value);
  -                                    fLocalNSBinder.declarePrefix(prefix, value);
  -                                   
  -                                }
  -                                // REVISIT: only if we can skip continue;
  -                            }
  -                        }
  -                    }
  -
  -                    if (colon > -1) {
  -                        //
  -                        //  DOM Level 1 node!
  -                        // 
  -                        if (colon != colon2) {
  -                            //not a QName: report an error
  -                            if (fDOMErrorHandler != null) {
  -                                String msg = 
DOMMessageFormatter.formatMessage(DOMMessageFormatter.SERIALIZER_DOMAIN, 
"AttributeQName", new Object[]{name});
  -                                modifyDOMError(msg, DOMError.SEVERITY_ERROR);
  -                                boolean continueProcess = 
fDOMErrorHandler.handleError(fDOMError);                                               
         
  -                            }
  -
  -                        }
  -                        else {
  -                            // if we got here no namespace processing was performed
  -                            // report warnings
  -                            if (fDOMErrorHandler != null) {
  -                                String msg = 
DOMMessageFormatter.formatMessage(DOMMessageFormatter.SERIALIZER_DOMAIN, 
"AttributePrefix", new Object[]{name});
  -                                modifyDOMError(msg, DOMError.SEVERITY_WARNING);
  -                                boolean continueProcess = 
fDOMErrorHandler.handleError(fDOMError);
  +                    if (colon < 0) {
  +                        if (fDOMErrorHandler != null) {
  +                            modifyDOMError("DOM Level 1 Node: "+name, 
  +                                           DOMError.SEVERITY_ERROR, attr);
  +                            boolean continueProcess = 
fDOMErrorHandler.handleError(fDOMError);
  +                            if (!continueProcess) {
  +                                // stop the namespace fixup and validation
  +                                throw new RuntimeException("Stopped at user 
request");
                               }
  +                            printAttribute (name, value, attr.getSpecified());
                           }
  +                    } else { // uri=null and no colon
   
  -                        printAttribute (name, value, attr.getSpecified());
  -                    }
  -                    else { // uri=null and no colon
                           // no fix up is needed: default namespace decl does not 
                           // apply to attributes
  -
                           printAttribute (name, value, attr.getSpecified());
                       }
                   }
               } // end loop for attributes
  -         
  +
           }// end namespace fixup algorithm
   
   
  @@ -1132,16 +1090,15 @@
                   serializeNode( child );
                   child = child.getNextSibling();
               }
  -            if (fNamespaces) {                
  +            if (fNamespaces) {
                   fNSBinder.popContext();
               }
               endElementIO( null, null, tagName );
  -        }
  -        else {
  +        } else {
               if (DEBUG) {
                   System.out.println("==>endElement: " +elem.getNodeName());
               }
  -            if (fNamespaces) {                
  +            if (fNamespaces) {
                   fNSBinder.popContext();
               }
               _printer.unindent();
  @@ -1173,8 +1130,7 @@
                   System.out.println("=>add xmlns=\""+uri+"\" declaration");
               }
               _printer.printText( fXmlnsSymbol );
  -        }
  -        else {
  +        } else {
               if (DEBUG) {
                   System.out.println("=>add xmlns:"+prefix+"=\""+uri+"\" 
declaration");
               }
  @@ -1185,7 +1141,7 @@
           _printer.printText( '"' );
       }
   
  -   
  +
   
       /**
        * Prints attribute. 
  @@ -1266,8 +1222,7 @@
                   if (rawName.length() == 5) {
                       startPrefixMapping( "", attrs.getValue( i ) );
                       attrsOnly.removeAttribute( i );
  -                }
  -                else if (rawName.charAt(5) == ':') {
  +                } else if (rawName.charAt(5) == ':') {
                       startPrefixMapping(rawName.substring(6), attrs.getValue(i));
                       attrsOnly.removeAttribute( i );
                   }
  @@ -1275,7 +1230,7 @@
           }
           return attrsOnly;
       }
  -   
  +
       //
       // overwrite printing functions to make sure serializer prints out valid XML
       //
  @@ -1286,8 +1241,7 @@
               if (!XMLChar.isValid(ch)) {
                   if (++i <length) {
                       surrogates(ch, source.charAt(i));
  -                } 
  -                else {
  +                } else {
                       fatalError("The character '"+(char)ch+"' is an invalid XML 
character"); 
                   }
                   continue;
  @@ -1301,20 +1255,16 @@
   
           if ( ch == '<') {
               _printer.printText("&lt;");
  -        }
  -        else  if (ch == '&') {
  +        } else if (ch == '&') {
               _printer.printText("&amp;");
  -        } 
  -        else if ( ch == '"') {
  +        } else if ( ch == '"') {
               // REVISIT: for character data we should not convert this into 
               //          char reference
               _printer.printText("&quot;");
  -        }
  -        else if ( ( ch >= ' ' && _encodingInfo.isPrintable(ch)) ||
  +        } else if ( ( ch >= ' ' && _encodingInfo.isPrintable(ch)) ||
                       ch == '\n' || ch == '\r' || ch == '\t' ) {
               _printer.printText((char)ch);
  -        } 
  -        else {
  +        } else {
               // The character is not printable, print as character reference.
               _printer.printText( "&#x" );
               _printer.printText(Integer.toHexString(ch));
  @@ -1325,7 +1275,7 @@
   
   
       protected void printText( String text, boolean preserveSpace, boolean unescaped 
)
  -        throws IOException {
  +    throws IOException {
           int index;
           char ch;
           int length = text.length();
  @@ -1340,16 +1290,14 @@
                       // check if it is surrogate
                       if (++index <length) {
                           surrogates(ch, text.charAt(index));
  -                    } 
  -                    else {
  +                    } else {
                           fatalError("The character '"+(char)ch+"' is an invalid XML 
character"); 
                       }
                       continue;
  -                } 
  -                if ( unescaped ) { 
  -                    _printer.printText( ch );
                   }
  -                else
  +                if ( unescaped ) {
  +                    _printer.printText( ch );
  +                } else
                       printXMLChar( ch );
               }
           } else {
  @@ -1364,12 +1312,11 @@
                       // check if it is surrogate
                       if (++index <length) {
                           surrogates(ch, text.charAt(index));
  -                    } 
  -                    else {
  +                    } else {
                           fatalError("The character '"+(char)ch+"' is an invalid XML 
character"); 
                       }
                       continue;
  -                } 
  +                }
                   if ( XMLChar.isSpace(ch))
                       _printer.printSpace();
                   else if ( unescaped )
  @@ -1383,7 +1330,7 @@
   
   
       protected void printText( char[] chars, int start, int length,
  -                                    boolean preserveSpace, boolean unescaped ) 
throws IOException {
  +                              boolean preserveSpace, boolean unescaped ) throws 
IOException {
           int index;
           char ch;
   
  @@ -1399,12 +1346,11 @@
                       // check if it is surrogate
                       if (++start <length) {
                           surrogates(ch, chars[start]);
  -                    } 
  -                    else {
  +                    } else {
                           fatalError("The character '"+(char)ch+"' is an invalid XML 
character"); 
                       }
                       continue;
  -                } 
  +                }
                   if ( unescaped )
                       _printer.printText( ch );
                   else
  @@ -1424,12 +1370,11 @@
                       // check if it is surrogate
                       if (++start <length) {
                           surrogates(ch, chars[start]);
  -                    } 
  -                    else {
  +                    } else {
                           fatalError("The character '"+(char)ch+"' is an invalid XML 
character"); 
                       }
                       continue;
  -                } 
  +                }
                   if ( XMLChar.isSpace(ch))
                       _printer.printSpace();
                   else if ( unescaped )
  
  
  
  1.40      +6 -6      
xml-xerces/java/src/org/apache/xml/serialize/BaseMarkupSerializer.java
  
  Index: BaseMarkupSerializer.java
  ===================================================================
  RCS file: 
/home/cvs/xml-xerces/java/src/org/apache/xml/serialize/BaseMarkupSerializer.java,v
  retrieving revision 1.39
  retrieving revision 1.40
  diff -u -r1.39 -r1.40
  --- BaseMarkupSerializer.java 23 Jul 2002 19:51:53 -0000      1.39
  +++ BaseMarkupSerializer.java 8 Aug 2002 22:38:15 -0000       1.40
  @@ -1485,7 +1485,7 @@
                       if (!getFeature(Constants.DOM_SPLIT_CDATA)) {
                           // issue fatal error
                           String msg = 
DOMMessageFormatter.formatMessage(DOMMessageFormatter.SERIALIZER_DOMAIN, 
"EndingCDATA", null);
  -                        modifyDOMError(msg, DOMError.SEVERITY_FATAL_ERROR);
  +                        modifyDOMError(msg, DOMError.SEVERITY_FATAL_ERROR, 
fCurrentNode);
                           boolean continueProcess = 
fDOMErrorHandler.handleError(fDOMError);
                           if (!continueProcess) {
                               throw new IOException();
  @@ -1493,7 +1493,7 @@
                       } else {
                           // issue warning
                           String msg = 
DOMMessageFormatter.formatMessage(DOMMessageFormatter.SERIALIZER_DOMAIN, 
"SplittingCDATA", null);
  -                        modifyDOMError(msg, DOMError.SEVERITY_WARNING);
  +                        modifyDOMError(msg, DOMError.SEVERITY_WARNING, 
fCurrentNode);
                           fDOMErrorHandler.handleError(fDOMError);
                       }
                   }
  @@ -1865,11 +1865,11 @@
        * @param severity
        * @return a DOMError
        */
  -    protected DOMError modifyDOMError(String message, short severity){
  +    protected DOMError modifyDOMError(String message, short severity, Node node){
               fDOMError.reset();
               fDOMError.setMessage(message);
               fDOMError.setSeverity(severity);
  -            fDOMError.setLocator(new DOMLocatorImpl(-1, -1, -1, fCurrentNode, 
null));
  +            fDOMError.setLocator(new DOMLocatorImpl(-1, -1, -1, node, null));
               return fDOMError;
           
       }
  @@ -1881,7 +1881,7 @@
   
       protected void fatalError(String message) throws IOException{
           if (fDOMErrorHandler != null) {
  -            modifyDOMError(message, DOMError.SEVERITY_FATAL_ERROR);
  +            modifyDOMError(message, DOMError.SEVERITY_FATAL_ERROR, fCurrentNode);
               fDOMErrorHandler.handleError(fDOMError);
           } 
           else {
  
  
  

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

Reply via email to