Author: mrglavas
Date: Tue Aug 22 07:17:46 2006
New Revision: 433641

URL: http://svn.apache.org/viewvc?rev=433641&view=rev
Log:
JIRA Issue #1178
https://issues.apache.org/jira/browse/XERCESJ-1178

More bug fixes from Hua Lei.

To make sure the AsyncSAXParser thread terminates correctly the following 
modifications were made. 
1) When an exception occurs in the next() method the AsyncSAXParser thread is 
interrupted because 
   after that no call to the XMLStreamReader is valid.
2) When an exception occurs in other methods of XMLStreamReader, a call to the 
XMLStreamReader may 
   still be valid, so the AsyncSAXParser thread shouldn't be interrupted in 
this case.
3) In the close() method, if the AsyncSAXParser thread is still alive, 
interrupt it.

The namespace management code has been reorganized to prevent 
NamespaceContextImpl's stack from underflowing.




Modified:
    
xerces/java/branches/stax-dev/src/org/apache/xerces/stax/DOMXMLStreamReaderImpl.java
    
xerces/java/branches/stax-dev/src/org/apache/xerces/stax/NamespaceContextImpl.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/DOMXMLStreamReaderImpl.java
URL: 
http://svn.apache.org/viewvc/xerces/java/branches/stax-dev/src/org/apache/xerces/stax/DOMXMLStreamReaderImpl.java?rev=433641&r1=433640&r2=433641&view=diff
==============================================================================
--- 
xerces/java/branches/stax-dev/src/org/apache/xerces/stax/DOMXMLStreamReaderImpl.java
 (original)
+++ 
xerces/java/branches/stax-dev/src/org/apache/xerces/stax/DOMXMLStreamReaderImpl.java
 Tue Aug 22 07:17:46 2006
@@ -174,6 +174,9 @@
         if (hasNext() == false) {
             throw new XMLStreamException("No such element!");
         }
+        
+        if (curType == XMLStreamConstants.END_ELEMENT)
+            dc.onEndElement();
         try {            
             Node curChild = curNode.getFirstChild();
             
@@ -230,7 +233,6 @@
             return curType;
         }
         catch(Exception e) {
-            e.printStackTrace();
             throw new XMLStreamException("Error occurs when processing 
DOMSource", e);
         }
     }
@@ -314,8 +316,6 @@
             }
             if (curType == XMLStreamConstants.START_ELEMENT)
                 dc.onStartElement();
-            if (curType == XMLStreamConstants.END_ELEMENT)
-                dc.onEndElement();
         }
     }
     
@@ -531,13 +531,15 @@
         if (curType == XMLStreamConstants.START_ELEMENT) {
             NamedNodeMap attributes = curNode.getAttributes();
             
-            Attr attr = (Attr)attributes.getNamedItem(localName);
+            Attr attr = (Attr)attributes.getNamedItemNS(namespaceURI, 
localName);
             if (attr!= null) {
                 if(namespaceURI != null && 
!namespaceURI.equals(attr.getNamespaceURI())) {
                     return null;
                 }
                 return attr.getValue();
-            }    
+            }
+            else
+                return null;
         }
         if (curType == XMLStreamConstants.ATTRIBUTE) {
             Attr attr = (Attr)curNode;
@@ -559,7 +561,6 @@
      * @throws IllegalStateException if this is not a START_ELEMENT or 
ATTRIBUTE
      */
     public int getAttributeCount(){
-//      int count = 0;
         String attrName;
         if (curType == XMLStreamConstants.START_ELEMENT) {
             return curAttrs.size();
@@ -588,22 +589,18 @@
     public QName getAttributeName(int index){
         String localName;
         String namespaceURI;
-//      Attr attr = null;
         
         if (curType == XMLStreamConstants.START_ELEMENT) {
             int leng = getAttributeCount();
             if(index + 1 > leng || index < 0)
                 throw new IndexOutOfBoundsException("The index "+ index+ " 
should be between 0..."+ (leng-1));
             
-//          attr = (Attr) curAttrs.get(index);
             namespaceURI = this.getAttributeNamespace(index);
             localName = this.getAttributeLocalName(index);
             
             return new QName(namespaceURI, localName);
         }
         if (curType == XMLStreamConstants.ATTRIBUTE) {
-//          attr = (Attr) curNode;
-            
             namespaceURI = this.getAttributeNamespace(index);
             localName = this.getAttributeLocalName(index);
             return new QName(namespaceURI, localName);
@@ -621,7 +618,10 @@
      */
     public String getAttributeNamespace(int index){
         String pre = this.getAttributePrefix(index);
-        return dc.getNamespaceURI(pre);        
+        if(pre == null) 
+            return null;
+        else
+            return dc.getNamespaceURI(pre);    
     }
     
     /**
@@ -644,14 +644,17 @@
             attr = (Attr) curAttrs.get(index);
             
         }
-        if (curType == XMLStreamConstants.ATTRIBUTE) {
+        else if (curType == XMLStreamConstants.ATTRIBUTE) {
             attr = (Attr) curNode;
         }
         
         if(attr != null) {
             String nodeName = attr.getNodeName();
             int indexPre = nodeName.indexOf(":");
-            if(indexPre != -1) localName = nodeName.substring(indexPre + 1);
+            if(indexPre != -1) 
+                localName = nodeName.substring(indexPre + 1);
+            else
+                localName = nodeName;
             
             return localName;
         }
@@ -678,7 +681,7 @@
             
             attr = (Attr) curAttrs.get(index);
         }
-        if (curType == XMLStreamConstants.ATTRIBUTE) {
+        else if (curType == XMLStreamConstants.ATTRIBUTE) {
             attr = (Attr) curNode;      
         }
         
@@ -914,12 +917,13 @@
         if (curType == XMLStreamConstants.CHARACTERS) {
             String text = "";
             Node cur = curNode;
+            int count = contiNum;
             if (this.isCoalescing) {
                 text = getText(cur);
-                while(contiNum >0){
+                while(count >0){
                     cur = cur.getPreviousSibling();
                     text = getText(cur)+ text;
-                    contiNum--;
+                    count--;
                 }
             }
             else{
@@ -1153,7 +1157,7 @@
     public String getNamespaceURI(){
         
         if (curType == XMLStreamConstants.START_ELEMENT
-                || curType == XMLStreamConstants.START_ELEMENT || curType == 
XMLStreamConstants.ATTRIBUTE) {
+                || curType == XMLStreamConstants.END_ELEMENT || curType == 
XMLStreamConstants.ATTRIBUTE) {
             
             String nodeName = curNode.getNodeName();
             String prefix = "";;

Modified: 
xerces/java/branches/stax-dev/src/org/apache/xerces/stax/NamespaceContextImpl.java
URL: 
http://svn.apache.org/viewvc/xerces/java/branches/stax-dev/src/org/apache/xerces/stax/NamespaceContextImpl.java?rev=433641&r1=433640&r2=433641&view=diff
==============================================================================
--- 
xerces/java/branches/stax-dev/src/org/apache/xerces/stax/NamespaceContextImpl.java
 (original)
+++ 
xerces/java/branches/stax-dev/src/org/apache/xerces/stax/NamespaceContextImpl.java
 Tue Aug 22 07:17:46 2006
@@ -37,7 +37,7 @@
     private Stack namespaceStack;
     
     // Record the namespaces of START_ELEMENT and END_ELEMENT for SAXSource
-    private ArrayList eleNamespaces = new ArrayList();
+    private ArrayList eleNamespaces;
     
     private Stack enStack;
     
@@ -76,7 +76,8 @@
      * and removed from avaliable stack.
      */
     public void onEndElement() {
-        eleNamespaces = (ArrayList)enStack.pop();
+        if(!enStack.isEmpty())
+            eleNamespaces = (ArrayList)enStack.pop();
         
         if (!namespaceStack.empty()) {
             

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?rev=433641&r1=433640&r2=433641&view=diff
==============================================================================
--- 
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
 Tue Aug 22 07:17:46 2006
@@ -165,11 +165,14 @@
      */
     public  int next() throws XMLStreamException {      
         if (hasNext() == false) {
+            asp.interrupt();
             throw new XMLStreamException("No such element!");
         }
         
-        if(asp.ex != null)
+        if(asp.ex != null) {
+            asp.interrupt();
             throw new XMLStreamException(asp.ex.getMessage(), asp.ex);
+        }
         
         synchronized(asp) {
             asp.setRunningFlag(true);
@@ -177,14 +180,17 @@
             
             try {
                 while (asp.getRunningFlag() == true) {
-                    if(asp.ex != null)
+                    if(asp.ex != null) {
+                        asp.interrupt();
                         throw new XMLStreamException(asp.ex.getMessage(), 
asp.ex);
+                    }
                     asp.wait();
                 }
                 
                 return curType;
             } 
             catch (Exception e) {
+                asp.interrupt();
                 throw new XMLStreamException(
                         "Error occurs when processing SAXSource", e);
             }
@@ -413,7 +419,9 @@
      * @throws XMLStreamException if there are errors freeing associated 
resources
      */
     public void close() throws XMLStreamException {
-        // As for SAXSource, this method needs to close the underlying 
bytestream
+        //if the asp thread is still alive, interrupt it
+        if(asp.isAlive() && !asp.isInterrupted())
+            asp.interrupt();
     }
     
     /**

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?rev=433641&r1=433640&r2=433641&view=diff
==============================================================================
--- 
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 
Tue Aug 22 07:17:46 2006
@@ -17,10 +17,10 @@
 package org.apache.xerces.stax;
 
 import javax.xml.stream.XMLStreamConstants;
-import javax.xml.stream.XMLStreamException;
 
 import org.xml.sax.Attributes;
 import org.xml.sax.Locator;
+import org.xml.sax.SAXException;
 import org.xml.sax.helpers.DefaultHandler;
 
 /**
@@ -43,7 +43,7 @@
             buf = new StringBuffer();
     }
     
-    public void characters(char[] ch, int start, int length) {
+    public void characters(char[] ch, int start, int length) throws 
SAXException {
         try {
             synchronized (asp) {
                 reader.setCurType(XMLStreamConstants.CHARACTERS);
@@ -63,10 +63,12 @@
                 }
             }
         }
-        catch(Exception e) {}
+        catch(Exception e) {
+            throw new SAXException(e.getMessage(), e);
+        }
     }
     
-    public void endDocument(){
+    public void endDocument() throws SAXException{
         try {
             synchronized (asp) {
                 checkCoalescing();
@@ -76,14 +78,16 @@
                     asp.notify();
                     asp.wait();
                 }                
-                
+
                 asp.setRunningFlag(false);
             }
         }
-        catch(Exception e) {}
+        catch(Exception e) {
+            throw new SAXException(e.getMessage(), e);
+        }
     }
     
-    public synchronized void endElement(java.lang.String uri, java.lang.String 
localName, java.lang.String qName){
+    public synchronized void endElement(java.lang.String uri, java.lang.String 
localName, java.lang.String qName) throws SAXException{
         try {
             synchronized (asp) {
                 checkCoalescing();
@@ -105,10 +109,12 @@
                 asp.setRunningFlag(false);
             }
         }
-        catch(Exception e){}
+        catch(Exception e) {
+            throw new SAXException(e.getMessage(), e);
+        }
     }
     
-    public synchronized void ignorableWhitespace(char[] ch, int start, int 
length){
+    public synchronized void ignorableWhitespace(char[] ch, int start, int 
length) throws SAXException{
         try {
             synchronized (asp) {
                 checkCoalescing();
@@ -124,10 +130,12 @@
                 asp.setRunningFlag(false);
             }
         }
-        catch(Exception e) {}
+        catch(Exception e) {
+            throw new SAXException(e.getMessage(), e);
+        }
     }
     
-    public synchronized void notationDecl(java.lang.String name, 
java.lang.String publicId, java.lang.String systemId){
+    public synchronized void notationDecl(java.lang.String name, 
java.lang.String publicId, java.lang.String systemId) throws SAXException{
         try {
             synchronized (asp) {
                 reader.setCurType(XMLStreamConstants.NOTATION_DECLARATION);
@@ -139,10 +147,12 @@
                 asp.setRunningFlag(false);
             }
         }
-        catch(Exception e) {}
+        catch(Exception e) {
+            throw new SAXException(e.getMessage(), e);
+        }
     }
     
-    public synchronized void processingInstruction(java.lang.String target, 
java.lang.String data){
+    public synchronized void processingInstruction(java.lang.String target, 
java.lang.String data) throws SAXException{
         try {
             reader.setCurType(XMLStreamConstants.PROCESSING_INSTRUCTION);
             asp.setPI(data, target);
@@ -156,10 +166,12 @@
                 asp.setRunningFlag(false);
             }
         }
-        catch(Exception e) {}
+        catch(Exception e) {
+            throw new SAXException(e.getMessage(), e);
+        }
     }
     
-    public synchronized void startDocument() {
+    public synchronized void startDocument() throws SAXException {
         try {
             reader.setCurType(XMLStreamConstants.START_DOCUMENT);
             
@@ -172,10 +184,12 @@
                 asp.setRunningFlag(false);
             }
         }
-        catch(Exception e) {}
+        catch(Exception e) {
+            throw new SAXException(e.getMessage(), e);
+        }
     }
     
-    public synchronized void startElement(java.lang.String uri, 
java.lang.String localName, java.lang.String qName, Attributes attributes){
+    public synchronized void startElement(java.lang.String uri, 
java.lang.String localName, java.lang.String qName, Attributes attributes) 
throws SAXException{
         try {
             synchronized (asp) {
                 checkCoalescing();
@@ -199,14 +213,13 @@
                 asp.setRunningFlag(false);                
             }
         }
-        catch(XMLStreamException e) {
-            asp.ex = e;
-        } catch (InterruptedException e) {
+        catch(Exception e) {
+            throw new SAXException(e.getMessage(), e);
         }
     }
     
     
-    public synchronized void unparsedEntityDecl(java.lang.String name, 
java.lang.String publicId, java.lang.String systemId, java.lang.String 
notationName){
+    public synchronized void unparsedEntityDecl(java.lang.String name, 
java.lang.String publicId, java.lang.String systemId, java.lang.String 
notationName) throws SAXException{
 //      System.out.println("ENTITY_DECLARATION");
         try {
             synchronized (asp) {
@@ -219,7 +232,9 @@
                 asp.setRunningFlag(false);
             }
         }
-        catch(Exception e) {}
+        catch(Exception e) {
+            throw new SAXException(e.getMessage(), e);
+        }
     }
     
     /**
@@ -244,7 +259,7 @@
         loc.setLocator(locator);
     }
     
-    public synchronized void skippedEntity(java.lang.String name){
+    public synchronized void skippedEntity(java.lang.String name) throws 
SAXException{
         try {
             synchronized (asp) {
                 checkCoalescing();
@@ -260,7 +275,9 @@
                 asp.setRunningFlag(false);
             }
         }
-        catch(Exception e) {}
+        catch(Exception e) {
+            throw new SAXException(e.getMessage(), e);
+        }
     }
     
     private void checkCoalescing() throws InterruptedException {



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to