Author: mrglavas Date: Sat Sep 30 14:36:30 2006 New Revision: 451674 URL: http://svn.apache.org/viewvc?view=rev&rev=451674 Log: Fixing JIRA Issue #1182:
http://issues.apache.org/jira/browse/XERCESJ-1182 There was a race condition which allowed the XMLStreamReader constructor to return before the start document event is produced. I've fixed that as well as significantly simplifying the thread handling. There was a boolean that was used to track which thread was running. Since only one thread is running at a time we don't need it. Modified: xerces/java/branches/stax-dev/src/org/apache/xerces/stax/AsyncSAXParser.java xerces/java/branches/stax-dev/src/org/apache/xerces/stax/SAXXMLStreamReaderImpl.java xerces/java/branches/stax-dev/src/org/apache/xerces/stax/StAXSAXHandler.java Modified: xerces/java/branches/stax-dev/src/org/apache/xerces/stax/AsyncSAXParser.java URL: http://svn.apache.org/viewvc/xerces/java/branches/stax-dev/src/org/apache/xerces/stax/AsyncSAXParser.java?view=diff&rev=451674&r1=451673&r2=451674 ============================================================================== --- xerces/java/branches/stax-dev/src/org/apache/xerces/stax/AsyncSAXParser.java (original) +++ xerces/java/branches/stax-dev/src/org/apache/xerces/stax/AsyncSAXParser.java Sat Sep 30 14:36:30 2006 @@ -32,10 +32,6 @@ XMLReader xr; private InputSource is; - // The flag which represents the status of AsyncSAXParser. If true, - // the SAXParser is executing parsing work - private boolean runningFlag; - // The buffer which records the Characters and Space private char[] charactersBuf; @@ -50,8 +46,7 @@ public AsyncSAXParser(XMLReader xr, InputSource is) { this.xr = xr; - this.is = is; - this.runningFlag = false; + this.is = is; } /** @@ -68,25 +63,6 @@ ex = e; // throw new RuntimeException(e.getMessage(), e); } - } - - /** - * Set the status of SAXParser - * - * @param flag - */ - public synchronized void setRunningFlag(boolean flag) { - runningFlag = flag; - - } - - /** - * Get the status of SAXParser - * - * @return - */ - public synchronized boolean getRunningFlag(){ - return runningFlag; } /** Modified: xerces/java/branches/stax-dev/src/org/apache/xerces/stax/SAXXMLStreamReaderImpl.java URL: http://svn.apache.org/viewvc/xerces/java/branches/stax-dev/src/org/apache/xerces/stax/SAXXMLStreamReaderImpl.java?view=diff&rev=451674&r1=451673&r2=451674 ============================================================================== --- xerces/java/branches/stax-dev/src/org/apache/xerces/stax/SAXXMLStreamReaderImpl.java (original) +++ xerces/java/branches/stax-dev/src/org/apache/xerces/stax/SAXXMLStreamReaderImpl.java Sat Sep 30 14:36:30 2006 @@ -89,7 +89,7 @@ * @param xif */ public SAXXMLStreamReaderImpl(XMLReader xr, InputSource is, XMLInputFactory xif) - throws XMLStreamException { + throws XMLStreamException { this.xif = xif; this.curAttrs = new ArrayList(); @@ -112,14 +112,16 @@ dc = new NamespaceContextImpl(); - asp.start(); synchronized (asp) { - while (asp.getRunningFlag() == true) - asp.wait(); + asp.start(); + asp.wait(); + if (asp.ex != null) { + throw new XMLStreamException(asp.ex.getMessage(), asp.ex); + } } } - catch(Exception e) { - throw new XMLStreamException("Error occurs during the SAX parsing process", e); + catch (InterruptedException e) { + throw new XMLStreamException("Error occured during the SAX parsing process", e); } } @@ -150,10 +152,7 @@ * @throws XMLStreamException if there is a fatal error detecting the next state */ public boolean hasNext() throws XMLStreamException { - - if (curType == XMLStreamConstants.END_DOCUMENT) - return false; - return true; + return (curType != XMLStreamConstants.END_DOCUMENT); } /** @@ -175,25 +174,19 @@ throw new XMLStreamException(asp.ex.getMessage(), asp.ex); } - synchronized(asp) { - asp.setRunningFlag(true); + synchronized (asp) { asp.notify(); try { - while (asp.getRunningFlag() == true) { - if(asp.ex != null) { - asp.interrupt(); - throw new XMLStreamException(asp.ex.getMessage(), asp.ex); - } - asp.wait(); + asp.wait(); + if (asp.ex != null) { + throw new XMLStreamException(asp.ex.getMessage(), asp.ex); } - return curType; } - catch (Exception e) { - asp.interrupt(); + catch (InterruptedException e) { throw new XMLStreamException( - "Error occurs when processing SAXSource", e); + "Error occured when processing SAXSource", e); } } } Modified: xerces/java/branches/stax-dev/src/org/apache/xerces/stax/StAXSAXHandler.java URL: http://svn.apache.org/viewvc/xerces/java/branches/stax-dev/src/org/apache/xerces/stax/StAXSAXHandler.java?view=diff&rev=451674&r1=451673&r2=451674 ============================================================================== --- xerces/java/branches/stax-dev/src/org/apache/xerces/stax/StAXSAXHandler.java (original) +++ xerces/java/branches/stax-dev/src/org/apache/xerces/stax/StAXSAXHandler.java Sat Sep 30 14:36:30 2006 @@ -47,22 +47,16 @@ public void characters(char[] ch, int start, int length) throws SAXException { try { + reader.setCurType(XMLStreamConstants.CHARACTERS); + + if (reader.isCoalescing) { + buf.append(ch, start, length); + return; + } + asp.setCharacters(ch, start, length); synchronized (asp) { - reader.setCurType(XMLStreamConstants.CHARACTERS); - - if (reader.isCoalescing) { - buf.append(ch, start, length); - } - else { - asp.setCharacters(ch, start, length); - - while (!asp.getRunningFlag()) { - asp.notify(); - asp.wait(); - } - - asp.setRunningFlag(false); - } + asp.notify(); + asp.wait(); } } catch (Exception e) { @@ -70,14 +64,10 @@ } } - public void endDocument() throws SAXException{ + public void endDocument() throws SAXException { try { - synchronized (asp) { - checkCoalescing(); - - reader.setCurType(XMLStreamConstants.END_DOCUMENT); - asp.setRunningFlag(false); - } + checkCoalescing(); + reader.setCurType(XMLStreamConstants.END_DOCUMENT); } catch (Exception e) { throw new SAXException(e.getMessage(), e); @@ -86,21 +76,17 @@ public synchronized void endElement(String uri, String localName, String qName) throws SAXException { try { + checkCoalescing(); + reader.setCurType(XMLStreamConstants.END_ELEMENT); + asp.setElementName(uri, localName, (qName != null && qName.length() > 0) ? qName : localName); + synchronized (asp) { - checkCoalescing(); - - reader.setCurType(XMLStreamConstants.END_ELEMENT); - asp.setElementName(uri, localName, (qName != null && qName.length() > 0) ? qName : localName); - - while (asp.getRunningFlag() == false) { - asp.notify(); - asp.wait(); - } - - NamespaceContextImpl nci = (NamespaceContextImpl)reader.getNamespaceContext(); - nci.onEndElement(); - asp.setRunningFlag(false); + asp.notify(); + asp.wait(); } + + NamespaceContextImpl nci = (NamespaceContextImpl)reader.getNamespaceContext(); + nci.onEndElement(); } catch (Exception e) { throw new SAXException(e.getMessage(), e); @@ -109,18 +95,14 @@ public synchronized void ignorableWhitespace(char[] ch, int start, int length) throws SAXException { try { + checkCoalescing(); + + reader.setCurType(XMLStreamConstants.SPACE); + asp.setCharacters(ch, start, length); + synchronized (asp) { - checkCoalescing(); - - reader.setCurType(XMLStreamConstants.SPACE); - asp.setCharacters(ch, start, length); - - while (!asp.getRunningFlag()) { - asp.notify(); - asp.wait(); - } - - asp.setRunningFlag(false); + asp.notify(); + asp.wait(); } } catch (Exception e) { @@ -130,14 +112,10 @@ public synchronized void notationDecl(String name, String publicId, String systemId) throws SAXException { try { + reader.setCurType(XMLStreamConstants.NOTATION_DECLARATION); synchronized (asp) { - reader.setCurType(XMLStreamConstants.NOTATION_DECLARATION); - while (!asp.getRunningFlag()) { - asp.notify(); - asp.wait(); - } - - asp.setRunningFlag(false); + asp.notify(); + asp.wait(); } } catch (Exception e) { @@ -149,14 +127,9 @@ try { reader.setCurType(XMLStreamConstants.PROCESSING_INSTRUCTION); asp.setPI(data, target); - synchronized (asp) { - while (!asp.getRunningFlag()) { - asp.notify(); - asp.wait(); - } - - asp.setRunningFlag(false); + asp.notify(); + asp.wait(); } } catch (Exception e) { @@ -167,14 +140,9 @@ public synchronized void startDocument() throws SAXException { try { reader.setCurType(XMLStreamConstants.START_DOCUMENT); - synchronized (asp) { - while (!asp.getRunningFlag()) { - asp.notify(); - asp.wait(); - } - - asp.setRunningFlag(false); + asp.notify(); + asp.wait(); } } catch (Exception e) { @@ -185,22 +153,18 @@ public synchronized void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { try { + checkCoalescing(); + + reader.setCurType(XMLStreamConstants.START_ELEMENT); + reader.initialElementAttrs(attributes); + + NamespaceContextImpl nci = (NamespaceContextImpl)reader.getNamespaceContext(); + nci.onStartElement(); + asp.setElementName(uri, localName, (qName != null && qName.length() > 0) ? qName : localName); + synchronized (asp) { - checkCoalescing(); - - reader.setCurType(XMLStreamConstants.START_ELEMENT); - reader.initialElementAttrs(attributes); - - NamespaceContextImpl nci = (NamespaceContextImpl)reader.getNamespaceContext(); - nci.onStartElement(); - asp.setElementName(uri, localName, (qName != null && qName.length() > 0) ? qName : localName); - - while (!asp.getRunningFlag()) { - asp.notify(); - asp.wait(); - } - - asp.setRunningFlag(false); + asp.notify(); + asp.wait(); } } catch (Exception e) { @@ -212,14 +176,10 @@ public synchronized void unparsedEntityDecl(String name, String publicId, String systemId, String notationName) throws SAXException { try { + reader.setCurType(XMLStreamConstants.ENTITY_DECLARATION); synchronized (asp) { - reader.setCurType(XMLStreamConstants.ENTITY_DECLARATION); - while (!asp.getRunningFlag()) { - asp.notify(); - asp.wait(); - } - - asp.setRunningFlag(false); + asp.notify(); + asp.wait(); } } catch (Exception e) { @@ -252,18 +212,12 @@ public synchronized void skippedEntity(String name) throws SAXException{ try { + reader.setCurType(XMLStreamConstants.ENTITY_REFERENCE); + asp.setEntityName(name); + asp.setCharacters(null, 0, 0); synchronized (asp) { - checkCoalescing(); - - reader.setCurType(XMLStreamConstants.ENTITY_REFERENCE); - asp.setEntityName(name); - asp.setCharacters(null, 0, 0); - while (!asp.getRunningFlag()) { - asp.notify(); - asp.wait(); - } - - asp.setRunningFlag(false); + asp.notify(); + asp.wait(); } } catch (Exception e) { @@ -276,13 +230,10 @@ char[] chs = buf.toString().toCharArray(); asp.setCharacters(chs, 0, chs.length); buf.setLength(0); - - while (!asp.getRunningFlag()) { + synchronized (asp) { asp.notify(); asp.wait(); } - - asp.setRunningFlag(false); } } } --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]
