Thank for applying the patch.

Here's one more patch addressing several issues I discovered recently.

1) Fix a preifx/namespace mapping issue when a unqualified local element is loaded
2) Fix a duplicate START_DOCUMENT issue with XMLDocumentStreamReader
3) Fix the problem with getTextLength() with XMLDocumentStreamReader and enforce IllegalStateException for some methods per spec

For some TODO/FIXME/HACKs, we require SDO to provide addtional metadata so that the XMLStreamReader for SDO can produce the exact XML document.It' work in progress.

Thanks,
Raymond

----- Original Message ----- From: "Jeremy Boynes" <[EMAIL PROTECTED]>
To: <[email protected]>
Sent: Wednesday, June 21, 2006 12:05 PM
Subject: Re: [PATCH] More improvements to SDO/StAX support


Jeremy Boynes wrote:
Frank Budinsky wrote:

I can't seem to find the cycles to look at this right now, so in the
interest of getting something going here can some other StAX-savvy
committer (maybe Jeremy) take a look at Raymond's patch and commit it if
it looks like a reasonable start.? We can then look at addressing the
issues (e.g., substitution group, which involves a spec discussion) later.




I had a first look and this really helps - thanks Raymond.

Before I apply it, there are a few areas marked "FIXME" or "HACK" - are
those "permanent" hacks or should we expect an update soon?

--
Jeremy

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

Index: 
main/java/org/apache/tuscany/sdo/util/resource/DataObjectXMLStreamReader.java
===================================================================
--- 
main/java/org/apache/tuscany/sdo/util/resource/DataObjectXMLStreamReader.java   
    (revision 416102)
+++ 
main/java/org/apache/tuscany/sdo/util/resource/DataObjectXMLStreamReader.java   
    (working copy)
@@ -862,7 +862,7 @@
     */
    private void registerNamespace(String prefix, String uri) {
        if (!uri.equals(namespaceContext.getNamespaceURI(prefix))) {
-            namespaceContext.put(prefix, uri);
+            namespaceContext.registerMapping(prefix, uri);
            declaredNamespaceMap.put(prefix, uri);
        }
    }
@@ -1301,7 +1301,7 @@
            // namespaces are having no prefixes
            if (!uri.equals(namespaceContext.getNamespaceURI(prefix))) {
                // this namespace is not there. Need to declare it
-                namespaceContext.put(prefix, uri);
+                namespaceContext.registerMapping(prefix, uri);
            }
        }

@@ -1416,19 +1416,22 @@
    protected static class DelegatingNamespaceContext implements 
NamespaceContext {
        private NamespaceContext parent;

-        private Map nsMap = new HashMap();
+        private Map prefixToNamespaceMapping = new HashMap();

        public DelegatingNamespaceContext(NamespaceContext parent) {
            super();
            this.parent = parent;

-            nsMap.put("xml", "http://www.w3.org/XML/1998/namespace";);
-            nsMap.put("xmlns", "http://www.w3.org/2000/xmlns/";);
-            nsMap.put("xsi", "http://www.w3.org/2001/XMLSchema-instance";);
+            prefixToNamespaceMapping.put("xml", 
"http://www.w3.org/XML/1998/namespace";);
+            prefixToNamespaceMapping.put("xmlns", 
"http://www.w3.org/2000/xmlns/";);
+            prefixToNamespaceMapping.put("xsi", 
"http://www.w3.org/2001/XMLSchema-instance";);
        }

        public String getNamespaceURI(String prefix) {
-            String ns = (String) nsMap.get(prefix);
+            if (prefix == null)
+                throw new IllegalArgumentException("Prefix is null");
+
+            String ns = (String) prefixToNamespaceMapping.get(prefix);
            if (ns != null)
                return ns;
            else if (parent != null)
@@ -1440,7 +1443,7 @@
        public String getPrefix(String nsURI) {
            if (nsURI == null)
                throw new IllegalArgumentException("Namespace is null");
-            for (Iterator i = nsMap.entrySet().iterator(); i.hasNext();) {
+            for (Iterator i = prefixToNamespaceMapping.entrySet().iterator(); 
i.hasNext();) {
                Map.Entry entry = (Map.Entry) i.next();
                if (entry.getValue().equals(nsURI)) {
                    return (String) entry.getKey();
@@ -1454,17 +1457,22 @@

        public Iterator getPrefixes(String nsURI) {
            List prefixList = new ArrayList();
-            for (Iterator i = nsMap.entrySet().iterator(); i.hasNext();) {
+            for (Iterator i = prefixToNamespaceMapping.entrySet().iterator(); 
i.hasNext();) {
                Map.Entry entry = (Map.Entry) i.next();
                if (entry.getValue().equals(nsURI)) {
                    prefixList.add(entry.getKey());
                }
            }
+            if (parent != null) {
+                for (Iterator i = parent.getPrefixes(nsURI); i.hasNext();) {
+                    prefixList.add(i.next());
+                }
+            }
            return prefixList.iterator();
        }

-        public void put(String prefix, String nsURI) {
-            nsMap.put(prefix, nsURI);
+        public void registerMapping(String prefix, String nsURI) {
+            prefixToNamespaceMapping.put(prefix, nsURI);
        }

        private int counter = 0;
@@ -1476,12 +1484,12 @@
            if (prefix == null)
                prefix = "";
            if (nsURI != null)
-                nsMap.put(prefix, nsURI);
+                prefixToNamespaceMapping.put(prefix, nsURI);
            return new QName(nsURI, name, prefix);
        }

-        public void remove(String prefix) {
-            nsMap.remove(prefix);
+        public void removeMapping(String prefix) {
+            prefixToNamespaceMapping.remove(prefix);
        }

        public void setParent(NamespaceContext parent) {
Index: main/java/org/apache/tuscany/sdo/util/resource/SDOXMLResourceImpl.java
===================================================================
--- main/java/org/apache/tuscany/sdo/util/resource/SDOXMLResourceImpl.java      
(revision 416102)
+++ main/java/org/apache/tuscany/sdo/util/resource/SDOXMLResourceImpl.java      
(working copy)
@@ -79,7 +79,7 @@

                    uri = null;
                }
-                return uri != null ? uri : super.getURI(prefix);
+                return uri != null && uri.length()!=0 ? uri : 
super.getURI(prefix);
            }

            public StreamNamespaceSupport(XMLStreamReader reader) {
Index: 
main/java/org/apache/tuscany/sdo/util/resource/XMLDocumentStreamReader.java
===================================================================
--- main/java/org/apache/tuscany/sdo/util/resource/XMLDocumentStreamReader.java 
(revision 416102)
+++ main/java/org/apache/tuscany/sdo/util/resource/XMLDocumentStreamReader.java 
(working copy)
@@ -3,6 +3,8 @@
 */
package org.apache.tuscany.sdo.util.resource;

+import java.util.NoSuchElementException;
+
import javax.xml.namespace.NamespaceContext;
import javax.xml.namespace.QName;
import javax.xml.stream.Location;
@@ -10,86 +12,77 @@
import javax.xml.stream.XMLStreamReader;

/**
- * This class is derived from Apache Axis2 class - * <a href="http://svn.apache.org/repos/asf/webservices/axis2/trunk/java/modules/core/src/org/apache/axis2/util/StreamWrapper.java";>
- * org.apache.axis2.util.StreamWrapper</a>. It's used wrap a XMLStreamReader 
to create a XMLStreamReader representing a document and
- * it will produce START_DOCUMENT, END_DOCUMENT events.
- *
+ * This class is derived from Apache Axis2 class <a
+ * 
href="http://svn.apache.org/repos/asf/webservices/axis2/trunk/java/modules/core/src/org/apache/axis2/util/StreamWrapper.java";>
+ * org.apache.axis2.util.StreamWrapper</a>. It's used wrap a XMLStreamReader 
to create a XMLStreamReader representing a document and it will produce
+ * START_DOCUMENT, END_DOCUMENT events.
+ * */
public class XMLDocumentStreamReader implements XMLStreamReader {
-    private static final int STATE_SWITCHED = 0;
-    private static final int STATE_INIT = 1;
-    private static final int STATE_SWITCH_AT_NEXT = 2;
-    private static final int STATE_COMPLETE_AT_NEXT = 3;
-    private static final int STATE_COMPLETED = 4;
+    private static final int STATE_INIT = 0; // The wrapper will produce 
START_DOCUMENT
+
+    private static final int STATE_SWITCHED = 1; // The real reader will 
produce events
+
+    private static final int STATE_COMPLETE_AT_NEXT = 2; // The wrapper will 
produce END_DOCUMENT
+
+    private static final int STATE_COMPLETED = 3; // Done
+
    private XMLStreamReader realReader = null;
+
    private int state = STATE_INIT;
-    private int prevState = state;

-
    public XMLDocumentStreamReader(XMLStreamReader realReader) {
        if (realReader == null) {
            throw new UnsupportedOperationException("Reader cannot be null");
        }

        this.realReader = realReader;
+
+        // If the real reader is positioned at START_DOCUMENT, always use the 
real reader
+        if (realReader.getEventType() == START_DOCUMENT)
+            state = STATE_SWITCHED;
    }

    public void close() throws XMLStreamException {
-        if (prevState != STATE_INIT) {
-            realReader.close();
-        } else {
-            throw new XMLStreamException();
-        }
+        realReader.close();
    }

    public int next() throws XMLStreamException {
-        prevState = state;
        int returnEvent = -1;

        switch (state) {
-            // Commented out by Raymond Feng. It's a bug in the Axis2 code and 
it will produce START_DOCUMENT twice
-            /*
-            case STATE_INIT:
-                if (realReader.getEventType() == START_DOCUMENT) {
-                    state = STATE_SWITCHED;
-                    returnEvent = realReader.getEventType();
-                } else {
-                    state = STATE_SWITCH_AT_NEXT;
-                    returnEvent = START_DOCUMENT;
-                }
-                break;
- */ - case STATE_SWITCHED:
-                returnEvent = realReader.next();
-                if (returnEvent == END_DOCUMENT) {
-                    state = STATE_COMPLETED;
-                } else if (!realReader.hasNext()) {
-                    state = STATE_COMPLETE_AT_NEXT;
-                }
-                break;
-            case STATE_INIT:
-                prevState = STATE_SWITCH_AT_NEXT;
-            case STATE_SWITCH_AT_NEXT:
-                state = STATE_SWITCHED;
-                returnEvent = realReader.getEventType();
-                break;
-            case STATE_COMPLETE_AT_NEXT:
+        case STATE_SWITCHED:
+            returnEvent = realReader.next();
+            if (returnEvent == END_DOCUMENT) {
                state = STATE_COMPLETED;
-                returnEvent = END_DOCUMENT;
-                break;
-            case STATE_COMPLETED:
-                //oops - no way we can go beyond this
-                throw new XMLStreamException("end reached!");
-            default:
-                throw new UnsupportedOperationException();
+            } else if (!realReader.hasNext()) {
+                state = STATE_COMPLETE_AT_NEXT;
+            }
+            break;
+        case STATE_INIT:
+            state = STATE_SWITCHED;
+            returnEvent = realReader.getEventType();
+            break;
+        case STATE_COMPLETE_AT_NEXT:
+            state = STATE_COMPLETED;
+            returnEvent = END_DOCUMENT;
+            break;
+        case STATE_COMPLETED:
+            // oops - no way we can go beyond this
+            throw new NoSuchElementException("End of stream has reached.");
+        default:
+            throw new UnsupportedOperationException();
        }

        return returnEvent;
    }

+    private boolean isDelegating() {
+        return state == STATE_SWITCHED || state == STATE_COMPLETE_AT_NEXT;
+    }
+
    public int nextTag() throws XMLStreamException {
-        if (prevState != STATE_INIT) {
+        if (isDelegating()) {
            return realReader.nextTag();
        } else {
            throw new XMLStreamException();
@@ -97,13 +90,13 @@
    }

    public void require(int i, String s, String s1) throws XMLStreamException {
-        if (prevState != STATE_INIT) {
+        if (isDelegating()) {
            realReader.require(i, s, s1);
        }
    }

    public boolean standaloneSet() {
-        if (prevState != STATE_INIT) {
+        if (isDelegating()) {
            return realReader.standaloneSet();
        } else {
            return false;
@@ -111,79 +104,75 @@
    }

    public int getAttributeCount() {
-        if (prevState != STATE_INIT) {
+        if (isDelegating()) {
            return realReader.getAttributeCount();
        } else {
-            return 0;
+            throw new IllegalStateException();
        }
    }

    public String getAttributeLocalName(int i) {
-        if (prevState != STATE_INIT) {
+        if (isDelegating()) {
            return realReader.getAttributeLocalName(i);
        } else {
-            return null;
+            throw new IllegalStateException();
        }
    }

    public QName getAttributeName(int i) {
-        if (prevState != STATE_INIT) {
+        if (isDelegating()) {
            return realReader.getAttributeName(i);
        } else {
-            return null;
+            throw new IllegalStateException();
        }
    }

    public String getAttributeNamespace(int i) {
-        if (prevState != STATE_INIT) {
+        if (isDelegating()) {
            return realReader.getAttributeNamespace(i);
        } else {
-            return null;
+            throw new IllegalStateException();
        }
    }

    public String getAttributePrefix(int i) {
-        if (prevState != STATE_INIT) {
+        if (isDelegating()) {
            return realReader.getAttributePrefix(i);
        } else {
-            return null;
+            throw new IllegalStateException();
        }
    }

    public String getAttributeType(int i) {
-        if (prevState != STATE_INIT) {
+        if (isDelegating()) {
            return realReader.getAttributeType(i);
        } else {
-            return null;
+            throw new IllegalStateException();
        }
    }

    public String getAttributeValue(int i) {
-        if (prevState != STATE_INIT) {
+        if (isDelegating()) {
            return realReader.getAttributeValue(i);
        } else {
-            return null;
+            throw new IllegalStateException();
        }
    }

    public String getAttributeValue(String s, String s1) {
-        if (prevState != STATE_INIT) {
+        if (isDelegating()) {
            return realReader.getAttributeValue(s, s1);
        } else {
-            return null;
+            throw new IllegalStateException();
        }
    }

    public String getCharacterEncodingScheme() {
-        if (prevState != STATE_INIT) {
-            return realReader.getCharacterEncodingScheme();
-        } else {
-            return null;
-        }
+        return realReader.getCharacterEncodingScheme();
    }

    public String getElementText() throws XMLStreamException {
-        if (prevState != STATE_INIT) {
+        if (isDelegating()) {
            return realReader.getElementText();
        } else {
            throw new XMLStreamException();
@@ -191,31 +180,28 @@
    }

    public String getEncoding() {
-        if (prevState != STATE_INIT) {
-            return realReader.getEncoding();
-        } else {
-            return null;
-        }
+        return realReader.getEncoding();
    }

    public int getEventType() {
-        if (prevState == STATE_INIT) {
-            return START_DOCUMENT;
-        } else {
-            return realReader.getEventType();
+        int event = -1;
+        switch (state) {
+        case STATE_SWITCHED:
+        case STATE_COMPLETE_AT_NEXT:
+            event = realReader.getEventType();
+            break;
+        case STATE_INIT:
+            event = START_DOCUMENT;
+            break;
+        case STATE_COMPLETED:
+            event = END_DOCUMENT;
+            break;
        }
+        return event;
    }

-    public String getLocalName() {
-        if (prevState != STATE_INIT) {
-            return realReader.getLocalName();
-        } else {
-            return null;
-        }
-    }
-
    public Location getLocation() {
-        if (prevState != STATE_INIT) {
+        if (isDelegating()) {
            return realReader.getLocation();
        } else {
            return null;
@@ -223,87 +209,91 @@
    }

    public QName getName() {
-        if (prevState != STATE_INIT) {
+        if (isDelegating()) {
            return realReader.getName();
        } else {
-            return null;
+            throw new IllegalStateException();
        }
    }

-    public NamespaceContext getNamespaceContext() {
-        if (prevState != STATE_INIT) {
-            return realReader.getNamespaceContext();
+    public String getLocalName() {
+        if (isDelegating()) {
+            return realReader.getLocalName();
        } else {
-            return null;
+            throw new IllegalStateException();
        }
    }

+    public NamespaceContext getNamespaceContext() {
+        return realReader.getNamespaceContext();
+    }
+
    public int getNamespaceCount() {
-        if (prevState != STATE_INIT) {
+        if (isDelegating()) {
            return realReader.getNamespaceCount();
        } else {
-            return 0;
+            throw new IllegalStateException();
        }
    }

    public String getNamespacePrefix(int i) {
-        if (prevState != STATE_INIT) {
+        if (isDelegating()) {
            return realReader.getNamespacePrefix(i);
        } else {
-            return null;
+            throw new IllegalStateException();
        }
    }

    public String getNamespaceURI() {
-        if (prevState != STATE_INIT) {
+        if (isDelegating()) {
            return realReader.getNamespaceURI();
        } else {
-            return null;
+            throw new IllegalStateException();
        }
    }

    public String getNamespaceURI(int i) {
-        if (prevState != STATE_INIT) {
+        if (isDelegating()) {
            return realReader.getNamespaceURI(i);
        } else {
-            return null;
+            throw new IllegalStateException();
        }
    }

    public String getNamespaceURI(String s) {
-        if (prevState != STATE_INIT) {
+        if (isDelegating()) {
            return realReader.getNamespaceURI(s);
        } else {
-            return null;
+            throw new IllegalStateException();
        }
    }

    public String getPIData() {
-        if (prevState != STATE_INIT) {
+        if (isDelegating()) {
            return realReader.getPIData();
        } else {
-            return null;
+            throw new IllegalStateException();
        }
    }

    public String getPITarget() {
-        if (prevState != STATE_INIT) {
+        if (isDelegating()) {
            return realReader.getPITarget();
        } else {
-            return null;
+            throw new IllegalStateException();
        }
    }

    public String getPrefix() {
-        if (prevState != STATE_INIT) {
+        if (isDelegating()) {
            return realReader.getPrefix();
        } else {
-            return null;
+            throw new IllegalStateException();
        }
    }

    public Object getProperty(String s) throws IllegalArgumentException {
-        if (prevState != STATE_INIT) {
+        if (isDelegating()) {
            return realReader.getProperty(s);
        } else {
            throw new IllegalArgumentException();
@@ -311,47 +301,47 @@
    }

    public String getText() {
-        if (prevState != STATE_INIT) {
+        if (isDelegating()) {
            return realReader.getText();
        } else {
-            return null;
+            throw new IllegalStateException();
        }
    }

    public char[] getTextCharacters() {
-        if (prevState != STATE_INIT) {
+        if (isDelegating()) {
            return realReader.getTextCharacters();
        } else {
-            return new char[0];
+            throw new IllegalStateException();
        }
    }

    public int getTextCharacters(int i, char[] chars, int i1, int i2) throws 
XMLStreamException {
-        if (prevState != STATE_INIT) {
+        if (isDelegating()) {
            return realReader.getTextCharacters(i, chars, i1, i2);
        } else {
-            return 0;
+            throw new IllegalStateException();
        }
    }

    public int getTextLength() {
-        if (prevState != STATE_INIT) {
-            return realReader.getTextStart();
+        if (isDelegating()) {
+            return realReader.getTextLength();
        } else {
-            return 0;
+            throw new IllegalStateException();
        }
    }

    public int getTextStart() {
-        if (prevState != STATE_INIT) {
+        if (isDelegating()) {
            return realReader.getTextStart();
        } else {
-            return 0;
+            throw new IllegalStateException();
        }
    }

    public String getVersion() {
-        if (prevState != STATE_INIT) {
+        if (isDelegating()) {
            return realReader.getVersion();
        } else {
            return null;
@@ -359,7 +349,7 @@
    }

    public boolean hasName() {
-        if (prevState != STATE_INIT) {
+        if (isDelegating()) {
            return realReader.hasName();
        } else {
            return false;
@@ -371,7 +361,7 @@
            return true;
        } else if (state == STATE_COMPLETED) {
            return false;
-        } else if (prevState != STATE_INIT) {
+        } else if (state == STATE_SWITCHED) {
            return realReader.hasNext();
        } else {
            return true;
@@ -379,7 +369,7 @@
    }

    public boolean hasText() {
-        if (prevState != STATE_INIT) {
+        if (isDelegating()) {
            return realReader.hasText();
        } else {
            return false;
@@ -387,7 +377,7 @@
    }

    public boolean isAttributeSpecified(int i) {
-        if (prevState != STATE_INIT) {
+        if (isDelegating()) {
            return realReader.isAttributeSpecified(i);
        } else {
            return false;
@@ -395,7 +385,7 @@
    }

    public boolean isCharacters() {
-        if (prevState != STATE_INIT) {
+        if (isDelegating()) {
            return realReader.isCharacters();
        } else {
            return false;
@@ -403,7 +393,7 @@
    }

    public boolean isEndElement() {
-        if (prevState != STATE_INIT) {
+        if (isDelegating()) {
            return realReader.isEndElement();
        } else {
            return false;
@@ -411,7 +401,7 @@
    }

    public boolean isStandalone() {
-        if (prevState != STATE_INIT) {
+        if (isDelegating()) {
            return realReader.isStandalone();
        } else {
            return false;
@@ -419,7 +409,7 @@
    }

    public boolean isStartElement() {
-        if (prevState != STATE_INIT) {
+        if (isDelegating()) {
            return realReader.isStartElement();
        } else {
            return false;
@@ -427,7 +417,7 @@
    }

    public boolean isWhiteSpace() {
-        if (prevState != STATE_INIT) {
+        if (isDelegating()) {
            return realReader.isWhiteSpace();
        } else {
            return false;

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

Reply via email to