You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tuscany.apache.org by rf...@apache.org on 2008/12/10 20:37:27 UTC

svn commit: r725398 [2/4] - in /tuscany/java/sca/modules/common-xml: ./ META-INF/ src/ src/main/ src/main/java/ src/main/java/org/ src/main/java/org/apache/ src/main/java/org/apache/tuscany/ src/main/java/org/apache/tuscany/sca/ src/main/java/org/apach...

Added: tuscany/java/sca/modules/common-xml/src/main/java/org/apache/tuscany/sca/common/xml/stax/DelegatingNamespaceContext.java
URL: http://svn.apache.org/viewvc/tuscany/java/sca/modules/common-xml/src/main/java/org/apache/tuscany/sca/common/xml/stax/DelegatingNamespaceContext.java?rev=725398&view=auto
==============================================================================
--- tuscany/java/sca/modules/common-xml/src/main/java/org/apache/tuscany/sca/common/xml/stax/DelegatingNamespaceContext.java (added)
+++ tuscany/java/sca/modules/common-xml/src/main/java/org/apache/tuscany/sca/common/xml/stax/DelegatingNamespaceContext.java Wed Dec 10 11:37:25 2008
@@ -0,0 +1,310 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.    
+ */
+package org.apache.tuscany.sca.common.xml.stax;
+
+import java.util.ArrayList;
+import java.util.EmptyStackException;
+import java.util.Iterator;
+import java.util.List;
+
+import javax.xml.namespace.NamespaceContext;
+
+public class DelegatingNamespaceContext implements NamespaceContext {
+    private static int count;
+
+    private class WrappingIterator implements Iterator {
+
+        private Iterator containedIterator;
+
+        public WrappingIterator(Iterator containedIterator) {
+            this.containedIterator = containedIterator;
+        }
+
+        public Iterator getContainedIterator() {
+            return containedIterator;
+        }
+
+        public boolean hasNext() {
+            return containedIterator.hasNext();
+        }
+
+        public Object next() {
+            return containedIterator.next();
+        }
+
+        /**
+         * As per the contract on the API of Namespace context the returned iterator should be immutable
+         */
+        public void remove() {
+            throw new UnsupportedOperationException();
+        }
+
+        public void setContainedIterator(Iterator containedIterator) {
+            this.containedIterator = containedIterator;
+        }
+    }
+
+    private NamespaceContext parentNsContext;
+
+    private FastStack<String> prefixStack = new FastStack<String>();
+
+    // Keep two ArrayLists for the prefixes and namespaces. They should be in
+    // sync
+    // since the index of the entry will be used to relate them
+    // use the minimum initial capacity to let things handle memory better
+
+    private FastStack<String> uriStack = new FastStack<String>();
+
+    /**
+     * Generates a unique namespace prefix that is not in the scope of the NamespaceContext
+     * 
+     * @return string
+     */
+    public String generateUniquePrefix() {
+        String prefix = "p" + count++;
+        // null should be returned if the prefix is not bound!
+        while (getNamespaceURI(prefix) != null) {
+            prefix = "p" + count++;
+        }
+
+        return prefix;
+    }
+
+    public String getNamespaceURI(String prefix) {
+        // do the corrections as per the Javadoc
+        int index = prefixStack.search(prefix);
+        if (index != -1) {
+            return uriStack.get(index);
+        }
+        if (parentNsContext != null) {
+            return parentNsContext.getPrefix(prefix);
+        }
+        return null;
+    }
+
+    public NamespaceContext getParentNsContext() {
+        return parentNsContext;
+    }
+
+    public String getPrefix(String uri) {
+        // do the corrections as per the Javadoc
+        int index = uriStack.search(uri);
+        if (index != -1) {
+            return prefixStack.get(index);
+        }
+
+        if (parentNsContext != null) {
+            return parentNsContext.getPrefix(uri);
+        }
+        return null;
+    }
+
+    public Iterator getPrefixes(String uri) {
+        // create an ArrayList that contains the relevant prefixes
+        String[] uris = uriStack.toArray(new String[uriStack.size()]);
+        List<String> tempList = new ArrayList<String>();
+        for (int i = uris.length - 1; i >= 0; i--) {
+            if (uris[i].equals(uri)) {
+                tempList.add(prefixStack.get(i));
+                // we assume that array conversion preserves the order
+            }
+        }
+        // by now all the relevant prefixes are collected
+        // make a new iterator and provide a wrapper iterator to
+        // obey the contract on the API
+        return new WrappingIterator(tempList.iterator());
+    }
+
+    /**
+     * Pop a namespace
+     */
+    public void popNamespace() {
+        prefixStack.pop();
+        uriStack.pop();
+    }
+
+    /**
+     * Register a namespace in this context
+     * 
+     * @param prefix
+     * @param uri
+     */
+    public void pushNamespace(String prefix, String uri) {
+        prefixStack.push(prefix);
+        uriStack.push(uri);
+
+    }
+
+    public void setParentNsContext(NamespaceContext parentNsContext) {
+        this.parentNsContext = parentNsContext;
+    }
+
+    /**
+     * An implementation of the {@link java.util.Stack} API that is based on an <code>ArrayList</code> instead of a
+     * <code>Vector</code>, so it is not synchronized to protect against multi-threaded access. The implementation is
+     * therefore operates faster in environments where you do not need to worry about multiple thread contention.
+     * <p>
+     * The removal order of an <code>ArrayStack</code> is based on insertion order: The most recently added element is
+     * removed first. The iteration order is <i>not</i> the same as the removal order. The iterator returns elements
+     * from the bottom up, whereas the {@link #remove()} method removes them from the top down.
+     * <p>
+     * Unlike <code>Stack</code>, <code>ArrayStack</code> accepts null entries.
+     */
+    public static class FastStack<T> extends ArrayList<T> {
+
+        /** Ensure Serialization compatibility */
+        private static final long serialVersionUID = 2130079159931574599L;
+
+        /**
+         * Constructs a new empty <code>ArrayStack</code>. The initial size is controlled by <code>ArrayList</code>
+         * and is currently 10.
+         */
+        public FastStack() {
+            super();
+        }
+
+        /**
+         * Constructs a new empty <code>ArrayStack</code> with an initial size.
+         * 
+         * @param initialSize the initial size to use
+         * @throws IllegalArgumentException if the specified initial size is negative
+         */
+        public FastStack(int initialSize) {
+            super(initialSize);
+        }
+
+        /**
+         * Return <code>true</code> if this stack is currently empty.
+         * <p>
+         * This method exists for compatibility with <code>java.util.Stack</code>. New users of this class should use
+         * <code>isEmpty</code> instead.
+         * 
+         * @return true if the stack is currently empty
+         */
+        public boolean empty() {
+            return isEmpty();
+        }
+
+        /**
+         * Returns the top item off of this stack without removing it.
+         * 
+         * @return the top item on the stack
+         * @throws EmptyStackException if the stack is empty
+         */
+        public T peek() throws EmptyStackException {
+            int n = size();
+            if (n <= 0) {
+                throw new EmptyStackException();
+            } else {
+                return get(n - 1);
+            }
+        }
+
+        /**
+         * Returns the n'th item down (zero-relative) from the top of this stack without removing it.
+         * 
+         * @param n the number of items down to go
+         * @return the n'th item on the stack, zero relative
+         * @throws EmptyStackException if there are not enough items on the stack to satisfy this request
+         */
+        public T peek(int n) throws EmptyStackException {
+            int m = (size() - n) - 1;
+            if (m < 0) {
+                throw new EmptyStackException();
+            } else {
+                return get(m);
+            }
+        }
+
+        /**
+         * Pops the top item off of this stack and return it.
+         * 
+         * @return the top item on the stack
+         * @throws EmptyStackException if the stack is empty
+         */
+        public T pop() throws EmptyStackException {
+            int n = size();
+            if (n <= 0) {
+                throw new EmptyStackException();
+            } else {
+                return remove(n - 1);
+            }
+        }
+
+        /**
+         * Pushes a new item onto the top of this stack. The pushed item is also returned. This is equivalent to calling
+         * <code>add</code>.
+         * 
+         * @param item the item to be added
+         * @return the item just pushed
+         */
+        public Object push(T item) {
+            add(item);
+            return item;
+        }
+
+        /**
+         * Returns the top-most index for the object in the stack
+         * 
+         * @param object the object to be searched for
+         * @return top-most index, or -1 if not found
+         */
+        public int search(T object) {
+            int i = size() - 1; // Current index
+            while (i >= 0) {
+                T current = get(i);
+                if ((object == null && current == null) || (object != null && object.equals(current))) {
+                    return i;
+                }
+                i--;
+            }
+            return -1;
+        }
+
+        /**
+         * Returns the element on the top of the stack.
+         * 
+         * @return the element on the top of the stack
+         * @throws EmptyStackException if the stack is empty
+         */
+        public T get() {
+            int size = size();
+            if (size == 0) {
+                throw new EmptyStackException();
+            }
+            return get(size - 1);
+        }
+
+        /**
+         * Removes the element on the top of the stack.
+         * 
+         * @return the removed element
+         * @throws EmptyStackException if the stack is empty
+         */
+        public T remove() {
+            int size = size();
+            if (size == 0) {
+                throw new EmptyStackException();
+            }
+            return remove(size - 1);
+        }
+
+    }
+
+}

Propchange: tuscany/java/sca/modules/common-xml/src/main/java/org/apache/tuscany/sca/common/xml/stax/DelegatingNamespaceContext.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: tuscany/java/sca/modules/common-xml/src/main/java/org/apache/tuscany/sca/common/xml/stax/DelegatingNamespaceContext.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Added: tuscany/java/sca/modules/common-xml/src/main/java/org/apache/tuscany/sca/common/xml/stax/NameValueArrayStreamReader.java
URL: http://svn.apache.org/viewvc/tuscany/java/sca/modules/common-xml/src/main/java/org/apache/tuscany/sca/common/xml/stax/NameValueArrayStreamReader.java?rev=725398&view=auto
==============================================================================
--- tuscany/java/sca/modules/common-xml/src/main/java/org/apache/tuscany/sca/common/xml/stax/NameValueArrayStreamReader.java (added)
+++ tuscany/java/sca/modules/common-xml/src/main/java/org/apache/tuscany/sca/common/xml/stax/NameValueArrayStreamReader.java Wed Dec 10 11:37:25 2008
@@ -0,0 +1,404 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.    
+ */
+package org.apache.tuscany.sca.common.xml.stax;
+
+import javax.xml.namespace.NamespaceContext;
+import javax.xml.namespace.QName;
+import javax.xml.stream.Location;
+import javax.xml.stream.XMLStreamException;
+
+
+public class NameValueArrayStreamReader implements XMLFragmentStreamReader {
+
+    private static final int START_ELEMENT_STATE = 0;
+    private static final int TEXT_STATE = 1;
+    private static final int END_ELEMENT_STATE = 2;
+    private static final int FINAL_END_ELEMENT_STATE = 3;
+    private static final int START_ELEMENT_STATE_WITH_NULL = 4;
+
+    private DelegatingNamespaceContext namespaceContext = new DelegatingNamespaceContext();
+    // the index of the array
+    private int arrayIndex;
+
+    private QName name;
+    private String[] values;
+
+    // start element is the default state
+    private int state = START_ELEMENT_STATE;
+
+    public NameValueArrayStreamReader(QName name, String[] values) {
+        this.name = name;
+        this.values = values;
+    }
+
+    public void setParentNamespaceContext(NamespaceContext nsContext) {
+        this.namespaceContext.setParentNsContext(nsContext);
+    }
+
+    public void init() {
+        // TODO what if the QName namespace has not been declared
+    }
+
+    public Object getProperty(String string) throws IllegalArgumentException {
+        return null;
+    }
+
+    /**
+     * @throws XMLStreamException
+     */
+    public int next() throws XMLStreamException {
+        switch (state) {
+            case START_ELEMENT_STATE:
+                if (values.length > 0) {
+                    state = TEXT_STATE;
+                    return CHARACTERS;
+                } else {
+                    state = FINAL_END_ELEMENT_STATE;
+                    return END_ELEMENT;
+                }
+
+            case START_ELEMENT_STATE_WITH_NULL:
+                if (arrayIndex == (values.length - 1)) {
+                    state = FINAL_END_ELEMENT_STATE;
+                } else {
+                    state = END_ELEMENT_STATE;
+                }
+                return END_ELEMENT;
+            case FINAL_END_ELEMENT_STATE:
+                // oops, not supposed to happen!
+                throw new XMLStreamException("end already reached!");
+            case END_ELEMENT_STATE:
+                // we've to have more values since this is not the
+                // last value
+                // increment the counter
+                arrayIndex++;
+                if (values[arrayIndex] == null) {
+                    state = START_ELEMENT_STATE_WITH_NULL;
+                } else {
+                    state = START_ELEMENT_STATE;
+                }
+                return START_ELEMENT;
+            case TEXT_STATE:
+                if (arrayIndex == (values.length - 1)) {
+                    state = FINAL_END_ELEMENT_STATE;
+                    return END_ELEMENT;
+                } else {
+                    state = END_ELEMENT_STATE;
+                    return END_ELEMENT;
+                }
+
+            default:
+                throw new XMLStreamException("unknown event type!");
+        }
+    }
+
+    public void require(int i, String string, String string1) throws XMLStreamException {
+        // nothing done here
+    }
+
+    public String getElementText() throws XMLStreamException {
+        return null; // not implemented
+    }
+
+    public int nextTag() throws XMLStreamException {
+        return 0; // not implemented
+    }
+
+    public String getAttributeValue(String string, String string1) {
+        if (state == TEXT_STATE) {
+            // TODO something
+            return null;
+        } else {
+            return null;
+        }
+
+    }
+
+    public int getAttributeCount() {
+        if (state == START_ELEMENT_STATE_WITH_NULL) {
+            return 1;
+        }
+        if (state == START_ELEMENT_STATE) {
+            return 0;
+        } else {
+            throw new IllegalStateException();
+        }
+
+    }
+
+    public QName getAttributeName(int i) {
+        if (state == START_ELEMENT_STATE_WITH_NULL && i == 0) {
+            return NIL_QNAME;
+        }
+        if (state == START_ELEMENT_STATE) {
+            return null;
+        } else {
+            throw new IllegalStateException();
+        }
+    }
+
+    public String getAttributeNamespace(int i) {
+        if (state == START_ELEMENT_STATE_WITH_NULL && i == 0) {
+            return NIL_QNAME.getNamespaceURI();
+        }
+        if (state == START_ELEMENT_STATE) {
+            return null;
+        } else {
+            throw new IllegalStateException();
+        }
+    }
+
+    public String getAttributeLocalName(int i) {
+        if (state == START_ELEMENT_STATE_WITH_NULL && i == 0) {
+            return NIL_QNAME.getLocalPart();
+        }
+        if (state == START_ELEMENT_STATE) {
+            return null;
+        } else {
+            throw new IllegalStateException();
+        }
+    }
+
+    public String getAttributePrefix(int i) {
+        if (state == START_ELEMENT_STATE_WITH_NULL && i == 0) {
+            return NIL_QNAME.getPrefix();
+        }
+        if (state == START_ELEMENT_STATE) {
+            return null;
+        } else {
+            throw new IllegalStateException();
+        }
+    }
+
+    public String getAttributeType(int i) {
+        return null; // not implemented
+    }
+
+    public String getAttributeValue(int i) {
+        if (state == START_ELEMENT_STATE_WITH_NULL && i == 0) {
+            return NIL_VALUE_TRUE;
+        }
+        if (state == START_ELEMENT_STATE) {
+            return null;
+        } else {
+            throw new IllegalStateException();
+        }
+    }
+
+    public boolean isAttributeSpecified(int i) {
+        return false; // not supported
+    }
+
+    public int getNamespaceCount() {
+        if (state == START_ELEMENT_STATE_WITH_NULL && isXsiNamespacePresent()) {
+            return 1;
+        } else {
+            return 0;
+        }
+
+    }
+
+    public String getNamespacePrefix(int i) {
+        if (state == START_ELEMENT_STATE_WITH_NULL && isXsiNamespacePresent() && i == 0) {
+            return NIL_QNAME.getPrefix();
+        } else {
+            return null;
+        }
+    }
+
+    public String getNamespaceURI(int i) {
+        if (state == START_ELEMENT_STATE_WITH_NULL && isXsiNamespacePresent() && i == 0) {
+            return NIL_QNAME.getNamespaceURI();
+        } else {
+            return null;
+        }
+    }
+
+    public NamespaceContext getNamespaceContext() {
+        return this.namespaceContext;
+    }
+
+    public boolean isDone() {
+        return state == FINAL_END_ELEMENT_STATE;
+    }
+
+    public int getEventType() {
+        switch (state) {
+            case START_ELEMENT_STATE:
+                return START_ELEMENT;
+            case END_ELEMENT_STATE:
+                return END_ELEMENT;
+            case TEXT_STATE:
+                return CHARACTERS;
+            case FINAL_END_ELEMENT_STATE:
+                return END_ELEMENT;
+            default:
+                throw new UnsupportedOperationException();
+                // we've no idea what this is!!!!!
+        }
+
+    }
+
+    public String getText() {
+        if (state == TEXT_STATE) {
+            return values[arrayIndex];
+        } else {
+            throw new IllegalStateException();
+        }
+    }
+
+    public char[] getTextCharacters() {
+        if (state == TEXT_STATE) {
+            return values[arrayIndex].toCharArray();
+        } else {
+            throw new IllegalStateException();
+        }
+    }
+
+    public int getTextCharacters(int i, char[] chars, int i1, int i2) throws XMLStreamException {
+        // not implemented
+        throw new UnsupportedOperationException();
+    }
+
+    public int getTextStart() {
+        if (state == TEXT_STATE) {
+            return 0;
+        } else {
+            throw new IllegalStateException();
+        }
+    }
+
+    public int getTextLength() {
+        if (state == TEXT_STATE) {
+            return values[arrayIndex].length();
+        } else {
+            throw new IllegalStateException();
+        }
+
+    }
+
+    public String getEncoding() {
+        return null;
+    }
+
+    public boolean hasText() {
+        return state == TEXT_STATE;
+    }
+
+    public Location getLocation() {
+        return null; // not supported
+    }
+
+    public QName getName() {
+        if (state != TEXT_STATE) {
+            return name;
+        } else {
+            return null;
+        }
+    }
+
+    public String getLocalName() {
+        if (state != TEXT_STATE) {
+            return name.getLocalPart();
+        } else {
+            return null;
+        }
+    }
+
+    public boolean hasName() {
+        return state != TEXT_STATE;
+
+    }
+
+    public String getNamespaceURI() {
+        if (state != TEXT_STATE) {
+            return name.getNamespaceURI();
+        } else {
+            return null;
+        }
+
+    }
+
+    public String getPrefix() {
+        if (state != TEXT_STATE) {
+            return name.getPrefix();
+        } else {
+            return null;
+        }
+    }
+
+    public String getVersion() {
+        return null; // TODO 1.0 ?
+    }
+
+    public boolean isStandalone() {
+        return false;
+    }
+
+    public boolean standaloneSet() {
+        return false;
+    }
+
+    public String getCharacterEncodingScheme() {
+        return null;
+    }
+
+    public String getPITarget() {
+        return null;
+    }
+
+    public String getPIData() {
+        return null;
+    }
+
+    public boolean hasNext() throws XMLStreamException {
+        return state != FINAL_END_ELEMENT_STATE;
+    }
+
+    public void close() throws XMLStreamException {
+        // Do nothing - we've nothing to free here
+    }
+
+    public String getNamespaceURI(String prefix) {
+        return namespaceContext.getNamespaceURI(prefix);
+    }
+
+    public boolean isStartElement() {
+        return state == START_ELEMENT_STATE;
+    }
+
+    public boolean isEndElement() {
+        return state == END_ELEMENT_STATE;
+    }
+
+    public boolean isCharacters() {
+        return state == TEXT_STATE;
+    }
+
+    public boolean isWhiteSpace() {
+        return false; // no whitespaces here
+    }
+
+    /**
+     * Test whether the xsi namespace is present
+     */
+    private boolean isXsiNamespacePresent() {
+        return namespaceContext.getNamespaceURI(NIL_QNAME.getPrefix()) != null;
+    }
+}

Propchange: tuscany/java/sca/modules/common-xml/src/main/java/org/apache/tuscany/sca/common/xml/stax/NameValueArrayStreamReader.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: tuscany/java/sca/modules/common-xml/src/main/java/org/apache/tuscany/sca/common/xml/stax/NameValueArrayStreamReader.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Added: tuscany/java/sca/modules/common-xml/src/main/java/org/apache/tuscany/sca/common/xml/stax/NameValuePairStreamReader.java
URL: http://svn.apache.org/viewvc/tuscany/java/sca/modules/common-xml/src/main/java/org/apache/tuscany/sca/common/xml/stax/NameValuePairStreamReader.java?rev=725398&view=auto
==============================================================================
--- tuscany/java/sca/modules/common-xml/src/main/java/org/apache/tuscany/sca/common/xml/stax/NameValuePairStreamReader.java (added)
+++ tuscany/java/sca/modules/common-xml/src/main/java/org/apache/tuscany/sca/common/xml/stax/NameValuePairStreamReader.java Wed Dec 10 11:37:25 2008
@@ -0,0 +1,348 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.    
+ */
+package org.apache.tuscany.sca.common.xml.stax;
+
+import javax.xml.namespace.NamespaceContext;
+import javax.xml.namespace.QName;
+import javax.xml.stream.Location;
+import javax.xml.stream.XMLStreamException;
+
+
+
+public class NameValuePairStreamReader implements XMLFragmentStreamReader {
+
+    private static final int START_ELEMENT_STATE = 0;
+    private static final int TEXT_STATE = 1;
+    private static final int END_ELEMENT_STATE = 2;
+
+    private DelegatingNamespaceContext namespaceContext = new DelegatingNamespaceContext();
+
+    private QName name;
+    private String value;
+
+    private int state = START_ELEMENT_STATE;
+    // initiate at the start element state
+
+    // keeps track whether the namespace is declared
+    // false by default
+    private boolean nsDeclared;
+
+    public NameValuePairStreamReader(QName name, String value) {
+        this.name = name;
+        this.value = value;
+    }
+
+    public Object getProperty(String key) throws IllegalArgumentException {
+        return null;
+    }
+
+    public int next() throws XMLStreamException {
+        // no need to handle null here. it should have been handled
+        // already
+        switch (state) {
+            case START_ELEMENT_STATE:
+                state = TEXT_STATE;
+                return CHARACTERS;
+            case END_ELEMENT_STATE:
+                // oops, not supposed to happen!
+                throw new XMLStreamException("end already reached!");
+            case TEXT_STATE:
+                state = END_ELEMENT_STATE;
+                return END_ELEMENT;
+            default:
+                throw new XMLStreamException("unknown event type!");
+        }
+    }
+
+    public void require(int i, String string, String string1) throws XMLStreamException {
+        // not implemented
+    }
+
+    public String getElementText() throws XMLStreamException {
+        if (state == START_ELEMENT) {
+            // move to the end state and return the value
+            state = END_ELEMENT_STATE;
+            return value;
+        } else {
+            throw new XMLStreamException();
+        }
+
+    }
+
+    public int nextTag() throws XMLStreamException {
+        return 0; // TODO
+    }
+
+    public boolean hasNext() throws XMLStreamException {
+        return state != END_ELEMENT_STATE;
+    }
+
+    public void close() throws XMLStreamException {
+        // Do nothing - we've nothing to free here
+    }
+
+    public String getNamespaceURI(String prefix) {
+        return namespaceContext.getNamespaceURI(prefix);
+    }
+
+    public boolean isStartElement() {
+        return state == START_ELEMENT_STATE;
+    }
+
+    public boolean isEndElement() {
+        return state == END_ELEMENT_STATE;
+    }
+
+    public boolean isCharacters() {
+        return state == TEXT_STATE;
+    }
+
+    public boolean isWhiteSpace() {
+        return false; // no whitespaces here
+    }
+
+    public String getAttributeValue(String string, String string1) {
+        return null;
+    }
+
+    public int getAttributeCount() {
+        return 0;
+    }
+
+    public QName getAttributeName(int i) {
+        return null;
+    }
+
+    public String getAttributeNamespace(int i) {
+        return null;
+    }
+
+    public String getAttributeLocalName(int i) {
+        return null;
+    }
+
+    public String getAttributePrefix(int i) {
+        return null;
+    }
+
+    public String getAttributeType(int i) {
+        return null;
+    }
+
+    public String getAttributeValue(int i) {
+        return null;
+    }
+
+    public boolean isAttributeSpecified(int i) {
+        return false; // no attributes here
+    }
+
+    public int getNamespaceCount() {
+        return nsDeclared ? 1 : 0;
+    }
+
+    public String getNamespacePrefix(int i) {
+        return (nsDeclared && i == 0) ? name.getPrefix() : null;
+    }
+
+    public String getNamespaceURI(int i) {
+        return (nsDeclared && i == 0) ? name.getNamespaceURI() : null;
+    }
+
+    public NamespaceContext getNamespaceContext() {
+        return this.namespaceContext;
+    }
+
+    public int getEventType() {
+        switch (state) {
+            case START_ELEMENT_STATE:
+                return START_ELEMENT;
+            case END_ELEMENT_STATE:
+                return END_ELEMENT;
+            case TEXT_STATE:
+                return CHARACTERS;
+            default:
+                throw new UnsupportedOperationException();
+                // we've no idea what this is!!!!!
+        }
+
+    }
+
+    public String getText() {
+        if (state == TEXT_STATE) {
+            return value;
+        } else {
+            throw new IllegalStateException();
+        }
+    }
+
+    public char[] getTextCharacters() {
+        if (state == TEXT_STATE) {
+            return value.toCharArray();
+        } else {
+            throw new IllegalStateException();
+        }
+    }
+
+    public int getTextCharacters(int i, char[] chars, int i1, int i2) throws XMLStreamException {
+        // not implemented
+        throw new UnsupportedOperationException();
+    }
+
+    public int getTextStart() {
+        if (state == TEXT_STATE) {
+            return 0;
+        } else {
+            throw new IllegalStateException();
+        }
+    }
+
+    public int getTextLength() {
+        if (state == TEXT_STATE) {
+            return value.length();
+        } else {
+            throw new IllegalStateException();
+        }
+
+    }
+
+    public String getEncoding() {
+        return null;
+    }
+
+    public boolean hasText() {
+        return state == TEXT_STATE;
+    }
+
+    public Location getLocation() {
+        return new Location() {
+            public int getLineNumber() {
+                return 0;
+            }
+
+            public int getColumnNumber() {
+                return 0;
+            }
+
+            public int getCharacterOffset() {
+                return 0;
+            }
+
+            public String getPublicId() {
+                return null;
+            }
+
+            public String getSystemId() {
+                return null;
+            }
+        };
+    }
+
+    public QName getName() {
+        if (state != TEXT_STATE) {
+            return name;
+        } else {
+            return null;
+        }
+    }
+
+    public String getLocalName() {
+        if (state != TEXT_STATE) {
+            return name.getLocalPart();
+        } else {
+            return null;
+        }
+    }
+
+    public boolean hasName() {
+        return state != TEXT_STATE;
+
+    }
+
+    public String getNamespaceURI() {
+        if (state != TEXT_STATE) {
+            return name.getNamespaceURI();
+        } else {
+            return null;
+        }
+
+    }
+
+    public String getPrefix() {
+        if (state != TEXT_STATE) {
+            return name.getPrefix();
+        } else {
+            return null;
+        }
+    }
+
+    public String getVersion() {
+        return null; // TODO 1.0 ?
+    }
+
+    public boolean isStandalone() {
+        return false;
+    }
+
+    public boolean standaloneSet() {
+        return false;
+    }
+
+    public String getCharacterEncodingScheme() {
+        return null;
+    }
+
+    public String getPITarget() {
+        return null;
+    }
+
+    public String getPIData() {
+        return null;
+    }
+
+    public boolean isDone() {
+        return state == END_ELEMENT_STATE;
+    }
+
+    public void setParentNamespaceContext(NamespaceContext nsContext) {
+        this.namespaceContext.setParentNsContext(nsContext);
+    }
+
+    public void init() {
+        // just add the current elements namespace and prefix to the this
+        // elements nscontext
+        addToNsMap(name.getPrefix(), name.getNamespaceURI());
+
+    }
+
+    /**
+     * @param prefix
+     * @param uri
+     */
+    private void addToNsMap(String prefix, String uri) {
+        // TODO - need to fix this up to cater for cases where
+        // namespaces are having no prefixes
+        if (!uri.equals(namespaceContext.getNamespaceURI(prefix))) {
+            // this namespace is not there. Need to declare it
+            namespaceContext.pushNamespace(prefix, uri);
+            nsDeclared = true;
+        }
+    }
+
+}

Propchange: tuscany/java/sca/modules/common-xml/src/main/java/org/apache/tuscany/sca/common/xml/stax/NameValuePairStreamReader.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: tuscany/java/sca/modules/common-xml/src/main/java/org/apache/tuscany/sca/common/xml/stax/NameValuePairStreamReader.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Added: tuscany/java/sca/modules/common-xml/src/main/java/org/apache/tuscany/sca/common/xml/stax/NamedProperty.java
URL: http://svn.apache.org/viewvc/tuscany/java/sca/modules/common-xml/src/main/java/org/apache/tuscany/sca/common/xml/stax/NamedProperty.java?rev=725398&view=auto
==============================================================================
--- tuscany/java/sca/modules/common-xml/src/main/java/org/apache/tuscany/sca/common/xml/stax/NamedProperty.java (added)
+++ tuscany/java/sca/modules/common-xml/src/main/java/org/apache/tuscany/sca/common/xml/stax/NamedProperty.java Wed Dec 10 11:37:25 2008
@@ -0,0 +1,59 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.    
+ */
+
+package org.apache.tuscany.sca.common.xml.stax;
+
+import java.util.Map;
+
+import javax.xml.namespace.QName;
+
+/**
+ * A named property
+ * 
+ * @version $Rev$ $Date$
+ */
+public class NamedProperty implements Map.Entry<QName, Object> {
+    private QName key;
+
+    private Object value;
+
+    public NamedProperty(QName key, Object value) {
+        this.key = key;
+        this.value = value;
+    }
+
+    public NamedProperty(String key, Object value) {
+        this.key = new QName(key);
+        this.value = value;
+    }
+    
+    public QName getKey() {
+        return key;
+    }
+
+    public Object getValue() {
+        return value;
+    }
+
+    public Object setValue(Object value) {
+        Object v = this.value;
+        this.value = value;
+        return v;
+    }
+}

Propchange: tuscany/java/sca/modules/common-xml/src/main/java/org/apache/tuscany/sca/common/xml/stax/NamedProperty.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: tuscany/java/sca/modules/common-xml/src/main/java/org/apache/tuscany/sca/common/xml/stax/NamedProperty.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Added: tuscany/java/sca/modules/common-xml/src/main/java/org/apache/tuscany/sca/common/xml/stax/NilElementStreamReader.java
URL: http://svn.apache.org/viewvc/tuscany/java/sca/modules/common-xml/src/main/java/org/apache/tuscany/sca/common/xml/stax/NilElementStreamReader.java?rev=725398&view=auto
==============================================================================
--- tuscany/java/sca/modules/common-xml/src/main/java/org/apache/tuscany/sca/common/xml/stax/NilElementStreamReader.java (added)
+++ tuscany/java/sca/modules/common-xml/src/main/java/org/apache/tuscany/sca/common/xml/stax/NilElementStreamReader.java Wed Dec 10 11:37:25 2008
@@ -0,0 +1,279 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.    
+ */
+package org.apache.tuscany.sca.common.xml.stax;
+
+import javax.xml.namespace.NamespaceContext;
+import javax.xml.namespace.QName;
+import javax.xml.stream.Location;
+import javax.xml.stream.XMLStreamException;
+
+public class NilElementStreamReader implements XMLFragmentStreamReader {
+
+    private static final int END_ELEMENT_STATE = 2;
+
+    private static final int START_ELEMENT_STATE = 1;
+    private int currentState = START_ELEMENT;
+
+    private QName elementQName;
+
+    public NilElementStreamReader(QName elementQName) {
+        this.elementQName = elementQName;
+    }
+
+    public void setParentNamespaceContext(NamespaceContext nsContext) {
+        // NOOP
+    }
+
+    public void close() throws XMLStreamException {
+        // do nothing
+    }
+
+    public int getAttributeCount() {
+        return 1;
+    }
+
+    public String getAttributeLocalName(int i) {
+        return (i == 0) ? NIL_QNAME.getLocalPart() : null;
+    }
+
+    public QName getAttributeName(int i) {
+        return (i == 0) ? NIL_QNAME : null;
+    }
+
+    public String getAttributeNamespace(int i) {
+        return (i == 0) ? NIL_QNAME.getNamespaceURI() : null;
+    }
+
+    public String getAttributePrefix(int i) {
+        return (i == 0) ? NIL_QNAME.getPrefix() : null;
+    }
+
+    public String getAttributeType(int i) {
+        throw new UnsupportedOperationException();
+    }
+
+    public String getAttributeValue(int i) {
+        return (i == 0) ? NIL_VALUE_TRUE : null;
+    }
+
+    public String getAttributeValue(String string, String string1) {
+        if (string == null && NIL_QNAME.getLocalPart().equals(string1)) {
+            return NIL_VALUE_TRUE;
+        }
+        return null;
+    }
+
+    public String getCharacterEncodingScheme() {
+        throw new UnsupportedOperationException();
+    }
+
+    public String getElementText() throws XMLStreamException {
+        return null;
+    }
+
+    public String getEncoding() {
+        return null;
+    }
+
+    public int getEventType() {
+        int returnEvent = START_DOCUMENT;
+        switch (currentState) {
+            case START_ELEMENT_STATE:
+                returnEvent = START_ELEMENT;
+                break;
+            case END_ELEMENT_STATE:
+                returnEvent = END_ELEMENT;
+                break;
+        }
+        return returnEvent;
+    }
+
+    public String getLocalName() {
+        return elementQName.getLocalPart();
+    }
+
+    public Location getLocation() {
+        return new Location() {
+            public int getCharacterOffset() {
+                return 0;
+            }
+
+            public int getColumnNumber() {
+                return 0;
+            }
+
+            public int getLineNumber() {
+                return 0;
+            }
+
+            public String getPublicId() {
+                return null;
+            }
+
+            public String getSystemId() {
+                return null;
+            }
+        };
+    }
+
+    public QName getName() {
+        return elementQName;
+    }
+
+    public NamespaceContext getNamespaceContext() {
+        throw new UnsupportedOperationException();
+    }
+
+    public int getNamespaceCount() {
+        return 0;
+    }
+
+    public String getNamespacePrefix(int i) {
+        return null;
+    }
+
+    public String getNamespaceURI() {
+        return elementQName.getNamespaceURI();
+    }
+
+    public String getNamespaceURI(int i) {
+        return null;
+    }
+
+    public String getNamespaceURI(String string) {
+        if (elementQName.getPrefix() != null && elementQName.getPrefix().equals(string)) {
+            return elementQName.getNamespaceURI();
+        } else {
+            return null;
+        }
+    }
+
+    public String getPIData() {
+        throw new UnsupportedOperationException();
+    }
+
+    public String getPITarget() {
+        throw new UnsupportedOperationException();
+    }
+
+    public String getPrefix() {
+        return elementQName.getPrefix();
+    }
+
+    public Object getProperty(String key) throws IllegalArgumentException {
+        // since optimization is a global property
+        // we've to implement it everywhere
+        return null;
+    }
+
+    public String getText() {
+        return null;
+    }
+
+    public char[] getTextCharacters() {
+        return new char[0]; 
+    }
+
+    public int getTextCharacters(int i, char[] chars, int i1, int i2) throws XMLStreamException {
+        return 0;
+    }
+
+    public int getTextLength() {
+        return 0;
+    }
+
+    public int getTextStart() {
+        return 0;
+    }
+
+    public String getVersion() {
+        throw new UnsupportedOperationException();
+    }
+
+    public boolean hasName() {
+        return true;
+    }
+
+    public boolean hasNext() throws XMLStreamException {
+        return currentState != END_ELEMENT_STATE;
+
+    }
+
+    public boolean hasText() {
+        return false;
+    }
+
+    public void init() {
+        // NOOP
+    }
+
+    public boolean isAttributeSpecified(int i) {
+        return i == 0;
+    }
+
+    public boolean isCharacters() {
+        return false;
+    }
+
+    public boolean isDone() {
+        return currentState == END_ELEMENT_STATE;
+    }
+
+    public boolean isEndElement() {
+        return currentState == END_ELEMENT_STATE;
+    }
+
+    public boolean isStandalone() {
+        throw new UnsupportedOperationException();
+    }
+
+    public boolean isStartElement() {
+        return currentState == START_ELEMENT_STATE;
+    }
+
+    public boolean isWhiteSpace() {
+        return false;
+    }
+
+    public int next() throws XMLStreamException {
+        int returnEvent = START_DOCUMENT;
+        switch (currentState) {
+            case START_ELEMENT_STATE:
+                currentState = END_ELEMENT_STATE;
+                returnEvent = END_ELEMENT;
+                break;
+            case END_ELEMENT_STATE:
+                throw new XMLStreamException("parser completed!");
+
+        }
+        return returnEvent;
+    }
+
+    public int nextTag() throws XMLStreamException {
+        throw new UnsupportedOperationException();
+    }
+
+    public void require(int i, String string, String string1) throws XMLStreamException {
+        // nothing
+    }
+
+    public boolean standaloneSet() {
+        throw new UnsupportedOperationException();
+    }
+}

Propchange: tuscany/java/sca/modules/common-xml/src/main/java/org/apache/tuscany/sca/common/xml/stax/NilElementStreamReader.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: tuscany/java/sca/modules/common-xml/src/main/java/org/apache/tuscany/sca/common/xml/stax/NilElementStreamReader.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Added: tuscany/java/sca/modules/common-xml/src/main/java/org/apache/tuscany/sca/common/xml/stax/SimpleXmlNodeImpl.java
URL: http://svn.apache.org/viewvc/tuscany/java/sca/modules/common-xml/src/main/java/org/apache/tuscany/sca/common/xml/stax/SimpleXmlNodeImpl.java?rev=725398&view=auto
==============================================================================
--- tuscany/java/sca/modules/common-xml/src/main/java/org/apache/tuscany/sca/common/xml/stax/SimpleXmlNodeImpl.java (added)
+++ tuscany/java/sca/modules/common-xml/src/main/java/org/apache/tuscany/sca/common/xml/stax/SimpleXmlNodeImpl.java Wed Dec 10 11:37:25 2008
@@ -0,0 +1,112 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.    
+ */
+
+package org.apache.tuscany.sca.common.xml.stax;
+
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import javax.xml.namespace.QName;
+
+/**
+ * @version $Rev$ $Date$
+ */
+public class SimpleXmlNodeImpl implements XmlNode {
+    private static final String XSI_PREFIX = "xsi";
+    private static final String XSI_NS = "http://www.w3.org/2001/XMLSchema-instance";
+    private static final QName XSI_NIL = new QName(XSI_NS, "nil", XSI_PREFIX);
+    private static final Map<String, String> NS_MAP = new HashMap<String, String>();
+    static {
+        NS_MAP.put(XSI_PREFIX, XSI_NS);
+    }
+
+    protected Type type;
+    protected QName name;
+    protected Object value;
+
+    public SimpleXmlNodeImpl(QName name, Object value) {
+        this(name, value, name != null ? Type.ELEMENT : Type.CHARACTERS);
+    }
+
+    public SimpleXmlNodeImpl(QName name, Object value, Type type) {
+        super();
+        this.type = type;
+        this.name = name;
+        this.value = value;
+    }
+
+    /**
+     * @see org.apache.tuscany.sca.common.xml.stax.databinding.xml.XmlNode#attributes()
+     */
+    public List<XmlNode> attributes() {
+        if (type == Type.ELEMENT && value == null) {
+            // Nil element
+            XmlNode attr = new SimpleXmlNodeImpl(XSI_NIL, "true");
+            return Arrays.asList(attr);
+        }
+        return null;
+    }
+
+    /**
+     * @see org.apache.tuscany.sca.common.xml.stax.databinding.xml.XmlNode#children()
+     */
+    public Iterator<XmlNode> children() {
+        if (type == Type.ELEMENT && value != null) {
+            // Nil element
+            XmlNode node = new SimpleXmlNodeImpl(null, value);
+            return Arrays.asList(node).iterator();
+        }
+        return null;
+    }
+
+    /**
+     * @see org.apache.tuscany.sca.common.xml.stax.databinding.xml.XmlNode#getName()
+     */
+    public QName getName() {
+        return name;
+    }
+
+    /**
+     * @see org.apache.tuscany.sca.common.xml.stax.databinding.xml.XmlNode#getValue()
+     */
+    public String getValue() {
+        return value == null ? null : String.valueOf(value);
+    }
+
+    /**
+     * @see org.apache.tuscany.sca.common.xml.stax.databinding.xml.XmlNode#namespaces()
+     */
+    public Map<String, String> namespaces() {
+        if (type == Type.ELEMENT && value == null) {
+            return NS_MAP;
+        }
+        return null;
+    }
+
+    public Type getType() {
+        return type;
+    }
+
+    public void setType(Type type) {
+        this.type = type;
+    }
+}

Propchange: tuscany/java/sca/modules/common-xml/src/main/java/org/apache/tuscany/sca/common/xml/stax/SimpleXmlNodeImpl.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: tuscany/java/sca/modules/common-xml/src/main/java/org/apache/tuscany/sca/common/xml/stax/SimpleXmlNodeImpl.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Added: tuscany/java/sca/modules/common-xml/src/main/java/org/apache/tuscany/sca/common/xml/stax/StAX2SAXAdapter.java
URL: http://svn.apache.org/viewvc/tuscany/java/sca/modules/common-xml/src/main/java/org/apache/tuscany/sca/common/xml/stax/StAX2SAXAdapter.java?rev=725398&view=auto
==============================================================================
--- tuscany/java/sca/modules/common-xml/src/main/java/org/apache/tuscany/sca/common/xml/stax/StAX2SAXAdapter.java (added)
+++ tuscany/java/sca/modules/common-xml/src/main/java/org/apache/tuscany/sca/common/xml/stax/StAX2SAXAdapter.java Wed Dec 10 11:37:25 2008
@@ -0,0 +1,256 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.    
+ */
+package org.apache.tuscany.sca.common.xml.stax;
+
+import javax.xml.namespace.QName;
+import javax.xml.stream.Location;
+import javax.xml.stream.XMLStreamConstants;
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamReader;
+
+import org.xml.sax.Attributes;
+import org.xml.sax.ContentHandler;
+import org.xml.sax.Locator;
+import org.xml.sax.SAXException;
+import org.xml.sax.helpers.AttributesImpl;
+
+/**
+ * Adapter that converts from StAX to SAX event streams. Currently the following
+ * SAX events are not generated:
+ * <ul>
+ * <li>ignorableWhitespace</li>
+ * <li>skippedEntity</li>
+ * <ul>
+ * Also the following StAX events are not mapped:
+ * <ul>
+ * <li>CDATA</li>
+ * <li>COMMENT</li>
+ * <li>DTD</li>
+ * <li>ENTITY_DECLARATION</li>
+ * <li>ENTITY_REFERENCE</li>
+ * <li>NOTATION_DECLARATION</li>
+ * <li>SPACE</li>
+ * </ul>
+ * StAX ATTRIBUTE events are ignored but the equivalent attributes (derived from
+ * the START_ELEMENT event) are supplied in the SAX startElement event's
+ * Attributes parameter. If the adaptor is configured to pass namespace prefixes
+ * then namespace information will also be included in the Attributes; StAX
+ * NAMESPACE events are ignored. <p/> Another issue is namespace processing. If
+ * the reader is positioned at a sub-node, we cannot capture all the in-scope
+ * namespace bindings. Therefore we cannot re-create a proper SAX event stream
+ * from a StAX parser. <p/> For example <p/> &lt;a:root xmlns:a="foo"
+ * xmlns:b="bar"&gt;&lt;b:sub&gt;a:foo&lt;/b:sub&gt;&lt;/a:root&gt; <p/> And if
+ * you are handed a parser at &lt;b:sub&gt;, then your SAX events should look
+ * like: <p/> &lt;b:sub xmlns:a="foo" xmlns:b="bar"&gt;a:foo&lt;/b:sub&gt; <p/>
+ * not: <p/> &lt;b:sub&gt;a:foo&lt;/b:sub&gt; <p/> <p/> Proposal: we change the
+ * receiver of SAX events (SDOXMLResourceImpl) so that it uses NamespaceContext
+ * to resolve prefix (as opposed to record start/endPrefixMappings and use it
+ * for resolution.)
+ * 
+ * @version $Rev$ $Date$
+ */
+public class StAX2SAXAdapter {
+    private final boolean namespacePrefixes;
+
+    /**
+     * Construct a new StAX to SAX adapter that will convert a StAX event stream
+     * into a SAX event stream.
+     * 
+     * @param namespacePrefixes whether xmlns attributes should be included in
+     *            startElement events;
+     */
+    public StAX2SAXAdapter(boolean namespacePrefixes) {
+        this.namespacePrefixes = namespacePrefixes;
+    }
+
+    /**
+     * Pull events from the StAX stream and dispatch to the SAX ContentHandler.
+     * The StAX stream would typically be located on a START_DOCUMENT or
+     * START_ELEMENT event and when this method returns it will be located on
+     * the associated END_DOCUMENT or END_ELEMENT event. Behaviour with other
+     * start events is undefined.
+     * 
+     * @param reader StAX event source to read
+     * @param handler SAX ContentHandler for processing events
+     * @throws XMLStreamException if there was a problem reading the stream
+     * @throws SAXException passed through from the ContentHandler
+     */
+    public void parse(XMLStreamReader reader, ContentHandler handler) throws XMLStreamException, SAXException {
+        handler.setDocumentLocator(new LocatorAdaptor(reader.getLocation()));
+
+        // remembers the nest level of elements to know when we are done
+        int level = 0;
+        int event = reader.getEventType();
+        while (true) {
+            switch (event) {
+                case XMLStreamConstants.START_DOCUMENT:
+                    level++;
+                    handler.startDocument();
+                    break;
+                case XMLStreamConstants.START_ELEMENT:
+                    level++;
+                    handleStartElement(reader, handler);
+                    break;
+                case XMLStreamConstants.PROCESSING_INSTRUCTION:
+                    handler.processingInstruction(reader.getPITarget(), reader.getPIData());
+                    break;
+                case XMLStreamConstants.CHARACTERS:
+                    handler.characters(reader.getTextCharacters(), reader.getTextStart(), reader
+                        .getTextLength());
+                    break;
+                case XMLStreamConstants.END_ELEMENT:
+                    handleEndElement(reader, handler);
+                    level--;
+                    if (level == 0) {
+                        return;
+                    }
+                    break;
+                case XMLStreamConstants.END_DOCUMENT:
+                    handler.endDocument();
+                    return;
+                    /*
+                     * uncomment to handle all events rather than just mapped
+                     * ones // StAX events that are not mapped to SAX case
+                     * XMLStreamConstants.COMMENT: case
+                     * XMLStreamConstants.SPACE: case
+                     * XMLStreamConstants.ENTITY_REFERENCE: case
+                     * XMLStreamConstants.DTD: case XMLStreamConstants.CDATA:
+                     * case XMLStreamConstants.NOTATION_DECLARATION: case
+                     * XMLStreamConstants.ENTITY_DECLARATION: break; // StAX
+                     * events handled in START_ELEMENT case
+                     * XMLStreamConstants.ATTRIBUTE: case
+                     * XMLStreamConstants.NAMESPACE: break; default: throw new
+                     * AssertionError("Unknown StAX event: " + event);
+                     */
+            }
+            event = reader.next();
+        }
+    }
+
+    private void handleStartElement(XMLStreamReader reader, ContentHandler handler) throws SAXException {
+        // send startPrefixMapping events immediately before startElement event
+        int nsCount = reader.getNamespaceCount();
+        for (int i = 0; i < nsCount; i++) {
+            String prefix = reader.getNamespacePrefix(i);
+            if (prefix == null) { // true for default namespace
+                prefix = "";
+            }
+            handler.startPrefixMapping(prefix, reader.getNamespaceURI(i));
+        }
+
+        // fire startElement
+        QName qname = reader.getName();
+        String prefix = qname.getPrefix();
+        String rawname;
+        if (prefix == null || prefix.length() == 0) {
+            rawname = qname.getLocalPart();
+        } else {
+            rawname = prefix + ':' + qname.getLocalPart();
+        }
+        Attributes attrs = getAttributes(reader);
+        handler.startElement(qname.getNamespaceURI(), qname.getLocalPart(), rawname, attrs);
+    }
+
+    private static void handleEndElement(XMLStreamReader reader, ContentHandler handler) throws SAXException {
+        // fire endElement
+        QName qname = reader.getName();
+        handler.endElement(qname.getNamespaceURI(), qname.getLocalPart(), qname.toString());
+
+        // send endPrefixMapping events immediately after endElement event
+        // we send them in the opposite order to that returned but this is not
+        // actually required by SAX
+        int nsCount = reader.getNamespaceCount();
+        for (int i = nsCount - 1; i >= 0; i--) {
+            String prefix = reader.getNamespacePrefix(i);
+            if (prefix == null) { // true for default namespace
+                prefix = "";
+            }
+            handler.endPrefixMapping(prefix);
+        }
+    }
+
+    /**
+     * Get the attributes associated with the current START_ELEMENT event.
+     * 
+     * @return the StAX attributes converted to org.xml.sax.Attributes
+     */
+    private Attributes getAttributes(XMLStreamReader reader) {
+        assert reader.getEventType() == XMLStreamConstants.START_ELEMENT;
+
+        AttributesImpl attrs = new AttributesImpl();
+
+        // add namespace declarations if required
+        if (namespacePrefixes) {
+            for (int i = 0; i < reader.getNamespaceCount(); i++) {
+                String prefix = reader.getNamespacePrefix(i);
+                String uri = reader.getNamespaceURI(i);
+                attrs.addAttribute(null, prefix, "xmlns:" + prefix, "CDATA", uri);
+            }
+        }
+
+        // Regular attributes
+        for (int i = 0; i < reader.getAttributeCount(); i++) {
+            String uri = reader.getAttributeNamespace(i);
+            if (uri == null) {
+                uri = "";
+            }
+            String localName = reader.getAttributeLocalName(i);
+            String prefix = reader.getAttributePrefix(i);
+            String qname;
+            if (prefix == null || prefix.length() == 0) {
+                qname = localName;
+            } else {
+                qname = prefix + ':' + localName;
+            }
+            String type = reader.getAttributeType(i);
+            String value = reader.getAttributeValue(i);
+
+            attrs.addAttribute(uri, localName, qname, type, value);
+        }
+
+        return attrs;
+    }
+
+    /**
+     * Adaptor for mapping Locator information.
+     */
+    private static final class LocatorAdaptor implements Locator {
+        private final Location location;
+
+        private LocatorAdaptor(Location location) {
+            this.location = location;
+        }
+
+        public int getColumnNumber() {
+            return location == null ? 0 : location.getColumnNumber();
+        }
+
+        public int getLineNumber() {
+            return location == null ? 0 : location.getLineNumber();
+        }
+
+        public String getPublicId() {
+            return location == null ? "" : location.getPublicId();
+        }
+
+        public String getSystemId() {
+            return location == null ? "" : location.getSystemId();
+        }
+    }
+}

Propchange: tuscany/java/sca/modules/common-xml/src/main/java/org/apache/tuscany/sca/common/xml/stax/StAX2SAXAdapter.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: tuscany/java/sca/modules/common-xml/src/main/java/org/apache/tuscany/sca/common/xml/stax/StAX2SAXAdapter.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Added: tuscany/java/sca/modules/common-xml/src/main/java/org/apache/tuscany/sca/common/xml/stax/StAXHelper.java
URL: http://svn.apache.org/viewvc/tuscany/java/sca/modules/common-xml/src/main/java/org/apache/tuscany/sca/common/xml/stax/StAXHelper.java?rev=725398&view=auto
==============================================================================
--- tuscany/java/sca/modules/common-xml/src/main/java/org/apache/tuscany/sca/common/xml/stax/StAXHelper.java (added)
+++ tuscany/java/sca/modules/common-xml/src/main/java/org/apache/tuscany/sca/common/xml/stax/StAXHelper.java Wed Dec 10 11:37:25 2008
@@ -0,0 +1,87 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.    
+ */
+package org.apache.tuscany.sca.common.xml.stax;
+
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.io.Reader;
+import java.io.StringReader;
+import java.io.StringWriter;
+import java.io.Writer;
+
+import javax.xml.stream.XMLInputFactory;
+import javax.xml.stream.XMLOutputFactory;
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamReader;
+import javax.xml.stream.XMLStreamWriter;
+import javax.xml.transform.Source;
+
+
+
+public final class StAXHelper {
+    private static final XMLInputFactory INPUT_FACTORY = XMLInputFactory.newInstance();
+    private static final XMLOutputFactory OUTPUT_FACTORY = XMLOutputFactory.newInstance();
+
+    private StAXHelper() {
+    }
+
+    public static XMLStreamReader createXMLStreamReader(InputStream inputStream) throws XMLStreamException {
+        return INPUT_FACTORY.createXMLStreamReader(inputStream);
+    }
+
+    public static XMLStreamReader createXMLStreamReader(Reader reader) throws XMLStreamException {
+        return INPUT_FACTORY.createXMLStreamReader(reader);
+    }
+
+    public static XMLStreamReader createXMLStreamReader(Source source) throws XMLStreamException {
+        return INPUT_FACTORY.createXMLStreamReader(source);
+    }
+
+    public static XMLStreamReader createXMLStreamReader(String string) throws XMLStreamException {
+        StringReader reader = new StringReader(string);
+        return createXMLStreamReader(reader);
+    }
+
+    public static String save(XMLStreamReader reader) throws XMLStreamException {
+        StringWriter writer = new StringWriter();
+        save(reader, writer);
+        return writer.toString();
+    }
+
+    public static void save(XMLStreamReader reader, OutputStream outputStream) throws XMLStreamException {
+        XMLStreamSerializer serializer = new XMLStreamSerializer();
+        XMLStreamWriter streamWriter = OUTPUT_FACTORY.createXMLStreamWriter(outputStream);
+        serializer.serialize(reader, streamWriter);
+        streamWriter.flush();
+    }
+
+    public static void save(XMLStreamReader reader, Writer writer) throws XMLStreamException {
+        XMLStreamSerializer serializer = new XMLStreamSerializer();
+        XMLStreamWriter streamWriter = OUTPUT_FACTORY.createXMLStreamWriter(writer);
+        serializer.serialize(reader, streamWriter);
+        streamWriter.flush();
+    }
+
+    public static void save(XMLStreamReader reader, XMLStreamWriter writer) throws XMLStreamException {
+        XMLStreamSerializer serializer = new XMLStreamSerializer();
+        serializer.serialize(reader, writer);
+        writer.flush();
+    }
+
+}

Propchange: tuscany/java/sca/modules/common-xml/src/main/java/org/apache/tuscany/sca/common/xml/stax/StAXHelper.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: tuscany/java/sca/modules/common-xml/src/main/java/org/apache/tuscany/sca/common/xml/stax/StAXHelper.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Added: tuscany/java/sca/modules/common-xml/src/main/java/org/apache/tuscany/sca/common/xml/stax/WrappingXMLStreamReader.java
URL: http://svn.apache.org/viewvc/tuscany/java/sca/modules/common-xml/src/main/java/org/apache/tuscany/sca/common/xml/stax/WrappingXMLStreamReader.java?rev=725398&view=auto
==============================================================================
--- tuscany/java/sca/modules/common-xml/src/main/java/org/apache/tuscany/sca/common/xml/stax/WrappingXMLStreamReader.java (added)
+++ tuscany/java/sca/modules/common-xml/src/main/java/org/apache/tuscany/sca/common/xml/stax/WrappingXMLStreamReader.java Wed Dec 10 11:37:25 2008
@@ -0,0 +1,100 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.    
+ */
+package org.apache.tuscany.sca.common.xml.stax;
+
+import javax.xml.namespace.NamespaceContext;
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamReader;
+import javax.xml.stream.util.StreamReaderDelegate;
+
+public class WrappingXMLStreamReader extends StreamReaderDelegate implements XMLFragmentStreamReader {
+
+    private boolean done;
+    private int level;
+
+    public WrappingXMLStreamReader(XMLStreamReader realReader) throws XMLStreamException {
+        super(realReader);
+        if (realReader == null) {
+            throw new UnsupportedOperationException("Reader cannot be null");
+        }
+
+        if (realReader instanceof XMLFragmentStreamReader) {
+            ((XMLFragmentStreamReader)realReader).init();
+        }
+
+        if (realReader.getEventType() == START_DOCUMENT) {
+            // Position to the 1st element
+            realReader.nextTag();
+        }
+        if (realReader.getEventType() != START_ELEMENT) {
+            throw new IllegalStateException("The reader is not positioned at START_DOCUMENT or START_ELEMENT");
+        }
+        this.done = false;
+        this.level = 1;
+    }
+
+    @Override
+    public boolean hasNext() throws XMLStreamException {
+        return !done && super.hasNext();
+    }
+
+    @Override
+    public int next() throws XMLStreamException {
+        if (!hasNext()) {
+            throw new IllegalStateException("No more events");
+        }
+        int event = super.next();
+        if (!super.hasNext()) {
+            done = true;
+        }
+        if (event == START_ELEMENT) {
+            level++;
+        } else if (event == END_ELEMENT) {
+            level--;
+            if (level == 0) {
+                done = true;
+            }
+        }
+        return event;
+    }
+
+    @Override
+    public int nextTag() throws XMLStreamException {
+        int event = 0;
+        while (true) {
+            event = next();
+            if (event == START_ELEMENT || event == END_ELEMENT) {
+                return event;
+            }
+        }
+    }
+    
+    public void setParentNamespaceContext(NamespaceContext nsContext) {
+        // nothing to do here
+    }
+
+    public void init() {
+        // Nothing to do here
+    }
+    
+    public boolean isDone() {
+        return done;
+    }
+
+}

Propchange: tuscany/java/sca/modules/common-xml/src/main/java/org/apache/tuscany/sca/common/xml/stax/WrappingXMLStreamReader.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: tuscany/java/sca/modules/common-xml/src/main/java/org/apache/tuscany/sca/common/xml/stax/WrappingXMLStreamReader.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Added: tuscany/java/sca/modules/common-xml/src/main/java/org/apache/tuscany/sca/common/xml/stax/XMLDocumentStreamReader.java
URL: http://svn.apache.org/viewvc/tuscany/java/sca/modules/common-xml/src/main/java/org/apache/tuscany/sca/common/xml/stax/XMLDocumentStreamReader.java?rev=725398&view=auto
==============================================================================
--- tuscany/java/sca/modules/common-xml/src/main/java/org/apache/tuscany/sca/common/xml/stax/XMLDocumentStreamReader.java (added)
+++ tuscany/java/sca/modules/common-xml/src/main/java/org/apache/tuscany/sca/common/xml/stax/XMLDocumentStreamReader.java Wed Dec 10 11:37:25 2008
@@ -0,0 +1,482 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.    
+ */
+
+package org.apache.tuscany.sca.common.xml.stax;
+
+import java.util.NoSuchElementException;
+
+import javax.xml.namespace.NamespaceContext;
+import javax.xml.namespace.QName;
+import javax.xml.stream.Location;
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamReader;
+
+/**
+ * This class is derived from Apache Axis2 class
+ * 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.
+ *
+ * @version $Rev$ $Date$
+ */
+public class XMLDocumentStreamReader implements XMLStreamReader {
+    private static final int STATE_COMPLETE_AT_NEXT = 2; // The wrapper
+    // will produce
+    // END_DOCUMENT
+
+    private static final int STATE_COMPLETED = 3; // Done
+
+    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 XMLStreamReader realReader;
+    private boolean fragment;
+    private int level = 1;
+
+    private int state = STATE_INIT;
+
+    public XMLDocumentStreamReader(XMLStreamReader realReader) {
+        if (realReader == null) {
+            throw new UnsupportedOperationException("Reader cannot be null");
+        }
+
+        this.realReader = realReader;
+        
+        if (realReader instanceof XMLFragmentStreamReader) {
+            ((XMLFragmentStreamReader)realReader).init();
+        }
+
+        // If the real reader is positioned at START_DOCUMENT, always use
+        // the real reader
+        if (realReader.getEventType() == START_DOCUMENT) {
+            fragment = false;
+            state = STATE_SWITCHED;
+        }
+    }
+
+    public void close() throws XMLStreamException {
+        realReader.close();
+    }
+
+    public int getAttributeCount() {
+        if (isDelegating()) {
+            return realReader.getAttributeCount();
+        } else {
+            throw new IllegalStateException();
+        }
+    }
+
+    public String getAttributeLocalName(int i) {
+        if (isDelegating()) {
+            return realReader.getAttributeLocalName(i);
+        } else {
+            throw new IllegalStateException();
+        }
+    }
+
+    public QName getAttributeName(int i) {
+        if (isDelegating()) {
+            return realReader.getAttributeName(i);
+        } else {
+            throw new IllegalStateException();
+        }
+    }
+
+    public String getAttributeNamespace(int i) {
+        if (isDelegating()) {
+            return realReader.getAttributeNamespace(i);
+        } else {
+            throw new IllegalStateException();
+        }
+    }
+
+    public String getAttributePrefix(int i) {
+        if (isDelegating()) {
+            return realReader.getAttributePrefix(i);
+        } else {
+            throw new IllegalStateException();
+        }
+    }
+
+    public String getAttributeType(int i) {
+        if (isDelegating()) {
+            return realReader.getAttributeType(i);
+        } else {
+            throw new IllegalStateException();
+        }
+    }
+
+    public String getAttributeValue(int i) {
+        if (isDelegating()) {
+            return realReader.getAttributeValue(i);
+        } else {
+            throw new IllegalStateException();
+        }
+    }
+
+    public String getAttributeValue(String s, String s1) {
+        if (isDelegating()) {
+            return realReader.getAttributeValue(s, s1);
+        } else {
+            throw new IllegalStateException();
+        }
+    }
+
+    public String getCharacterEncodingScheme() {
+        return realReader.getCharacterEncodingScheme();
+    }
+
+    public String getElementText() throws XMLStreamException {
+        if (isDelegating()) {
+            return realReader.getElementText();
+        } else {
+            throw new XMLStreamException();
+        }
+    }
+
+    public String getEncoding() {
+        return realReader.getEncoding();
+    }
+
+    public int 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 (isDelegating()) {
+            return realReader.getLocalName();
+        } else {
+            throw new IllegalStateException();
+        }
+    }
+
+    public Location getLocation() {
+        if (isDelegating()) {
+            return realReader.getLocation();
+        } else {
+            return null;
+        }
+    }
+
+    public QName getName() {
+        if (isDelegating()) {
+            return realReader.getName();
+        } else {
+            throw new IllegalStateException();
+        }
+    }
+
+    public NamespaceContext getNamespaceContext() {
+        return realReader.getNamespaceContext();
+    }
+
+    public int getNamespaceCount() {
+        if (isDelegating()) {
+            return realReader.getNamespaceCount();
+        } else {
+            throw new IllegalStateException();
+        }
+    }
+
+    public String getNamespacePrefix(int i) {
+        if (isDelegating()) {
+            return realReader.getNamespacePrefix(i);
+        } else {
+            throw new IllegalStateException();
+        }
+    }
+
+    public String getNamespaceURI() {
+        if (isDelegating()) {
+            return realReader.getNamespaceURI();
+        } else {
+            throw new IllegalStateException();
+        }
+    }
+
+    public String getNamespaceURI(int i) {
+        if (isDelegating()) {
+            return realReader.getNamespaceURI(i);
+        } else {
+            throw new IllegalStateException();
+        }
+    }
+
+    public String getNamespaceURI(String s) {
+        if (isDelegating()) {
+            return realReader.getNamespaceURI(s);
+        } else {
+            throw new IllegalStateException();
+        }
+    }
+
+    public String getPIData() {
+        if (isDelegating()) {
+            return realReader.getPIData();
+        } else {
+            throw new IllegalStateException();
+        }
+    }
+
+    public String getPITarget() {
+        if (isDelegating()) {
+            return realReader.getPITarget();
+        } else {
+            throw new IllegalStateException();
+        }
+    }
+
+    public String getPrefix() {
+        if (isDelegating()) {
+            return realReader.getPrefix();
+        } else {
+            throw new IllegalStateException();
+        }
+    }
+
+    public Object getProperty(String s) throws IllegalArgumentException {
+        if (isDelegating()) {
+            return realReader.getProperty(s);
+        } else {
+            throw new IllegalArgumentException();
+        }
+    }
+
+    public String getText() {
+        if (isDelegating()) {
+            return realReader.getText();
+        } else {
+            throw new IllegalStateException();
+        }
+    }
+
+    public char[] getTextCharacters() {
+        if (isDelegating()) {
+            return realReader.getTextCharacters();
+        } else {
+            throw new IllegalStateException();
+        }
+    }
+
+    public int getTextCharacters(int i, char[] chars, int i1, int i2) throws XMLStreamException {
+        if (isDelegating()) {
+            return realReader.getTextCharacters(i, chars, i1, i2);
+        } else {
+            throw new IllegalStateException();
+        }
+    }
+
+    public int getTextLength() {
+        if (isDelegating()) {
+            return realReader.getTextLength();
+        } else {
+            throw new IllegalStateException();
+        }
+    }
+
+    public int getTextStart() {
+        if (isDelegating()) {
+            return realReader.getTextStart();
+        } else {
+            throw new IllegalStateException();
+        }
+    }
+
+    public String getVersion() {
+        if (isDelegating()) {
+            return realReader.getVersion();
+        } else {
+            return null;
+        }
+    }
+
+    public boolean hasName() {
+        if (isDelegating()) {
+            return realReader.hasName();
+        } else {
+            return false;
+        }
+    }
+
+    public boolean hasNext() throws XMLStreamException {
+        if (state == STATE_COMPLETE_AT_NEXT) {
+            return true;
+        } else if (state == STATE_COMPLETED) {
+            return false;
+        } else if (state == STATE_SWITCHED) {
+            return realReader.hasNext();
+        } else {
+            return true;
+        }
+    }
+
+    public boolean hasText() {
+        if (isDelegating()) {
+            return realReader.hasText();
+        } else {
+            return false;
+        }
+    }
+
+    public boolean isAttributeSpecified(int i) {
+        if (isDelegating()) {
+            return realReader.isAttributeSpecified(i);
+        } else {
+            return false;
+        }
+    }
+
+    public boolean isCharacters() {
+        if (isDelegating()) {
+            return realReader.isCharacters();
+        } else {
+            return false;
+        }
+    }
+
+    private boolean isDelegating() {
+        return state == STATE_SWITCHED || state == STATE_COMPLETE_AT_NEXT;
+    }
+
+    public boolean isEndElement() {
+        if (isDelegating()) {
+            return realReader.isEndElement();
+        } else {
+            return false;
+        }
+    }
+
+    public boolean isStandalone() {
+        if (isDelegating()) {
+            return realReader.isStandalone();
+        } else {
+            return false;
+        }
+    }
+
+    public boolean isStartElement() {
+        if (isDelegating()) {
+            return realReader.isStartElement();
+        } else {
+            return false;
+        }
+    }
+
+    public boolean isWhiteSpace() {
+        if (isDelegating()) {
+            return realReader.isWhiteSpace();
+        } else {
+            return false;
+        }
+    }
+
+    public int next() throws XMLStreamException {
+        int returnEvent;
+
+        switch (state) {
+            case STATE_SWITCHED:
+                returnEvent = realReader.next();
+                if (returnEvent == END_DOCUMENT) {
+                    state = STATE_COMPLETED;
+                } else if (!realReader.hasNext()) {
+                    state = STATE_COMPLETE_AT_NEXT;
+                } 
+                if (fragment && returnEvent == END_ELEMENT) {
+                    level--;
+                    if (level == 0) {
+                        // We are now at the end of the top-level element in the fragment
+                        state = STATE_COMPLETE_AT_NEXT;
+                    }
+                }
+                if (fragment && returnEvent == START_ELEMENT) {
+                    level++;
+                }
+                break;
+            case STATE_INIT:
+                state = STATE_SWITCHED;
+                returnEvent = realReader.getEventType();
+                if (returnEvent == START_ELEMENT) {
+                    // The real reader is positioned at the top-level element in the fragment
+                    level = 0;
+                    fragment = true;
+                }
+                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;
+    }
+
+    public int nextTag() throws XMLStreamException {
+        if (isDelegating()) {
+            int returnEvent = realReader.nextTag();
+            if (fragment && returnEvent == END_ELEMENT) {
+                level--;
+                if (level == 0) {
+                    // We are now at the end of the top-level element in the fragment
+                    state = STATE_COMPLETE_AT_NEXT;
+                }
+            }
+            if (fragment && returnEvent == START_ELEMENT) {
+                level++;
+            }
+            return returnEvent;
+        } else {
+            throw new XMLStreamException();
+        }
+    }
+
+    public void require(int i, String s, String s1) throws XMLStreamException {
+        if (isDelegating()) {
+            realReader.require(i, s, s1);
+        }
+    }
+
+    public boolean standaloneSet() {
+        if (isDelegating()) {
+            return realReader.standaloneSet();
+        } else {
+            return false;
+        }
+    }
+}

Propchange: tuscany/java/sca/modules/common-xml/src/main/java/org/apache/tuscany/sca/common/xml/stax/XMLDocumentStreamReader.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: tuscany/java/sca/modules/common-xml/src/main/java/org/apache/tuscany/sca/common/xml/stax/XMLDocumentStreamReader.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Added: tuscany/java/sca/modules/common-xml/src/main/java/org/apache/tuscany/sca/common/xml/stax/XMLFragmentStreamReader.java
URL: http://svn.apache.org/viewvc/tuscany/java/sca/modules/common-xml/src/main/java/org/apache/tuscany/sca/common/xml/stax/XMLFragmentStreamReader.java?rev=725398&view=auto
==============================================================================
--- tuscany/java/sca/modules/common-xml/src/main/java/org/apache/tuscany/sca/common/xml/stax/XMLFragmentStreamReader.java (added)
+++ tuscany/java/sca/modules/common-xml/src/main/java/org/apache/tuscany/sca/common/xml/stax/XMLFragmentStreamReader.java Wed Dec 10 11:37:25 2008
@@ -0,0 +1,53 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.    
+ */
+package org.apache.tuscany.sca.common.xml.stax;
+
+import javax.xml.namespace.NamespaceContext;
+import javax.xml.namespace.QName;
+import javax.xml.stream.XMLStreamReader;
+
+public interface XMLFragmentStreamReader extends XMLStreamReader {
+    QName NIL_QNAME = new QName("http://www.w3.org/2001/XMLSchema-instance", "nil", "xsi");
+    String NIL_VALUE_TRUE = "true";
+
+    /**
+     * this will help to handle Text within the current element. user should
+     * pass the element text to the property list as this ELEMENT_TEXT as the
+     * key. This key deliberately has a space in it so that it is not a valid
+     * XML name
+     */
+    String ELEMENT_TEXT = "Element Text";
+
+    /**
+     * Extra method to query the state of the pullparser
+     */
+    boolean isDone();
+
+    /**
+     * add the parent namespace context to this parser
+     */
+    void setParentNamespaceContext(NamespaceContext nsContext);
+
+    /**
+     * Initiate the parser - this will do whatever the needed tasks to initiate
+     * the parser and must be called before attempting any specific parsing
+     * using this parser
+     */
+    void init();
+}

Propchange: tuscany/java/sca/modules/common-xml/src/main/java/org/apache/tuscany/sca/common/xml/stax/XMLFragmentStreamReader.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: tuscany/java/sca/modules/common-xml/src/main/java/org/apache/tuscany/sca/common/xml/stax/XMLFragmentStreamReader.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date