rahuls 2002/08/14 08:15:42 Modified: java/src/org/apache/xerces/dom Tag: jaxp-ri-1_2_0-fcs-branch TextImpl.java java/src/org/apache/xerces/impl Tag: jaxp-ri-1_2_0-fcs-branch XMLDTDScannerImpl.java XMLDocumentScannerImpl.java java/src/org/apache/xerces/parsers Tag: jaxp-ri-1_2_0-fcs-branch AbstractDOMParser.java Log: Patch from Gopal for improving performance of DTDScanner, DocumentScanner and DOM building. Revision Changes Path No revision No revision 1.13.2.1 +19 -1 xml-xerces/java/src/org/apache/xerces/dom/TextImpl.java Index: TextImpl.java =================================================================== RCS file: /home/cvs/xml-xerces/java/src/org/apache/xerces/dom/TextImpl.java,v retrieving revision 1.13 retrieving revision 1.13.2.1 diff -u -r1.13 -r1.13.2.1 --- TextImpl.java 29 Jan 2002 01:15:07 -0000 1.13 +++ TextImpl.java 14 Aug 2002 15:15:41 -0000 1.13.2.1 @@ -192,4 +192,22 @@ } // splitText(int):Text + + /** + * NON-DOM (used by DOMParser): Reset data for the node. + */ + public void replaceData (String value){ + data = value; + } + + /** + * NON-DOM (used by DOMParser: Sets data to empty string. + * Returns the value the data was set to. + */ + public String removeData (){ + String olddata=data; + data = ""; + return olddata; + } + } // class TextImpl No revision No revision 1.18.2.1 +2 -2 xml-xerces/java/src/org/apache/xerces/impl/XMLDTDScannerImpl.java Index: XMLDTDScannerImpl.java =================================================================== RCS file: /home/cvs/xml-xerces/java/src/org/apache/xerces/impl/XMLDTDScannerImpl.java,v retrieving revision 1.18 retrieving revision 1.18.2.1 diff -u -r1.18 -r1.18.2.1 --- XMLDTDScannerImpl.java 29 Jan 2002 20:44:02 -0000 1.18 +++ XMLDTDScannerImpl.java 14 Aug 2002 15:15:41 -0000 1.18.2.1 @@ -655,7 +655,7 @@ } } } - + fEntityManager.fCurrentEntity.mayReadChunks = true; return textDecl; } // scanTextDecl(boolean):boolean 1.15.2.2 +2 -2 xml-xerces/java/src/org/apache/xerces/impl/XMLDocumentScannerImpl.java Index: XMLDocumentScannerImpl.java =================================================================== RCS file: /home/cvs/xml-xerces/java/src/org/apache/xerces/impl/XMLDocumentScannerImpl.java,v retrieving revision 1.15.2.1 retrieving revision 1.15.2.2 diff -u -r1.15.2.1 -r1.15.2.2 --- XMLDocumentScannerImpl.java 8 Aug 2002 10:50:47 -0000 1.15.2.1 +++ XMLDocumentScannerImpl.java 14 Aug 2002 15:15:41 -0000 1.15.2.2 @@ -587,7 +587,7 @@ reportFatalError("PrematureEOF", null); throw e; } - + fEntityManager.fCurrentEntity.mayReadChunks = true; // if no XMLDecl, then scan piece of prolog return true; No revision No revision 1.42.2.3 +78 -11 xml-xerces/java/src/org/apache/xerces/parsers/AbstractDOMParser.java Index: AbstractDOMParser.java =================================================================== RCS file: /home/cvs/xml-xerces/java/src/org/apache/xerces/parsers/AbstractDOMParser.java,v retrieving revision 1.42.2.2 retrieving revision 1.42.2.3 diff -u -r1.42.2.2 -r1.42.2.3 --- AbstractDOMParser.java 8 Aug 2002 12:54:39 -0000 1.42.2.2 +++ AbstractDOMParser.java 14 Aug 2002 15:15:41 -0000 1.42.2.3 @@ -205,11 +205,15 @@ /** Current node. */ protected Node fCurrentNode; protected CDATASection fCurrentCDATASection; - + + /** Character buffer */ + protected final StringBuffer fStringBuffer = new StringBuffer(50); + // internal subset /** Internal subset buffer. */ protected StringBuffer fInternalSubset; + // deferred expansion data @@ -231,6 +235,9 @@ /** True if inside CDATA section. */ protected boolean fInCDATASection; + + /** True if saw the first chunk of characters */ + protected boolean fFirstChunk = false; // data @@ -381,12 +388,16 @@ fDocumentTypeIndex = -1; fDeferredDocumentImpl = null; fCurrentNode = null; + + // reset string buffer + fStringBuffer.setLength(0); // reset state information fInDocument = false; fInDTD = false; fInDTDExternalSubset = false; fInCDATASection = false; + fFirstChunk = false; fCurrentCDATASection = null; fCurrentCDATASectionIndex = -1; @@ -422,6 +433,7 @@ } if (fCreateEntityRefNodes) { if (!fDeferNodeExpansion) { + setCharacterData(); EntityReference er = fDocument.createEntityReference(name); // we don't need synchronization now, because entity ref will be // expanded anyway. Synch only needed when user creates entityRef node @@ -505,10 +517,19 @@ */ public void comment(XMLString text, Augmentations augs) throws XNIException { - if (!fIncludeComments || fInDTD) { - return; - } + if (fInDTD) { + if (fInternalSubset != null && !fInDTDExternalSubset) { + fInternalSubset.append("<!-- "); + fInternalSubset.append(text.toString()); + fInternalSubset.append(" -->"); + } + return; + } + if (!fIncludeComments) { + return; + } if (!fDeferNodeExpansion) { + setCharacterData(); Comment comment = fDocument.createComment(text.toString()); fCurrentNode.appendChild(comment); } @@ -539,8 +560,20 @@ */ public void processingInstruction(String target, XMLString data, Augmentations augs) throws XNIException { + + if (fInDTD) { + if (fInternalSubset != null && !fInDTDExternalSubset) { + fInternalSubset.append("<?"); + fInternalSubset.append(target.toString()); + fInternalSubset.append(' '); + fInternalSubset.append(data.toString()); + fInternalSubset.append("?>"); + + } + } if (!fDeferNodeExpansion) { + setCharacterData(); ProcessingInstruction pi = fDocument.createProcessingInstruction(target, data.toString()); fCurrentNode.appendChild(pi); @@ -734,6 +767,7 @@ } // REVISIT: Handle entities in attribute value. } + setCharacterData(); fCurrentNode.appendChild(el); fCurrentNode = el; } @@ -816,12 +850,21 @@ } Node child = fCurrentNode.getLastChild(); if (child != null && child.getNodeType() == Node.TEXT_NODE) { - Text textNode = (Text)child; - textNode.appendData(value); + // Text textNode = (Text)child; + // textNode.appendData(value); + // collect all the data into the string buffer. + if (fFirstChunk) { + fStringBuffer.append(((TextImpl)child).removeData()); + fFirstChunk = false; + } + fStringBuffer.append(value); } else { - Text textNode = fDocument.createTextNode(value); - fCurrentNode.appendChild(textNode); + // Text textNode = fDocument.createTextNode(value); + // fCurrentNode.appendChild(textNode); + fFirstChunk = true; + Text textNode = fDocument.createTextNode(value); + fCurrentNode.appendChild(textNode); } } } @@ -931,6 +974,7 @@ System.out.println("==>endElement ("+element.rawname+")"); } if (!fDeferNodeExpansion) { + setCharacterData(); fCurrentNode = fCurrentNode.getParentNode(); } else { @@ -960,7 +1004,7 @@ * @throws XNIException Thrown by handler to signal an error. */ public void startCDATA(Augmentations augs) throws XNIException { - + setCharacterData(); fInCDATASection = true; } // startCDATA() @@ -1026,11 +1070,12 @@ * Thrown by handler to signal an error. */ public void endGeneralEntity(String name, Augmentations augs) throws XNIException { - if (DEBUG_EVENTS || DEBUG_ENTITY_REF) { + if (DEBUG_EVENTS ) { System.out.println("==>endGeneralEntity: ("+name+")"); } if (fCreateEntityRefNodes) { if (!fDeferNodeExpansion) { + setCharacterData(); if (fDocumentType != null) { NamedNodeMap entities = fDocumentType.getEntities(); NodeImpl entity = (NodeImpl)entities.getNamedItem(name); @@ -1425,6 +1470,7 @@ String literalSystemId = identifier.getLiteralSystemId(); if (fInternalSubset != null && !fInDTDExternalSubset) { fInternalSubset.append("<!NOTATION "); + fInternalSubset.append(name); if (publicId != null) { fInternalSubset.append("PUBLIC '"); fInternalSubset.append(publicId); @@ -1694,5 +1740,26 @@ return attr; } + + // If data rececived in more than one chunk, the data + // is stored in StringBuffer. + // This function is called then the state is changed and the + // data needs to be appended to the current node + protected void setCharacterData(){ + // handle character data + fFirstChunk = false; + if (fStringBuffer.length() > 0) { + // if we have data in the buffer we must have created + // a text node already. + Node child = fCurrentNode.getLastChild(); + // REVISIT: should this check be performed? + if (child != null && child.getNodeType() == Node.TEXT_NODE) { + ((TextImpl)child).replaceData(fStringBuffer.toString()); + } + // reset string buffer + fStringBuffer.setLength(0); + } + } + } // class AbstractDOMParser
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]