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 2007/10/17 20:04:51 UTC

svn commit: r585611 - in /incubator/tuscany/java/sca/modules/databinding: ./ src/main/java/org/apache/tuscany/sca/databinding/javabeans/ src/main/java/org/apache/tuscany/sca/databinding/xml/ src/test/java/org/apache/tuscany/sca/databinding/xml/

Author: rfeng
Date: Wed Oct 17 11:04:49 2007
New Revision: 585611

URL: http://svn.apache.org/viewvc?rev=585611&view=rev
Log:
Improve the tree-based XMLStreamReader and convert Bean & DOM to use this approach
Use the xmlunit to test the equality of XML

Added:
    incubator/tuscany/java/sca/modules/databinding/src/main/java/org/apache/tuscany/sca/databinding/xml/BeanXMLStreamReaderImpl.java   (with props)
    incubator/tuscany/java/sca/modules/databinding/src/main/java/org/apache/tuscany/sca/databinding/xml/SimpleXmlNodeImpl.java   (with props)
    incubator/tuscany/java/sca/modules/databinding/src/test/java/org/apache/tuscany/sca/databinding/xml/BeanXMLStreamReaderTestCase.java   (with props)
Removed:
    incubator/tuscany/java/sca/modules/databinding/src/main/java/org/apache/tuscany/sca/databinding/xml/BeanUtil.java
    incubator/tuscany/java/sca/modules/databinding/src/main/java/org/apache/tuscany/sca/databinding/xml/XmlAttribute.java
Modified:
    incubator/tuscany/java/sca/modules/databinding/LICENSE
    incubator/tuscany/java/sca/modules/databinding/pom.xml
    incubator/tuscany/java/sca/modules/databinding/src/main/java/org/apache/tuscany/sca/databinding/javabeans/JavaBean2XMLStreamReader.java
    incubator/tuscany/java/sca/modules/databinding/src/main/java/org/apache/tuscany/sca/databinding/xml/DOMXMLStreamReader.java
    incubator/tuscany/java/sca/modules/databinding/src/main/java/org/apache/tuscany/sca/databinding/xml/DOMXmlNodeImpl.java
    incubator/tuscany/java/sca/modules/databinding/src/main/java/org/apache/tuscany/sca/databinding/xml/Node2XMLStreamReader.java
    incubator/tuscany/java/sca/modules/databinding/src/main/java/org/apache/tuscany/sca/databinding/xml/WrappingXMLStreamReader.java
    incubator/tuscany/java/sca/modules/databinding/src/main/java/org/apache/tuscany/sca/databinding/xml/XMLFragmentStreamReaderImpl.java
    incubator/tuscany/java/sca/modules/databinding/src/main/java/org/apache/tuscany/sca/databinding/xml/XmlNode.java
    incubator/tuscany/java/sca/modules/databinding/src/main/java/org/apache/tuscany/sca/databinding/xml/XmlTreeStreamReaderImpl.java
    incubator/tuscany/java/sca/modules/databinding/src/test/java/org/apache/tuscany/sca/databinding/xml/DOM2StAXTestCase.java
    incubator/tuscany/java/sca/modules/databinding/src/test/java/org/apache/tuscany/sca/databinding/xml/JavaBean2XMLStreamReaderTestCase.java
    incubator/tuscany/java/sca/modules/databinding/src/test/java/org/apache/tuscany/sca/databinding/xml/StAXHelperTestCase.java
    incubator/tuscany/java/sca/modules/databinding/src/test/java/org/apache/tuscany/sca/databinding/xml/XmlTreeStreamReaderTestCase.java

Modified: incubator/tuscany/java/sca/modules/databinding/LICENSE
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/databinding/LICENSE?rev=585611&r1=585610&r2=585611&view=diff
==============================================================================
--- incubator/tuscany/java/sca/modules/databinding/LICENSE (original)
+++ incubator/tuscany/java/sca/modules/databinding/LICENSE Wed Oct 17 11:04:49 2007
@@ -201,5 +201,44 @@
    See the License for the specific language governing permissions and
    limitations under the License.
 
+-----------------------------------------------------------------
+The test cases use xmlunit with the following license:
+----------------------------------------------------------------- 
+
+/*
+******************************************************************
+Copyright (c) 2001-2007, Jeff Martin, Tim Bacon
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+
+    * Redistributions of source code must retain the above copyright
+      notice, this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above
+      copyright notice, this list of conditions and the following
+      disclaimer in the documentation and/or other materials provided
+      with the distribution.
+    * Neither the name of the xmlunit.sourceforge.net nor the names
+      of its contributors may be used to endorse or promote products
+      derived from this software without specific prior written
+      permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGE.
+
+******************************************************************
+*/
 
 

Modified: incubator/tuscany/java/sca/modules/databinding/pom.xml
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/databinding/pom.xml?rev=585611&r1=585610&r2=585611&view=diff
==============================================================================
--- incubator/tuscany/java/sca/modules/databinding/pom.xml (original)
+++ incubator/tuscany/java/sca/modules/databinding/pom.xml Wed Oct 17 11:04:49 2007
@@ -1,51 +1,59 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!--
-    * 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.    
+	* 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.    
 -->
 <project>
-    <modelVersion>4.0.0</modelVersion>
-    <parent>
-        <groupId>org.apache.tuscany.sca</groupId>
-        <artifactId>tuscany-modules</artifactId>
-        <version>1.1-incubating-SNAPSHOT</version>
-        <relativePath>../pom.xml</relativePath>
-    </parent>
-    <artifactId>tuscany-databinding</artifactId>
-    <name>Apache Tuscany SCA DataBinding Framework</name>
+	<modelVersion>4.0.0</modelVersion>
+	<parent>
+		<groupId>org.apache.tuscany.sca</groupId>
+		<artifactId>tuscany-modules</artifactId>
+		<version>1.1-incubating-SNAPSHOT</version>
+		<relativePath>../pom.xml</relativePath>
+	</parent>
+	<artifactId>tuscany-databinding</artifactId>
+	<name>Apache Tuscany SCA DataBinding Framework</name>
 
-    <dependencies>
-        <dependency>
-            <groupId>org.apache.tuscany.sca</groupId>
-            <artifactId>tuscany-interface</artifactId>
-            <version>1.1-incubating-SNAPSHOT</version>
-        </dependency>
+	<dependencies>
+		<dependency>
+			<groupId>org.apache.tuscany.sca</groupId>
+			<artifactId>tuscany-interface</artifactId>
+			<version>1.1-incubating-SNAPSHOT</version>
+		</dependency>
 
-        <dependency>
-            <groupId>stax</groupId>
-            <artifactId>stax-api</artifactId>
-            <version>1.0.1</version>
-        </dependency>
+		<dependency>
+			<groupId>stax</groupId>
+			<artifactId>stax-api</artifactId>
+			<version>1.0.1</version>
+		</dependency>
 
-        <dependency>
-            <groupId>org.codehaus.woodstox</groupId>
-            <artifactId>wstx-asl</artifactId>
-            <version>3.2.1</version>
-            <scope>runtime</scope>
-        </dependency>
-    </dependencies>
+		<dependency>
+			<groupId>org.codehaus.woodstox</groupId>
+			<artifactId>wstx-asl</artifactId>
+			<version>3.2.1</version>
+			<scope>runtime</scope>
+		</dependency>
+
+		<dependency>
+			<groupId>xmlunit</groupId>
+			<artifactId>xmlunit</artifactId>
+			<version>1.1</version>
+			<scope>test</scope>
+		</dependency>
+
+	</dependencies>
 </project>

Modified: incubator/tuscany/java/sca/modules/databinding/src/main/java/org/apache/tuscany/sca/databinding/javabeans/JavaBean2XMLStreamReader.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/databinding/src/main/java/org/apache/tuscany/sca/databinding/javabeans/JavaBean2XMLStreamReader.java?rev=585611&r1=585610&r2=585611&view=diff
==============================================================================
--- incubator/tuscany/java/sca/modules/databinding/src/main/java/org/apache/tuscany/sca/databinding/javabeans/JavaBean2XMLStreamReader.java (original)
+++ incubator/tuscany/java/sca/modules/databinding/src/main/java/org/apache/tuscany/sca/databinding/javabeans/JavaBean2XMLStreamReader.java Wed Oct 17 11:04:49 2007
@@ -24,15 +24,22 @@
 import org.apache.tuscany.sca.databinding.TransformationContext;
 import org.apache.tuscany.sca.databinding.TransformationException;
 import org.apache.tuscany.sca.databinding.impl.BaseTransformer;
-import org.apache.tuscany.sca.databinding.xml.BeanUtil;
-import org.apache.tuscany.sca.databinding.xml.XMLDocumentStreamReader;
+import org.apache.tuscany.sca.databinding.xml.BeanXMLStreamReaderImpl;
+import org.apache.tuscany.sca.interfacedef.util.XMLType;
 
 public class JavaBean2XMLStreamReader extends BaseTransformer<Object, XMLStreamReader> implements
     PullTransformer<Object, XMLStreamReader> {
 
     public XMLStreamReader transform(Object source, TransformationContext context) {
         try {
-            return new XMLDocumentStreamReader(BeanUtil.getXMLStreamReader(source));
+            javax.xml.namespace.QName name = null;
+            if (context != null) {
+                Object logical = context.getSourceDataType().getLogical();
+                if (logical instanceof XMLType) {
+                    name = ((XMLType)logical).getElementName();
+                }
+            }
+            return new BeanXMLStreamReaderImpl(name, source);
         } catch (Exception e) {
             throw new TransformationException(e);
         }

Added: incubator/tuscany/java/sca/modules/databinding/src/main/java/org/apache/tuscany/sca/databinding/xml/BeanXMLStreamReaderImpl.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/databinding/src/main/java/org/apache/tuscany/sca/databinding/xml/BeanXMLStreamReaderImpl.java?rev=585611&view=auto
==============================================================================
--- incubator/tuscany/java/sca/modules/databinding/src/main/java/org/apache/tuscany/sca/databinding/xml/BeanXMLStreamReaderImpl.java (added)
+++ incubator/tuscany/java/sca/modules/databinding/src/main/java/org/apache/tuscany/sca/databinding/xml/BeanXMLStreamReaderImpl.java Wed Oct 17 11:04:49 2007
@@ -0,0 +1,173 @@
+/*
+ * 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.databinding.xml;
+
+import java.beans.BeanInfo;
+import java.beans.Introspector;
+import java.beans.PropertyDescriptor;
+import java.lang.reflect.Array;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.List;
+
+import javax.xml.namespace.QName;
+
+import org.apache.tuscany.sca.databinding.impl.SimpleTypeMapperImpl;
+import org.apache.tuscany.sca.interfacedef.util.TypeInfo;
+
+/**
+ * @version $Rev$ $Date$
+ */
+public class BeanXMLStreamReaderImpl extends XmlTreeStreamReaderImpl {
+
+    public static class BeanXmlNodeImpl extends SimpleXmlNodeImpl implements XmlNode {
+        private static final Object[] NULL = null;
+        private static final SimpleTypeMapperImpl MAPPER = new SimpleTypeMapperImpl();
+    
+        public BeanXmlNodeImpl(Object bean) {
+            super(getName(bean == null ? null : bean.getClass()), bean);
+        }
+    
+        public BeanXmlNodeImpl(QName name, Object bean) {
+            super(name, bean);
+        }
+    
+        private static boolean isSimpleType(Class<?> javaType) {
+            return SimpleTypeMapperImpl.getXMLType(javaType) != null;
+        }
+    
+        private static String getStringValue(Object o) {
+            if (o == null) {
+                return null;
+            }
+            TypeInfo info = SimpleTypeMapperImpl.getXMLType(o.getClass());
+            if (info != null) {
+                return MAPPER.toXMLLiteral(info.getQName(), o, null);
+            } else {
+                return String.valueOf(o);
+            }
+        }
+    
+        public Iterator<XmlNode> children() {
+            if (name == null) {
+                return null;
+            }
+            if (value == null) {
+                return super.children();
+            }
+            if (isSimpleType(value.getClass())) {
+                XmlNode textNode = new BeanXmlNodeImpl(null, value);
+                return Arrays.asList(textNode).iterator();
+            }
+            try {
+                BeanInfo beanInfo = Introspector.getBeanInfo(value.getClass());
+                PropertyDescriptor[] propDescs = beanInfo.getPropertyDescriptors();
+    
+                List<XmlNode> props = new ArrayList<XmlNode>();
+                for (int i = 0; i < propDescs.length; i++) {
+                    PropertyDescriptor propDesc = propDescs[i];
+                    Class<?> pType = propDesc.getPropertyType();
+                    if ("class".equals(propDesc.getName())) {
+                        continue;
+                    }
+                    QName pName = new QName(name.getNamespaceURI(), propDesc.getName());
+                    Object pValue = propDesc.getReadMethod().invoke(value, NULL);
+                    if (pType.isArray()) {
+                        if (pValue != null) {
+                            int i1 = Array.getLength(pValue);
+                            for (int j = 0; j < i1; j++) {
+                                Object o = Array.get(pValue, j);
+                                props.add(new BeanXmlNodeImpl(pName, getStringValue(o)));
+                            }
+                        } else {
+                            // TODO: How to handle null?
+                        }
+                    } else if (Collection.class.isAssignableFrom(pType)) {
+                        Collection objList = (Collection)pValue;
+                        if (objList != null && objList.size() > 0) {
+                            for (Iterator j = objList.iterator(); j.hasNext();) {
+                                Object o = j.next();
+                                if (isSimpleType(o.getClass())) {
+                                    props.add(new BeanXmlNodeImpl(pName, getStringValue(o)));
+                                } else {
+                                    props.add(new BeanXmlNodeImpl(pName, o));
+                                }
+                            }
+    
+                        } else {
+                            // How to handle null
+                        }
+                    } else {
+                        props.add(new BeanXmlNodeImpl(pName, pValue));
+                    }
+                }
+                return props.iterator();
+            } catch (Exception e) {
+                throw new IllegalArgumentException(e);
+            }
+        }
+    
+        public QName getName() {
+            return name;
+        }
+    
+        public String getValue() {
+            return getStringValue(value);
+        }
+    
+        public static QName getName(Class<?> cls) {
+            if (cls == null) {
+                return null;
+            }
+            Package pkg = cls.getPackage();
+            if (pkg == null) {
+                return new QName("", cls.getSimpleName());
+            }
+            StringBuffer ns = new StringBuffer("http://");
+            String[] names = pkg.getName().split("\\.");
+            for (int i = names.length - 1; i >= 0; i--) {
+                ns.append(names[i]);
+                if (i != 0) {
+                    ns.append('.');
+                }
+            }
+            ns.append('/');
+            return new QName(ns.toString(), cls.getSimpleName());
+        }
+    
+    }
+
+    public BeanXMLStreamReaderImpl(QName name, Object bean) {
+        super(getXmlNode(name, bean));
+    }
+
+    private static BeanXmlNodeImpl getXmlNode(QName name, Object bean) {
+        BeanXmlNodeImpl root = null;
+        if (name != null) {
+            root = new BeanXmlNodeImpl(name, bean);
+        } else {
+            root = new BeanXmlNodeImpl(bean);
+        }
+        return root;
+    }
+
+}

Propchange: incubator/tuscany/java/sca/modules/databinding/src/main/java/org/apache/tuscany/sca/databinding/xml/BeanXMLStreamReaderImpl.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/tuscany/java/sca/modules/databinding/src/main/java/org/apache/tuscany/sca/databinding/xml/BeanXMLStreamReaderImpl.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Modified: incubator/tuscany/java/sca/modules/databinding/src/main/java/org/apache/tuscany/sca/databinding/xml/DOMXMLStreamReader.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/databinding/src/main/java/org/apache/tuscany/sca/databinding/xml/DOMXMLStreamReader.java?rev=585611&r1=585610&r2=585611&view=diff
==============================================================================
--- incubator/tuscany/java/sca/modules/databinding/src/main/java/org/apache/tuscany/sca/databinding/xml/DOMXMLStreamReader.java (original)
+++ incubator/tuscany/java/sca/modules/databinding/src/main/java/org/apache/tuscany/sca/databinding/xml/DOMXMLStreamReader.java Wed Oct 17 11:04:49 2007
@@ -18,112 +18,19 @@
  */
 package org.apache.tuscany.sca.databinding.xml;
 
-import static javax.xml.XMLConstants.DEFAULT_NS_PREFIX;
-import static javax.xml.XMLConstants.XMLNS_ATTRIBUTE_NS_URI;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import javax.xml.namespace.QName;
-
-import org.w3c.dom.Attr;
-import org.w3c.dom.CharacterData;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.NamedNodeMap;
 import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
 
-public class DOMXMLStreamReader extends XMLFragmentStreamReaderImpl {
-    private Element rootElement;
+public class DOMXMLStreamReader extends XmlTreeStreamReaderImpl {
 
     public DOMXMLStreamReader(Node node) {
-        super(null);
+        super(new DOMXmlNodeImpl(node));
         switch (node.getNodeType()) {
             case Node.DOCUMENT_NODE:
-                this.rootElement = ((Document)node).getDocumentElement();
                 break;
             case Node.ELEMENT_NODE:
-                this.rootElement = (Element)node;
                 break;
             default:
-                throw new IllegalArgumentException("Illegal Node");
-        }
-        String ns = rootElement.getNamespaceURI();
-        String prefix = rootElement.getPrefix();
-        String name = rootElement.getLocalName();
-        elementQName = new QName(ns == null ? "" : ns, name, prefix == null ? "" : prefix);
-    }
-
-    @Override
-    protected final NamedProperty[] getAttributes() {
-        if (attributes == null) {
-            List<NamedProperty> attributeList = new ArrayList<NamedProperty>();
-            NamedNodeMap nodeMap = rootElement.getAttributes();
-            for (int i = 0; i < nodeMap.getLength(); i++) {
-                Attr attr = (Attr)nodeMap.item(i);
-                String ns = attr.getNamespaceURI();
-                String prefix = attr.getPrefix();
-                if (!XMLNS_ATTRIBUTE_NS_URI.equals(ns)) {
-                    QName attrName = new QName(ns == null ? "" : ns, attr.getLocalName(), prefix != null ? prefix : "");
-                    NamedProperty pair = new NamedProperty(attrName, attr.getValue());
-                    attributeList.add(pair);
-                } 
-            }
-            attributes = new NamedProperty[attributeList.size()];
-            attributeList.toArray(attributes);
-        }
-        return attributes;
-    }
-    
-    @Override
-    protected QName[] getNamespaces() {
-        List<QName> nsList = new ArrayList<QName>();
-        NamedNodeMap nodeMap = rootElement.getAttributes();
-        for (int i = 0; i < nodeMap.getLength(); i++) {
-            Attr attr = (Attr)nodeMap.item(i);
-            String ns = attr.getNamespaceURI();
-            if (XMLNS_ATTRIBUTE_NS_URI.equals(ns)) {
-                String prefix = attr.getPrefix();
-                if (prefix == null) {
-                    // xmlns="http://ns"
-                    nsList.add(new QName(attr.getValue(), "", DEFAULT_NS_PREFIX));
-                } else {
-                    // xmlns:ns="http://ns"
-                    nsList.add(new QName(attr.getValue(), "", attr.getLocalName()));
-                }
-            }
-        }
-        QName[] nss = new QName[nsList.size()];
-        nsList.toArray(nss);
-        return nss;
-    }
-
-    @Override
-    protected NamedProperty[] getElements() {
-        if (elements == null) {
-            List<NamedProperty> elementList = new ArrayList<NamedProperty>();
-            NodeList nodeList = rootElement.getChildNodes();
-            for (int i = 0; i < nodeList.getLength(); i++) {
-                Node node = nodeList.item(i);
-                switch (node.getNodeType()) {
-                    case Node.TEXT_NODE:
-                    case Node.CDATA_SECTION_NODE:
-                        NamedProperty pair = new NamedProperty(ELEMENT_TEXT, ((CharacterData)node).getData());
-                        elementList.add(pair);
-                        break;
-
-                    case Node.ELEMENT_NODE:
-                        Element element = (Element)node;
-                        QName elementName = new QName(element.getNamespaceURI(), element.getLocalName());
-                        pair = new NamedProperty(elementName, new DOMXMLStreamReader(element));
-                        elementList.add(pair);
-                        break;
-                }
-            }
-            elements = new NamedProperty[elementList.size()];
-            elementList.toArray(elements);
+                throw new IllegalArgumentException("Illegal node type: " + node);
         }
-        return elements;
     }
 }

Modified: incubator/tuscany/java/sca/modules/databinding/src/main/java/org/apache/tuscany/sca/databinding/xml/DOMXmlNodeImpl.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/databinding/src/main/java/org/apache/tuscany/sca/databinding/xml/DOMXmlNodeImpl.java?rev=585611&r1=585610&r2=585611&view=diff
==============================================================================
--- incubator/tuscany/java/sca/modules/databinding/src/main/java/org/apache/tuscany/sca/databinding/xml/DOMXmlNodeImpl.java (original)
+++ incubator/tuscany/java/sca/modules/databinding/src/main/java/org/apache/tuscany/sca/databinding/xml/DOMXmlNodeImpl.java Wed Oct 17 11:04:49 2007
@@ -39,6 +39,7 @@
 public class DOMXmlNodeImpl implements XmlNode {
     private Node node;
     private Map<String, String> namespaces;
+    private Type type;
 
     /**
      * @param element
@@ -50,18 +51,32 @@
         } else {
             this.node = element;
         }
+        switch (node.getNodeType()) {
+            case Node.CDATA_SECTION_NODE:
+                this.type = Type.CHARACTERS;
+                break;
+            case Node.ELEMENT_NODE:
+                this.type = Type.ELEMENT;
+                break;
+            case Node.TEXT_NODE:
+                this.type = Type.CHARACTERS;
+                break;
+        }
     }
 
     /**
      * @see org.apache.tuscany.sca.databinding.xml.XmlNode#attributes()
      */
-    public List<XmlAttribute> attributes() {
+    public List<XmlNode> attributes() {
+        if (type != Type.ELEMENT) {
+            return null;
+        }
         NamedNodeMap attrs = node.getAttributes();
-        List<XmlAttribute> xmlAttrs = new ArrayList<XmlAttribute>();
+        List<XmlNode> xmlAttrs = new ArrayList<XmlNode>();
         for (int i = 0; i < attrs.getLength(); i++) {
             Attr attr = (Attr)attrs.item(i);
             if (!attr.getName().equals("xmlns") && !attr.getName().startsWith("xmlns:")) {
-                xmlAttrs.add(new DOMAttribute(attr));
+                xmlAttrs.add(new SimpleXmlNodeImpl(getQName(attr), attr.getValue(), XmlNode.Type.ATTRIBUTE));
             }
         }
         return xmlAttrs;
@@ -71,11 +86,15 @@
      * @see org.apache.tuscany.sca.databinding.xml.XmlNode#children()
      */
     public Iterator<XmlNode> children() {
+        if (type != Type.ELEMENT) {
+            return null;
+        }
         NodeList nodes = node.getChildNodes();
         List<XmlNode> xmlNodes = new ArrayList<XmlNode>();
         for (int i = 0; i < nodes.getLength(); i++) {
             Node child = (Node)nodes.item(i);
-            if (child.getNodeType() == Node.ELEMENT_NODE || child.getNodeType() == Node.TEXT_NODE) {
+            int nodeType = child.getNodeType();
+            if (nodeType == Node.ELEMENT_NODE || nodeType == Node.TEXT_NODE || nodeType == Node.CDATA_SECTION_NODE) {
                 xmlNodes.add(new DOMXmlNodeImpl(child));
             }
         }
@@ -108,16 +127,12 @@
     }
 
     /**
-     * @see org.apache.tuscany.sca.databinding.xml.XmlNode#isLeaf()
-     */
-    public boolean isLeaf() {
-        return node.getNodeType() != Node.ELEMENT_NODE;
-    }
-
-    /**
      * @see org.apache.tuscany.sca.databinding.xml.XmlNode#namespaces()
      */
     public Map<String, String> namespaces() {
+        if (type != Type.ELEMENT) {
+            return null;
+        }
         if (namespaces == null) {
             namespaces = new HashMap<String, String>();
             NamedNodeMap attrs = node.getAttributes();
@@ -134,33 +149,8 @@
         return namespaces;
     }
 
-    public static class DOMAttribute implements XmlAttribute {
-        private Attr attr;
-
-        /**
-         * @param attr
-         */
-        public DOMAttribute(Attr attr) {
-            super();
-            this.attr = attr;
-        }
-
-        /**
-         * @see org.apache.tuscany.sca.databinding.xml.XmlAttribute#getName()
-         */
-        public QName getName() {
-            // TODO Auto-generated method stub
-            return getQName(attr);
-        }
-
-        /**
-         * @see org.apache.tuscany.sca.databinding.xml.XmlAttribute#getValue()
-         */
-        public String getValue() {
-            // TODO Auto-generated method stub
-            return attr.getValue();
-        }
-
+    public Type getType() {
+        return type;
     }
 
 }

Modified: incubator/tuscany/java/sca/modules/databinding/src/main/java/org/apache/tuscany/sca/databinding/xml/Node2XMLStreamReader.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/databinding/src/main/java/org/apache/tuscany/sca/databinding/xml/Node2XMLStreamReader.java?rev=585611&r1=585610&r2=585611&view=diff
==============================================================================
--- incubator/tuscany/java/sca/modules/databinding/src/main/java/org/apache/tuscany/sca/databinding/xml/Node2XMLStreamReader.java (original)
+++ incubator/tuscany/java/sca/modules/databinding/src/main/java/org/apache/tuscany/sca/databinding/xml/Node2XMLStreamReader.java Wed Oct 17 11:04:49 2007
@@ -35,7 +35,7 @@
     public XMLStreamReader transform(Node source, TransformationContext context) {
         try {
             DOMXMLStreamReader reader = new DOMXMLStreamReader(source);
-            return new XMLDocumentStreamReader(reader);
+            return reader;
         } catch (Exception e) {
             throw new TransformationException(e);
         }

Added: incubator/tuscany/java/sca/modules/databinding/src/main/java/org/apache/tuscany/sca/databinding/xml/SimpleXmlNodeImpl.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/databinding/src/main/java/org/apache/tuscany/sca/databinding/xml/SimpleXmlNodeImpl.java?rev=585611&view=auto
==============================================================================
--- incubator/tuscany/java/sca/modules/databinding/src/main/java/org/apache/tuscany/sca/databinding/xml/SimpleXmlNodeImpl.java (added)
+++ incubator/tuscany/java/sca/modules/databinding/src/main/java/org/apache/tuscany/sca/databinding/xml/SimpleXmlNodeImpl.java Wed Oct 17 11:04:49 2007
@@ -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.databinding.xml;
+
+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 final static String XSI_PREFIX = "xsi";
+    private final static String XSI_NS = "http://www.w3.org/2001/XMLSchema-instance";
+    private final static QName XSI_NIL = new QName(XSI_NS, "nil", XSI_PREFIX);
+    private final static 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.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.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.databinding.xml.XmlNode#getName()
+     */
+    public QName getName() {
+        return name;
+    }
+
+    /**
+     * @see org.apache.tuscany.sca.databinding.xml.XmlNode#getValue()
+     */
+    public String getValue() {
+        return value == null ? null : String.valueOf(value);
+    }
+
+    /**
+     * @see org.apache.tuscany.sca.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: incubator/tuscany/java/sca/modules/databinding/src/main/java/org/apache/tuscany/sca/databinding/xml/SimpleXmlNodeImpl.java
------------------------------------------------------------------------------
    svn:eol-style = native

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

Modified: incubator/tuscany/java/sca/modules/databinding/src/main/java/org/apache/tuscany/sca/databinding/xml/WrappingXMLStreamReader.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/databinding/src/main/java/org/apache/tuscany/sca/databinding/xml/WrappingXMLStreamReader.java?rev=585611&r1=585610&r2=585611&view=diff
==============================================================================
--- incubator/tuscany/java/sca/modules/databinding/src/main/java/org/apache/tuscany/sca/databinding/xml/WrappingXMLStreamReader.java (original)
+++ incubator/tuscany/java/sca/modules/databinding/src/main/java/org/apache/tuscany/sca/databinding/xml/WrappingXMLStreamReader.java Wed Oct 17 11:04:49 2007
@@ -19,207 +19,69 @@
 package org.apache.tuscany.sca.databinding.xml;
 
 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;
+import javax.xml.stream.util.StreamReaderDelegate;
 
-public class WrappingXMLStreamReader implements XMLFragmentStreamReader {
+public class WrappingXMLStreamReader extends StreamReaderDelegate implements XMLFragmentStreamReader {
 
-    private XMLStreamReader reader;
+    private boolean done;
+    private int level;
 
-    public WrappingXMLStreamReader(XMLStreamReader reader) {
-        this.reader = reader;
-    }
-
-    public boolean isDone() {
-        try {
-            return !hasNext();
-        } catch (XMLStreamException e) {
-            throw new RuntimeException(e);
+    public WrappingXMLStreamReader(XMLStreamReader realReader) throws XMLStreamException {
+        super(realReader);
+        if (realReader == null) {
+            throw new UnsupportedOperationException("Reader cannot be null");
         }
-    }
 
-    public Object getProperty(String string) throws IllegalArgumentException {
-        return reader.getProperty(string);
-    }
-
-    public int next() throws XMLStreamException {
-        return reader.next();
-    }
-
-    public void require(int i, String string, String string1) throws XMLStreamException {
-        // nothing to do
-    }
-
-    public String getElementText() throws XMLStreamException {
-        return reader.getElementText();
-    }
+        if (realReader instanceof XMLFragmentStreamReader) {
+            ((XMLFragmentStreamReader)realReader).init();
+        }
 
-    public int nextTag() throws XMLStreamException {
-        return reader.nextTag();
+        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;
     }
 
     public boolean hasNext() throws XMLStreamException {
-        return reader.hasNext();
-    }
-
-    public void close() throws XMLStreamException {
-        reader.close();
-    }
-
-    public String getNamespaceURI(String string) {
-        return reader.getNamespaceURI(string);
-    }
-
-    public boolean isStartElement() {
-        return reader.isStartElement();
-    }
-
-    public boolean isEndElement() {
-        return reader.isEndElement();
-    }
-
-    public boolean isCharacters() {
-        return reader.isCharacters();
-    }
-
-    public boolean isWhiteSpace() {
-        return reader.isWhiteSpace();
-    }
-
-    public String getAttributeValue(String string, String string1) {
-        return reader.getAttributeValue(string, string1);
-    }
-
-    public int getAttributeCount() {
-        return reader.getAttributeCount();
-    }
-
-    public QName getAttributeName(int i) {
-        return reader.getAttributeName(i);
-    }
-
-    public String getAttributeNamespace(int i) {
-        return reader.getAttributeNamespace(i);
-    }
-
-    public String getAttributeLocalName(int i) {
-        return reader.getAttributeLocalName(i);
-    }
-
-    public String getAttributePrefix(int i) {
-        return reader.getAttributeLocalName(i);
-    }
-
-    public String getAttributeType(int i) {
-        return reader.getAttributeType(i);
-    }
-
-    public String getAttributeValue(int i) {
-        return reader.getAttributeValue(i);
-    }
-
-    public boolean isAttributeSpecified(int i) {
-        return reader.isAttributeSpecified(i);
-    }
-
-    public int getNamespaceCount() {
-        return reader.getNamespaceCount();
-    }
-
-    public String getNamespacePrefix(int i) {
-        return reader.getNamespacePrefix(i);
+        return !done && super.hasNext();
     }
 
-    public String getNamespaceURI(int i) {
-        return reader.getNamespaceURI(i);
-    }
-
-    public NamespaceContext getNamespaceContext() {
-        return reader.getNamespaceContext();
-    }
-
-    public int getEventType() {
-        return reader.getEventType();
-    }
-
-    public String getText() {
-        return reader.getText();
-    }
-
-    public char[] getTextCharacters() {
-        return reader.getTextCharacters();
-    }
-
-    public int getTextCharacters(int i, char[] chars, int i1, int i2) throws XMLStreamException {
-        return reader.getTextCharacters(i, chars, i1, i2);
-    }
-
-    public int getTextStart() {
-        return reader.getTextStart();
-    }
-
-    public int getTextLength() {
-        return reader.getTextLength();
-    }
-
-    public String getEncoding() {
-        return reader.getEncoding();
-    }
-
-    public boolean hasText() {
-        return reader.hasText();
-    }
-
-    public Location getLocation() {
-        return reader.getLocation();
-    }
-
-    public QName getName() {
-        return reader.getName();
-    }
-
-    public String getLocalName() {
-        return reader.getLocalName();
-    }
-
-    public boolean hasName() {
-        return reader.hasName();
-    }
-
-    public String getNamespaceURI() {
-        return reader.getNamespaceURI();
-    }
-
-    public String getPrefix() {
-        return reader.getPrefix();
-    }
-
-    public String getVersion() {
-        return reader.getVersion();
-    }
-
-    public boolean isStandalone() {
-        return reader.isStandalone();
-    }
-
-    public boolean standaloneSet() {
-        return reader.standaloneSet();
-    }
-
-    public String getCharacterEncodingScheme() {
-        return reader.getCharacterEncodingScheme();
-    }
-
-    public String getPITarget() {
-        return reader.getPITarget();
+    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;
     }
 
-    public String getPIData() {
-        return reader.getPIData();
+    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
     }
@@ -227,4 +89,9 @@
     public void init() {
         // Nothing to do here
     }
+    
+    public boolean isDone() {
+        return done;
+    }
+
 }

Modified: incubator/tuscany/java/sca/modules/databinding/src/main/java/org/apache/tuscany/sca/databinding/xml/XMLFragmentStreamReaderImpl.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/databinding/src/main/java/org/apache/tuscany/sca/databinding/xml/XMLFragmentStreamReaderImpl.java?rev=585611&r1=585610&r2=585611&view=diff
==============================================================================
--- incubator/tuscany/java/sca/modules/databinding/src/main/java/org/apache/tuscany/sca/databinding/xml/XMLFragmentStreamReaderImpl.java (original)
+++ incubator/tuscany/java/sca/modules/databinding/src/main/java/org/apache/tuscany/sca/databinding/xml/XMLFragmentStreamReaderImpl.java Wed Oct 17 11:04:49 2007
@@ -834,7 +834,7 @@
         } else {
             // all special possiblilities has been tried! Let's treat
             // the thing as a bean and try generating events from it
-            childReader = new WrappingXMLStreamReader(BeanUtil.getXMLStreamReader(propertyValue, propertyQName));
+            childReader = new WrappingXMLStreamReader(new BeanXMLStreamReaderImpl(propertyQName, propertyValue));
             // we cannot register the namespace context here
         }
 

Modified: incubator/tuscany/java/sca/modules/databinding/src/main/java/org/apache/tuscany/sca/databinding/xml/XmlNode.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/databinding/src/main/java/org/apache/tuscany/sca/databinding/xml/XmlNode.java?rev=585611&r1=585610&r2=585611&view=diff
==============================================================================
--- incubator/tuscany/java/sca/modules/databinding/src/main/java/org/apache/tuscany/sca/databinding/xml/XmlNode.java (original)
+++ incubator/tuscany/java/sca/modules/databinding/src/main/java/org/apache/tuscany/sca/databinding/xml/XmlNode.java Wed Oct 17 11:04:49 2007
@@ -29,11 +29,7 @@
  * @version $Rev$ $Date$
  */
 public interface XmlNode {
-    /**
-     * Returns true if the receiver is a leaf.
-     */
-    boolean isLeaf();
-
+    enum Type {ELEMENT, ATTRIBUTE, CHARACTERS, READER};
     /**
      * Returns the children of the receiver as an <code>Iterator</code>.
      */
@@ -45,7 +41,7 @@
      * 
      * @return
      */
-    List<XmlAttribute> attributes();
+    List<XmlNode> attributes();
     
     /**
      * Retunrs a map of prefix to namespace URI
@@ -63,5 +59,11 @@
      * Return the text value of the leaf element
      * @return
      */
-    String getValue();
+    <T> T getValue();
+    
+    /**
+     * Return the type of the XML node
+     * @return
+     */
+    Type getType();
 }

Modified: incubator/tuscany/java/sca/modules/databinding/src/main/java/org/apache/tuscany/sca/databinding/xml/XmlTreeStreamReaderImpl.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/databinding/src/main/java/org/apache/tuscany/sca/databinding/xml/XmlTreeStreamReaderImpl.java?rev=585611&r1=585610&r2=585611&view=diff
==============================================================================
--- incubator/tuscany/java/sca/modules/databinding/src/main/java/org/apache/tuscany/sca/databinding/xml/XmlTreeStreamReaderImpl.java (original)
+++ incubator/tuscany/java/sca/modules/databinding/src/main/java/org/apache/tuscany/sca/databinding/xml/XmlTreeStreamReaderImpl.java Wed Oct 17 11:04:49 2007
@@ -19,23 +19,28 @@
 package org.apache.tuscany.sca.databinding.xml;
 
 import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
 import java.util.Map;
 
 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;
 
 /**
  * 
  * @version $Rev$ $Date$
  */
-public class XmlTreeStreamReaderImpl implements XMLFragmentStreamReader {
+public class XmlTreeStreamReaderImpl implements XMLStreamReader {
 
     protected int state;
     protected XmlNodeIterator iterator;
     protected XmlNode current;
 
+    protected XMLStreamReader reader;
+
     /*
      * we need to pass in a namespace context since when delegated, we've no
      * idea of the current namespace context. So it needs to be passed on here!
@@ -44,26 +49,43 @@
         this.iterator = new XmlNodeIterator(root);
         this.current = null;
         this.state = START_DOCUMENT;
+        this.reader = null;
     }
 
     public void close() throws XMLStreamException {
-        // do nothing here - we have no resources to free
+        if (reader != null) {
+            reader.close();
+        }
     }
 
     private void checkElementState() {
-        if (current == null || current.getName() == null) {
+        if (getEventType() != START_ELEMENT && getEventType() != END_ELEMENT) {
             throw new IllegalStateException();
         }
     }
 
+    private List<XmlNode> getAttributes() {
+        if (current != null && current.attributes() != null) {
+            return current.attributes();
+        } else {
+            return Collections.emptyList();
+        }
+    }
+
     public int getAttributeCount() {
         checkElementState();
-        return current.attributes().size();
+        if (reader != null) {
+            return reader.getAttributeCount();
+        }
+        return getAttributes().size();
     }
 
     public String getAttributeLocalName(int i) {
         checkElementState();
-        return current.attributes().get(i).getName().getLocalPart();
+        if (reader != null) {
+            return reader.getAttributeLocalName(i);
+        }
+        return getAttributes().get(i).getName().getLocalPart();
     }
 
     /**
@@ -71,29 +93,48 @@
      */
     public QName getAttributeName(int i) {
         checkElementState();
-        return current.attributes().get(i).getName();
+        if (reader != null) {
+            return reader.getAttributeName(i);
+        }
+        return getAttributes().get(i).getName();
     }
 
     public String getAttributeNamespace(int i) {
         checkElementState();
-        return current.attributes().get(i).getName().getNamespaceURI();
+        if (reader != null) {
+            return reader.getAttributeNamespace(i);
+        }
+        return getAttributes().get(i).getName().getNamespaceURI();
     }
 
     public String getAttributePrefix(int i) {
         checkElementState();
-        return current.attributes().get(i).getName().getPrefix();
+        if (reader != null) {
+            return reader.getAttributePrefix(i);
+        }
+        return getAttributes().get(i).getName().getPrefix();
     }
 
     public String getAttributeType(int i) {
+        if (reader != null) {
+            return reader.getAttributeType(i);
+        }
         return null; // not supported
     }
 
     public String getAttributeValue(int i) {
         checkElementState();
-        return current.attributes().get(i).getValue();
+        if (reader != null) {
+            return reader.getAttributeValue(i);
+        }
+        return getAttributes().get(i).getValue();
     }
 
     public String getAttributeValue(String nsUri, String localName) {
+        checkElementState();
+        if (reader != null) {
+            return reader.getAttributeValue(nsUri, localName);
+        }
         int count = getAttributeCount();
         String value = null;
         QName attrQName;
@@ -117,15 +158,24 @@
     }
 
     public String getCharacterEncodingScheme() {
-        return null; // todo - should we return something for this ?
+        if (reader != null) {
+            return reader.getCharacterEncodingScheme();
+        }
+        return "UTF-8";
     }
 
     public String getElementText() throws XMLStreamException {
         checkElementState();
+        if (reader != null) {
+            return reader.getElementText();
+        }
         return current.getValue();
     }
 
     public String getEncoding() {
+        if (reader != null) {
+            return reader.getEncoding();
+        }
         return "UTF-8";
     }
 
@@ -135,12 +185,18 @@
 
     public String getLocalName() {
         checkElementState();
+        if (reader != null) {
+            return reader.getLocalName();
+        }
         return current.getName().getLocalPart();
     }
 
     /**
      */
     public Location getLocation() {
+        if (reader != null) {
+            return reader.getLocation();
+        }
         // return a default location
         return new Location() {
             public int getCharacterOffset() {
@@ -167,16 +223,33 @@
 
     public QName getName() {
         checkElementState();
+        if (reader != null) {
+            return reader.getName();
+        }
         return current.getName();
     }
 
     public NamespaceContext getNamespaceContext() {
+        if (reader != null) {
+            return reader.getNamespaceContext();
+        }
         return iterator.getNamespaceContext();
     }
 
+    private Map<String, String> getNamespaces() {
+        if (current != null && current.namespaces() != null) {
+            return current.namespaces();
+        } else {
+            return Collections.emptyMap();
+        }
+    }
+
     public int getNamespaceCount() {
         checkElementState();
-        return current.namespaces().size();
+        if (reader != null) {
+            return reader.getNamespaceCount();
+        }
+        return getNamespaces().size();
     }
 
     /**
@@ -184,31 +257,53 @@
      */
     public String getNamespacePrefix(int i) {
         checkElementState();
-        return new ArrayList<Map.Entry<String, String>>(current.namespaces().entrySet()).get(i).getKey();
+        if (reader != null) {
+            return reader.getNamespacePrefix(i);
+        }
+        return new ArrayList<Map.Entry<String, String>>(getNamespaces().entrySet()).get(i).getKey();
     }
 
     public String getNamespaceURI() {
+        checkElementState();
+        if (reader != null) {
+            return reader.getNamespaceURI();
+        }
         return current.getName().getNamespaceURI();
     }
 
     public String getNamespaceURI(int i) {
         checkElementState();
-        return new ArrayList<Map.Entry<String, String>>(current.namespaces().entrySet()).get(i).getValue();
+        if (reader != null) {
+            return reader.getNamespaceURI(i);
+        }
+        return new ArrayList<Map.Entry<String, String>>(getNamespaces().entrySet()).get(i).getValue();
     }
 
     public String getNamespaceURI(String prefix) {
+        if (reader != null) {
+            return reader.getNamespaceURI(prefix);
+        }
         return getNamespaceContext().getNamespaceURI(prefix);
     }
 
     public String getPIData() {
+        if (reader != null) {
+            return reader.getPIData();
+        }
         throw new UnsupportedOperationException("Yet to be implemented !!");
     }
 
     public String getPITarget() {
+        if (reader != null) {
+            return reader.getPITarget();
+        }
         throw new UnsupportedOperationException("Yet to be implemented !!");
     }
 
     public String getPrefix() {
+        if (reader != null) {
+            return reader.getPrefix();
+        }
         if (state == START_ELEMENT || state == END_ELEMENT) {
             String prefix = current.getName().getPrefix();
             return "".equals(prefix) ? null : prefix;
@@ -224,14 +319,23 @@
      * @throws IllegalArgumentException
      */
     public Object getProperty(String key) throws IllegalArgumentException {
+        if (reader != null) {
+            return reader.getProperty(key);
+        }
         return null;
     }
 
     public String getText() {
+        if (reader != null) {
+            return reader.getText();
+        }
         return current.getValue();
     }
 
     public char[] getTextCharacters() {
+        if (reader != null) {
+            return reader.getTextCharacters();
+        }
         String value = current.getValue();
         return value == null ? new char[0] : value.toCharArray();
     }
@@ -250,14 +354,23 @@
     }
 
     public int getTextCharacters(int i, char[] chars, int i1, int i2) throws XMLStreamException {
+        if (reader != null) {
+            return reader.getTextCharacters(i, chars, i1, i2);
+        }
         return copy(i, chars, i1, i2);
     }
 
     public int getTextLength() {
+        if (reader != null) {
+            return reader.getTextLength();
+        }
         return getTextCharacters().length;
     }
 
     public int getTextStart() {
+        if (reader != null) {
+            return reader.getTextStart();
+        }
         return 0;
     }
 
@@ -266,6 +379,9 @@
     }
 
     public boolean hasName() {
+        if (reader != null) {
+            return reader.hasName();
+        }
         return current.getName() != null;
     }
 
@@ -273,43 +389,34 @@
      * @throws XMLStreamException
      */
     public boolean hasNext() throws XMLStreamException {
-        return iterator.hasNext() || state != END_DOCUMENT;
+        return iterator.hasNext() || state != END_DOCUMENT || (reader != null && reader.hasNext());
     }
 
     public boolean hasText() {
-        return current.getName() == null;
-    }
-
-    /**
-     * we need to split out the calling to the populate namespaces seperately
-     * since this needs to be done *after* setting the parent namespace context.
-     * We cannot assume it will happen at construction!
-     */
-    public void init() {
-        // here we have an extra issue to attend to. we need to look at the
-        // prefixes and uris (the combination) and populate a hashmap of
-        // namespaces. The hashmap of namespaces will be used to serve the
-        // namespace context
-
-        // populateNamespaceContext();
+        if (reader != null) {
+            return reader.hasText();
+        }
+        return current.getType() == XmlNode.Type.CHARACTERS;
     }
 
     public boolean isAttributeSpecified(int i) {
+        if (reader != null) {
+            return reader.isAttributeSpecified(i);
+        }
         return false; // not supported
     }
 
     public boolean isCharacters() {
-        return current.getName() == null;
-    }
-
-    /**
-     * are we done ?
-     */
-    public boolean isDone() {
-        return !iterator.hasNext();
+        if (reader != null) {
+            return reader.isCharacters();
+        }
+        return current.getType() == XmlNode.Type.CHARACTERS;
     }
 
     public boolean isEndElement() {
+        if (reader != null) {
+            return reader.isEndElement();
+        }
         return getEventType() == END_ELEMENT;
     }
 
@@ -318,10 +425,16 @@
     }
 
     public boolean isStartElement() {
+        if (reader != null) {
+            return reader.isStartElement();
+        }
         return getEventType() == START_ELEMENT;
     }
 
     public boolean isWhiteSpace() {
+        if (reader != null) {
+            return reader.isWhiteSpace();
+        }
         return false;
     }
 
@@ -333,25 +446,42 @@
         if (!hasNext()) {
             throw new IllegalStateException("No more events");
         }
+        if (reader != null) {
+            if (!reader.hasNext()) {
+                this.reader = null;
+            } else {
+                // Go to the delegation mode
+                state = reader.next();
+                return state;
+            }
+        }
         if (!iterator.hasNext()) {
             state = END_DOCUMENT;
             current = null;
             return state;
         }
         current = iterator.next();
+        XmlNode.Type type = current.getType();
+
         int itState = iterator.getState();
         if (itState == XmlNodeIterator.END) {
-            if (current.getName() != null) {
+            if (type == XmlNode.Type.ELEMENT) {
                 state = END_ELEMENT;
             } else {
+                // Ignore the pop
                 state = next();
             }
         }
         if (itState == XmlNodeIterator.START) {
-            if (current.getName() != null) {
+            if (type == XmlNode.Type.ELEMENT) {
                 state = START_ELEMENT;
-            } else {
+            } else if (type == XmlNode.Type.CHARACTERS) {
                 state = CHARACTERS;
+            } else if (type == XmlNode.Type.READER) {
+                XMLStreamReader value = current.getValue();
+                this.reader = new WrappingXMLStreamReader(value);
+                state = reader.getEventType();
+                return state;
             }
         }
         return state;
@@ -372,6 +502,10 @@
     }
 
     public void require(int i, String ns, String localPart) throws XMLStreamException {
+        if (reader != null) {
+            reader.require(i, ns, localPart);
+            return;
+        }
         int event = getEventType();
         if (event != i) {
             throw new IllegalStateException("Event type is " + event + " (!=" + i + ")");
@@ -392,14 +526,6 @@
 
     public boolean standaloneSet() {
         return true;
-    }
-
-    /**
-     * @see org.apache.tuscany.sca.databinding.xml.XMLFragmentStreamReader#setParentNamespaceContext(javax.xml.namespace.NamespaceContext)
-     */
-    public void setParentNamespaceContext(NamespaceContext nsContext) {
-        // TODO Auto-generated method stub
-
     }
 
 }

Added: incubator/tuscany/java/sca/modules/databinding/src/test/java/org/apache/tuscany/sca/databinding/xml/BeanXMLStreamReaderTestCase.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/databinding/src/test/java/org/apache/tuscany/sca/databinding/xml/BeanXMLStreamReaderTestCase.java?rev=585611&view=auto
==============================================================================
--- incubator/tuscany/java/sca/modules/databinding/src/test/java/org/apache/tuscany/sca/databinding/xml/BeanXMLStreamReaderTestCase.java (added)
+++ incubator/tuscany/java/sca/modules/databinding/src/test/java/org/apache/tuscany/sca/databinding/xml/BeanXMLStreamReaderTestCase.java Wed Oct 17 11:04:49 2007
@@ -0,0 +1,164 @@
+/*
+ * 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.databinding.xml;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.xml.stream.XMLStreamReader;
+
+import junit.framework.TestCase;
+
+import org.custommonkey.xmlunit.XMLAssert;
+
+public class BeanXMLStreamReaderTestCase extends TestCase {
+    private final static String XML_RESULT =
+        "<?xml version='1.0' encoding='UTF-8'?>"
+        +"<MyBean xmlns=\"http://xml.databinding.sca.tuscany.apache.org/\">"
+        +"<nil xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:nil=\"true\" />"
+        +"<i>1</i><list>Item1</list><list>Item2</list><arr>1</arr><arr>2</arr><arr>3</arr>"
+        +"<bean><name>Name</name></bean><str>ABC</str></MyBean>";
+    /**
+     * @see junit.framework.TestCase#setUp()
+     */
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+    }
+
+    public void testTransformation() throws Exception {
+        MyBean bean = new MyBean();
+        bean.str = "ABC";
+        bean.i = 1;
+        bean.arr = new long[] {1, 2, 3};
+        bean.bean = new AnotherBean();
+        bean.bean.setName("Name");
+        bean.list.add("Item1");
+        bean.list.add("Item2");
+        XMLStreamReader reader = new BeanXMLStreamReaderImpl(null, bean);
+        XMLStreamReader2String t3 = new XMLStreamReader2String();
+        String xml = t3.transform(reader, null);
+        XMLAssert.assertXMLEqual(XML_RESULT, xml);
+        /* assertTrue(xml.contains("<JavaBean2XMLStreamReaderTestCase$MyBean>" 
+                     + "<arr>1</arr><arr>2</arr><arr>3</arr><bean><name>Name</name></bean>"
+                     + "<i>1</i><str>ABC</str></JavaBean2XMLStreamReaderTestCase$MyBean>"));
+                     */
+    }
+
+    private static class MyBean {
+        private String str;
+        private int i;
+        private String nil;
+        private long arr[];
+        private List<String> list = new ArrayList();
+        private AnotherBean bean;
+
+        /**
+         * @return the arr
+         */
+        public long[] getArr() {
+            return arr;
+        }
+
+        /**
+         * @param arr the arr to set
+         */
+        public void setArr(long[] arr) {
+            this.arr = arr;
+        }
+
+        /**
+         * @return the i
+         */
+        public int getI() {
+            return i;
+        }
+
+        /**
+         * @param i the i to set
+         */
+        public void setI(int i) {
+            this.i = i;
+        }
+
+        /**
+         * @return the str
+         */
+        public String getStr() {
+            return str;
+        }
+
+        /**
+         * @param str the str to set
+         */
+        public void setStr(String str) {
+            this.str = str;
+        }
+
+        /**
+         * @return the bean
+         */
+        public AnotherBean getBean() {
+            return bean;
+        }
+
+        /**
+         * @param bean the bean to set
+         */
+        public void setBean(AnotherBean bean) {
+            this.bean = bean;
+        }
+
+        public List<String> getList() {
+            return list;
+        }
+
+        public void setList(List<String> list) {
+            this.list = list;
+        }
+
+        public String getNil() {
+            return nil;
+        }
+
+        public void setNil(String nil) {
+            this.nil = nil;
+        }
+
+    }
+
+    private static class AnotherBean {
+        private String name;
+
+        /**
+         * @return the name
+         */
+        public String getName() {
+            return name;
+        }
+
+        /**
+         * @param name the name to set
+         */
+        public void setName(String name) {
+            this.name = name;
+        }
+    }
+
+}

Propchange: incubator/tuscany/java/sca/modules/databinding/src/test/java/org/apache/tuscany/sca/databinding/xml/BeanXMLStreamReaderTestCase.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/tuscany/java/sca/modules/databinding/src/test/java/org/apache/tuscany/sca/databinding/xml/BeanXMLStreamReaderTestCase.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Modified: incubator/tuscany/java/sca/modules/databinding/src/test/java/org/apache/tuscany/sca/databinding/xml/DOM2StAXTestCase.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/databinding/src/test/java/org/apache/tuscany/sca/databinding/xml/DOM2StAXTestCase.java?rev=585611&r1=585610&r2=585611&view=diff
==============================================================================
--- incubator/tuscany/java/sca/modules/databinding/src/test/java/org/apache/tuscany/sca/databinding/xml/DOM2StAXTestCase.java (original)
+++ incubator/tuscany/java/sca/modules/databinding/src/test/java/org/apache/tuscany/sca/databinding/xml/DOM2StAXTestCase.java Wed Oct 17 11:04:49 2007
@@ -22,6 +22,7 @@
 
 import junit.framework.TestCase;
 
+import org.custommonkey.xmlunit.XMLAssert;
 import org.w3c.dom.Node;
 
 public class DOM2StAXTestCase extends TestCase {
@@ -66,35 +67,38 @@
         super.setUp();
     }
 
-    public void testTransformation() {
+    public void testTransformation() throws Exception {
         String2Node t1 = new String2Node();
         Node node = t1.transform(IPO_XML, null);
         Node2XMLStreamReader t2 = new Node2XMLStreamReader();
         XMLStreamReader reader = t2.transform(node, null);
         XMLStreamReader2String t3 = new XMLStreamReader2String();
         String xml = t3.transform(reader, null);
-        assertTrue(xml != null && xml.indexOf("<shipDate>1999-12-05</shipDate>") != -1);
+        XMLAssert.assertXMLEqual(IPO_XML, xml);
+        // assertTrue(xml != null && xml.indexOf("<shipDate>1999-12-05</shipDate>") != -1);
     }
 
-    public void testTransformation2() {
+    public void testTransformation2() throws Exception {
         String2Node t1 = new String2Node();
         Node node = t1.transform(CRAZY_XML, null);
         Node2XMLStreamReader t2 = new Node2XMLStreamReader();
         XMLStreamReader reader = t2.transform(node, null);
         XMLStreamReader2String t3 = new XMLStreamReader2String();
         String xml = t3.transform(reader, null);
-        System.out.println(xml);
+        // System.out.println(xml);
+        XMLAssert.assertXMLEqual(CRAZY_XML, xml);
         assertTrue(xml.contains("<p:e2 xmlns:p=\"http://p2\""));
     }
 
-    public void testTransformation3() {
+    public void testTransformation3() throws Exception {
         String2Node t1 = new String2Node();
         Node node = t1.transform(IPO_XML, null);
         DOMXmlNodeImpl element = new DOMXmlNodeImpl(node);
         XmlTreeStreamReaderImpl reader = new XmlTreeStreamReaderImpl(element);
         XMLStreamReader2String t3 = new XMLStreamReader2String();
         String xml = t3.transform(reader, null);
-        assertTrue(xml != null && xml.indexOf("<shipDate>1999-12-05</shipDate>") != -1);
+        XMLAssert.assertXMLEqual(IPO_XML, xml);
+        // assertTrue(xml != null && xml.indexOf("<shipDate>1999-12-05</shipDate>") != -1);
     }
 
 }

Modified: incubator/tuscany/java/sca/modules/databinding/src/test/java/org/apache/tuscany/sca/databinding/xml/JavaBean2XMLStreamReaderTestCase.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/databinding/src/test/java/org/apache/tuscany/sca/databinding/xml/JavaBean2XMLStreamReaderTestCase.java?rev=585611&r1=585610&r2=585611&view=diff
==============================================================================
--- incubator/tuscany/java/sca/modules/databinding/src/test/java/org/apache/tuscany/sca/databinding/xml/JavaBean2XMLStreamReaderTestCase.java (original)
+++ incubator/tuscany/java/sca/modules/databinding/src/test/java/org/apache/tuscany/sca/databinding/xml/JavaBean2XMLStreamReaderTestCase.java Wed Oct 17 11:04:49 2007
@@ -23,8 +23,15 @@
 import junit.framework.TestCase;
 
 import org.apache.tuscany.sca.databinding.javabeans.JavaBean2XMLStreamReader;
+import org.custommonkey.xmlunit.XMLAssert;
 
 public class JavaBean2XMLStreamReaderTestCase extends TestCase {
+    private final static String XML_RESULT =
+        "<?xml version='1.0' encoding='UTF-8'?>" 
+            + "<MyBean xmlns=\"http://xml.databinding.sca.tuscany.apache.org/\">"
+            + "<i>1</i><arr>1</arr><arr>2</arr><arr>3</arr><str>ABC</str><bean><name>Name</name></bean>"
+            + "</MyBean>";
+
     /**
      * @see junit.framework.TestCase#setUp()
      */
@@ -33,7 +40,7 @@
         super.setUp();
     }
 
-    public void testTransformation() {
+    public void testTransformation() throws Exception {
         JavaBean2XMLStreamReader t2 = new JavaBean2XMLStreamReader();
         MyBean bean = new MyBean();
         bean.str = "ABC";
@@ -44,9 +51,8 @@
         XMLStreamReader reader = t2.transform(bean, null);
         XMLStreamReader2String t3 = new XMLStreamReader2String();
         String xml = t3.transform(reader, null);
-        assertTrue(xml.contains("<JavaBean2XMLStreamReaderTestCase$MyBean>" 
-                     + "<arr>1</arr><arr>2</arr><arr>3</arr><bean><name>Name</name></bean>"
-                     + "<i>1</i><str>ABC</str></JavaBean2XMLStreamReaderTestCase$MyBean>"));
+        XMLAssert.assertXMLEqual(XML_RESULT, xml);
+
     }
 
     private static class MyBean {

Modified: incubator/tuscany/java/sca/modules/databinding/src/test/java/org/apache/tuscany/sca/databinding/xml/StAXHelperTestCase.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/databinding/src/test/java/org/apache/tuscany/sca/databinding/xml/StAXHelperTestCase.java?rev=585611&r1=585610&r2=585611&view=diff
==============================================================================
--- incubator/tuscany/java/sca/modules/databinding/src/test/java/org/apache/tuscany/sca/databinding/xml/StAXHelperTestCase.java (original)
+++ incubator/tuscany/java/sca/modules/databinding/src/test/java/org/apache/tuscany/sca/databinding/xml/StAXHelperTestCase.java Wed Oct 17 11:04:49 2007
@@ -23,12 +23,15 @@
 
 import junit.framework.TestCase;
 
+import org.custommonkey.xmlunit.XMLAssert;
+
 /**
  * Test Case for StAXHelper
  */
 public class StAXHelperTestCase extends TestCase {
     private static final String XML =
-        "<a:foo xmlns:a='http://a' name='foo'><bar name='bar'>" + "<doo a:name='doo' xmlns:a='http://doo'/>"
+        "<a:foo xmlns:a='http://a' name='foo'><bar name='bar'>" 
+            + "<doo a:name='doo' xmlns:a='http://doo'/>"
             + "</bar></a:foo>";
 
     /**
@@ -42,7 +45,9 @@
     public void testHelper() throws Exception {
         XMLStreamReader reader = StAXHelper.createXMLStreamReader(XML);
         String xml = StAXHelper.save(reader);
+        XMLAssert.assertXMLEqual(XML, xml);
         reader = StAXHelper.createXMLStreamReader(xml);
+        assertNotNull(reader);
     }
 
 }

Modified: incubator/tuscany/java/sca/modules/databinding/src/test/java/org/apache/tuscany/sca/databinding/xml/XmlTreeStreamReaderTestCase.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/databinding/src/test/java/org/apache/tuscany/sca/databinding/xml/XmlTreeStreamReaderTestCase.java?rev=585611&r1=585610&r2=585611&view=diff
==============================================================================
--- incubator/tuscany/java/sca/modules/databinding/src/test/java/org/apache/tuscany/sca/databinding/xml/XmlTreeStreamReaderTestCase.java (original)
+++ incubator/tuscany/java/sca/modules/databinding/src/test/java/org/apache/tuscany/sca/databinding/xml/XmlTreeStreamReaderTestCase.java Wed Oct 17 11:04:49 2007
@@ -19,6 +19,7 @@
 
 package org.apache.tuscany.sca.databinding.xml;
 
+import java.io.StringReader;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.HashMap;
@@ -27,11 +28,12 @@
 import java.util.Map;
 
 import javax.xml.namespace.QName;
-import javax.xml.stream.XMLStreamConstants;
-import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLInputFactory;
+import javax.xml.stream.XMLStreamReader;
 
 import junit.framework.Assert;
 
+import org.custommonkey.xmlunit.XMLAssert;
 import org.junit.Before;
 import org.junit.Test;
 
@@ -39,30 +41,80 @@
  * @version $Rev$ $Date$
  */
 public class XmlTreeStreamReaderTestCase {
-    private XmlElementImpl root;
+    private static final String IPO_XML =
+        "<?xml version=\"1.0\"?>" + "<ipo:purchaseOrder"
+            + "  xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\""
+            + "  xmlns:ipo=\"http://www.example.com/IPO\""
+            + "  xsi:schemaLocation=\"http://www.example.com/IPO ipo.xsd\""
+            + "  orderDate=\"1999-12-01\">"
+            + "  <shipTo exportCode=\"1\" xsi:type=\"ipo:UKAddress\">"
+            + "    <name>Helen Zoe</name>"
+            + "    <street>47 Eden Street</street>"
+            + "    <city>Cambridge</city>"
+            + "    <postcode>CB1 1JR</postcode>"
+            + "  </shipTo>"
+            + "  <billTo xsi:type=\"ipo:USAddress\">"
+            + "    <name>Robert Smith</name>"
+            + "    <street>8 Oak Avenue</street>"
+            + "    <city>Old Town</city>"
+            + "    <state>PA</state>"
+            + "    <zip>95819</zip>"
+            + "  </billTo>"
+            + "  <items>"
+            + "    <item partNum=\"833-AA\">"
+            + "      <productName>Lapis necklace</productName>"
+            + "      <quantity>1</quantity>"
+            + "      <USPrice>99.95</USPrice>"
+            + "      <ipo:comment>Want this for the holidays</ipo:comment>"
+            + "      <shipDate>1999-12-05</shipDate>"
+            + "    </item>"
+            + "  </items>"
+            + "</ipo:purchaseOrder>";
+
+    private final static String XML_RESULT =
+        "<?xml version='1.0' encoding='UTF-8'?>" + "<p1:e1 xmlns:p1=\"http://ns\">"
+            + "<p2:e11 xmlns:p2=\"http://ns1\">MyText</p2:e11>"
+            + "<p1:e12><p1:e121 /></p1:e12>"
+            + "<ipo:purchaseOrder xmlns:ipo=\"http://www.example.com/IPO\" "
+            + "xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" "
+            + "xsi:schemaLocation=\"http://www.example.com/IPO ipo.xsd\" orderDate=\"1999-12-01\">  "
+            + "<shipTo exportCode=\"1\" xsi:type=\"ipo:UKAddress\">    "
+            + "<name>Helen Zoe</name>    <street>47 Eden Street</street>    "
+            + "<city>Cambridge</city>    <postcode>CB1 1JR</postcode>  </shipTo>  "
+            + "<billTo xsi:type=\"ipo:USAddress\">    <name>Robert Smith</name>    "
+            + "<street>8 Oak Avenue</street>    <city>Old Town</city>    <state>PA</state>    "
+            + "<zip>95819</zip>  </billTo>  <items>    <item partNum=\"833-AA\">      "
+            + "<productName>Lapis necklace</productName>      <quantity>1</quantity>      "
+            + "<USPrice>99.95</USPrice>      <ipo:comment>Want this for the holidays</ipo:comment>      "
+            + "<shipDate>1999-12-05</shipDate>    </item>  </items></ipo:purchaseOrder></p1:e1>";
+    private XmlNodeImpl root;
 
     @Before
-    public void setUp() {
-        root = new XmlElementImpl();
+    public void setUp() throws Exception {
+        root = new XmlNodeImpl();
         root.name = new QName("http://ns", "e1", "p1");
 
-        XmlElementImpl e11 = new XmlElementImpl();
+        XmlNodeImpl e11 = new XmlNodeImpl();
         e11.name = new QName("http://ns1", "e11", "p2");
 
-        XmlElementImpl e12 = new XmlElementImpl();
+        XmlNodeImpl e12 = new XmlNodeImpl();
         e12.name = new QName("http://ns", "e12");
 
         root.children.add(e11);
         root.children.add(e12);
 
-        XmlElementImpl e121 = new XmlElementImpl();
+        XmlNodeImpl e121 = new XmlNodeImpl();
         e121.name = new QName("http://ns", "e121");
         e12.children.add(e121);
 
-        XmlElementImpl e111 = new XmlElementImpl();
+        XmlNodeImpl e111 = new XmlNodeImpl();
         e111.value = "MyText";
         e11.children.add(e111);
 
+        XmlNodeImpl e13 = new XmlNodeImpl();
+        e13.value = XMLInputFactory.newInstance().createXMLStreamReader(new StringReader(IPO_XML));
+        root.children.add(e13);
+
     }
 
     @Test
@@ -72,58 +124,34 @@
         for (; i.hasNext();) {
             XmlNode e = i.next();
             elements.add(e.getName());
-            // System.out.println(i.getNamespaceContext());
         }
+        // System.out.println(elements);
         QName[] names =
             {new QName("http://ns", "e1"), new QName("http://ns1", "e11"), null, null, new QName("http://ns1", "e11"),
              new QName("http://ns", "e12"), new QName("http://ns", "e121"), new QName("http://ns", "e121"),
-             new QName("http://ns", "e12"), new QName("http://ns", "e1")};
+             new QName("http://ns", "e12"), null, null, new QName("http://ns", "e1")};
         Assert.assertEquals(Arrays.asList(names), elements);
     }
 
     @Test
-    public void testReader() throws XMLStreamException {
+    public void testReader() throws Exception {
         XmlTreeStreamReaderImpl reader = new XmlTreeStreamReaderImpl(root);
-        List<String> seq = new ArrayList<String>();
-        while (true) {
-            int e = reader.getEventType();
-            if (e == XMLStreamConstants.START_DOCUMENT) {
-                seq.add("START_DOCUMENT");
-            } else if (e == XMLStreamConstants.END_DOCUMENT) {
-                seq.add("END_DOCUMENT");
-            } else if (e == XMLStreamConstants.CHARACTERS) {
-                seq.add(reader.getText());
-            } else {
-                seq.add(e + ": " + reader.getName());
-            }
-            if (!reader.hasNext()) {
-                break;
-            } else {
-                reader.next();
-            }
-        }
-
-        String[] events =
-            {"START_DOCUMENT", "1: {http://ns}e1", "1: {http://ns1}e11", "MyText", "2: {http://ns1}e11",
-             "1: {http://ns}e12", "1: {http://ns}e121", "2: {http://ns}e121", "2: {http://ns}e12", "2: {http://ns}e1",
-             "END_DOCUMENT"
-            };
-        
-        Assert.assertEquals(Arrays.asList(events), seq);
+        XMLStreamReader2String t = new XMLStreamReader2String();
+        String xml = t.transform(reader, null);
+        XMLAssert.assertXMLEqual(XML_RESULT, xml);
     }
 
-    private static class XmlElementImpl implements XmlNode {
+    private static class XmlNodeImpl implements XmlNode {
         private List<XmlNode> children = new ArrayList<XmlNode>();
-        private List<XmlAttribute> attrs = new ArrayList<XmlAttribute>();
+        private List<XmlNode> attrs = new ArrayList<XmlNode>();
         private Map<String, String> namespaces = new HashMap<String, String>();
         private QName name;
-        private boolean isLeaf;
-        private String value = "123";
+        private Object value = "123";
 
         /**
          * @see org.apache.tuscany.sca.databinding.xml.XmlNode#attributes()
          */
-        public List<XmlAttribute> attributes() {
+        public List<XmlNode> attributes() {
             return attrs;
         }
 
@@ -144,15 +172,8 @@
         /**
          * @see org.apache.tuscany.sca.databinding.xml.XmlNode#getValue()
          */
-        public String getValue() {
-            return value;
-        }
-
-        /**
-         * @see org.apache.tuscany.sca.databinding.xml.XmlNode#isLeaf()
-         */
-        public boolean isLeaf() {
-            return isLeaf;
+        public <T> T getValue() {
+            return (T)value;
         }
 
         /**
@@ -164,6 +185,13 @@
 
         public String toString() {
             return String.valueOf(name);
+        }
+
+        public Type getType() {
+            if (value instanceof XMLStreamReader) {
+                return Type.READER;
+            }
+            return name == null ? Type.CHARACTERS : Type.ELEMENT;
         }
 
     }



---------------------------------------------------------------------
To unsubscribe, e-mail: tuscany-commits-unsubscribe@ws.apache.org
For additional commands, e-mail: tuscany-commits-help@ws.apache.org