Return-Path: Delivered-To: apmail-xerces-commits-archive@www.apache.org Received: (qmail 93822 invoked from network); 9 May 2005 18:35:41 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (209.237.227.199) by minotaur.apache.org with SMTP; 9 May 2005 18:35:41 -0000 Received: (qmail 82340 invoked by uid 500); 9 May 2005 18:38:58 -0000 Delivered-To: apmail-xerces-commits-archive@xerces.apache.org Received: (qmail 82311 invoked by uid 500); 9 May 2005 18:38:58 -0000 Mailing-List: contact commits-help@xerces.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Delivered-To: mailing list commits@xerces.apache.org Received: (qmail 82289 invoked by uid 500); 9 May 2005 18:38:57 -0000 Delivered-To: apmail-xml-xerces-cvs@apache.org Received: (qmail 82284 invoked by uid 99); 9 May 2005 18:38:57 -0000 X-ASF-Spam-Status: No, hits=0.2 required=10.0 tests=NO_REAL_NAME X-Spam-Check-By: apache.org Received: from minotaur.apache.org (HELO minotaur.apache.org) (209.237.227.194) by apache.org (qpsmtpd/0.28) with SMTP; Mon, 09 May 2005 11:38:57 -0700 Received: (qmail 93805 invoked by uid 1965); 9 May 2005 18:35:38 -0000 Date: 9 May 2005 18:35:38 -0000 Message-ID: <20050509183538.93804.qmail@minotaur.apache.org> From: ankitp@apache.org To: xml-xerces-cvs@apache.org Subject: cvs commit: xml-xerces/java/src/org/apache/xerces/parsers DOMParserImpl.java X-Virus-Checked: Checked X-Spam-Rating: minotaur.apache.org 1.6.2 0/1000/N ankitp 2005/05/09 11:35:38 Modified: java/src/org/apache/xerces/parsers DOMParserImpl.java Log: Jira Bug#946 Fix: org.w3c.dom.ls.LSParser.abort() throws unexpected RuntimeException Revision Changes Path 1.31 +278 -6 xml-xerces/java/src/org/apache/xerces/parsers/DOMParserImpl.java Index: DOMParserImpl.java =================================================================== RCS file: /home/cvs/xml-xerces/java/src/org/apache/xerces/parsers/DOMParserImpl.java,v retrieving revision 1.30 retrieving revision 1.31 diff -u -r1.30 -r1.31 --- DOMParserImpl.java 4 May 2005 03:56:45 -0000 1.30 +++ DOMParserImpl.java 9 May 2005 18:35:38 -0000 1.31 @@ -30,15 +30,26 @@ import org.apache.xerces.util.DOMErrorHandlerWrapper; import org.apache.xerces.util.SymbolTable; import org.apache.xerces.util.XMLSymbols; -import org.apache.xerces.xni.grammars.XMLGrammarPool; import org.apache.xerces.xni.Augmentations; +import org.apache.xerces.xni.NamespaceContext; import org.apache.xerces.xni.QName; import org.apache.xerces.xni.XMLAttributes; +import org.apache.xerces.xni.XMLDTDContentModelHandler; +import org.apache.xerces.xni.XMLDTDHandler; +import org.apache.xerces.xni.XMLDocumentHandler; +import org.apache.xerces.xni.XMLLocator; +import org.apache.xerces.xni.XMLResourceIdentifier; +import org.apache.xerces.xni.XMLString; +import org.apache.xerces.xni.XNIException; +import org.apache.xerces.xni.grammars.XMLGrammarPool; import org.apache.xerces.xni.parser.XMLConfigurationException; +import org.apache.xerces.xni.parser.XMLDTDContentModelSource; +import org.apache.xerces.xni.parser.XMLDTDSource; +import org.apache.xerces.xni.parser.XMLDocumentSource; import org.apache.xerces.xni.parser.XMLEntityResolver; import org.apache.xerces.xni.parser.XMLInputSource; -import org.apache.xerces.xni.parser.XMLParserConfiguration; import org.apache.xerces.xni.parser.XMLParseException; +import org.apache.xerces.xni.parser.XMLParserConfiguration; import org.w3c.dom.DOMConfiguration; import org.w3c.dom.DOMError; import org.w3c.dom.DOMErrorHandler; @@ -47,10 +58,11 @@ import org.w3c.dom.Document; import org.w3c.dom.Node; import org.w3c.dom.ls.LSException; +import org.w3c.dom.ls.LSInput; import org.w3c.dom.ls.LSParser; import org.w3c.dom.ls.LSParserFilter; import org.w3c.dom.ls.LSResourceResolver; -import org.w3c.dom.ls.LSInput; +import org.xml.sax.SAXException; /** @@ -116,12 +128,18 @@ protected String fSchemaType = null; protected boolean fBusy = false; + + private boolean abortNow = false; + + private Thread currentThread; protected final static boolean DEBUG = false; private Vector fSchemaLocations = new Vector (); private String fSchemaLocation = null; private DOMStringList fRecognizedParameters; + + private AbortHandler abortHandler = new AbortHandler(); // // Constructors @@ -840,11 +858,27 @@ XMLInputSource source = new XMLInputSource (null, uri, null); try { + currentThread = Thread.currentThread(); fBusy = true; parse (source); fBusy = false; + if(abortNow && currentThread.isInterrupted()) + { + //reset interrupt state + abortNow = false; + currentThread.interrupted(); + } } catch (Exception e){ fBusy = false; + if(abortNow && currentThread.isInterrupted()) + { + currentThread.interrupted(); + } + if(abortNow) { + abortNow = false; + restoreHandlers(); + return null; + } // Consume this exception if the user // issued an interrupt or an abort. if (e != abort) { @@ -881,11 +915,27 @@ } try { + currentThread = Thread.currentThread(); fBusy = true; parse (xmlInputSource); - fBusy = false; + fBusy = false; + if(abortNow && currentThread.isInterrupted()) + { + //reset interrupt state + abortNow = false; + currentThread.interrupted(); + } } catch (Exception e) { fBusy = false; + if(abortNow && currentThread.isInterrupted()) + { + currentThread.interrupted(); + } + if(abortNow) { + abortNow = false; + restoreHandlers(); + return null; + } // Consume this exception if the user // issued an interrupt or an abort. if (e != abort) { @@ -905,6 +955,13 @@ return getDocument (); } + + private void restoreHandlers() { + fConfiguration.setDocumentHandler(this); + fConfiguration.setDTDHandler(this); + fConfiguration.setDTDContentModelHandler(this); + } + /** * Parse an XML document or fragment from a resource identified by an * LSInput and insert the content into an existing @@ -1001,7 +1058,18 @@ // If parse operation is in progress then reset it if ( fBusy ) { fBusy = false; - throw abort; + if(currentThread != null) { + abortNow = true; + + fConfiguration.setDocumentHandler(abortHandler); + fConfiguration.setDTDHandler(abortHandler); + fConfiguration.setDTDContentModelHandler(abortHandler); + + if(currentThread == Thread.currentThread()) + throw abort; + + currentThread.interrupt(); + } } return; // If not busy then this is noop } @@ -1031,5 +1099,209 @@ } super.startElement(element, attributes, augs); } + + private class AbortHandler implements XMLDocumentHandler, XMLDTDHandler, XMLDTDContentModelHandler { + + private XMLDocumentSource documentSource; + private XMLDTDContentModelSource dtdContentSource; + private XMLDTDSource dtdSource; + + public void startDocument(XMLLocator locator, String encoding, NamespaceContext namespaceContext, Augmentations augs) throws XNIException { + throw abort; + } + + public void xmlDecl(String version, String encoding, String standalone, Augmentations augs) throws XNIException { + throw abort; + } + + public void doctypeDecl(String rootElement, String publicId, String systemId, Augmentations augs) throws XNIException { + throw abort; + } + + public void comment(XMLString text, Augmentations augs) throws XNIException { + throw abort; + } + + public void processingInstruction(String target, XMLString data, Augmentations augs) throws XNIException { + throw abort; + } + + public void startElement(QName element, XMLAttributes attributes, Augmentations augs) throws XNIException { + throw abort; + } + + public void emptyElement(QName element, XMLAttributes attributes, Augmentations augs) throws XNIException { + throw abort; + } + + public void startGeneralEntity(String name, XMLResourceIdentifier identifier, String encoding, Augmentations augs) throws XNIException { + throw abort; + } + + public void textDecl(String version, String encoding, Augmentations augs) throws XNIException { + throw abort; + } + + public void endGeneralEntity(String name, Augmentations augs) throws XNIException { + throw abort; + } + + public void characters(XMLString text, Augmentations augs) throws XNIException { + throw abort; + } + + public void ignorableWhitespace(XMLString text, Augmentations augs) throws XNIException { + throw abort; + } + + public void endElement(QName element, Augmentations augs) throws XNIException { + throw abort; + } + + public void startCDATA(Augmentations augs) throws XNIException { + throw abort; + } + + public void endCDATA(Augmentations augs) throws XNIException { + throw abort; + } + + public void endDocument(Augmentations augs) throws XNIException { + throw abort; + } + + public void setDocumentSource(XMLDocumentSource source) { + documentSource = source; + } + + public XMLDocumentSource getDocumentSource() { + return documentSource; + } + + public void startDTD(XMLLocator locator, Augmentations augmentations) throws XNIException { + throw abort; + } + + public void startParameterEntity(String name, XMLResourceIdentifier identifier, String encoding, Augmentations augmentations) throws XNIException { + throw abort; + } + + public void endParameterEntity(String name, Augmentations augmentations) throws XNIException { + throw abort; + } + + public void startExternalSubset(XMLResourceIdentifier identifier, Augmentations augmentations) throws XNIException { + throw abort; + } + + public void endExternalSubset(Augmentations augmentations) throws XNIException { + throw abort; + } + + public void elementDecl(String name, String contentModel, Augmentations augmentations) throws XNIException { + throw abort; + } + + public void startAttlist(String elementName, Augmentations augmentations) throws XNIException { + throw abort; + } + + public void attributeDecl(String elementName, String attributeName, String type, String[] enumeration, String defaultType, XMLString defaultValue, XMLString nonNormalizedDefaultValue, Augmentations augmentations) throws XNIException { + throw abort; + } + + public void endAttlist(Augmentations augmentations) throws XNIException { + throw abort; + } + + public void internalEntityDecl(String name, XMLString text, XMLString nonNormalizedText, Augmentations augmentations) throws XNIException { + throw abort; + } + + public void externalEntityDecl(String name, XMLResourceIdentifier identifier, Augmentations augmentations) throws XNIException { + throw abort; + } + + public void unparsedEntityDecl(String name, XMLResourceIdentifier identifier, String notation, Augmentations augmentations) throws XNIException { + throw abort; + } + + public void notationDecl(String name, XMLResourceIdentifier identifier, Augmentations augmentations) throws XNIException { + throw abort; + } + + public void startConditional(short type, Augmentations augmentations) throws XNIException { + throw abort; + } + + public void ignoredCharacters(XMLString text, Augmentations augmentations) throws XNIException { + throw abort; + } + + public void endConditional(Augmentations augmentations) throws XNIException { + throw abort; + } + + public void endDTD(Augmentations augmentations) throws XNIException { + throw abort; + } + + public void setDTDSource(XMLDTDSource source) { + dtdSource = source; + } + + public XMLDTDSource getDTDSource() { + return dtdSource; + } + + public void startContentModel(String elementName, Augmentations augmentations) throws XNIException { + throw abort; + } + + public void any(Augmentations augmentations) throws XNIException { + throw abort; + } + + public void empty(Augmentations augmentations) throws XNIException { + throw abort; + } + + public void startGroup(Augmentations augmentations) throws XNIException { + throw abort; + } + + public void pcdata(Augmentations augmentations) throws XNIException { + throw abort; + } + + public void element(String elementName, Augmentations augmentations) throws XNIException { + throw abort; + } + + public void separator(short separator, Augmentations augmentations) throws XNIException { + throw abort; + } + + public void occurrence(short occurrence, Augmentations augmentations) throws XNIException { + throw abort; + } + + public void endGroup(Augmentations augmentations) throws XNIException { + throw abort; + } + + public void endContentModel(Augmentations augmentations) throws XNIException { + throw abort; + } + + public void setDTDContentModelSource(XMLDTDContentModelSource source) { + dtdContentSource = source; + } + + public XMLDTDContentModelSource getDTDContentModelSource() { + return dtdContentSource; + } + + } } // class DOMParserImpl --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscribe@xerces.apache.org For additional commands, e-mail: commits-help@xerces.apache.org