Author: scheu
Date: Fri Aug 10 12:45:28 2007
New Revision: 564731

URL: http://svn.apache.org/viewvc?view=rev&rev=564731
Log:
WSCOMMONS-222
Contributor:Rich Scheuerle
Serialize methods fail to close locally created XMLStreamWriters.

Modified:
    
webservices/commons/trunk/modules/axiom/modules/axiom-dom/src/main/java/org/apache/axiom/om/impl/dom/NodeImpl.java
    
webservices/commons/trunk/modules/axiom/modules/axiom-impl/src/main/java/org/apache/axiom/om/impl/llom/OMElementImpl.java
    
webservices/commons/trunk/modules/axiom/modules/axiom-impl/src/main/java/org/apache/axiom/om/impl/llom/OMNodeImpl.java
    
webservices/commons/trunk/modules/axiom/modules/axiom-impl/src/main/java/org/apache/axiom/om/impl/llom/OMSourcedElementImpl.java

Modified: 
webservices/commons/trunk/modules/axiom/modules/axiom-dom/src/main/java/org/apache/axiom/om/impl/dom/NodeImpl.java
URL: 
http://svn.apache.org/viewvc/webservices/commons/trunk/modules/axiom/modules/axiom-dom/src/main/java/org/apache/axiom/om/impl/dom/NodeImpl.java?view=diff&rev=564731&r1=564730&r2=564731
==============================================================================
--- 
webservices/commons/trunk/modules/axiom/modules/axiom-dom/src/main/java/org/apache/axiom/om/impl/dom/NodeImpl.java
 (original)
+++ 
webservices/commons/trunk/modules/axiom/modules/axiom-dom/src/main/java/org/apache/axiom/om/impl/dom/NodeImpl.java
 Fri Aug 10 12:45:28 2007
@@ -1,786 +1,828 @@
-/*
- * 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.axiom.om.impl.dom;
-
-import org.apache.axiom.om.OMContainer;
-import org.apache.axiom.om.OMException;
-import org.apache.axiom.om.OMFactory;
-import org.apache.axiom.om.OMNode;
-import org.apache.axiom.om.OMOutputFormat;
-import org.apache.axiom.om.OMXMLParserWrapper;
-import org.apache.axiom.om.impl.MTOMXMLStreamWriter;
-import org.apache.axiom.om.impl.OMNodeEx;
-import org.apache.axiom.om.util.StAXUtils;
-import org.w3c.dom.DOMException;
-import org.w3c.dom.Document;
-import org.w3c.dom.NamedNodeMap;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-import org.w3c.dom.UserDataHandler;
-
-import javax.xml.stream.XMLStreamException;
-import javax.xml.stream.XMLStreamWriter;
-import java.io.OutputStream;
-import java.io.Writer;
-import java.util.Hashtable;
-import java.util.Map;
-
-public abstract class NodeImpl implements Node, NodeList, OMNodeEx, Cloneable {
-
-    /** Holds the user data objects */
-    private Map userData = new Hashtable();
-
-    /** Field builder */
-    public OMXMLParserWrapper builder;
-
-    /** Field done */
-    protected boolean done = false;
-
-    protected DocumentImpl ownerNode;
-
-    /** Factory that created this node */
-    protected OMFactory factory;
-
-    // data
-
-    protected short flags;
-
-    protected final static short OWNED = 0x1 << 1;
-
-    protected final static short FIRSTCHILD = 0x1 << 2;
-
-    protected final static short READONLY = 0x1 << 3;
-
-    protected final static short SPECIFIED = 0x1 << 4;
-
-    protected final static short NORMALIZED = 0x1 << 5;
-
-    //
-    // Constructors
-    //
-
-    protected NodeImpl(DocumentImpl ownerDocument, OMFactory factory) {
-        this(factory);
-        this.ownerNode = ownerDocument;
-        // this.isOwned(true);
-
-    }
-
-    protected NodeImpl(OMFactory factory) {
-        this.factory = factory;
-    }
-
-    public void normalize() {
-        //Parent node should override this 
-    }
-
-    public boolean hasAttributes() {
-        return false; // overridden in ElementImpl
-    }
-
-    public boolean hasChildNodes() {
-        return false; // Override in ParentNode
-    }
-
-    public String getLocalName() {
-        return null; // Override in AttrImpl and ElementImpl
-    }
-
-    public String getNamespaceURI() {
-        return null; // Override in AttrImpl and ElementImpl
-    }
-
-    public String getNodeValue() throws DOMException {
-        return null;
-    }
-
-    /*
-     * Overidden in ElementImpl and AttrImpl.
-     */
-    public String getPrefix() {
-        return null;
-    }
-
-    public void setNodeValue(String arg0) throws DOMException {
-        // Don't do anything, to be overridden in SOME Child classes
-    }
-
-    public void setPrefix(String prefix) throws DOMException {
-        throw new DOMException(DOMException.NAMESPACE_ERR, DOMMessageFormatter
-                .formatMessage(DOMMessageFormatter.DOM_DOMAIN, "NAMESPACE_ERR",
-                               null));
-    }
-
-    /**
-     * Finds the document that this Node belongs to (the document in whose 
context the Node was
-     * created). The Node may or may not
-     */
-    public Document getOwnerDocument() {
-        return this.ownerNode;
-    }
-
-    /**
-     * Returns the collection of attributes associated with this node, or null 
if none. At this
-     * writing, Element is the only type of node which will ever have 
attributes.
-     *
-     * @see ElementImpl
-     */
-    public NamedNodeMap getAttributes() {
-        return null; // overridden in ElementImpl
-    }
-
-    /**
-     * Gets the first child of this Node, or null if none.
-     * <p/>
-     * By default we do not have any children, ParentNode overrides this.
-     *
-     * @see ParentNode
-     */
-    public Node getFirstChild() {
-        return null;
-    }
-
-    /**
-     * Gets the last child of this Node, or null if none.
-     * <p/>
-     * By default we do not have any children, ParentNode overrides this.
-     *
-     * @see ParentNode
-     */
-    public Node getLastChild() {
-        return null;
-    }
-
-    /** Returns the next child of this node's parent, or null if none. */
-    public Node getNextSibling() {
-        return null; // default behavior, overriden in ChildNode
-    }
-
-    public Node getParentNode() {
-        return null; // overriden by ChildNode
-        // Document, DocumentFragment, and Attribute will never have parents.
-    }
-
-    /*
-     * Same as getParentNode but returns internal type NodeImpl.
-     */
-    NodeImpl parentNode() {
-        return null;
-    }
-
-    /** Returns the previous child of this node's parent, or null if none. */
-    public Node getPreviousSibling() {
-        return null; // default behavior, overriden in ChildNode
-    }
-
-    // public Node cloneNode(boolean deep) {
-    // if(this instanceof OMElement) {
-    // return (Node)((OMElement)this).cloneOMElement();
-    // } else if(this instanceof OMText ){
-    // return ((TextImpl)this).cloneText();
-    // } else {
-    // throw new UnsupportedOperationException("Only elements can be cloned
-    // right now");
-    // }
-    // }
-    //    
-    public Node cloneNode(boolean deep) {
-        NodeImpl newnode;
-        try {
-            newnode = (NodeImpl) clone();
-        } catch (CloneNotSupportedException e) {
-            throw new RuntimeException("**Internal Error**" + e);
-        }
-        newnode.ownerNode = this.ownerNode;
-        newnode.isOwned(false);
-
-        newnode.isReadonly(false);
-
-        return newnode;
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.w3c.dom.Node#getChildNodes()
-     */
-    public NodeList getChildNodes() {
-        return this;
-    }
-
-    public boolean isSupported(String feature, String version) {
-        throw new UnsupportedOperationException();
-        // TODO
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.w3c.dom.Node#appendChild(org.w3c.dom.Node)
-     */
-    public Node appendChild(Node newChild) throws DOMException {
-        return insertBefore(newChild, null);
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.w3c.dom.Node#removeChild(org.w3c.dom.Node)
-     */
-    public Node removeChild(Node oldChild) throws DOMException {
-        throw new DOMException(DOMException.NOT_FOUND_ERR, DOMMessageFormatter
-                .formatMessage(DOMMessageFormatter.DOM_DOMAIN, "NOT_FOUND_ERR",
-                               null));
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.w3c.dom.Node#insertBefore(org.w3c.dom.Node, org.w3c.dom.Node)
-     */
-    public Node insertBefore(Node newChild, Node refChild) throws DOMException 
{
-        // Overridden in ParentNode
-        throw new DOMException(DOMException.HIERARCHY_REQUEST_ERR,
-                               DOMMessageFormatter.formatMessage(
-                                       DOMMessageFormatter.DOM_DOMAIN,
-                                       "HIERARCHY_REQUEST_ERR", null));
-
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.w3c.dom.Node#replaceChild(org.w3c.dom.Node, org.w3c.dom.Node)
-     */
-    public Node replaceChild(Node newChild, Node oldChild) throws DOMException 
{
-        throw new DOMException(DOMException.HIERARCHY_REQUEST_ERR,
-                               DOMMessageFormatter.formatMessage(
-                                       DOMMessageFormatter.DOM_DOMAIN,
-                                       "HIERARCHY_REQUEST_ERR", null));
-    }
-
-    //
-    // NodeList methods
-    //
-
-    /**
-     * NodeList method: Returns the number of immediate children of this node.
-     * <p/>
-     * By default we do not have any children, ParentNode overrides this.
-     *
-     * @return Returns int.
-     * @see ParentNode
-     */
-    public int getLength() {
-        return 0;
-    }
-
-    /**
-     * NodeList method: Returns the Nth immediate child of this node, or null 
if the index is out of
-     * bounds.
-     * <p/>
-     * By default we do not have any children, ParentNode overrides this.
-     *
-     * @param index
-     * @return Returns org.w3c.dom.Node
-     * @see ParentNode
-     */
-    public Node item(int index) {
-        return null;
-    }
-
-    /*
-     * Flags setters and getters
-     */
-
-    final boolean isOwned() {
-        return (flags & OWNED) != 0;
-    }
-
-    final void isOwned(boolean value) {
-        flags = (short) (value ? flags | OWNED : flags & ~OWNED);
-    }
-
-    final boolean isFirstChild() {
-        return (flags & FIRSTCHILD) != 0;
-    }
-
-    final void isFirstChild(boolean value) {
-        flags = (short) (value ? flags | FIRSTCHILD : flags & ~FIRSTCHILD);
-    }
-
-    final boolean isReadonly() {
-        return (flags & READONLY) != 0;
-    }
-
-    final void isReadonly(boolean value) {
-        flags = (short) (value ? flags | READONLY : flags & ~READONLY);
-    }
-
-    final boolean isSpecified() {
-        return (flags & SPECIFIED) != 0;
-    }
-
-    final void isSpecified(boolean value) {
-        flags = (short) (value ? flags | SPECIFIED : flags & ~SPECIFIED);
-    }
-
-    final boolean isNormalized() {
-        return (flags & NORMALIZED) != 0;
-    }
-
-    final void isNormalized(boolean value) {
-        // See if flag should propagate to parent.
-        if (!value && isNormalized() && ownerNode != null) {
-            ownerNode.isNormalized(false);
-        }
-        flags = (short) (value ? flags | NORMALIZED : flags & ~NORMALIZED);
-    }
-
-    // /
-    // /OM Methods
-    // /
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.apache.axis2.om.OMNode#getParent()
-     */
-    public OMContainer getParent() throws OMException {
-        return null; // overriden by ChildNode
-        // Document, DocumentFragment, and Attribute will never have parents.
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.apache.axis2.om.OMNode#isComplete()
-     */
-    public boolean isComplete() {
-        return this.done;
-    }
-
-    public void setComplete(boolean state) {
-        this.done = state;
-
-    }
-
-    /** There no concept of caching in this OM-DOM implementation. */
-    public void internalSerializeWithCache(XMLStreamWriter writer)
-            throws XMLStreamException {
-        this.internalSerialize(writer);
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.apache.axis2.om.OMNode#insertSiblingAfter
-     * (org.apache.axis2.om.OMNode)
-     */
-    public void insertSiblingAfter(OMNode sibling) throws OMException {
-        // Overridden in ChildNode
-        throw new DOMException(DOMException.HIERARCHY_REQUEST_ERR,
-                               DOMMessageFormatter.formatMessage(
-                                       DOMMessageFormatter.DOM_DOMAIN,
-                                       "HIERARCHY_REQUEST_ERR", null));
-
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.apache.axis2.om.OMNode#insertSiblingBefore
-     * (org.apache.axis2.om.OMNode)
-     */
-    public void insertSiblingBefore(OMNode sibling) throws OMException {
-        // Overridden in ChildNode
-        throw new DOMException(DOMException.HIERARCHY_REQUEST_ERR,
-                               DOMMessageFormatter.formatMessage(
-                                       DOMMessageFormatter.DOM_DOMAIN,
-                                       "HIERARCHY_REQUEST_ERR", null));
-
-    }
-
-    /** Default behavior returns null, overriden in ChildNode. */
-    public OMNode getPreviousOMSibling() {
-        return null;
-    }
-
-    /** Default behavior returns null, overriden in ChildNode. */
-    public OMNode getNextOMSibling() {
-        return null;
-    }
-
-    public void setPreviousOMSibling(OMNode previousSibling) {
-        throw new DOMException(DOMException.HIERARCHY_REQUEST_ERR,
-                               DOMMessageFormatter.formatMessage(
-                                       DOMMessageFormatter.DOM_DOMAIN,
-                                       "HIERARCHY_REQUEST_ERR", null));
-    }
-
-    public void setNextOMSibling(OMNode previousSibling) {
-        throw new DOMException(DOMException.HIERARCHY_REQUEST_ERR,
-                               DOMMessageFormatter.formatMessage(
-                                       DOMMessageFormatter.DOM_DOMAIN,
-                                       "HIERARCHY_REQUEST_ERR", null));
-    }
-
-    /** Builds next element. */
-    public void build() {
-        while (!done)
-            this.builder.next();
-    }
-
-    /**
-     * Parses this node and builds the object structure in memory. AXIOM 
supports two levels of
-     * deffered building. First is deffered building of AXIOM using StAX. 
Second level is the deffered
-     * building of attachments. AXIOM reads in the attachements from the 
stream only when user asks by
-     * calling getDataHandler(). build() method builds the OM without the 
attachments. buildAll()
-     * builds the OM together with attachement data. This becomes handy when 
user wants to free the
-     * input stream.
-     */
-    public void buildWithAttachments() {
-        if (!this.done) {
-            this.build();
-        }
-    }
-
-    /**
-     * Sets the owner document.
-     *
-     * @param document
-     */
-    protected void setOwnerDocument(DocumentImpl document) {
-        this.ownerNode = document;
-        this.isOwned(true);
-    }
-
-    public void serialize(XMLStreamWriter xmlWriter) throws XMLStreamException 
{
-        MTOMXMLStreamWriter writer = new MTOMXMLStreamWriter(xmlWriter);
-        internalSerialize(writer);
-        writer.flush();
-    }
-
-    public void serializeAndConsume(XMLStreamWriter xmlWriter)
-            throws XMLStreamException {
-        MTOMXMLStreamWriter writer = new MTOMXMLStreamWriter(xmlWriter);
-        internalSerializeAndConsume(writer);
-        writer.flush();
-    }
-
-    public OMNode detach() {
-        throw new OMException(
-                "Elements that doesn't have a parent can not be detached");
-    }
-
-    /*
-     * DOM-Level 3 methods
-     */
-
-    public String getBaseURI() {
-        // TODO TODO
-        throw new UnsupportedOperationException("TODO");
-    }
-
-    public short compareDocumentPosition(Node arg0) throws DOMException {
-        // TODO TODO
-        throw new UnsupportedOperationException("TODO");
-    }
-
-    public String getTextContent() throws DOMException {
-        // TODO TODO
-        throw new UnsupportedOperationException("TODO");
-    }
-
-    public void setTextContent(String arg0) throws DOMException {
-        // TODO TODO
-        throw new UnsupportedOperationException("TODO");
-    }
-
-    public boolean isSameNode(Node node) {
-        // TODO : check
-        if (this == node) {
-            return true;
-        } else {
-            return false;
-        }
-    }
-
-    public String lookupPrefix(String arg0) {
-        // TODO TODO
-        throw new UnsupportedOperationException("TODO");
-    }
-
-    public boolean isDefaultNamespace(String arg0) {
-        // TODO TODO
-        throw new UnsupportedOperationException("TODO");
-    }
-
-    public String lookupNamespaceURI(String arg0) {
-        // TODO TODO
-        throw new UnsupportedOperationException("TODO");
-    }
-
-    /**
-     * Tests whether two nodes are equal. <br>This method tests for equality 
of nodes, not sameness
-     * (i.e., whether the two nodes are references to the same object) which 
can be tested with
-     * <code>Node.isSameNode()</code>. All nodes that are the same will also 
be equal, though the
-     * reverse may not be true. <br>Two nodes are equal if and only if the 
following conditions are
-     * satisfied: <ul> <li>The two nodes are of the same type. </li> <li>The 
following string
-     * attributes are equal: <code>nodeName</code>, <code>localName</code>,
-     * <code>namespaceURI</code>, <code>prefix</code>, <code>nodeValue</code> 
. This is: they are
-     * both <code>null</code>, or they have the same length and are character 
for character
-     * identical. </li> <li>The <code>attributes</code> 
<code>NamedNodeMaps</code> are equal. This
-     * is: they are both <code>null</code>, or they have the same length and 
for each node that
-     * exists in one map there is a node that exists in the other map and is 
equal, although not
-     * necessarily at the same index. </li> <li>The <code>childNodes</code> 
<code>NodeLists</code>
-     * are equal. This is: they are both <code>null</code>, or they have the 
same length and contain
-     * equal nodes at the same index. Note that normalization can affect 
equality; to avoid this,
-     * nodes should be normalized before being compared. </li> </ul> <br>For 
two
-     * <code>DocumentType</code> nodes to be equal, the following conditions 
must also be satisfied:
-     * <ul> <li>The following string attributes are equal: 
<code>publicId</code>,
-     * <code>systemId</code>, <code>internalSubset</code>. </li> <li>The 
<code>entities</code>
-     * <code>NamedNodeMaps</code> are equal. </li> <li>The 
<code>notations</code>
-     * <code>NamedNodeMaps</code> are equal. </li> </ul> <br>On the other 
hand, the following do not
-     * affect equality: the <code>ownerDocument</code>, <code>baseURI</code>, 
and
-     * <code>parentNode</code> attributes, the <code>specified</code> 
attribute for
-     * <code>Attr</code> nodes, the <code>schemaTypeInfo</code> attribute for 
<code>Attr</code> and
-     * <code>Element</code> nodes, the 
<code>Text.isElementContentWhitespace</code> attribute for
-     * <code>Text</code> nodes, as well as any user data or event listeners 
registered on the nodes.
-     * <p ><b>Note:</b>  As a general rule, anything not mentioned in the 
description above is not
-     * significant in consideration of equality checking. Note that future 
versions of this
-     * specification may take into account more attributes and implementations 
conform to this
-     * specification are expected to be updated accordingly.
-     *
-     * @param arg The node to compare equality with.
-     * @return Returns <code>true</code> if the nodes are equal, 
<code>false</code> otherwise.
-     * @since DOM Level 3
-     */
-
-    //TODO : sumedha, complete
-    public boolean isEqualNode(Node node) {
-        final boolean equal = true;
-        final boolean notEqual = false;
-        if (this.getNodeType() != node.getNodeType()) {
-            return notEqual;
-        }
-        if (checkStringAttributeEquality(node)) {
-            if (checkNamedNodeMapEquality(node)) {
-
-            } else {
-                return notEqual;
-            }
-        } else {
-            return notEqual;
-        }
-        return equal;
-    }
-
-    private boolean checkStringAttributeEquality(Node node) {
-        final boolean equal = true;
-        final boolean notEqual = false;
-
-        // null     not-null  -> true
-        // not-null null      -> true
-        // null     null      -> false
-        // not-null not-null  -> false
-
-        //NodeName
-        if (node.getNodeName() == null ^ this.getNodeName() == null) {
-            return notEqual;
-        } else {
-            if (node.getNodeName() == null) {
-                //This means both are null.do nothing
-            } else {
-                if (!(node.getNodeName().equals(this.getNodeName()))) {
-                    return notEqual;
-                }
-            }
-        }
-
-        //localName
-        if (node.getLocalName() == null ^ this.getLocalName() == null) {
-            return notEqual;
-        } else {
-            if (node.getLocalName() == null) {
-                //This means both are null.do nothing
-            } else {
-                if (!(node.getLocalName().equals(this.getLocalName()))) {
-                    return notEqual;
-                }
-            }
-        }
-
-        //namespaceURI
-        if (node.getNamespaceURI() == null ^ this.getNamespaceURI() == null) {
-            return notEqual;
-        } else {
-            if (node.getNamespaceURI() == null) {
-                //This means both are null.do nothing
-            } else {
-                if (!(node.getNamespaceURI().equals(this.getNamespaceURI()))) {
-                    return notEqual;
-                }
-            }
-        }
-
-        //prefix
-        if (node.getPrefix() == null ^ this.getPrefix() == null) {
-            return notEqual;
-        } else {
-            if (node.getPrefix() == null) {
-                //This means both are null.do nothing
-            } else {
-                if (!(node.getPrefix().equals(this.getPrefix()))) {
-                    return notEqual;
-                }
-            }
-        }
-
-        //nodeValue
-        if (node.getNodeValue() == null ^ this.getNodeValue() == null) {
-            return notEqual;
-        } else {
-            if (node.getNodeValue() == null) {
-                //This means both are null.do nothing
-            } else {
-                if (!(node.getNodeValue().equals(this.getNodeValue()))) {
-                    return notEqual;
-                }
-            }
-        }
-        return equal;
-    }
-
-    private boolean checkNamedNodeMapEquality(Node node) {
-        final boolean equal = true;
-        final boolean notEqual = false;
-        if (node.getAttributes() == null ^ this.getAttributes() == null) {
-            return notEqual;
-        }
-        NamedNodeMap thisNamedNodeMap = this.getAttributes();
-        NamedNodeMap nodeNamedNodeMap = node.getAttributes();
-
-        // null     not-null  -> true
-        // not-null null      -> true
-        // null     null      -> false
-        // not-null not-null  -> false
-
-        if (thisNamedNodeMap == null ^ nodeNamedNodeMap == null) {
-            return notEqual;
-        } else {
-            if (thisNamedNodeMap == null) {
-                //This means both are null.do nothing
-            } else {
-                if (thisNamedNodeMap.getLength() != 
nodeNamedNodeMap.getLength()) {
-                    return notEqual;
-                } else {
-                    //they have the same length and for each node that exists 
in one map
-                    //there is a node that exists in the other map and is 
equal, although
-                    //not necessarily at the same index.
-                    int itemCount = thisNamedNodeMap.getLength();
-                    for (int a = 0; a < itemCount; a++) {
-                        NodeImpl thisNode = (NodeImpl) 
thisNamedNodeMap.item(a);
-                        NodeImpl tmpNode =
-                                (NodeImpl) 
nodeNamedNodeMap.getNamedItem(thisNode.getNodeName());
-                        if (tmpNode == null) {
-                            //i.e. no corresponding node
-                            return notEqual;
-                        } else {
-                            NodeImpl node1 = thisNode;
-                            if (!(node1.isEqualNode(tmpNode))) {
-                                return notEqual;
-                            }
-                        }
-                    }
-                }
-            }
-        }
-        return equal;
-    }
-
-    public Object getFeature(String arg0, String arg1) {
-        // TODO TODO
-        throw new UnsupportedOperationException("TODO");
-    }
-
-    public Object setUserData(String key, Object value, UserDataHandler 
userDataHandler) {
-        return userData.put(key, value);
-    }
-
-    public Object getUserData(String key) {
-        return userData.get(key);
-    }
-
-    public void serialize(OutputStream output) throws XMLStreamException {
-        serialize(StAXUtils.createXMLStreamWriter(output));
-    }
-
-    public void serialize(Writer writer) throws XMLStreamException {
-        serialize(StAXUtils.createXMLStreamWriter(writer));
-    }
-
-    public void serializeAndConsume(OutputStream output)
-            throws XMLStreamException {
-        serializeAndConsume(StAXUtils
-                .createXMLStreamWriter(output));
-    }
-
-    public void serializeAndConsume(Writer writer) throws XMLStreamException {
-        serializeAndConsume(StAXUtils
-                .createXMLStreamWriter(writer));
-    }
-
-    public void serialize(OutputStream output, OMOutputFormat format)
-            throws XMLStreamException {
-        MTOMXMLStreamWriter writer = new MTOMXMLStreamWriter(output, format);
-        internalSerialize(writer);
-        writer.flush();
-    }
-
-    public void serialize(Writer writer2, OMOutputFormat format)
-            throws XMLStreamException {
-        MTOMXMLStreamWriter writer = new MTOMXMLStreamWriter(StAXUtils
-                .createXMLStreamWriter(writer2));
-        writer.setOutputFormat(format);
-        internalSerialize(writer);
-        writer.flush();
-    }
-
-    public void serializeAndConsume(OutputStream output, OMOutputFormat format)
-            throws XMLStreamException {
-        MTOMXMLStreamWriter writer = new MTOMXMLStreamWriter(output, format);
-        internalSerializeAndConsume(writer);
-        writer.flush();
-    }
-
-    public void serializeAndConsume(Writer writer2, OMOutputFormat format)
-            throws XMLStreamException {
-        MTOMXMLStreamWriter writer = new MTOMXMLStreamWriter(StAXUtils
-                .createXMLStreamWriter(writer2));
-        writer.setOutputFormat(format);
-        internalSerializeAndConsume(writer);
-        writer.flush();
-    }
-
-    /** Returns the <code>OMFactory</code> that created this node */
-    public OMFactory getOMFactory() {
-        return this.factory;
-    }
-}
+/*
+ * 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.axiom.om.impl.dom;
+
+import org.apache.axiom.om.OMContainer;
+import org.apache.axiom.om.OMException;
+import org.apache.axiom.om.OMFactory;
+import org.apache.axiom.om.OMNode;
+import org.apache.axiom.om.OMOutputFormat;
+import org.apache.axiom.om.OMXMLParserWrapper;
+import org.apache.axiom.om.impl.MTOMXMLStreamWriter;
+import org.apache.axiom.om.impl.OMNodeEx;
+import org.apache.axiom.om.util.StAXUtils;
+import org.w3c.dom.DOMException;
+import org.w3c.dom.Document;
+import org.w3c.dom.NamedNodeMap;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+import org.w3c.dom.UserDataHandler;
+
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamWriter;
+import java.io.OutputStream;
+import java.io.Writer;
+import java.util.Hashtable;
+import java.util.Map;
+
+public abstract class NodeImpl implements Node, NodeList, OMNodeEx, Cloneable {
+
+    /** Holds the user data objects */
+    private Map userData = new Hashtable();
+
+    /** Field builder */
+    public OMXMLParserWrapper builder;
+
+    /** Field done */
+    protected boolean done = false;
+
+    protected DocumentImpl ownerNode;
+
+    /** Factory that created this node */
+    protected OMFactory factory;
+
+    // data
+
+    protected short flags;
+
+    protected final static short OWNED = 0x1 << 1;
+
+    protected final static short FIRSTCHILD = 0x1 << 2;
+
+    protected final static short READONLY = 0x1 << 3;
+
+    protected final static short SPECIFIED = 0x1 << 4;
+
+    protected final static short NORMALIZED = 0x1 << 5;
+
+    //
+    // Constructors
+    //
+
+    protected NodeImpl(DocumentImpl ownerDocument, OMFactory factory) {
+        this(factory);
+        this.ownerNode = ownerDocument;
+        // this.isOwned(true);
+
+    }
+
+    protected NodeImpl(OMFactory factory) {
+        this.factory = factory;
+    }
+
+    public void normalize() {
+        //Parent node should override this 
+    }
+
+    public boolean hasAttributes() {
+        return false; // overridden in ElementImpl
+    }
+
+    public boolean hasChildNodes() {
+        return false; // Override in ParentNode
+    }
+
+    public String getLocalName() {
+        return null; // Override in AttrImpl and ElementImpl
+    }
+
+    public String getNamespaceURI() {
+        return null; // Override in AttrImpl and ElementImpl
+    }
+
+    public String getNodeValue() throws DOMException {
+        return null;
+    }
+
+    /*
+     * Overidden in ElementImpl and AttrImpl.
+     */
+    public String getPrefix() {
+        return null;
+    }
+
+    public void setNodeValue(String arg0) throws DOMException {
+        // Don't do anything, to be overridden in SOME Child classes
+    }
+
+    public void setPrefix(String prefix) throws DOMException {
+        throw new DOMException(DOMException.NAMESPACE_ERR, DOMMessageFormatter
+                .formatMessage(DOMMessageFormatter.DOM_DOMAIN, "NAMESPACE_ERR",
+                               null));
+    }
+
+    /**
+     * Finds the document that this Node belongs to (the document in whose 
context the Node was
+     * created). The Node may or may not
+     */
+    public Document getOwnerDocument() {
+        return this.ownerNode;
+    }
+
+    /**
+     * Returns the collection of attributes associated with this node, or null 
if none. At this
+     * writing, Element is the only type of node which will ever have 
attributes.
+     *
+     * @see ElementImpl
+     */
+    public NamedNodeMap getAttributes() {
+        return null; // overridden in ElementImpl
+    }
+
+    /**
+     * Gets the first child of this Node, or null if none.
+     * <p/>
+     * By default we do not have any children, ParentNode overrides this.
+     *
+     * @see ParentNode
+     */
+    public Node getFirstChild() {
+        return null;
+    }
+
+    /**
+     * Gets the last child of this Node, or null if none.
+     * <p/>
+     * By default we do not have any children, ParentNode overrides this.
+     *
+     * @see ParentNode
+     */
+    public Node getLastChild() {
+        return null;
+    }
+
+    /** Returns the next child of this node's parent, or null if none. */
+    public Node getNextSibling() {
+        return null; // default behavior, overriden in ChildNode
+    }
+
+    public Node getParentNode() {
+        return null; // overriden by ChildNode
+        // Document, DocumentFragment, and Attribute will never have parents.
+    }
+
+    /*
+     * Same as getParentNode but returns internal type NodeImpl.
+     */
+    NodeImpl parentNode() {
+        return null;
+    }
+
+    /** Returns the previous child of this node's parent, or null if none. */
+    public Node getPreviousSibling() {
+        return null; // default behavior, overriden in ChildNode
+    }
+
+    // public Node cloneNode(boolean deep) {
+    // if(this instanceof OMElement) {
+    // return (Node)((OMElement)this).cloneOMElement();
+    // } else if(this instanceof OMText ){
+    // return ((TextImpl)this).cloneText();
+    // } else {
+    // throw new UnsupportedOperationException("Only elements can be cloned
+    // right now");
+    // }
+    // }
+    //    
+    public Node cloneNode(boolean deep) {
+        NodeImpl newnode;
+        try {
+            newnode = (NodeImpl) clone();
+        } catch (CloneNotSupportedException e) {
+            throw new RuntimeException("**Internal Error**" + e);
+        }
+        newnode.ownerNode = this.ownerNode;
+        newnode.isOwned(false);
+
+        newnode.isReadonly(false);
+
+        return newnode;
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see org.w3c.dom.Node#getChildNodes()
+     */
+    public NodeList getChildNodes() {
+        return this;
+    }
+
+    public boolean isSupported(String feature, String version) {
+        throw new UnsupportedOperationException();
+        // TODO
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see org.w3c.dom.Node#appendChild(org.w3c.dom.Node)
+     */
+    public Node appendChild(Node newChild) throws DOMException {
+        return insertBefore(newChild, null);
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see org.w3c.dom.Node#removeChild(org.w3c.dom.Node)
+     */
+    public Node removeChild(Node oldChild) throws DOMException {
+        throw new DOMException(DOMException.NOT_FOUND_ERR, DOMMessageFormatter
+                .formatMessage(DOMMessageFormatter.DOM_DOMAIN, "NOT_FOUND_ERR",
+                               null));
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see org.w3c.dom.Node#insertBefore(org.w3c.dom.Node, org.w3c.dom.Node)
+     */
+    public Node insertBefore(Node newChild, Node refChild) throws DOMException 
{
+        // Overridden in ParentNode
+        throw new DOMException(DOMException.HIERARCHY_REQUEST_ERR,
+                               DOMMessageFormatter.formatMessage(
+                                       DOMMessageFormatter.DOM_DOMAIN,
+                                       "HIERARCHY_REQUEST_ERR", null));
+
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see org.w3c.dom.Node#replaceChild(org.w3c.dom.Node, org.w3c.dom.Node)
+     */
+    public Node replaceChild(Node newChild, Node oldChild) throws DOMException 
{
+        throw new DOMException(DOMException.HIERARCHY_REQUEST_ERR,
+                               DOMMessageFormatter.formatMessage(
+                                       DOMMessageFormatter.DOM_DOMAIN,
+                                       "HIERARCHY_REQUEST_ERR", null));
+    }
+
+    //
+    // NodeList methods
+    //
+
+    /**
+     * NodeList method: Returns the number of immediate children of this node.
+     * <p/>
+     * By default we do not have any children, ParentNode overrides this.
+     *
+     * @return Returns int.
+     * @see ParentNode
+     */
+    public int getLength() {
+        return 0;
+    }
+
+    /**
+     * NodeList method: Returns the Nth immediate child of this node, or null 
if the index is out of
+     * bounds.
+     * <p/>
+     * By default we do not have any children, ParentNode overrides this.
+     *
+     * @param index
+     * @return Returns org.w3c.dom.Node
+     * @see ParentNode
+     */
+    public Node item(int index) {
+        return null;
+    }
+
+    /*
+     * Flags setters and getters
+     */
+
+    final boolean isOwned() {
+        return (flags & OWNED) != 0;
+    }
+
+    final void isOwned(boolean value) {
+        flags = (short) (value ? flags | OWNED : flags & ~OWNED);
+    }
+
+    final boolean isFirstChild() {
+        return (flags & FIRSTCHILD) != 0;
+    }
+
+    final void isFirstChild(boolean value) {
+        flags = (short) (value ? flags | FIRSTCHILD : flags & ~FIRSTCHILD);
+    }
+
+    final boolean isReadonly() {
+        return (flags & READONLY) != 0;
+    }
+
+    final void isReadonly(boolean value) {
+        flags = (short) (value ? flags | READONLY : flags & ~READONLY);
+    }
+
+    final boolean isSpecified() {
+        return (flags & SPECIFIED) != 0;
+    }
+
+    final void isSpecified(boolean value) {
+        flags = (short) (value ? flags | SPECIFIED : flags & ~SPECIFIED);
+    }
+
+    final boolean isNormalized() {
+        return (flags & NORMALIZED) != 0;
+    }
+
+    final void isNormalized(boolean value) {
+        // See if flag should propagate to parent.
+        if (!value && isNormalized() && ownerNode != null) {
+            ownerNode.isNormalized(false);
+        }
+        flags = (short) (value ? flags | NORMALIZED : flags & ~NORMALIZED);
+    }
+
+    // /
+    // /OM Methods
+    // /
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see org.apache.axis2.om.OMNode#getParent()
+     */
+    public OMContainer getParent() throws OMException {
+        return null; // overriden by ChildNode
+        // Document, DocumentFragment, and Attribute will never have parents.
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see org.apache.axis2.om.OMNode#isComplete()
+     */
+    public boolean isComplete() {
+        return this.done;
+    }
+
+    public void setComplete(boolean state) {
+        this.done = state;
+
+    }
+
+    /** There no concept of caching in this OM-DOM implementation. */
+    public void internalSerializeWithCache(XMLStreamWriter writer)
+            throws XMLStreamException {
+        this.internalSerialize(writer);
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see org.apache.axis2.om.OMNode#insertSiblingAfter
+     * (org.apache.axis2.om.OMNode)
+     */
+    public void insertSiblingAfter(OMNode sibling) throws OMException {
+        // Overridden in ChildNode
+        throw new DOMException(DOMException.HIERARCHY_REQUEST_ERR,
+                               DOMMessageFormatter.formatMessage(
+                                       DOMMessageFormatter.DOM_DOMAIN,
+                                       "HIERARCHY_REQUEST_ERR", null));
+
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see org.apache.axis2.om.OMNode#insertSiblingBefore
+     * (org.apache.axis2.om.OMNode)
+     */
+    public void insertSiblingBefore(OMNode sibling) throws OMException {
+        // Overridden in ChildNode
+        throw new DOMException(DOMException.HIERARCHY_REQUEST_ERR,
+                               DOMMessageFormatter.formatMessage(
+                                       DOMMessageFormatter.DOM_DOMAIN,
+                                       "HIERARCHY_REQUEST_ERR", null));
+
+    }
+
+    /** Default behavior returns null, overriden in ChildNode. */
+    public OMNode getPreviousOMSibling() {
+        return null;
+    }
+
+    /** Default behavior returns null, overriden in ChildNode. */
+    public OMNode getNextOMSibling() {
+        return null;
+    }
+
+    public void setPreviousOMSibling(OMNode previousSibling) {
+        throw new DOMException(DOMException.HIERARCHY_REQUEST_ERR,
+                               DOMMessageFormatter.formatMessage(
+                                       DOMMessageFormatter.DOM_DOMAIN,
+                                       "HIERARCHY_REQUEST_ERR", null));
+    }
+
+    public void setNextOMSibling(OMNode previousSibling) {
+        throw new DOMException(DOMException.HIERARCHY_REQUEST_ERR,
+                               DOMMessageFormatter.formatMessage(
+                                       DOMMessageFormatter.DOM_DOMAIN,
+                                       "HIERARCHY_REQUEST_ERR", null));
+    }
+
+    /** Builds next element. */
+    public void build() {
+        while (!done)
+            this.builder.next();
+    }
+
+    /**
+     * Parses this node and builds the object structure in memory. AXIOM 
supports two levels of
+     * deffered building. First is deffered building of AXIOM using StAX. 
Second level is the deffered
+     * building of attachments. AXIOM reads in the attachements from the 
stream only when user asks by
+     * calling getDataHandler(). build() method builds the OM without the 
attachments. buildAll()
+     * builds the OM together with attachement data. This becomes handy when 
user wants to free the
+     * input stream.
+     */
+    public void buildWithAttachments() {
+        if (!this.done) {
+            this.build();
+        }
+    }
+
+    /**
+     * Sets the owner document.
+     *
+     * @param document
+     */
+    protected void setOwnerDocument(DocumentImpl document) {
+        this.ownerNode = document;
+        this.isOwned(true);
+    }
+
+    public void serialize(XMLStreamWriter xmlWriter) throws XMLStreamException 
{
+        MTOMXMLStreamWriter writer = new MTOMXMLStreamWriter(xmlWriter);
+        internalSerialize(writer);
+        writer.flush();
+    }
+
+    public void serializeAndConsume(XMLStreamWriter xmlWriter)
+            throws XMLStreamException {
+        MTOMXMLStreamWriter writer = new MTOMXMLStreamWriter(xmlWriter);
+        internalSerializeAndConsume(writer);
+        writer.flush();
+    }
+
+    public OMNode detach() {
+        throw new OMException(
+                "Elements that doesn't have a parent can not be detached");
+    }
+
+    /*
+     * DOM-Level 3 methods
+     */
+
+    public String getBaseURI() {
+        // TODO TODO
+        throw new UnsupportedOperationException("TODO");
+    }
+
+    public short compareDocumentPosition(Node arg0) throws DOMException {
+        // TODO TODO
+        throw new UnsupportedOperationException("TODO");
+    }
+
+    public String getTextContent() throws DOMException {
+        // TODO TODO
+        throw new UnsupportedOperationException("TODO");
+    }
+
+    public void setTextContent(String arg0) throws DOMException {
+        // TODO TODO
+        throw new UnsupportedOperationException("TODO");
+    }
+
+    public boolean isSameNode(Node node) {
+        // TODO : check
+        if (this == node) {
+            return true;
+        } else {
+            return false;
+        }
+    }
+
+    public String lookupPrefix(String arg0) {
+        // TODO TODO
+        throw new UnsupportedOperationException("TODO");
+    }
+
+    public boolean isDefaultNamespace(String arg0) {
+        // TODO TODO
+        throw new UnsupportedOperationException("TODO");
+    }
+
+    public String lookupNamespaceURI(String arg0) {
+        // TODO TODO
+        throw new UnsupportedOperationException("TODO");
+    }
+
+    /**
+     * Tests whether two nodes are equal. <br>This method tests for equality 
of nodes, not sameness
+     * (i.e., whether the two nodes are references to the same object) which 
can be tested with
+     * <code>Node.isSameNode()</code>. All nodes that are the same will also 
be equal, though the
+     * reverse may not be true. <br>Two nodes are equal if and only if the 
following conditions are
+     * satisfied: <ul> <li>The two nodes are of the same type. </li> <li>The 
following string
+     * attributes are equal: <code>nodeName</code>, <code>localName</code>,
+     * <code>namespaceURI</code>, <code>prefix</code>, <code>nodeValue</code> 
. This is: they are
+     * both <code>null</code>, or they have the same length and are character 
for character
+     * identical. </li> <li>The <code>attributes</code> 
<code>NamedNodeMaps</code> are equal. This
+     * is: they are both <code>null</code>, or they have the same length and 
for each node that
+     * exists in one map there is a node that exists in the other map and is 
equal, although not
+     * necessarily at the same index. </li> <li>The <code>childNodes</code> 
<code>NodeLists</code>
+     * are equal. This is: they are both <code>null</code>, or they have the 
same length and contain
+     * equal nodes at the same index. Note that normalization can affect 
equality; to avoid this,
+     * nodes should be normalized before being compared. </li> </ul> <br>For 
two
+     * <code>DocumentType</code> nodes to be equal, the following conditions 
must also be satisfied:
+     * <ul> <li>The following string attributes are equal: 
<code>publicId</code>,
+     * <code>systemId</code>, <code>internalSubset</code>. </li> <li>The 
<code>entities</code>
+     * <code>NamedNodeMaps</code> are equal. </li> <li>The 
<code>notations</code>
+     * <code>NamedNodeMaps</code> are equal. </li> </ul> <br>On the other 
hand, the following do not
+     * affect equality: the <code>ownerDocument</code>, <code>baseURI</code>, 
and
+     * <code>parentNode</code> attributes, the <code>specified</code> 
attribute for
+     * <code>Attr</code> nodes, the <code>schemaTypeInfo</code> attribute for 
<code>Attr</code> and
+     * <code>Element</code> nodes, the 
<code>Text.isElementContentWhitespace</code> attribute for
+     * <code>Text</code> nodes, as well as any user data or event listeners 
registered on the nodes.
+     * <p ><b>Note:</b>  As a general rule, anything not mentioned in the 
description above is not
+     * significant in consideration of equality checking. Note that future 
versions of this
+     * specification may take into account more attributes and implementations 
conform to this
+     * specification are expected to be updated accordingly.
+     *
+     * @param arg The node to compare equality with.
+     * @return Returns <code>true</code> if the nodes are equal, 
<code>false</code> otherwise.
+     * @since DOM Level 3
+     */
+
+    //TODO : sumedha, complete
+    public boolean isEqualNode(Node node) {
+        final boolean equal = true;
+        final boolean notEqual = false;
+        if (this.getNodeType() != node.getNodeType()) {
+            return notEqual;
+        }
+        if (checkStringAttributeEquality(node)) {
+            if (checkNamedNodeMapEquality(node)) {
+
+            } else {
+                return notEqual;
+            }
+        } else {
+            return notEqual;
+        }
+        return equal;
+    }
+
+    private boolean checkStringAttributeEquality(Node node) {
+        final boolean equal = true;
+        final boolean notEqual = false;
+
+        // null     not-null  -> true
+        // not-null null      -> true
+        // null     null      -> false
+        // not-null not-null  -> false
+
+        //NodeName
+        if (node.getNodeName() == null ^ this.getNodeName() == null) {
+            return notEqual;
+        } else {
+            if (node.getNodeName() == null) {
+                //This means both are null.do nothing
+            } else {
+                if (!(node.getNodeName().equals(this.getNodeName()))) {
+                    return notEqual;
+                }
+            }
+        }
+
+        //localName
+        if (node.getLocalName() == null ^ this.getLocalName() == null) {
+            return notEqual;
+        } else {
+            if (node.getLocalName() == null) {
+                //This means both are null.do nothing
+            } else {
+                if (!(node.getLocalName().equals(this.getLocalName()))) {
+                    return notEqual;
+                }
+            }
+        }
+
+        //namespaceURI
+        if (node.getNamespaceURI() == null ^ this.getNamespaceURI() == null) {
+            return notEqual;
+        } else {
+            if (node.getNamespaceURI() == null) {
+                //This means both are null.do nothing
+            } else {
+                if (!(node.getNamespaceURI().equals(this.getNamespaceURI()))) {
+                    return notEqual;
+                }
+            }
+        }
+
+        //prefix
+        if (node.getPrefix() == null ^ this.getPrefix() == null) {
+            return notEqual;
+        } else {
+            if (node.getPrefix() == null) {
+                //This means both are null.do nothing
+            } else {
+                if (!(node.getPrefix().equals(this.getPrefix()))) {
+                    return notEqual;
+                }
+            }
+        }
+
+        //nodeValue
+        if (node.getNodeValue() == null ^ this.getNodeValue() == null) {
+            return notEqual;
+        } else {
+            if (node.getNodeValue() == null) {
+                //This means both are null.do nothing
+            } else {
+                if (!(node.getNodeValue().equals(this.getNodeValue()))) {
+                    return notEqual;
+                }
+            }
+        }
+        return equal;
+    }
+
+    private boolean checkNamedNodeMapEquality(Node node) {
+        final boolean equal = true;
+        final boolean notEqual = false;
+        if (node.getAttributes() == null ^ this.getAttributes() == null) {
+            return notEqual;
+        }
+        NamedNodeMap thisNamedNodeMap = this.getAttributes();
+        NamedNodeMap nodeNamedNodeMap = node.getAttributes();
+
+        // null     not-null  -> true
+        // not-null null      -> true
+        // null     null      -> false
+        // not-null not-null  -> false
+
+        if (thisNamedNodeMap == null ^ nodeNamedNodeMap == null) {
+            return notEqual;
+        } else {
+            if (thisNamedNodeMap == null) {
+                //This means both are null.do nothing
+            } else {
+                if (thisNamedNodeMap.getLength() != 
nodeNamedNodeMap.getLength()) {
+                    return notEqual;
+                } else {
+                    //they have the same length and for each node that exists 
in one map
+                    //there is a node that exists in the other map and is 
equal, although
+                    //not necessarily at the same index.
+                    int itemCount = thisNamedNodeMap.getLength();
+                    for (int a = 0; a < itemCount; a++) {
+                        NodeImpl thisNode = (NodeImpl) 
thisNamedNodeMap.item(a);
+                        NodeImpl tmpNode =
+                                (NodeImpl) 
nodeNamedNodeMap.getNamedItem(thisNode.getNodeName());
+                        if (tmpNode == null) {
+                            //i.e. no corresponding node
+                            return notEqual;
+                        } else {
+                            NodeImpl node1 = thisNode;
+                            if (!(node1.isEqualNode(tmpNode))) {
+                                return notEqual;
+                            }
+                        }
+                    }
+                }
+            }
+        }
+        return equal;
+    }
+
+    public Object getFeature(String arg0, String arg1) {
+        // TODO TODO
+        throw new UnsupportedOperationException("TODO");
+    }
+
+    public Object setUserData(String key, Object value, UserDataHandler 
userDataHandler) {
+        return userData.put(key, value);
+    }
+
+    public Object getUserData(String key) {
+        return userData.get(key);
+    }
+
+    public void serialize(OutputStream output) throws XMLStreamException {
+        XMLStreamWriter xmlStreamWriter = 
StAXUtils.createXMLStreamWriter(output);
+        try {
+            serialize(xmlStreamWriter);
+        } finally {
+            xmlStreamWriter.close();
+        }
+    }
+
+    public void serialize(Writer writer) throws XMLStreamException {
+        XMLStreamWriter xmlStreamWriter = 
StAXUtils.createXMLStreamWriter(writer);
+        try {
+            serialize(xmlStreamWriter);
+        } finally {
+            xmlStreamWriter.close();
+        }
+    }
+
+    public void serializeAndConsume(OutputStream output)
+            throws XMLStreamException {
+        XMLStreamWriter xmlStreamWriter = 
StAXUtils.createXMLStreamWriter(output);
+        try {
+            serializeAndConsume(xmlStreamWriter);
+        } finally {
+            xmlStreamWriter.close();
+        }
+    }
+
+    public void serializeAndConsume(Writer writer) throws XMLStreamException {
+        XMLStreamWriter xmlStreamWriter = 
StAXUtils.createXMLStreamWriter(writer);
+        try {
+            serializeAndConsume(xmlStreamWriter);
+        } finally {
+            xmlStreamWriter.close();
+        }
+    }
+
+    public void serialize(OutputStream output, OMOutputFormat format)
+            throws XMLStreamException {
+        MTOMXMLStreamWriter writer = new MTOMXMLStreamWriter(output, format);
+        try {
+            internalSerialize(writer);
+            writer.flush();
+        } finally {
+            if (format.isAutoCloseWriter()) {
+                writer.close();
+            }
+        }
+    }
+
+    public void serialize(Writer writer2, OMOutputFormat format)
+            throws XMLStreamException {
+        MTOMXMLStreamWriter writer = new MTOMXMLStreamWriter(StAXUtils
+                .createXMLStreamWriter(writer2));
+        writer.setOutputFormat(format);
+        try {
+            internalSerialize(writer);
+            writer.flush();
+        } finally {
+            if (format.isAutoCloseWriter()) {
+                writer.close();
+            }
+        }
+    }
+
+    public void serializeAndConsume(OutputStream output, OMOutputFormat format)
+            throws XMLStreamException {
+        MTOMXMLStreamWriter writer = new MTOMXMLStreamWriter(output, format);
+        try {
+            internalSerializeAndConsume(writer);
+            writer.flush();
+        } finally {
+            if (format.isAutoCloseWriter()) {
+                writer.close();
+            }
+        }
+    }
+
+    public void serializeAndConsume(Writer writer2, OMOutputFormat format)
+            throws XMLStreamException {
+        MTOMXMLStreamWriter writer = new MTOMXMLStreamWriter(StAXUtils
+                .createXMLStreamWriter(writer2));
+        try {
+            writer.setOutputFormat(format);
+            internalSerializeAndConsume(writer);
+            writer.flush();
+        } finally {
+            if (format.isAutoCloseWriter()) {
+                writer.close();
+            }
+        }
+    }
+
+    /** Returns the <code>OMFactory</code> that created this node */
+    public OMFactory getOMFactory() {
+        return this.factory;
+    }
+}



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

Reply via email to