You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@xerces.apache.org by mr...@apache.org on 2006/09/30 23:36:30 UTC

svn commit: r451674 - in /xerces/java/branches/stax-dev/src/org/apache/xerces/stax: AsyncSAXParser.java SAXXMLStreamReaderImpl.java StAXSAXHandler.java

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: commits-unsubscribe@xerces.apache.org
For additional commands, e-mail: commits-help@xerces.apache.org