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/03/02 07:32:27 UTC

svn commit: r513629 [1/3] - in /incubator/tuscany/branches/sca-java-integration/sca/kernel/core/src: main/java/org/apache/tuscany/core/databinding/javabeans/ main/java/org/apache/tuscany/core/databinding/xml/ test/java/org/apache/tuscany/core/databindi...

Author: rfeng
Date: Thu Mar  1 22:32:26 2007
New Revision: 513629

URL: http://svn.apache.org/viewvc?view=rev&rev=513629
Log:
[sca-integration-branch] Add JavaBean2XMLStreamReader transformer and improve the StAX readers

Added:
    incubator/tuscany/branches/sca-java-integration/sca/kernel/core/src/main/java/org/apache/tuscany/core/databinding/javabeans/JavaBean2XMLStreamReader.java   (with props)
    incubator/tuscany/branches/sca-java-integration/sca/kernel/core/src/main/java/org/apache/tuscany/core/databinding/xml/BeanUtil.java   (with props)
    incubator/tuscany/branches/sca-java-integration/sca/kernel/core/src/main/java/org/apache/tuscany/core/databinding/xml/DelegatingNamespaceContext.java   (with props)
    incubator/tuscany/branches/sca-java-integration/sca/kernel/core/src/main/java/org/apache/tuscany/core/databinding/xml/NameValueArrayStreamReader.java   (with props)
    incubator/tuscany/branches/sca-java-integration/sca/kernel/core/src/main/java/org/apache/tuscany/core/databinding/xml/NameValuePairStreamReader.java   (with props)
    incubator/tuscany/branches/sca-java-integration/sca/kernel/core/src/main/java/org/apache/tuscany/core/databinding/xml/NamedProperty.java   (with props)
    incubator/tuscany/branches/sca-java-integration/sca/kernel/core/src/main/java/org/apache/tuscany/core/databinding/xml/NilElementStreamReader.java   (with props)
    incubator/tuscany/branches/sca-java-integration/sca/kernel/core/src/main/java/org/apache/tuscany/core/databinding/xml/WrappingXMLStreamReader.java   (with props)
    incubator/tuscany/branches/sca-java-integration/sca/kernel/core/src/main/java/org/apache/tuscany/core/databinding/xml/XMLDocumentStreamReader.java   (with props)
    incubator/tuscany/branches/sca-java-integration/sca/kernel/core/src/main/java/org/apache/tuscany/core/databinding/xml/XMLFragmentStreamReader.java   (with props)
    incubator/tuscany/branches/sca-java-integration/sca/kernel/core/src/main/java/org/apache/tuscany/core/databinding/xml/XMLFragmentStreamReaderImpl.java   (with props)
    incubator/tuscany/branches/sca-java-integration/sca/kernel/core/src/main/java/org/apache/tuscany/core/databinding/xml/XMLStreamSerializer.java   (with props)
    incubator/tuscany/branches/sca-java-integration/sca/kernel/core/src/main/java/org/apache/tuscany/core/databinding/xml/XMLStreamable.java   (with props)
    incubator/tuscany/branches/sca-java-integration/sca/kernel/core/src/test/java/org/apache/tuscany/core/databinding/xml/JavaBean2XMLStreamReaderTestCase.java   (with props)
Modified:
    incubator/tuscany/branches/sca-java-integration/sca/kernel/core/src/main/java/org/apache/tuscany/core/databinding/xml/DOMXMLStreamReader.java
    incubator/tuscany/branches/sca-java-integration/sca/kernel/core/src/main/java/org/apache/tuscany/core/databinding/xml/Node2XMLStreamReader.java
    incubator/tuscany/branches/sca-java-integration/sca/kernel/core/src/main/java/org/apache/tuscany/core/databinding/xml/StAXHelper.java
    incubator/tuscany/branches/sca-java-integration/sca/kernel/core/src/test/java/org/apache/tuscany/core/databinding/xml/DOM2StAXTestCase.java

Added: incubator/tuscany/branches/sca-java-integration/sca/kernel/core/src/main/java/org/apache/tuscany/core/databinding/javabeans/JavaBean2XMLStreamReader.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/branches/sca-java-integration/sca/kernel/core/src/main/java/org/apache/tuscany/core/databinding/javabeans/JavaBean2XMLStreamReader.java?view=auto&rev=513629
==============================================================================
--- incubator/tuscany/branches/sca-java-integration/sca/kernel/core/src/main/java/org/apache/tuscany/core/databinding/javabeans/JavaBean2XMLStreamReader.java (added)
+++ incubator/tuscany/branches/sca-java-integration/sca/kernel/core/src/main/java/org/apache/tuscany/core/databinding/javabeans/JavaBean2XMLStreamReader.java Thu Mar  1 22:32:26 2007
@@ -0,0 +1,56 @@
+/*
+ * 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.core.databinding.javabeans;
+
+import javax.xml.stream.XMLStreamReader;
+
+import org.apache.tuscany.core.databinding.xml.BeanUtil;
+import org.apache.tuscany.core.databinding.xml.XMLDocumentStreamReader;
+import org.apache.tuscany.spi.databinding.PullTransformer;
+import org.apache.tuscany.spi.databinding.TransformationContext;
+import org.apache.tuscany.spi.databinding.TransformationException;
+import org.apache.tuscany.spi.databinding.Transformer;
+import org.apache.tuscany.spi.databinding.extension.TransformerExtension;
+import org.osoa.sca.annotations.Service;
+
+@Service(Transformer.class)
+public class JavaBean2XMLStreamReader extends TransformerExtension<Object, XMLStreamReader> implements
+    PullTransformer<Object, XMLStreamReader> {
+
+    public XMLStreamReader transform(Object source, TransformationContext context) {
+        try {
+            return new XMLDocumentStreamReader(BeanUtil.getXMLStreamReader(source));
+        } catch (Exception e) {
+            throw new TransformationException(e);
+        }
+    }
+
+    public Class getSourceType() {
+        return Object.class;
+    }
+
+    public Class getTargetType() {
+        return XMLStreamReader.class;
+    }
+
+    public int getWeight() {
+        return 50;
+    }
+
+}

Propchange: incubator/tuscany/branches/sca-java-integration/sca/kernel/core/src/main/java/org/apache/tuscany/core/databinding/javabeans/JavaBean2XMLStreamReader.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/tuscany/branches/sca-java-integration/sca/kernel/core/src/main/java/org/apache/tuscany/core/databinding/javabeans/JavaBean2XMLStreamReader.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Added: incubator/tuscany/branches/sca-java-integration/sca/kernel/core/src/main/java/org/apache/tuscany/core/databinding/xml/BeanUtil.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/branches/sca-java-integration/sca/kernel/core/src/main/java/org/apache/tuscany/core/databinding/xml/BeanUtil.java?view=auto&rev=513629
==============================================================================
--- incubator/tuscany/branches/sca-java-integration/sca/kernel/core/src/main/java/org/apache/tuscany/core/databinding/xml/BeanUtil.java (added)
+++ incubator/tuscany/branches/sca-java-integration/sca/kernel/core/src/main/java/org/apache/tuscany/core/databinding/xml/BeanUtil.java Thu Mar  1 22:32:26 2007
@@ -0,0 +1,196 @@
+/*
+ * 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.core.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.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import javax.xml.namespace.QName;
+import javax.xml.stream.XMLStreamReader;
+
+import org.apache.tuscany.spi.databinding.extension.SimpleTypeMapperExtension;
+import org.apache.tuscany.spi.idl.TypeInfo;
+
+public final class BeanUtil {
+    private static final Object[] NULL = (Object[])null;
+    private static int nsCount = 1;
+
+    private static final SimpleTypeMapperExtension MAPPER = new SimpleTypeMapperExtension();
+
+    private BeanUtil() {
+    }
+
+    private static boolean isSimpleType(Class javaType) {
+        return MAPPER.getXMLType(javaType) != null;
+    }
+
+    private static String getStringValue(Object o) {
+        if (o == null) {
+            return null;
+        }
+        TypeInfo info = MAPPER.getXMLType(o.getClass());
+        if (info != null) {
+            return MAPPER.toXMLLiteral(info.getQName(), o, null);
+        } else {
+            return String.valueOf(o);
+        }
+    }
+
+    /**
+     * To Serilize Bean object this method is used, this will create an object
+     * array using given bean object
+     * 
+     * @param beanObject
+     * @param beanName
+     */
+    public static XMLStreamReader getXMLStreamReader(Object beanObject, QName beanName) {
+        try {
+            ClassLoader cl = beanObject.getClass().getClassLoader();
+            if (cl == null) {
+                cl = ClassLoader.getSystemClassLoader();
+            }
+            String beanNS = beanName.getNamespaceURI();
+            String beanPrefix = beanName.getPrefix();
+            BeanInfo beanInfo = Introspector.getBeanInfo(beanObject.getClass());
+            PropertyDescriptor[] propDescs = beanInfo.getPropertyDescriptors();
+            Map<String, PropertyDescriptor> propertMap = new HashMap<String, PropertyDescriptor>();
+            for (int i = 0; i < propDescs.length; i++) {
+                PropertyDescriptor propDesc = propDescs[i];
+                propertMap.put(propDesc.getName(), propDesc);
+            }
+            List<String> properties = new ArrayList<String>(propertMap.keySet());
+            Collections.sort(properties);
+            List<NamedProperty> props = new ArrayList<NamedProperty>();
+            for (int i = 0; i < properties.size(); i++) {
+                String property = properties.get(i);
+                PropertyDescriptor propDesc = (PropertyDescriptor)propertMap.get(property);
+                if (propDesc == null) {
+                    // JAM does bad thing so I need to add this
+                    continue;
+                }
+                Class ptype = propDesc.getPropertyType();
+                if ("class".equals(property)) {
+                    continue;
+                }
+                if (isSimpleType(ptype)) {
+                    Object value = propDesc.getReadMethod().invoke(beanObject, NULL);
+                    NamedProperty prop =
+                        new NamedProperty(new QName(beanNS, property, beanPrefix), getStringValue(value));
+                    props.add(prop);
+                } else if (ptype.isArray()) {
+                    if (isSimpleType(ptype.getComponentType())) {
+                        Object value = propDesc.getReadMethod().invoke(beanObject, NULL);
+                        if (value != null) {
+                            int i1 = Array.getLength(value);
+                            for (int j = 0; j < i1; j++) {
+                                Object o = Array.get(value, j);
+                                NamedProperty prop =
+                                    new NamedProperty(new QName(beanNS, property, beanPrefix), getStringValue(o));
+                                props.add(prop);
+                            }
+                        } else {
+                            NamedProperty prop = new NamedProperty(new QName(beanNS, property, beanPrefix), value);
+                            props.add(prop);
+                        }
+
+                    } else {
+                        Object value[] = (Object[])propDesc.getReadMethod().invoke(beanObject, NULL);
+                        if (value != null) {
+                            for (int j = 0; j < value.length; j++) {
+                                Object o = value[j];
+                                NamedProperty prop =
+                                    new NamedProperty(new QName(beanNS, property, beanPrefix), getStringValue(o));
+                                props.add(prop);
+                            }
+                        } else {
+                            NamedProperty prop = new NamedProperty(new QName(beanNS, property, beanPrefix), value);
+                            props.add(prop);
+                        }
+                    }
+                } else if (Collection.class.isAssignableFrom(ptype)) {
+                    Object value = propDesc.getReadMethod().invoke(beanObject, NULL);
+                    Collection objList = (Collection)value;
+                    if (objList != null && objList.size() > 0) {
+                        // this was given error , when the array.size = 0
+                        // and if the array contain simple type , then the
+                        // ADBPullParser asked
+                        // PullParser from That simpel type
+                        for (Iterator j = objList.iterator(); j.hasNext();) {
+                            Object o = j.next();
+                            if (isSimpleType(o.getClass())) {
+                                NamedProperty prop =
+                                    new NamedProperty(new QName(beanNS, property, beanPrefix), getStringValue(o));
+                                props.add(prop);
+                            } else {
+                                NamedProperty prop = new NamedProperty(new QName(beanNS, property, beanPrefix), o);
+                                props.add(prop);
+                            }
+                        }
+
+                    } else {
+                        NamedProperty prop = new NamedProperty(new QName(beanNS, property, beanPrefix), value);
+                        props.add(prop);
+                    }
+                } else {
+                    Object value = propDesc.getReadMethod().invoke(beanObject, NULL);
+                    NamedProperty prop = new NamedProperty(new QName(beanNS, property, beanPrefix), value);
+                    props.add(prop);
+                }
+            }
+            NamedProperty[] elements = new NamedProperty[props.size()];
+            props.toArray(elements);
+            return new XMLFragmentStreamReaderImpl(beanName, elements, null);
+        } catch (Exception e) {
+            throw new IllegalArgumentException(e);
+        }
+    }
+
+    /**
+     * to get the pull parser for a given bean object , generate the wrpper
+     * element using class name
+     * 
+     * @param beanObject
+     */
+    public static XMLStreamReader getXMLStreamReader(Object beanObject) {
+        String className = beanObject.getClass().getName();
+        if (className.indexOf(".") > 0) {
+            className = className.substring(className.lastIndexOf('.') + 1, className.length());
+        }
+        return getXMLStreamReader(beanObject, new QName(className));
+    }
+
+    /**
+     * increments the namespace counter and returns a new prefix
+     * 
+     * @return unique prefix
+     */
+    public static String getUniquePrefix() {
+        return "s" + nsCount++;
+    }
+
+}

Propchange: incubator/tuscany/branches/sca-java-integration/sca/kernel/core/src/main/java/org/apache/tuscany/core/databinding/xml/BeanUtil.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/tuscany/branches/sca-java-integration/sca/kernel/core/src/main/java/org/apache/tuscany/core/databinding/xml/BeanUtil.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Modified: incubator/tuscany/branches/sca-java-integration/sca/kernel/core/src/main/java/org/apache/tuscany/core/databinding/xml/DOMXMLStreamReader.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/branches/sca-java-integration/sca/kernel/core/src/main/java/org/apache/tuscany/core/databinding/xml/DOMXMLStreamReader.java?view=diff&rev=513629&r1=513628&r2=513629
==============================================================================
--- incubator/tuscany/branches/sca-java-integration/sca/kernel/core/src/main/java/org/apache/tuscany/core/databinding/xml/DOMXMLStreamReader.java (original)
+++ incubator/tuscany/branches/sca-java-integration/sca/kernel/core/src/main/java/org/apache/tuscany/core/databinding/xml/DOMXMLStreamReader.java Thu Mar  1 22:32:26 2007
@@ -18,17 +18,12 @@
  */
 package org.apache.tuscany.core.databinding.xml;
 
+import static javax.xml.XMLConstants.XMLNS_ATTRIBUTE_NS_URI;
+
 import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.Iterator;
 import java.util.List;
-import java.util.Map;
-import javax.xml.XMLConstants;
-import javax.xml.namespace.NamespaceContext;
+
 import javax.xml.namespace.QName;
-import javax.xml.stream.Location;
-import javax.xml.stream.XMLStreamException;
 
 import org.w3c.dom.Attr;
 import org.w3c.dom.CharacterData;
@@ -38,1393 +33,89 @@
 import org.w3c.dom.Node;
 import org.w3c.dom.NodeList;
 
-import org.apache.tuscany.core.databinding.xml.StAXHelper.XMLFragmentStreamReader;
-
-public class DOMXMLStreamReader implements XMLFragmentStreamReader {
-    protected static class DelegatingNamespaceContext implements NamespaceContext {
-        private int counter;
-
-        private NamespaceContext parent;
-
-        private Map<String, String> prefixToNamespaceMapping = new HashMap<String, String>();
-
-        public DelegatingNamespaceContext(NamespaceContext parent) {
-            super();
-            this.parent = parent;
-
-            prefixToNamespaceMapping.put("xml", "http://www.w3.org/XML/1998/namespace");
-            prefixToNamespaceMapping.put("xmlns", "http://www.w3.org/2000/xmlns/");
-            prefixToNamespaceMapping.put("xsi", "http://www.w3.org/2001/XMLSchema-instance");
-        }
-
-        public synchronized QName createQName(String nsURI, String name) {
-            String prefix = nsURI != null ? (String) getPrefix(nsURI) : null;
-            if (prefix == null && nsURI != null && !nsURI.equals("")) {
-                prefix = "p" + (counter++);
-            }
-            if (prefix == null) {
-                prefix = "";
-            }
-            if (nsURI != null) {
-                prefixToNamespaceMapping.put(prefix, nsURI);
-            }
-            return new QName(nsURI, name, prefix);
-        }
-
-        public String getNamespaceURI(String prefix) {
-            if (prefix == null) {
-                throw new IllegalArgumentException("Prefix is null");
-            }
-
-            String ns = (String) prefixToNamespaceMapping.get(prefix);
-            if (ns != null) {
-                return ns;
-            } else if (parent != null) {
-                return parent.getNamespaceURI(prefix);
-            } else {
-                return null;
-            }
-        }
-
-        public String getPrefix(String nsURI) {
-            if (nsURI == null) {
-                throw new IllegalArgumentException("Namespace is null");
-            }
-            for (Map.Entry<String, String> entry1 : prefixToNamespaceMapping.entrySet()) {
-                Map.Entry entry = entry1;
-                if (entry.getValue().equals(nsURI)) {
-                    return (String) entry.getKey();
-                }
-            }
-            if (parent != null) {
-                return parent.getPrefix(nsURI);
-            } else {
-                return null;
-            }
-        }
-
-        public Iterator getPrefixes(String nsURI) {
-            List<String> prefixList = new ArrayList<String>();
-            for (Map.Entry<String, String> entry : prefixToNamespaceMapping.entrySet()) {
-                if (entry.getValue().equals(nsURI)) {
-                    prefixList.add(entry.getKey());
-                }
-            }
-            if (parent != null) {
-                for (Iterator i = parent.getPrefixes(nsURI); i.hasNext();) {
-                    prefixList.add((String) i.next());
-                }
-            }
-            return prefixList.iterator();
-        }
-
-        public void registerMapping(String prefix, String nsURI) {
-            prefixToNamespaceMapping.put(prefix, nsURI);
-        }
-
-        public void removeMapping(String prefix) {
-            prefixToNamespaceMapping.remove(prefix);
-        }
-
-        public void setParent(NamespaceContext parent) {
-            this.parent = parent;
-        }
-    }
-
-    protected static class NameValuePair implements Map.Entry {
-        private Object key;
-
-        private Object value;
-
-        public NameValuePair(Object key, Object value) {
-            this.key = key;
-            this.value = value;
-        }
-
-        public Object getKey() {
-            return key;
-        }
-
-        public Object getValue() {
-            return value;
-        }
-
-        public Object setValue(Object value) {
-            Object v = this.value;
-            this.value = value;
-            return v;
-        }
-
-    }
-
-    protected static class SimpleElementStreamReader implements XMLFragmentStreamReader {
-
-        private static final int END_ELEMENT_STATE = 2;
-
-        private static final int START_ELEMENT_STATE = 0;
-
-        private static final int START_ELEMENT_STATE_WITH_NULL = 3;
-
-        private static final int TEXT_STATE = 1;
-
-        private static final QName XSI_NIL_QNAME =
-            new QName("http://www.w3.org/2001/XMLSchema-instance", "nil", "xsi");
-
-        private QName name;
-
-        private DelegatingNamespaceContext namespaceContext = new DelegatingNamespaceContext(null);
-
-        private int state = START_ELEMENT_STATE;
-
-        private String value;
-
-        public SimpleElementStreamReader(QName name, String value) {
-            this.name = name;
-            this.value = value;
-            if (value == null) {
-                state = START_ELEMENT_STATE_WITH_NULL;
-            }
-        }
-
-        public void close() throws XMLStreamException {
-            // Do nothing - we've nothing to free here
-        }
-
-        public int getAttributeCount() {
-            if (state == START_ELEMENT_STATE_WITH_NULL) {
-                return 1;
-            }
-            if (state == START_ELEMENT_STATE) {
-                return 0;
-            } else {
-                throw new IllegalStateException();
-            }
-
-        }
-
-        public String getAttributeLocalName(int i) {
-            if (state == START_ELEMENT_STATE_WITH_NULL && i == 0) {
-                return XSI_NIL_QNAME.getLocalPart();
-            }
-            if (state == START_ELEMENT_STATE) {
-                return null;
-            } else {
-                throw new IllegalStateException();
-            }
-        }
-
-        public QName getAttributeName(int i) {
-            if (state == START_ELEMENT_STATE_WITH_NULL && i == 0) {
-                return XSI_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 XSI_NIL_QNAME.getNamespaceURI();
-            }
-            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 XSI_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 "true";
-            }
-            if (state == START_ELEMENT_STATE) {
-                return null;
-            } else {
-                throw new IllegalStateException();
-            }
-        }
-
-        public String getAttributeValue(String string, String string1) {
-            if (state == TEXT_STATE) {
-                // todo something
-                return null;
-            } else {
-                return null;
-            }
-
-        }
-
-        public String getCharacterEncodingScheme() {
-            return null;
-        }
-
-        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 String getEncoding() {
-            return "UTF-8";
-        }
-
-        public int getEventType() {
-            switch (state) {
-                case START_ELEMENT_STATE:
-                case START_ELEMENT_STATE_WITH_NULL:
-                    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 getLocalName() {
-            if (state != TEXT_STATE) {
-                return name.getLocalPart();
-            } else {
-                return null;
-            }
-        }
-
-        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() {
-            if (state != TEXT_STATE) {
-                return name;
-            } else {
-                return null;
-            }
-        }
-
-        public NamespaceContext getNamespaceContext() {
-            return this.namespaceContext;
-        }
-
-        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 XSI_NIL_QNAME.getPrefix();
-            } else {
-                return null;
-            }
-        }
-
-        public String getNamespaceURI() {
-            if (state != TEXT_STATE) {
-                return name.getNamespaceURI();
-            } else {
-                return null;
-            }
-
-        }
-
-        public String getNamespaceURI(int i) {
-            if (state == START_ELEMENT_STATE_WITH_NULL && isXsiNamespacePresent() && i == 0) {
-                return XSI_NIL_QNAME.getNamespaceURI();
-            } else {
-                return null;
-            }
-        }
-
-        public String getNamespaceURI(String prefix) {
-            return namespaceContext.getNamespaceURI(prefix);
-        }
-
-        public String getPIData() {
-            return null;
-        }
-
-        public String getPITarget() {
-            return null;
-        }
-
-        public String getPrefix() {
-            if (state != TEXT_STATE) {
-                return name.getPrefix();
-            } else {
-                return null;
-            }
-        }
-
-        public Object getProperty(String key) throws IllegalArgumentException {
-            return null;
-        }
-
-        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 sourceStart, char[] target, int targetStart, int length) {
-            char[] source = getTextCharacters();
-            if (sourceStart > source.length)
-                throw new IndexOutOfBoundsException("source start > source length");
-            int sourceLen = source.length - sourceStart;
-            if (length > sourceLen)
-                length = sourceLen;
-            System.arraycopy(source, sourceStart, target, targetStart, length);
-            return sourceLen;
-        }
-        
-        public int getTextLength() {
-            if (state == TEXT_STATE) {
-                return value.length();
-            } else {
-                throw new IllegalStateException();
-            }
-
-        }
-
-        public int getTextStart() {
-            if (state == TEXT_STATE) {
-                return 0;
-            } else {
-                throw new IllegalStateException();
-            }
-        }
-
-        public String getVersion() {
-            return null; // todo 1.0 ?
-        }
-
-        public boolean hasName() {
-            return state != TEXT_STATE;
-
-        }
-
-        public boolean hasNext() throws XMLStreamException {
-            return state != END_ELEMENT_STATE;
-        }
-
-        public boolean hasText() {
-            return state == TEXT_STATE;
-        }
-
-        public void init() {
-            // just add the current elements namespace and prefix to the this
-            // elements nscontext
-            registerNamespace(name.getPrefix(), name.getNamespaceURI());
-
-        }
-
-        public boolean isAttributeSpecified(int i) {
-            return false; // no attribs here
-        }
-
-        public boolean isCharacters() {
-            return state == TEXT_STATE;
-        }
-
-        public boolean isEndElement() {
-            return state == END_ELEMENT_STATE;
-        }
-
-        public boolean isEndOfFragment() {
-            return state == END_ELEMENT_STATE;
-        }
-
-        public boolean isStandalone() {
-            return false;
-        }
-
-        public boolean isStartElement() {
-            return state == START_ELEMENT_STATE || state == START_ELEMENT_STATE_WITH_NULL;
-        }
-
-        public boolean isWhiteSpace() {
-            return false; // no whitespaces here
-        }
-
-        /**
-         * Test whether the xsi namespace is present
-         *
-         * @return
-         */
-        private boolean isXsiNamespacePresent() {
-            return namespaceContext.getNamespaceURI(XSI_NIL_QNAME.getPrefix()) != null;
-        }
-
-        public int next() throws XMLStreamException {
-            switch (state) {
-                case START_ELEMENT_STATE:
-                    state = TEXT_STATE;
-                    return CHARACTERS;
-                case START_ELEMENT_STATE_WITH_NULL:
-                    state = END_ELEMENT_STATE;
-                    return END_ELEMENT;
-                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 int nextTag() throws XMLStreamException {
-            return 0; // todo
-        }
-
-        /**
-         * @param prefix
-         * @param uri
-         */
-        private void registerNamespace(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.registerMapping(prefix, uri);
-            }
-        }
-
-        public void require(int i, String string, String string1) throws XMLStreamException {
-            // not implemented
-        }
-
-        public void setParentNamespaceContext(NamespaceContext nsContext) {
-            this.namespaceContext.setParent(nsContext);
-        }
-
-        public boolean standaloneSet() {
-            return false;
-        }
-
-    }
-
-    private static final int DELEGATED_STATE = 2;
-
-    private static final int END_ELEMENT_STATE = 1;
-
-    // states for this pullparser - it can only have three states
-    private static final int START_ELEMENT_STATE = 0;
-
-    private static final int TEXT_STATE = 3;
-
-    private Map.Entry[] attributes;
-
-    // reference to the child reader
-    private XMLFragmentStreamReader childReader;
-
-    // current property index
-    private int currentPropertyIndex;
-
-    private Map<String, String> declaredNamespaceMap = new HashMap<String, String>();
-
-    private QName elementQName;
-
-    // we always create a new namespace context
-    private DelegatingNamespaceContext namespaceContext = new DelegatingNamespaceContext(null);
-
-    private Map.Entry[] properties;
-
+public class DOMXMLStreamReader extends XMLFragmentStreamReaderImpl {
     private Element rootElement;
 
-    private String rootElementName;
-
-    private String rootElementURI;
-
-    // integer field that keeps the state of this
-    // parser.
-    private int state = START_ELEMENT_STATE;
-
     public DOMXMLStreamReader(Node node) {
+        super(null);
         switch (node.getNodeType()) {
             case Node.DOCUMENT_NODE:
-                this.rootElement = ((Document) node).getDocumentElement();
+                this.rootElement = ((Document)node).getDocumentElement();
                 break;
             case Node.ELEMENT_NODE:
-                this.rootElement = (Element) node;
+                this.rootElement = (Element)node;
                 break;
             default:
                 throw new IllegalArgumentException("Illegal Node");
         }
-        this.rootElementName = rootElement.getLocalName();
-        this.rootElementURI = rootElement.getNamespaceURI();
-
-//TODO remove permanently? 02/22/07
-//    This is causing exceptionXbindingWSTest to fail because it is binding these prefixes
-//    later in the xml document. All tests run with out this and we are not sure why 
-//      why it was required.  old woodstox bug?
-//        declaredNamespaceMap.put("xml", "http://www.w3.org/XML/1998/namespace");
-//        declaredNamespaceMap.put("xmlns", "http://www.w3.org/2000/xmlns/");
-//        declaredNamespaceMap.put("xsi", "http://www.w3.org/2001/XMLSchema-instance");
-
-        populateProperties();
-    }
-
-    /*
-     * 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!
-     */
-    protected DOMXMLStreamReader(QName elementQName, Map.Entry[] properties, Map.Entry[] attributes) {
-        // validate the lengths, since both the arrays are supposed
-        // to have
-        this.properties = properties;
-        this.elementQName = elementQName;
-        this.attributes = attributes;
-
-    }
-
-    public void close() throws XMLStreamException {
-        // do nothing here - we have no resources to free
-    }
-
-    public int getAttributeCount() {
-        return (state == DELEGATED_STATE) ? childReader.getAttributeCount()
-            : ((attributes != null) && (state == START_ELEMENT_STATE) ? attributes.length : 0);
-    }
-
-    public String getAttributeLocalName(int i) {
-        if (state == DELEGATED_STATE) {
-            return childReader.getAttributeLocalName(i);
-        } else if (state == START_ELEMENT_STATE) {
-            QName name = getAttributeName(i);
-            if (name == null) {
-                return null;
-            } else {
-                return name.getLocalPart();
-            }
-        } else {
-            throw new IllegalStateException();
-        }
-    }
-
-    /**
-     * @param i
-     * @return
-     */
-    public QName getAttributeName(int i) {
-        if (state == DELEGATED_STATE) {
-            return childReader.getAttributeName(i);
-        } else if (state == START_ELEMENT_STATE) {
-            if (attributes == null) {
-                return null;
-            } else {
-                if ((i >= (attributes.length)) || i < 0) { // out of range
-                    return null;
-                } else {
-                    // get the attribute pointer
-                    Object attribPointer = attributes[i].getKey();
-                    // case one - attrib name is null
-                    // this should be the pointer to the OMAttribute then
-                    if (attribPointer instanceof String) {
-                        return new QName((String) attribPointer);
-                    } else if (attribPointer instanceof QName) {
-                        return (QName) attribPointer;
-                    } else {
-                        return null;
-                    }
-                }
-            }
-        } else {
-            throw new IllegalStateException(); // as per the api contract
-        }
-
-    }
-
-    public String getAttributeNamespace(int i) {
-        if (state == DELEGATED_STATE) {
-            return childReader.getAttributeNamespace(i);
-        } else if (state == START_ELEMENT_STATE) {
-            QName name = getAttributeName(i);
-            if (name == null) {
-                return null;
-            } else {
-                return name.getNamespaceURI();
-            }
-        } else {
-            throw new IllegalStateException();
-        }
-    }
-
-    public String getAttributePrefix(int i) {
-        if (state == DELEGATED_STATE) {
-            return childReader.getAttributePrefix(i);
-        } else if (state == START_ELEMENT_STATE) {
-            QName name = getAttributeName(i);
-            if (name == null) {
-                return null;
-            } else {
-                return name.getPrefix();
-            }
-        } else {
-            throw new IllegalStateException();
-        }
-    }
-
-    public String getAttributeType(int i) {
-        return null; // not supported
-    }
-
-    public String getAttributeValue(int i) {
-        if (state == DELEGATED_STATE) {
-            return childReader.getAttributeValue(i);
-        } else if (state == START_ELEMENT_STATE) {
-            if (attributes == null) {
-                return null;
-            } else {
-                if ((i >= (attributes.length)) || i < 0) { // out of range
-                    return null;
-                } else {
-                    // get the attribute pointer
-                    Object attribPointer = attributes[i].getKey();
-                    Object omAttribObj = attributes[i].getValue();
-                    // case one - attrib name is null
-                    // this should be the pointer to the OMAttribute then
-                    if (attribPointer instanceof String) {
-                        return (String) omAttribObj;
-                    } else if (attribPointer instanceof QName) {
-                        return (String) omAttribObj;
-                    } else {
-                        return null;
-                    }
-                }
-            }
-        } else {
-            throw new IllegalStateException();
-        }
-
-    }
-
-    public String getAttributeValue(String nsUri, String localName) {
-
-        int attribCount = getAttributeCount();
-        String returnValue = null;
-        QName attribQualifiedName;
-        for (int i = 0; i < attribCount; i++) {
-            attribQualifiedName = getAttributeName(i);
-            if (nsUri == null) {
-                if (localName.equals(attribQualifiedName.getLocalPart())) {
-                    returnValue = getAttributeValue(i);
-                    break;
-                }
-            } else {
-                if (localName.equals(attribQualifiedName.getLocalPart()) && nsUri.equals(attribQualifiedName
-                    .getNamespaceURI())) {
-                    returnValue = getAttributeValue(i);
-                    break;
-                }
-            }
-
-        }
-
-        return returnValue;
-    }
-
-    public String getCharacterEncodingScheme() {
-        return null; // todo - should we return something for this ?
-    }
-
-    /**
-     * todo implement the right contract for this
-     *
-     * @return
-     * @throws XMLStreamException
-     */
-    public String getElementText() throws XMLStreamException {
-        if (state == DELEGATED_STATE) {
-            return childReader.getElementText();
-        } else {
-            return null;
-        }
-
-    }
-
-    public String getEncoding() {
-        if (state == DELEGATED_STATE) {
-            return childReader.getEncoding();
-        } else {
-            // we've no idea what the encoding is going to be in this case
-            // perhaps we ought to return some constant here, which the user
-            // might
-            // have access to change!
-            return null;
-        }
-    }
-
-    // /////////////////////////////////////////////////////////////////////////
-    // / attribute handling
-    // /////////////////////////////////////////////////////////////////////////
-
-    public int getEventType() {
-        if (state == START_ELEMENT_STATE) {
-            return START_ELEMENT;
-        } else if (state == END_ELEMENT_STATE) {
-            return END_ELEMENT;
-        } else { // this is the delegated state
-            return childReader.getEventType();
-        }
-
-    }
-
-    public String getLocalName() {
-        if (state == DELEGATED_STATE) {
-            return childReader.getLocalName();
-        } else if (state != TEXT_STATE) {
-            return elementQName.getLocalPart();
-        } else {
-            throw new IllegalStateException();
-        }
-    }
-
-    /**
-     * @return
-     */
-    public Location getLocation() {
-        // return a default location
-        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() {
-        if (state == DELEGATED_STATE) {
-            return childReader.getName();
-        } else if (state != TEXT_STATE) {
-            return elementQName;
-        } else {
-            throw new IllegalStateException();
-        }
-
-    }
-
-    public NamespaceContext getNamespaceContext() {
-        if (state == DELEGATED_STATE) {
-            return childReader.getNamespaceContext();
-        } else {
-            return namespaceContext;
-        }
-
-    }
-
-    public int getNamespaceCount() {
-        if (state == DELEGATED_STATE) {
-            return childReader.getNamespaceCount();
-        } else {
-            return declaredNamespaceMap.size();
-        }
-    }
-
-    /**
-     * @param i
-     * @return
-     */
-    public String getNamespacePrefix(int i) {
-        if (state == DELEGATED_STATE) {
-            return childReader.getNamespacePrefix(i);
-        } else if (state != TEXT_STATE) {
-            // order the prefixes
-            String[] prefixes = makePrefixArray();
-            if ((i >= prefixes.length) || (i < 0)) {
-                return null;
-            } else {
-                return prefixes[i];
-            }
-
-        } else {
-            throw new IllegalStateException();
-        }
-
-    }
-
-    public String getNamespaceURI() {
-        if (state == DELEGATED_STATE) {
-            return childReader.getNamespaceURI();
-        } else if (state == TEXT_STATE) {
-            return null;
-        } else {
-            return elementQName.getNamespaceURI();
-        }
-    }
-
-    public String getNamespaceURI(int i) {
-        if (state == DELEGATED_STATE) {
-            return childReader.getNamespaceURI(i);
-        } else if (state != TEXT_STATE) {
-            String namespacePrefix = getNamespacePrefix(i);
-            return namespacePrefix == null ? null : (String) declaredNamespaceMap.get(namespacePrefix);
-        } else {
-            throw new IllegalStateException();
-        }
-
-    }
-
-    // /////////////////////////////////////////////////////////////////////////
-    // //////////// end of attribute handling
-    // /////////////////////////////////////////////////////////////////////////
-
-    // //////////////////////////////////////////////////////////////////////////
-    // //////////// namespace handling
-    // //////////////////////////////////////////////////////////////////////////
-
-    public String getNamespaceURI(String prefix) {
-        return namespaceContext.getNamespaceURI(prefix);
-    }
-
-    public String getPIData() {
-        throw new UnsupportedOperationException("Yet to be implemented !!");
-    }
-
-    public String getPITarget() {
-        throw new UnsupportedOperationException("Yet to be implemented !!");
-    }
-
-    public String getPrefix() {
-        if (state == DELEGATED_STATE) {
-            return childReader.getPrefix();
-        } else if (state == TEXT_STATE) {
-            return null;
-        } else {
-            return elementQName.getPrefix();
-        }
-    }
-
-    /**
-     * @param key
-     * @return
-     * @throws IllegalArgumentException
-     */
-    public Object getProperty(String key) throws IllegalArgumentException {
-        if (state == START_ELEMENT_STATE || state == END_ELEMENT_STATE) {
-            return null;
-        } else if (state == TEXT_STATE) {
-            return null;
-        } else if (state == DELEGATED_STATE) {
-            return childReader.getProperty(key);
-        } else {
-            return null;
-        }
-
-    }
-
-    // /////////////////////////////////////////////////////////////////////////
-    // /////// end of namespace handling
-    // /////////////////////////////////////////////////////////////////////////
-
-    public String getText() {
-        if (state == DELEGATED_STATE) {
-            return childReader.getText();
-        } else if (state == TEXT_STATE) {
-            return (String) properties[currentPropertyIndex - 1].getValue();
-        } else {
-            throw new IllegalStateException();
-        }
-    }
-
-    public char[] getTextCharacters() {
-        if (state == DELEGATED_STATE) {
-            return childReader.getTextCharacters();
-        } else if (state == TEXT_STATE) {
-            return getTextData();
-        } else {
-            throw new IllegalStateException();
-        }
-    }
-
-    private char[] getTextData() {
-        return properties[currentPropertyIndex - 1].getValue() == null ? new char[0]
-            : ((String) properties[currentPropertyIndex - 1].getValue()).toCharArray();
-    }
-
-    public int getTextCharacters(int i, char[] chars, int i1, int i2) throws XMLStreamException {
-        if (state == DELEGATED_STATE) {
-            return childReader.getTextCharacters(i, chars, i1, i2);
-        } else if (state == TEXT_STATE) {
-            // todo - implement this
-            return 0;
-        } else {
-            throw new IllegalStateException();
-        }
-    }
-
-    public int getTextLength() {
-        if (state == DELEGATED_STATE) {
-            return childReader.getTextLength();
-        } else if (state == TEXT_STATE) {
-            return getTextData().length;
-        } else {
-            throw new IllegalStateException();
-        }
-    }
-
-    public int getTextStart() {
-        if (state == DELEGATED_STATE) {
-            return childReader.getTextStart();
-        } else if (state == TEXT_STATE) {
-            return 0; // assume text always starts at 0
-        } else {
-            throw new IllegalStateException();
-        }
-    }
-
-    public String getVersion() {
-        return null;
-    }
-
-    public boolean hasName() {
-        // since this parser always has a name, the hasname
-        // has to return true if we are still navigating this element
-        // if not we should ask the child reader for it.
-        if (state == DELEGATED_STATE) {
-            return childReader.hasName();
-        } else {
-            return state != TEXT_STATE;
-        }
-    }
-
-    /**
-     * @return
-     * @throws XMLStreamException
-     */
-    public boolean hasNext() throws XMLStreamException {
-        if (state == DELEGATED_STATE) {
-            if (childReader.isEndOfFragment()) {
-                // the child reader is done. We shouldn't be getting the
-                // hasnext result from the child pullparser then
-                return true;
-            } else {
-                return childReader.hasNext();
-            }
-        } else {
-            return state == START_ELEMENT_STATE || state == TEXT_STATE;
-
-        }
-    }
-
-    /**
-     * check the validity of this implementation
-     *
-     * @return
-     */
-    public boolean hasText() {
-        if (state == DELEGATED_STATE) {
-            return childReader.hasText();
-        } else {
-            return state == TEXT_STATE;
-        }
-    }
-
-    /**
-     * 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();
-    }
-
-    public boolean isAttributeSpecified(int i) {
-        return false; // not supported
-    }
-
-    public boolean isCharacters() {
-        if (state == START_ELEMENT_STATE || state == END_ELEMENT_STATE) {
-            return false;
-        }
-        return childReader.isCharacters();
-    }
-
-    public boolean isEndElement() {
-        if (state == START_ELEMENT_STATE) {
-            return false;
-        } else if (state == END_ELEMENT_STATE) {
-            return true;
-        }
-        return childReader.isEndElement();
-    }
-
-    /**
-     * are we done ?
-     *
-     * @return
-     */
-    public boolean isEndOfFragment() {
-        return state == END_ELEMENT_STATE;
-    }
-
-    public boolean isStandalone() {
-        return true;
-    }
-
-    public boolean isStartElement() {
-        if (state == START_ELEMENT_STATE) {
-            return true;
-        } else if (state == END_ELEMENT_STATE) {
-            return false;
-        }
-        return childReader.isStartElement();
-    }
-
-    public boolean isWhiteSpace() {
-        if (state == START_ELEMENT_STATE || state == END_ELEMENT_STATE) {
-            return false;
-        }
-        return childReader.isWhiteSpace();
-    }
-
-    /**
-     * Get the prefix list from the hastable and take that into an array
-     *
-     * @return
-     */
-    private String[] makePrefixArray() {
-        String[] prefixes =
-            (String[]) declaredNamespaceMap.keySet().toArray(new String[declaredNamespaceMap.size()]);
-        Arrays.sort(prefixes);
-        return prefixes;
-    }
-
-    public int next() throws XMLStreamException {
-        return updateStatus();
-    }
-
-    /**
-     * todo implement this
-     *
-     * @return
-     * @throws XMLStreamException
-     */
-    public int nextTag() throws XMLStreamException {
-        return 0;
-    }
-
-    // /////////////////////////////////////////////////////////////////////////
-    // / Other utility methods
-    // ////////////////////////////////////////////////////////////////////////
-
-    /**
-     * Populates a namespace context
-     */
-    private void populateNamespaceContext() {
-
-        // first add the current element namespace to the namespace context
-        // declare it if not found
-        registerNamespace(elementQName.getPrefix(), elementQName.getNamespaceURI());
-
-        // traverse through the attributes and populate the namespace context
-        // the attrib list can be of many combinations
-        // the valid combinations are
-        // String - String
-        // QName - QName
-        // null - OMAttribute
-
-        if (attributes != null) {
-            for (int i = 0; i < attributes.length; i++) { // jump in two
-                Object attribName = attributes[i].getKey();
-                if (attribName instanceof String) {
-                    // ignore this case - Nothing to do
-                } else if (attribName instanceof QName) {
-                    QName attribQName = (QName) attribName;
-                    registerNamespace(attribQName.getPrefix(), attribQName.getNamespaceURI());
-
-                }
-            }
-        }
-
-    }
-
-    public final void populateProperties() {
-        if (properties != null) {
-            return;
-        }
-        if (elementQName == null) {
-            elementQName = namespaceContext.createQName(this.rootElementURI, this.rootElementName);
-        } else {
-            elementQName =
-                namespaceContext.createQName(elementQName.getNamespaceURI(), elementQName.getLocalPart());
-        }
-
-        List<Object> elementList = new ArrayList<Object>();
-        List<Object> attributeList = new ArrayList<Object>();
+        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);
-            if (XMLConstants.XMLNS_ATTRIBUTE_NS_URI.equals(attr.getNamespaceURI())) {
-                // Skip xmlns:xxx
-                if (!attr.getName().equals(attr.getLocalName())) {
-                    // Skip xmlns="..."
-                    registerNamespace(attr.getLocalName(), attr.getValue());
-                } else {
-                    registerNamespace(XMLConstants.DEFAULT_NS_PREFIX, attr.getValue());
+            Attr attr = (Attr)nodeMap.item(i);
+            String ns = attr.getNamespaceURI();
+            if (XMLNS_ATTRIBUTE_NS_URI.equals(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;
                 }
-                continue;
             }
-            String prefix = attr.getPrefix();
-            QName attrName = new QName(attr.getNamespaceURI(), attr.getLocalName(), prefix != null ? prefix : "");
-            NameValuePair pair = new NameValuePair(attrName, attr.getValue());
-            attributeList.add(pair);
+            elements = new NamedProperty[elementList.size()];
+            elementList.toArray(elements);
         }
-        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:
-                    NameValuePair pair = new NameValuePair(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 NameValuePair(elementName, new DOMXMLStreamReader(element));
-                    elementList.add(pair);
-                    break;
-            }
-        }
-        properties = elementList.toArray(new Map.Entry[elementList.size()]);
-        attributes = attributeList.toArray(new Map.Entry[attributeList.size()]);
+        return elements;
     }
-
-    /**
-     * A convenient method to reuse the properties
-     *
-     * @return event to be thrown
-     * @throws XMLStreamException
-     */
-    private int processProperties() throws XMLStreamException {
-        // move to the next property depending on the current property
-        // index
-        Object propPointer = properties[currentPropertyIndex].getKey();
-        QName propertyQName = null;
-        boolean textFound = false;
-        if (propPointer == null) {
-            throw new XMLStreamException("property key cannot be null!");
-        } else if (propPointer instanceof String) {
-            // propPointer being a String has a special case
-            // that is it can be a the special constant ELEMENT_TEXT that
-            // says this text event
-            if (ELEMENT_TEXT.equals(propPointer)) {
-                textFound = true;
-            } else {
-                propertyQName = new QName((String) propPointer);
-            }
-        } else if (propPointer instanceof QName) {
-            propertyQName = (QName) propPointer;
-        } else {
-            // oops - we've no idea what kind of key this is
-            throw new XMLStreamException("unidentified property key!!!" + propPointer);
-        }
-
-        // ok! we got the key. Now look at the value
-        Object propertyValue = properties[currentPropertyIndex].getValue();
-        // cater for the special case now
-        if (textFound) {
-            // no delegation here - make the parser null and immediately
-            // return with the event characters
-            childReader = null;
-            state = TEXT_STATE;
-            currentPropertyIndex++;
-            return CHARACTERS;
-        } else if (propertyValue == null || propertyValue instanceof String) {
-            // strings are handled by the NameValuePairStreamReader
-            childReader = new SimpleElementStreamReader(propertyQName, (String) propertyValue);
-            childReader.setParentNamespaceContext(this.namespaceContext);
-            childReader.init();
-        } else if (propertyValue instanceof DOMXMLStreamReader) {
-            // ADBbean has it's own method to get a reader
-            XMLFragmentStreamReader reader = (DOMXMLStreamReader) propertyValue;
-            // we know for sure that this is an ADB XMLStreamreader.
-            // However we need to make sure that it is compatible
-            childReader = reader;
-            childReader.setParentNamespaceContext(this.namespaceContext);
-            childReader.init();
-        } else {
-            // all special possiblilities has been tried! Let's treat
-            // the thing as a bean and try generating events from it
-            throw new UnsupportedOperationException("Not supported");
-            // childReader = new
-            // WrappingXMLStreamReader(BeanUtil.getPullParser(propertyValue,
-            // propertyQName));
-            // we cannot register the namespace context here
-        }
-
-        // set the state here
-        state = DELEGATED_STATE;
-        // we are done with the delegation
-        // increment the property index
-        currentPropertyIndex++;
-        return childReader.getEventType();
-    }
-
-    /**
-     * @param prefix
-     * @param uri
-     */
-    private void registerNamespace(String prefix, String uri) {
-        if (!uri.equals(namespaceContext.getNamespaceURI(prefix))) {
-            namespaceContext.registerMapping(prefix, uri);
-            declaredNamespaceMap.put(prefix, uri);
-        }
-    }
-
-    public void require(int i, String string, String string1) throws XMLStreamException {
-        throw new UnsupportedOperationException();
-    }
-
-    /**
-     * add the namespace context
-     */
-
-    public void setParentNamespaceContext(NamespaceContext nsContext) {
-        // register the namespace context passed in to this
-        this.namespaceContext.setParent(nsContext);
-
-    }
-
-    public boolean standaloneSet() {
-        return true;
-    }
-
-    /**
-     * By far this should be the most important method in this class this method changes the state of the parser
-     * according to the change in the
-     */
-    private int updateStatus() throws XMLStreamException {
-        int returnEvent = -1; // invalid state is the default state
-        switch (state) {
-            case START_ELEMENT_STATE:
-                // current element is start element. We should be looking at the
-                // property list and making a pullparser for the property value
-                if (properties == null || properties.length == 0) {
-                    // no properties - move to the end element state
-                    // straightaway
-                    state = END_ELEMENT_STATE;
-                    returnEvent = END_ELEMENT;
-                } else {
-                    // there are properties. now we should delegate this task to
-                    // a
-                    // child reader depending on the property type
-                    returnEvent = processProperties();
-
-                }
-                break;
-            case END_ELEMENT_STATE:
-                // we've reached the end element already. If the user tries to
-                // push
-                // further ahead then it is an exception
-                throw new XMLStreamException("Trying to go beyond the end of the pullparser");
-
-            case DELEGATED_STATE:
-                if (childReader.isEndOfFragment()) {
-                    // we've reached the end!
-                    if (currentPropertyIndex > (properties.length - 1)) {
-                        state = END_ELEMENT_STATE;
-                        returnEvent = END_ELEMENT;
-                    } else {
-                        returnEvent = processProperties();
-                    }
-                } else {
-                    returnEvent = childReader.next();
-                }
-                break;
-
-            case TEXT_STATE:
-                // if there are any more event we should be delegating to
-                // processProperties. if not we just return an end element
-                if (currentPropertyIndex > (properties.length - 1)) {
-                    state = END_ELEMENT_STATE;
-                    returnEvent = END_ELEMENT;
-                } else {
-                    returnEvent = processProperties();
-                }
-                break;
-        }
-        return returnEvent;
-    }
-
 }

Added: incubator/tuscany/branches/sca-java-integration/sca/kernel/core/src/main/java/org/apache/tuscany/core/databinding/xml/DelegatingNamespaceContext.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/branches/sca-java-integration/sca/kernel/core/src/main/java/org/apache/tuscany/core/databinding/xml/DelegatingNamespaceContext.java?view=auto&rev=513629
==============================================================================
--- incubator/tuscany/branches/sca-java-integration/sca/kernel/core/src/main/java/org/apache/tuscany/core/databinding/xml/DelegatingNamespaceContext.java (added)
+++ incubator/tuscany/branches/sca-java-integration/sca/kernel/core/src/main/java/org/apache/tuscany/core/databinding/xml/DelegatingNamespaceContext.java Thu Mar  1 22:32:26 2007
@@ -0,0 +1,329 @@
+/*
+ * 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.core.databinding.xml;
+
+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
+        if (prefixStack.contains(prefix)) {
+            int index = prefixStack.indexOf(prefix);
+            return (String)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.indexOf(uri);
+        if (index != -1) {
+            return (String)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 = (String[])uriStack.toArray(new String[uriStack.size()]);
+        List<String> tempList = new ArrayList<String>();
+        for (int i = 0; i < uris.length; 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 one-based position of the distance from the top that the
+         * specified object exists on this stack, where the top-most element is
+         * considered to be at distance <code>1</code>. If the object is not
+         * present on the stack, return <code>-1</code> instead. The
+         * <code>equals()</code> method is used to compare to the items in
+         * this stack.
+         * 
+         * @param object the object to be searched for
+         * @return the 1-based depth into the stack of the object, or -1 if not
+         *         found
+         */
+        public int search(T object) {
+            int i = size() - 1; // Current index
+            int n = 1; // Current distance
+            while (i >= 0) {
+                T current = get(i);
+                if ((object == null && current == null) || (object != null && object.equals(current))) {
+                    return n;
+                }
+                i--;
+                n++;
+            }
+            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: incubator/tuscany/branches/sca-java-integration/sca/kernel/core/src/main/java/org/apache/tuscany/core/databinding/xml/DelegatingNamespaceContext.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/tuscany/branches/sca-java-integration/sca/kernel/core/src/main/java/org/apache/tuscany/core/databinding/xml/DelegatingNamespaceContext.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date



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