sandygao 2002/08/13 16:03:13 Modified: java/src/org/apache/xml/serialize DOMWriterImpl.java XMLSerializer.java Log: 1. Trying to improve the use of symbol tables. Many predefined Strings are added to symbol tables every time the parser is reset. For small documents, this would be a significant cost. Now since we call String#intern for Strings in the symbol table, it's sufficient to use String#intern for those predefined symbols. This only needs to be performed once. 2. These commonly used symbols are gethered together in a new class XMLSymbols. Revision Changes Path 1.4 +3 -5 xml-xerces/java/src/org/apache/xml/serialize/DOMWriterImpl.java Index: DOMWriterImpl.java =================================================================== RCS file: /home/cvs/xml-xerces/java/src/org/apache/xml/serialize/DOMWriterImpl.java,v retrieving revision 1.3 retrieving revision 1.4 diff -u -r1.3 -r1.4 --- DOMWriterImpl.java 17 Jul 2002 00:28:11 -0000 1.3 +++ DOMWriterImpl.java 13 Aug 2002 23:03:13 -0000 1.4 @@ -72,6 +72,7 @@ import org.apache.xerces.impl.Constants; import org.apache.xerces.util.SymbolTable; +import org.apache.xerces.util.XMLSymbols; import org.apache.xerces.util.NamespaceSupport; import java.io.IOException; @@ -418,11 +419,8 @@ serializer.fNSBinder.reset(serializer.fSymbolTable); // during serialization always have a mapping to empty string // so we assume there is a declaration. - serializer.fNSBinder.declarePrefix(serializer.fEmptySymbol, serializer.fEmptySymbol); + serializer.fNSBinder.declarePrefix(XMLSymbols.EMPTY_STRING, XMLSymbols.EMPTY_STRING); serializer.fNamespaceCounter = 1; - serializer.fXmlSymbol = serializer.fSymbolTable.addSymbol("xml"); - serializer.fXmlnsSymbol = serializer.fSymbolTable.addSymbol("xmlns"); - serializer.fEmptySymbol = serializer.fSymbolTable.addSymbol(""); return true; } 1.40 +29 -32 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.39 retrieving revision 1.40 diff -u -r1.39 -r1.40 --- XMLSerializer.java 8 Aug 2002 22:38:15 -0000 1.39 +++ XMLSerializer.java 13 Aug 2002 23:03:13 -0000 1.40 @@ -89,6 +89,7 @@ import org.xml.sax.helpers.AttributesImpl; import org.apache.xerces.util.SymbolTable; +import org.apache.xerces.util.XMLSymbols; import org.apache.xerces.util.NamespaceSupport; import org.apache.xerces.util.XMLChar; import org.apache.xerces.dom.DOMMessageFormatter; @@ -151,10 +152,6 @@ /** symbol table for serialization */ protected SymbolTable fSymbolTable; - protected String fEmptySymbol; - protected String fXmlSymbol; - protected String fXmlnsSymbol; - // is node dom level 1 node? protected boolean fDOML1 = false; // counter for new prefix names @@ -166,7 +163,7 @@ * the serialization. * NOTE: if this field is set to true the following * fields need to be initialized: fNSBinder, fLocalNSBinder, fSymbolTable, - * fEmptySymbol, fXmlSymbol, fXmlnsSymbol, fNamespaceCounter. + * XMLSymbols.EMPTY_STRING, fXmlSymbol, fXmlnsSymbol, fNamespaceCounter. */ protected boolean fNamespaces = false; @@ -776,14 +773,14 @@ attr = (Attr) attrMap.item( i ); uri = attr.getNamespaceURI(); // check if attribute is a namespace decl - if (uri != null && uri.equals(NamespaceSupport.XMLNS_URI)) { + if (uri != null && uri.equals(XMLSymbols.XMLNS_URI)) { value = attr.getNodeValue(); if (value == null) { - value=fEmptySymbol; + value=XMLSymbols.EMPTY_STRING; } - if (value.equals(NamespaceSupport.XMLNS_URI)) { + if (value.equals(XMLSymbols.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); @@ -796,9 +793,9 @@ } else { prefix = attr.getPrefix(); prefix = (prefix == null || - prefix.length() == 0) ? fEmptySymbol :fSymbolTable.addSymbol(prefix); + prefix.length() == 0) ? XMLSymbols.EMPTY_STRING :fSymbolTable.addSymbol(prefix); String localpart = fSymbolTable.addSymbol( attr.getLocalName()); - if (prefix == fXmlnsSymbol) { //xmlns:prefix + if (prefix == XMLSymbols.PREFIX_XMLNS) { //xmlns:prefix value = fSymbolTable.addSymbol(value); // record valid decl if (value.length() != 0) { @@ -812,7 +809,7 @@ // empty prefix is always bound ("" or some string) value = fSymbolTable.addSymbol(value); - fNSBinder.declarePrefix(fEmptySymbol, value); + fNSBinder.declarePrefix(XMLSymbols.EMPTY_STRING, value); continue; } } // end-else: valid declaration @@ -876,7 +873,7 @@ if (uri != null) { // Element has a namespace uri = fSymbolTable.addSymbol(uri); prefix = (prefix == null || - prefix.length() == 0) ? fEmptySymbol :fSymbolTable.addSymbol(prefix); + prefix.length() == 0) ? XMLSymbols.EMPTY_STRING :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 "". @@ -907,14 +904,14 @@ } } } else { // uri=null and no colon (DOM L2 node) - uri = fNSBinder.getURI(fEmptySymbol); + uri = fNSBinder.getURI(XMLSymbols.EMPTY_STRING); 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); + printNamespaceAttr(XMLSymbols.EMPTY_STRING, XMLSymbols.EMPTY_STRING); + fLocalNSBinder.declarePrefix(XMLSymbols.EMPTY_STRING, XMLSymbols.EMPTY_STRING); + //fNSBinder.declarePrefix(XMLSymbols.EMPTY_STRING, XMLSymbols.EMPTY_STRING); } } } @@ -944,12 +941,12 @@ } // make sure that value is never null. if (value == null) { - value=fEmptySymbol; + value=XMLSymbols.EMPTY_STRING; } if (uri != null) { // attribute has namespace !=null prefix = attr.getPrefix(); - prefix = prefix == null ? fEmptySymbol :fSymbolTable.addSymbol(prefix); + prefix = prefix == null ? XMLSymbols.EMPTY_STRING :fSymbolTable.addSymbol(prefix); String localpart = fSymbolTable.addSymbol( attr.getLocalName()); @@ -957,13 +954,13 @@ // --------------------------------------------------- // print namespace declarations namespace declarations // --------------------------------------------------- - if (uri != null && uri.equals(NamespaceSupport.XMLNS_URI)) { + if (uri != null && uri.equals(XMLSymbols.XMLNS_URI)) { // check if we need to output this declaration prefix = attr.getPrefix(); prefix = (prefix == null || - prefix.length() == 0) ? fEmptySymbol :fSymbolTable.addSymbol(prefix); + prefix.length() == 0) ? XMLSymbols.EMPTY_STRING :fSymbolTable.addSymbol(prefix); localpart = fSymbolTable.addSymbol( attr.getLocalName()); - if (prefix == fXmlnsSymbol) { //xmlns:prefix + if (prefix == XMLSymbols.PREFIX_XMLNS) { //xmlns:prefix localUri = fLocalNSBinder.getURI(localpart); // local prefix mapping value = fSymbolTable.addSymbol(value); if (value.length() != 0 ) { @@ -982,14 +979,14 @@ } else { // xmlns // empty prefix is always bound ("" or some string) - uri = fNSBinder.getURI(fEmptySymbol); - localUri=fLocalNSBinder.getURI(fEmptySymbol); + uri = fNSBinder.getURI(XMLSymbols.EMPTY_STRING); + localUri=fLocalNSBinder.getURI(XMLSymbols.EMPTY_STRING); value = fSymbolTable.addSymbol(value); if (localUri != null) { // declaration was redeclared and printed above - fNSBinder.declarePrefix(fEmptySymbol, value); + fNSBinder.declarePrefix(XMLSymbols.EMPTY_STRING, value); } else { - printNamespaceAttr(fEmptySymbol, value); + printNamespaceAttr(XMLSymbols.EMPTY_STRING, value); } continue; } @@ -1000,7 +997,7 @@ // find if for this prefix a URI was already declared String declaredURI = fNSBinder.getURI(prefix); - if (prefix == fEmptySymbol || declaredURI != uri) { + if (prefix == XMLSymbols.EMPTY_STRING || declaredURI != uri) { // attribute has no prefix (default namespace decl does not apply to attributes) // OR // attribute prefix is not declared @@ -1017,7 +1014,7 @@ } - if (declaredPrefix !=null && declaredPrefix !=fEmptySymbol) { + if (declaredPrefix !=null && declaredPrefix !=XMLSymbols.EMPTY_STRING) { // use the prefix that was found prefix = declaredPrefix; name=prefix+":"+localpart; @@ -1026,7 +1023,7 @@ System.out.println("==> cound not find prefix for the attribute: " +prefix); } - if (prefix != fEmptySymbol && fLocalNSBinder.getURI(prefix) == null) { + if (prefix != XMLSymbols.EMPTY_STRING && fLocalNSBinder.getURI(prefix) == null) { // the current prefix is not null and it has no in scope declaration // use this prefix @@ -1049,7 +1046,7 @@ // change prefix for this attribute } - printAttribute (name, (value==null)?fEmptySymbol:value, attr.getSpecified()); + printAttribute (name, (value==null)?XMLSymbols.EMPTY_STRING:value, attr.getSpecified()); } else { // attribute uri == null // data @@ -1125,11 +1122,11 @@ private void printNamespaceAttr(String prefix, String uri) throws IOException{ _printer.printSpace(); - if (prefix == fEmptySymbol) { + if (prefix == XMLSymbols.EMPTY_STRING) { if (DEBUG) { System.out.println("=>add xmlns=\""+uri+"\" declaration"); } - _printer.printText( fXmlnsSymbol ); + _printer.printText( XMLSymbols.PREFIX_XMLNS ); } else { if (DEBUG) { System.out.println("=>add xmlns:"+prefix+"=\""+uri+"\" declaration");
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]