You are viewing a plain text version of this content. The canonical link for it is here.
Posted to axis-cvs@ws.apache.org by di...@apache.org on 2006/01/03 01:29:01 UTC

svn commit: r365487 [4/5] - in /webservices/axis2/trunk/java/modules/saaj: ./ src/org/apache/axis2/saaj/ src/org/apache/axis2/util/ test/org/apache/axis2/saaj/

Modified: webservices/axis2/trunk/java/modules/saaj/src/org/apache/axis2/saaj/SOAPPartImpl.java
URL: http://svn.apache.org/viewcvs/webservices/axis2/trunk/java/modules/saaj/src/org/apache/axis2/saaj/SOAPPartImpl.java?rev=365487&r1=365486&r2=365487&view=diff
==============================================================================
--- webservices/axis2/trunk/java/modules/saaj/src/org/apache/axis2/saaj/SOAPPartImpl.java (original)
+++ webservices/axis2/trunk/java/modules/saaj/src/org/apache/axis2/saaj/SOAPPartImpl.java Mon Jan  2 16:28:43 2006
@@ -15,16 +15,32 @@
  */
 package org.apache.axis2.saaj;
 
+import org.apache.axis2.soap.impl.dom.soap11.SOAP11Factory;
 import org.apache.axis2.soap.impl.llom.builder.StAXSOAPModelBuilder;
 import org.apache.axis2.transport.http.HTTPConstants;
 import org.apache.axis2.util.SessionUtils2;
-import org.w3c.dom.*;
+import org.w3c.dom.Attr;
+import org.w3c.dom.CDATASection;
+import org.w3c.dom.Comment;
+import org.w3c.dom.DOMException;
+import org.w3c.dom.DOMImplementation;
+import org.w3c.dom.Document;
+import org.w3c.dom.DocumentFragment;
+import org.w3c.dom.DocumentType;
+import org.w3c.dom.Element;
+import org.w3c.dom.EntityReference;
+import org.w3c.dom.NamedNodeMap;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+import org.w3c.dom.ProcessingInstruction;
+import org.w3c.dom.Text;
 
-import javax.xml.soap.MimeHeaders;
 import javax.xml.soap.SOAPEnvelope;
 import javax.xml.soap.SOAPException;
+import javax.xml.soap.SOAPMessage;
 import javax.xml.soap.SOAPPart;
 import javax.xml.stream.XMLInputFactory;
+import javax.xml.stream.XMLStreamException;
 import javax.xml.transform.Source;
 import java.io.InputStream;
 import java.io.InputStreamReader;
@@ -32,67 +48,67 @@
 
 public class SOAPPartImpl extends SOAPPart {
 
-    private SOAPMessageImpl msgObject;
-    private MimeHeaders mimeHeaders = new MimeHeaders();
-    private Object envelope;
-    /**
-     * default message encoding charset
-     */
-    private String currentEncoding = "UTF-8";
+    private Document document;
+    private SOAPMessage soapMessage;
+    private SOAPEnvelopeImpl envelope;
+    private MimeHeadersEx mimeHeaders = new MimeHeadersEx();
 
-    public SOAPPartImpl(SOAPMessageImpl parent,
-                        Object initialContents,
-                        boolean isBodyStream) throws SOAPException {
 
-        setMimeHeader(HTTPConstants.HEADER_CONTENT_ID,
-                SessionUtils2.generateSessionId());
+    public SOAPPartImpl(SOAPMessageImpl parentSoapMsg,
+                        SOAPEnvelopeImpl soapEnvelope) {
+
+        setMimeHeader(HTTPConstants.HEADER_CONTENT_ID, SessionUtils2.generateSessionId());
         setMimeHeader(HTTPConstants.HEADER_CONTENT_TYPE, "text/xml");
-        StAXSOAPModelBuilder stAXSOAPModelBuilder;
 
-        msgObject = parent;
+        soapMessage = parentSoapMsg;
+        envelope = soapEnvelope;
+        this.document = soapEnvelope.getOwnerDocument();
+    }
+
+    public SOAPPartImpl(SOAPMessageImpl parentSoapMsg,
+                        InputStream inputStream) throws SOAPException {
+
+        setMimeHeader(HTTPConstants.HEADER_CONTENT_ID, SessionUtils2.generateSessionId());
+        setMimeHeader(HTTPConstants.HEADER_CONTENT_TYPE, "text/xml");
+
+        soapMessage = parentSoapMsg;
+
         try {
-            if (initialContents instanceof SOAPEnvelope) {
-                ((SOAPEnvelopeImpl) initialContents).setOwnerDocument(this);
-                envelope = initialContents;
-            } else if (initialContents instanceof InputStream) {
-                //XMLStreamReader reader = XMLInputFactory.newInstance().createXMLStreamReader((InputStream)initialContents);
-                InputStreamReader inr = new InputStreamReader(
-                        (InputStream) initialContents);
-                stAXSOAPModelBuilder =
-                        new StAXSOAPModelBuilder(
-                                XMLInputFactory.newInstance()
-                        .createXMLStreamReader(inr), null);
-                org.apache.axis2.soap.SOAPEnvelope omEnv = stAXSOAPModelBuilder.getSOAPEnvelope();
-                envelope = new SOAPEnvelopeImpl(omEnv);
-                ((SOAPEnvelopeImpl) envelope).setOwnerDocument(this);
-            }
+            InputStreamReader isReader = new InputStreamReader(inputStream);
 
-        } catch (Exception e) {
+            StAXSOAPModelBuilder builder =
+                    new StAXSOAPModelBuilder(XMLInputFactory.newInstance().createXMLStreamReader(isReader),
+                                             new SOAP11Factory(),
+                                             null);
+            org.apache.axis2.soap.SOAPEnvelope soapEnvelope = builder.getSOAPEnvelope();
+            envelope = new SOAPEnvelopeImpl(soapEnvelope);
+            this.document = envelope.getOwnerDocument();
+        } catch (XMLStreamException e) {
+            e.printStackTrace();
             throw new SOAPException(e);
         }
     }
 
-    public SOAPMessageImpl getMessage() {
-        return msgObject;
-    }
-
     /**
-     * Set the Message for this Part.
-     * Do not call this Directly. Called by Message.
+     * Obtain the SOAPMessage
      *
-     * @param msg the <code>Message</code> for this part
+     * @return the related SOAPMessage
      */
-    public void setMessage(SOAPMessageImpl msg) {
-        this.msgObject = msg;
+    public SOAPMessage getSoapMessage() {
+        return soapMessage;
     }
 
     /**
-     * @see javax.xml.soap.SOAPPart#getEnvelope()
+     * Gets the <CODE>SOAPEnvelope</CODE> object associated with
+     * this <CODE>SOAPPart</CODE> object. Once the SOAP envelope is
+     * obtained, it can be used to get its contents.
+     *
+     * @return the <CODE>SOAPEnvelope</CODE> object for this <CODE>
+     *         SOAPPart</CODE> object
+     * @throws SOAPException if there is a SOAP error
      */
     public SOAPEnvelope getEnvelope() throws SOAPException {
-        //if(envelope != null)
-        return (SOAPEnvelope) envelope;
-
+        return envelope;
     }
 
     /**
@@ -148,9 +164,12 @@
      *              current value(s) of the first header that is a match if
      *              there is one. If there is no match, this value will be
      *              the value for a new <CODE>MimeHeader</CODE> object.
-     * @ throws java.lang.IllegalArgumentException if
-     * there was a problem with the specified mime header name
-     * or value
+     * @throws java.lang.IllegalArgumentException
+     *          if
+     *          there was a problem with the specified mime header name
+     *          or value
+     * @throws java.lang.IllegalArgumentException
+     *          if there was a problem with the specified mime header name or value
      * @see #getMimeHeader(java.lang.String) getMimeHeader(java.lang.String)
      */
     public void setMimeHeader(String name, String value) {
@@ -158,10 +177,22 @@
     }
 
     /**
-     * Add the specified MIME header, as per JAXM.
+     * Creates a <CODE>MimeHeader</CODE> object with the specified
+     * name and value and adds it to this <CODE>SOAPPart</CODE>
+     * object. If a <CODE>MimeHeader</CODE> with the specified
+     * name already exists, this method adds the specified value
+     * to the already existing value(s).
+     * <p/>
+     * <P>Note that RFC822 headers can contain only US-ASCII
+     * characters.</P>
      *
-     * @param header the header to add
-     * @param value  the value of that header
+     * @param header a <CODE>String</CODE> giving the
+     *               header name
+     * @param value  a <CODE>String</CODE> giving the
+     *               value to be set or added
+     * @throws IllegalArgumentException if
+     *                                  there was a problem with the specified mime header name
+     *                                  or value
      */
     public void addMimeHeader(String header, String value) {
         mimeHeaders.addHeader(header, value);
@@ -180,397 +211,888 @@
     }
 
     /**
-     * Get all headers that match.
+     * Retrieves all <CODE>MimeHeader</CODE> objects that match
+     * a name in the given array.
      *
-     * @param match an array of <code>String</code>s giving mime header names
-     * @return an <code>Iterator</code> over all values matching these headers
+     * @param names a <CODE>String</CODE> array with
+     *              the name(s) of the MIME headers to be returned
+     * @return all of the MIME headers that match one of the names
+     *         in the given array, returned as an <CODE>Iterator</CODE>
+     *         object
      */
-    public java.util.Iterator getMatchingMimeHeaders(final String[] match) {
-        return mimeHeaders.getMatchingHeaders(match);
+    public Iterator getMatchingMimeHeaders(String[] names) {
+        return mimeHeaders.getMatchingHeaders(names);
     }
 
     /**
-     * Get all headers that do not match.
+     * Retrieves all <CODE>MimeHeader</CODE> objects whose name
+     * does not match a name in the given array.
      *
-     * @param match an array of <code>String</code>s giving mime header names
-     * @return an <code>Iterator</code> over all values not matching these
-     *         headers
+     * @param names a <CODE>String</CODE> array with
+     *              the name(s) of the MIME headers not to be returned
+     * @return all of the MIME headers in this <CODE>SOAPPart</CODE>
+     *         object except those that match one of the names in the
+     *         given array. The nonmatching MIME headers are returned as
+     *         an <CODE>Iterator</CODE> object.
      */
-    public java.util.Iterator getNonMatchingMimeHeaders(final String[] match) {
-        return mimeHeaders.getNonMatchingHeaders(match);
+    public Iterator getNonMatchingMimeHeaders(String[] names) {
+        return mimeHeaders.getNonMatchingHeaders(names);
     }
 
-    /* (non-Javadoc)
-     * @see javax.xml.soap.SOAPPart#setContent(javax.xml.transform.Source)
+    /**
+     * Sets the content of the <CODE>SOAPEnvelope</CODE> object
+     * with the data from the given <CODE>Source</CODE> object.
+     *
+     * @param source javax.xml.transform.Source</CODE> object with the data to
+     *               be set
+     * @throws SOAPException if there is a problem in
+     *                       setting the source
+     * @see #getContent() getContent()
      */
     public void setContent(Source source) throws SOAPException {
-        // TODO Auto-generated method stub
-
+        //TODO: implementation
+        throw new UnsupportedOperationException("TODO");
     }
 
-    /* (non-Javadoc)
-     * @see javax.xml.soap.SOAPPart#getContent()
-     */
-    public Source getContent() throws SOAPException {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    /**
-     * Implementation of org.w3c.Document
-     * Most of methods will be implemented using the delgate
-     * instance of SOAPDocumentImpl
-     * This is for two reasons:
-     * - possible change of message classes, by extenstion of xerces implementation
-     * - we cannot extends SOAPPart (multiple inheritance),
-     * since it is defined as Abstract class
-     * ***********************************************************
-     */
-
-    private Document document = new SOAPDocumentImpl(this);
-
     /**
-     * @since SAAJ 1.2
+     * Returns the content of the SOAPEnvelope as a JAXP <CODE>
+     * Source</CODE> object.
+     *
+     * @return the content as a <CODE>
+     *         javax.xml.transform.Source</CODE> object
+     * @throws SOAPException if the implementation cannot
+     *                       convert the specified <CODE>Source</CODE> object
+     * @see #setContent(javax.xml.transform.Source) setContent(javax.xml.transform.Source)
      */
-    public Document getSOAPDocument() {
-        if (document == null) {
-            document = new SOAPDocumentImpl(this);
-        }
-        return document;
+    public Source getContent() throws SOAPException {
+        //TODO: implementation
+        throw new UnsupportedOperationException("TODO");
     }
 
     /**
-     * @return
+     * The Document Type Declaration (see <code>DocumentType</code>)
+     * associated with this document. For HTML documents as well as XML
+     * documents without a document type declaration this returns
+     * <code>null</code>. The DOM Level 2 does not support editing the
+     * Document Type Declaration. <code>docType</code> cannot be altered in
+     * any way, including through the use of methods inherited from the
+     * <code>Node</code> interface, such as <code>insertNode</code> or
+     * <code>removeNode</code>.
      */
     public DocumentType getDoctype() {
         return document.getDoctype();
     }
 
     /**
-     * @return
+     * The <code>DOMImplementation</code> object that handles this document. A
+     * DOM application may use objects from multiple implementations.
      */
     public DOMImplementation getImplementation() {
         return document.getImplementation();
     }
 
     /**
-     * SOAPEnvelope is the Document Elements of this XML document
+     * This is a convenience attribute that allows direct access to the child
+     * node that is the root element of the document. For HTML documents,
+     * this is the element with the tagName "HTML".
      */
-    protected Document mDocument;
-
     public Element getDocumentElement() {
-        try {
-            return getEnvelope();
-        } catch (SOAPException se) {
-            return null;
-        }
+        return document.getDocumentElement();
     }
 
     /**
-     * @param tagName
-     * @return
-     * @throws DOMException
+     * Creates an element of the type specified. Note that the instance
+     * returned implements the <code>Element</code> interface, so attributes
+     * can be specified directly on the returned object.
+     * <br>In addition, if there are known attributes with default values,
+     * <code>Attr</code> nodes representing them are automatically created
+     * and attached to the element.
+     * <br>To create an element with a qualified name and namespace URI, use
+     * the <code>createElementNS</code> method.
+     *
+     * @param tagName The name of the element type to instantiate. For XML,
+     *                this is case-sensitive. For HTML, the <code>tagName</code>
+     *                parameter may be provided in any case, but it must be mapped to the
+     *                canonical uppercase form by the DOM implementation.
+     * @return A new <code>Element</code> object with the
+     *         <code>nodeName</code> attribute set to <code>tagName</code>, and
+     *         <code>localName</code>, <code>prefix</code>, and
+     *         <code>namespaceURI</code> set to <code>null</code>.
+     * @throws DOMException INVALID_CHARACTER_ERR: Raised if the specified name contains an
+     *                      illegal character.
      */
     public Element createElement(String tagName) throws DOMException {
         return document.createElement(tagName);
     }
 
+    /**
+     * Creates an empty <code>DocumentFragment</code> object.
+     *
+     * @return A new <code>DocumentFragment</code>.
+     */
     public DocumentFragment createDocumentFragment() {
         return document.createDocumentFragment();
     }
 
+    /**
+     * Creates a <code>Text</code> node given the specified string.
+     *
+     * @param data The data for the node.
+     * @return The new <code>Text</code> object.
+     */
     public Text createTextNode(String data) {
         return document.createTextNode(data);
     }
 
+    /**
+     * Creates a <code>CDATASection</code> node whose value is the specified
+     * string.
+     *
+     * @param data The data for the <code>CDATASection</code> contents.
+     * @return The new <code>CDATASection</code> object.
+     * @throws DOMException NOT_SUPPORTED_ERR: Raised if this document is an HTML document.
+     */
     public Comment createComment(String data) {
         return document.createComment(data);
     }
 
+    /**
+     * Creates a <code>CDATASection</code> node whose value is the specified
+     * string.
+     *
+     * @param data The data for the <code>CDATASection</code> contents.
+     * @return The new <code>CDATASection</code> object.
+     * @throws DOMException NOT_SUPPORTED_ERR: Raised if this document is an HTML document.
+     */
     public CDATASection createCDATASection(String data) throws DOMException {
         return document.createCDATASection(data);
     }
 
-    public ProcessingInstruction createProcessingInstruction(String target,
-                                                             String data)
-            throws DOMException {
+    /**
+     * Creates a <code>ProcessingInstruction</code> node given the specified
+     * name and data strings.
+     *
+     * @param target The target part of the processing instruction.
+     * @param data   The data for the node.
+     * @return The new <code>ProcessingInstruction</code> object.
+     * @throws DOMException INVALID_CHARACTER_ERR: Raised if the specified target contains an
+     *                      illegal character.
+     *                      <br>NOT_SUPPORTED_ERR: Raised if this document is an HTML document.
+     */
+    public ProcessingInstruction createProcessingInstruction(String target, String data) throws DOMException {
         return document.createProcessingInstruction(target, data);
     }
 
+    /**
+     * Creates an <code>Attr</code> of the given name. Note that the
+     * <code>Attr</code> instance can then be set on an <code>Element</code>
+     * using the <code>setAttributeNode</code> method.
+     * <br>To create an attribute with a qualified name and namespace URI, use
+     * the <code>createAttributeNS</code> method.
+     *
+     * @param name The name of the attribute.
+     * @return A new <code>Attr</code> object with the <code>nodeName</code>
+     *         attribute set to <code>name</code>, and <code>localName</code>,
+     *         <code>prefix</code>, and <code>namespaceURI</code> set to
+     *         <code>null</code>. The value of the attribute is the empty string.
+     * @throws DOMException INVALID_CHARACTER_ERR: Raised if the specified name contains an
+     *                      illegal character.
+     */
     public Attr createAttribute(String name) throws DOMException {
         return document.createAttribute(name);
     }
 
+    /**
+     * Creates an <code>EntityReference</code> object. In addition, if the
+     * referenced entity is known, the child list of the
+     * <code>EntityReference</code> node is made the same as that of the
+     * corresponding <code>Entity</code> node.If any descendant of the
+     * <code>Entity</code> node has an unbound namespace prefix, the
+     * corresponding descendant of the created <code>EntityReference</code>
+     * node is also unbound; (its <code>namespaceURI</code> is
+     * <code>null</code>). The DOM Level 2 does not support any mechanism to
+     * resolve namespace prefixes.
+     *
+     * @param name The name of the entity to reference.
+     * @return The new <code>EntityReference</code> object.
+     * @throws DOMException INVALID_CHARACTER_ERR: Raised if the specified name contains an
+     *                      illegal character.
+     *                      <br>NOT_SUPPORTED_ERR: Raised if this document is an HTML document.
+     */
     public EntityReference createEntityReference(String name) throws DOMException {
         return document.createEntityReference(name);
     }
 
+    /**
+     * Returns a <code>NodeList</code> of all the <code>Elements</code> with a
+     * given tag name in the order in which they are encountered in a
+     * preorder traversal of the <code>Document</code> tree.
+     *
+     * @param tagname The name of the tag to match on. The special value "*"
+     *                matches all tags.
+     * @return A new <code>NodeList</code> object containing all the matched
+     *         <code>Elements</code>.
+     */
     public NodeList getElementsByTagName(String tagname) {
         return document.getElementsByTagName(tagname);
     }
 
-    public Node importNode(Node importedNode, boolean deep)
-            throws DOMException {
+    /**
+     * Imports a node from another document to this document. The returned
+     * node has no parent; (<code>parentNode</code> is <code>null</code>).
+     * The source node is not altered or removed from the original document;
+     * this method creates a new copy of the source node.
+     * <br>For all nodes, importing a node creates a node object owned by the
+     * importing document, with attribute values identical to the source
+     * node's <code>nodeName</code> and <code>nodeType</code>, plus the
+     * attributes related to namespaces (<code>prefix</code>,
+     * <code>localName</code>, and <code>namespaceURI</code>). As in the
+     * <code>cloneNode</code> operation on a <code>Node</code>, the source
+     * node is not altered.
+     * <br>Additional information is copied as appropriate to the
+     * <code>nodeType</code>, attempting to mirror the behavior expected if
+     * a fragment of XML or HTML source was copied from one document to
+     * another, recognizing that the two documents may have different DTDs
+     * in the XML case. The following list describes the specifics for each
+     * type of node.
+     * <dl>
+     * <dt>ATTRIBUTE_NODE</dt>
+     * <dd>The <code>ownerElement</code> attribute
+     * is set to <code>null</code> and the <code>specified</code> flag is
+     * set to <code>true</code> on the generated <code>Attr</code>. The
+     * descendants of the source <code>Attr</code> are recursively imported
+     * and the resulting nodes reassembled to form the corresponding subtree.
+     * Note that the <code>deep</code> parameter has no effect on
+     * <code>Attr</code> nodes; they always carry their children with them
+     * when imported.</dd>
+     * <dt>DOCUMENT_FRAGMENT_NODE</dt>
+     * <dd>If the <code>deep</code> option
+     * was set to <code>true</code>, the descendants of the source element
+     * are recursively imported and the resulting nodes reassembled to form
+     * the corresponding subtree. Otherwise, this simply generates an empty
+     * <code>DocumentFragment</code>.</dd>
+     * <dt>DOCUMENT_NODE</dt>
+     * <dd><code>Document</code>
+     * nodes cannot be imported.</dd>
+     * <dt>DOCUMENT_TYPE_NODE</dt>
+     * <dd><code>DocumentType</code>
+     * nodes cannot be imported.</dd>
+     * <dt>ELEMENT_NODE</dt>
+     * <dd>Specified attribute nodes of the
+     * source element are imported, and the generated <code>Attr</code>
+     * nodes are attached to the generated <code>Element</code>. Default
+     * attributes are not copied, though if the document being imported into
+     * defines default attributes for this element name, those are assigned.
+     * If the <code>importNode</code> <code>deep</code> parameter was set to
+     * <code>true</code>, the descendants of the source element are
+     * recursively imported and the resulting nodes reassembled to form the
+     * corresponding subtree.</dd>
+     * <dt>ENTITY_NODE</dt>
+     * <dd><code>Entity</code> nodes can be
+     * imported, however in the current release of the DOM the
+     * <code>DocumentType</code> is readonly. Ability to add these imported
+     * nodes to a <code>DocumentType</code> will be considered for addition
+     * to a future release of the DOM.On import, the <code>publicId</code>,
+     * <code>systemId</code>, and <code>notationName</code> attributes are
+     * copied. If a <code>deep</code> import is requested, the descendants
+     * of the the source <code>Entity</code> are recursively imported and
+     * the resulting nodes reassembled to form the corresponding subtree.</dd>
+     * <dt>
+     * ENTITY_REFERENCE_NODE</dt>
+     * <dd>Only the <code>EntityReference</code> itself is
+     * copied, even if a <code>deep</code> import is requested, since the
+     * source and destination documents might have defined the entity
+     * differently. If the document being imported into provides a
+     * definition for this entity name, its value is assigned.</dd>
+     * <dt>NOTATION_NODE</dt>
+     * <dd>
+     * <code>Notation</code> nodes can be imported, however in the current
+     * release of the DOM the <code>DocumentType</code> is readonly. Ability
+     * to add these imported nodes to a <code>DocumentType</code> will be
+     * considered for addition to a future release of the DOM.On import, the
+     * <code>publicId</code> and <code>systemId</code> attributes are copied.
+     * Note that the <code>deep</code> parameter has no effect on
+     * <code>Notation</code> nodes since they never have any children.</dd>
+     * <dt>
+     * PROCESSING_INSTRUCTION_NODE</dt>
+     * <dd>The imported node copies its
+     * <code>target</code> and <code>data</code> values from those of the
+     * source node.</dd>
+     * <dt>TEXT_NODE, CDATA_SECTION_NODE, COMMENT_NODE</dt>
+     * <dd>These three
+     * types of nodes inheriting from <code>CharacterData</code> copy their
+     * <code>data</code> and <code>length</code> attributes from those of
+     * the source node.</dd>
+     * </dl>
+     *
+     * @param importedNode The node to import.
+     * @param deep         If <code>true</code>, recursively import the subtree under
+     *                     the specified node; if <code>false</code>, import only the node
+     *                     itself, as explained above. This has no effect on <code>Attr</code>
+     *                     , <code>EntityReference</code>, and <code>Notation</code> nodes.
+     * @return The imported node that belongs to this <code>Document</code>.
+     * @throws DOMException NOT_SUPPORTED_ERR: Raised if the type of node being imported is not
+     *                      supported.
+     * @since DOM Level 2
+     */
+    public Node importNode(Node importedNode, boolean deep) throws DOMException {
         return document.importNode(importedNode, deep);
     }
 
-    public Element createElementNS(String namespaceURI, String qualifiedName)
-            throws DOMException {
+    /**
+     * Creates an element of the given qualified name and namespace URI.
+     *
+     * @param namespaceURI  The namespace URI of the element to create.
+     * @param qualifiedName The qualified name of the element type to
+     *                      instantiate.
+     * @return A new <code>Element</code> object with the following
+     *         attributes:
+     *         <table border='1' summary="Description of attributes and values for the new Element object">
+     *         <tr>
+     *         <th>Attribute</th>
+     *         <th>Value</th>
+     *         </tr>
+     *         <tr>
+     *         <td valign='top'><code>Node.nodeName</code></td>
+     *         <td valign='top'>
+     *         <code>qualifiedName</code></td>
+     *         </tr>
+     *         <tr>
+     *         <td valign='top'><code>Node.namespaceURI</code></td>
+     *         <td valign='top'>
+     *         <code>namespaceURI</code></td>
+     *         </tr>
+     *         <tr>
+     *         <td valign='top'><code>Node.prefix</code></td>
+     *         <td valign='top'>prefix, extracted
+     *         from <code>qualifiedName</code>, or <code>null</code> if there is
+     *         no prefix</td>
+     *         </tr>
+     *         <tr>
+     *         <td valign='top'><code>Node.localName</code></td>
+     *         <td valign='top'>local name, extracted from
+     *         <code>qualifiedName</code></td>
+     *         </tr>
+     *         <tr>
+     *         <td valign='top'><code>Element.tagName</code></td>
+     *         <td valign='top'>
+     *         <code>qualifiedName</code></td>
+     *         </tr>
+     *         </table>
+     * @throws DOMException INVALID_CHARACTER_ERR: Raised if the specified qualified name
+     *                      contains an illegal character, per the XML 1.0 specification .
+     *                      <br>NAMESPACE_ERR: Raised if the <code>qualifiedName</code> is
+     *                      malformed per the Namespaces in XML specification, if the
+     *                      <code>qualifiedName</code> has a prefix and the
+     *                      <code>namespaceURI</code> is <code>null</code>, or if the
+     *                      <code>qualifiedName</code> has a prefix that is "xml" and the
+     *                      <code>namespaceURI</code> is different from "
+     *                      http://www.w3.org/XML/1998/namespace" .
+     *                      <br>NOT_SUPPORTED_ERR: Always thrown if the current document does not
+     *                      support the <code>"XML"</code> feature, since namespaces were
+     *                      defined by XML.
+     * @since DOM Level 2
+     */
+    public Element createElementNS(String namespaceURI, String qualifiedName) throws DOMException {
         return document.createElementNS(namespaceURI, qualifiedName);
     }
 
-    public Attr createAttributeNS(String namespaceURI, String qualifiedName)
-            throws DOMException {
+    /**
+     * Creates an attribute of the given qualified name and namespace URI.
+     *
+     * @param namespaceURI  The namespace URI of the attribute to create.
+     * @param qualifiedName The qualified name of the attribute to
+     *                      instantiate.
+     * @return A new <code>Attr</code> object with the following attributes:
+     *         <table border='1' summary="Description of attributes and values for the new Attr object">
+     *         <tr>
+     *         <th>
+     *         Attribute</th>
+     *         <th>Value</th>
+     *         </tr>
+     *         <tr>
+     *         <td valign='top'><code>Node.nodeName</code></td>
+     *         <td valign='top'>qualifiedName</td>
+     *         </tr>
+     *         <tr>
+     *         <td valign='top'>
+     *         <code>Node.namespaceURI</code></td>
+     *         <td valign='top'><code>namespaceURI</code></td>
+     *         </tr>
+     *         <tr>
+     *         <td valign='top'>
+     *         <code>Node.prefix</code></td>
+     *         <td valign='top'>prefix, extracted from
+     *         <code>qualifiedName</code>, or <code>null</code> if there is no
+     *         prefix</td>
+     *         </tr>
+     *         <tr>
+     *         <td valign='top'><code>Node.localName</code></td>
+     *         <td valign='top'>local name, extracted from
+     *         <code>qualifiedName</code></td>
+     *         </tr>
+     *         <tr>
+     *         <td valign='top'><code>Attr.name</code></td>
+     *         <td valign='top'>
+     *         <code>qualifiedName</code></td>
+     *         </tr>
+     *         <tr>
+     *         <td valign='top'><code>Node.nodeValue</code></td>
+     *         <td valign='top'>the empty
+     *         string</td>
+     *         </tr>
+     *         </table>
+     * @throws DOMException INVALID_CHARACTER_ERR: Raised if the specified qualified name
+     *                      contains an illegal character, per the XML 1.0 specification .
+     *                      <br>NAMESPACE_ERR: Raised if the <code>qualifiedName</code> is
+     *                      malformed per the Namespaces in XML specification, if the
+     *                      <code>qualifiedName</code> has a prefix and the
+     *                      <code>namespaceURI</code> is <code>null</code>, if the
+     *                      <code>qualifiedName</code> has a prefix that is "xml" and the
+     *                      <code>namespaceURI</code> is different from "
+     *                      http://www.w3.org/XML/1998/namespace", or if the
+     *                      <code>qualifiedName</code>, or its prefix, is "xmlns" and the
+     *                      <code>namespaceURI</code> is different from "
+     *                      http://www.w3.org/2000/xmlns/".
+     *                      <br>NOT_SUPPORTED_ERR: Always thrown if the current document does not
+     *                      support the <code>"XML"</code> feature, since namespaces were
+     *                      defined by XML.
+     * @since DOM Level 2
+     */
+    public Attr createAttributeNS(String namespaceURI, String qualifiedName) throws DOMException {
         return document.createAttributeNS(namespaceURI, qualifiedName);
     }
 
-    public NodeList getElementsByTagNameNS(String namespaceURI,
-                                           String localName) {
+    /**
+     * Returns a <code>NodeList</code> of all the <code>Elements</code> with a
+     * given local name and namespace URI in the order in which they are
+     * encountered in a preorder traversal of the <code>Document</code> tree.
+     *
+     * @param namespaceURI The namespace URI of the elements to match on. The
+     *                     special value "*" matches all namespaces.
+     * @param localName    The local name of the elements to match on. The
+     *                     special value "*" matches all local names.
+     * @return A new <code>NodeList</code> object containing all the matched
+     *         <code>Elements</code>.
+     * @since DOM Level 2
+     */
+    public NodeList getElementsByTagNameNS(String namespaceURI, String localName) {
         return document.getElementsByTagNameNS(namespaceURI, localName);
     }
 
+    /**
+     * Returns the <code>Element</code> whose <code>ID</code> is given by
+     * <code>elementId</code>. If no such element exists, returns
+     * <code>null</code>. Behavior is not defined if more than one element
+     * has this <code>ID</code>. The DOM implementation must have
+     * information that says which attributes are of type ID. Attributes
+     * with the name "ID" are not of type ID unless so defined.
+     * Implementations that do not know whether attributes are of type ID or
+     * not are expected to return <code>null</code>.
+     *
+     * @param elementId The unique <code>id</code> value for an element.
+     * @return The matching element.
+     * @since DOM Level 2
+     */
     public Element getElementById(String elementId) {
         return document.getElementById(elementId);
     }
 
-    public String getInputEncoding() {
-        return null;  
-    }
-
-    public String getXmlEncoding() {
-        return null;  
-    }
-
-    public boolean getXmlStandalone() {
-        return false;  
-    }
-
-    public void setXmlStandalone(boolean xmlStandalone) throws DOMException {
-        
-    }
-
-    public String getXmlVersion() {
-        return null;  
-    }
-
-    public void setXmlVersion(String xmlVersion) throws DOMException {
-        
-    }
-
-    /////////////////////////////////////////////////////////////
-
-    public String getEncoding() {
-        return currentEncoding;
-    }
-
-    public void setEncoding(String s) {
-        currentEncoding = s;
-    }
-
-    public boolean getStandalone() {
-        throw new UnsupportedOperationException("Not yet implemented.71");
-    }
-
-
-    public void setStandalone(boolean flag) {
-        throw new UnsupportedOperationException("Not yet implemented.72");
-    }
-
-    public boolean getStrictErrorChecking() {
-        throw new UnsupportedOperationException("Not yet implemented.73");
-    }
-
-
-    public void setStrictErrorChecking(boolean flag) {
-        throw new UnsupportedOperationException("Not yet implemented. 74");
-    }
-
-    public String getDocumentURI() {
-        return null;  
-    }
-
-    public void setDocumentURI(String documentURI) {
-        
-    }
-
-
-    public String getVersion() {
-        throw new UnsupportedOperationException("Not yet implemented. 75");
-    }
-
-
-    public void setVersion(String s) {
-        throw new UnsupportedOperationException("Not yet implemented.76");
-    }
-
-
-    public Node adoptNode(Node node)
-            throws DOMException {
-        throw new UnsupportedOperationException("Not yet implemented.77");
-    }
-
-    public DOMConfiguration getDomConfig() {
-        return null;  
-    }
-
-    public void normalizeDocument() {
-        
-    }
-
-    public Node renameNode(Node n, String namespaceURI, String qualifiedName) throws DOMException {
-        return null;  
-    }
-
     /**
-     * Node Implementation
+     * The name of this node, depending on its type; see the table above.
      */
-
     public String getNodeName() {
         return document.getNodeName();
     }
 
+    /**
+     * The value of this node, depending on its type; see the table above.
+     * When it is defined to be <code>null</code>, setting it has no effect.
+     *
+     * @throws DOMException NO_MODIFICATION_ALLOWED_ERR: Raised when the node is readonly.
+     * @throws DOMException DOMSTRING_SIZE_ERR: Raised when it would return more characters than
+     *                      fit in a <code>DOMString</code> variable on the implementation
+     *                      platform.
+     */
     public String getNodeValue() throws DOMException {
         return document.getNodeValue();
     }
 
-    public void setNodeValue(String nodeValue) throws DOMException {
-        document.setNodeValue(nodeValue);
+    /**
+     * The value of this node, depending on its type; see the table above.
+     * When it is defined to be <code>null</code>, setting it has no effect.
+     *
+     * @throws DOMException NO_MODIFICATION_ALLOWED_ERR: Raised when the node is readonly.
+     * @throws DOMException DOMSTRING_SIZE_ERR: Raised when it would return more characters than
+     *                      fit in a <code>DOMString</code> variable on the implementation
+     *                      platform.
+     */
+    public void setNodeValue(String arg0) throws DOMException {
+        document.setNodeValue(arg0);
     }
 
+    /**
+     * A code representing the type of the underlying object, as defined above.
+     */
     public short getNodeType() {
         return document.getNodeType();
     }
 
+    /**
+     * The parent of this node. All nodes, except <code>Attr</code>,
+     * <code>Document</code>, <code>DocumentFragment</code>,
+     * <code>Entity</code>, and <code>Notation</code> may have a parent.
+     * However, if a node has just been created and not yet added to the
+     * tree, or if it has been removed from the tree, this is
+     * <code>null</code>.
+     */
     public Node getParentNode() {
         return document.getParentNode();
     }
 
+    /**
+     * A <code>NodeList</code> that contains all children of this node. If
+     * there are no children, this is a <code>NodeList</code> containing no
+     * nodes.
+     */
     public NodeList getChildNodes() {
         return document.getChildNodes();
     }
 
+    /**
+     * The first child of this node. If there is no such node, this returns
+     * <code>null</code>.
+     */
     public Node getFirstChild() {
         return document.getFirstChild();
     }
 
+    /**
+     * The last child of this node. If there is no such node, this returns
+     * <code>null</code>.
+     */
     public Node getLastChild() {
         return document.getLastChild();
     }
 
+    /**
+     * The node immediately preceding this node. If there is no such node,
+     * this returns <code>null</code>.
+     */
     public Node getPreviousSibling() {
         return document.getPreviousSibling();
     }
 
+    /**
+     * The node immediately following this node. If there is no such node,
+     * this returns <code>null</code>.
+     */
     public Node getNextSibling() {
         return document.getNextSibling();
     }
 
+    /**
+     * A <code>NamedNodeMap</code> containing the attributes of this node (if
+     * it is an <code>Element</code>) or <code>null</code> otherwise.
+     */
     public NamedNodeMap getAttributes() {
         return document.getAttributes();
     }
 
+    /**
+     * The <code>Document</code> object associated with this node. This is
+     * also the <code>Document</code> object used to create new nodes. When
+     * this node is a <code>Document</code> or a <code>DocumentType</code>
+     * which is not used with any <code>Document</code> yet, this is
+     * <code>null</code>.
+     */
     public Document getOwnerDocument() {
         return document.getOwnerDocument();
     }
 
+    /**
+     * Inserts the node <code>newChild</code> before the existing child node
+     * <code>refChild</code>. If <code>refChild</code> is <code>null</code>,
+     * insert <code>newChild</code> at the end of the list of children.
+     * <br>If <code>newChild</code> is a <code>DocumentFragment</code> object,
+     * all of its children are inserted, in the same order, before
+     * <code>refChild</code>. If the <code>newChild</code> is already in the
+     * tree, it is first removed.
+     *
+     * @param newChild The node to insert.
+     * @param refChild The reference node, i.e., the node before which the
+     *                 new node must be inserted.
+     * @return The node being inserted.
+     * @throws DOMException HIERARCHY_REQUEST_ERR: Raised if this node is of a type that does not
+     *                      allow children of the type of the <code>newChild</code> node, or if
+     *                      the node to insert is one of this node's ancestors or this node
+     *                      itself.
+     *                      <br>WRONG_DOCUMENT_ERR: Raised if <code>newChild</code> was created
+     *                      from a different document than the one that created this node.
+     *                      <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this node is readonly or
+     *                      if the parent of the node being inserted is readonly.
+     *                      <br>NOT_FOUND_ERR: Raised if <code>refChild</code> is not a child of
+     *                      this node.
+     */
     public Node insertBefore(Node newChild, Node refChild) throws DOMException {
         return document.insertBefore(newChild, refChild);
     }
 
+    /**
+     * Replaces the child node <code>oldChild</code> with <code>newChild</code>
+     * in the list of children, and returns the <code>oldChild</code> node.
+     * <br>If <code>newChild</code> is a <code>DocumentFragment</code> object,
+     * <code>oldChild</code> is replaced by all of the
+     * <code>DocumentFragment</code> children, which are inserted in the
+     * same order. If the <code>newChild</code> is already in the tree, it
+     * is first removed.
+     *
+     * @param newChild The new node to put in the child list.
+     * @param oldChild The node being replaced in the list.
+     * @return The node replaced.
+     * @throws DOMException HIERARCHY_REQUEST_ERR: Raised if this node is of a type that does not
+     *                      allow children of the type of the <code>newChild</code> node, or if
+     *                      the node to put in is one of this node's ancestors or this node
+     *                      itself.
+     *                      <br>WRONG_DOCUMENT_ERR: Raised if <code>newChild</code> was created
+     *                      from a different document than the one that created this node.
+     *                      <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this node or the parent of
+     *                      the new node is readonly.
+     *                      <br>NOT_FOUND_ERR: Raised if <code>oldChild</code> is not a child of
+     *                      this node.
+     */
     public Node replaceChild(Node newChild, Node oldChild) throws DOMException {
         return document.replaceChild(newChild, oldChild);
     }
 
+    /**
+     * Removes the child node indicated by <code>oldChild</code> from the list
+     * of children, and returns it.
+     *
+     * @param oldChild The node being removed.
+     * @return The node removed.
+     * @throws DOMException NO_MODIFICATION_ALLOWED_ERR: Raised if this node is readonly.
+     *                      <br>NOT_FOUND_ERR: Raised if <code>oldChild</code> is not a child of
+     *                      this node.
+     */
     public Node removeChild(Node oldChild) throws DOMException {
         return document.removeChild(oldChild);
     }
 
+    /**
+     * Adds the node <code>newChild</code> to the end of the list of children
+     * of this node. If the <code>newChild</code> is already in the tree, it
+     * is first removed.
+     *
+     * @param newChild The node to add.If it is a
+     *                 <code>DocumentFragment</code> object, the entire contents of the
+     *                 document fragment are moved into the child list of this node
+     * @return The node added.
+     * @throws DOMException HIERARCHY_REQUEST_ERR: Raised if this node is of a type that does not
+     *                      allow children of the type of the <code>newChild</code> node, or if
+     *                      the node to append is one of this node's ancestors or this node
+     *                      itself.
+     *                      <br>WRONG_DOCUMENT_ERR: Raised if <code>newChild</code> was created
+     *                      from a different document than the one that created this node.
+     *                      <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this node is readonly or
+     *                      if the previous parent of the node being inserted is readonly.
+     */
     public Node appendChild(Node newChild) throws DOMException {
         return document.appendChild(newChild);
     }
 
+    /**
+     * Returns whether this node has any children.
+     *
+     * @return <code>true</code> if this node has any children,
+     *         <code>false</code> otherwise.
+     */
     public boolean hasChildNodes() {
         return document.hasChildNodes();
     }
 
+    /**
+     * Returns a duplicate of this node, i.e., serves as a generic copy
+     * constructor for nodes. The duplicate node has no parent; (
+     * <code>parentNode</code> is <code>null</code>.).
+     * <br>Cloning an <code>Element</code> copies all attributes and their
+     * values, including those generated by the XML processor to represent
+     * defaulted attributes, but this method does not copy any text it
+     * contains unless it is a deep clone, since the text is contained in a
+     * child <code>Text</code> node. Cloning an <code>Attribute</code>
+     * directly, as opposed to be cloned as part of an <code>Element</code>
+     * cloning operation, returns a specified attribute (
+     * <code>specified</code> is <code>true</code>). Cloning any other type
+     * of node simply returns a copy of this node.
+     * <br>Note that cloning an immutable subtree results in a mutable copy,
+     * but the children of an <code>EntityReference</code> clone are readonly
+     * . In addition, clones of unspecified <code>Attr</code> nodes are
+     * specified. And, cloning <code>Document</code>,
+     * <code>DocumentType</code>, <code>Entity</code>, and
+     * <code>Notation</code> nodes is implementation dependent.
+     *
+     * @param deep If <code>true</code>, recursively clone the subtree under
+     *             the specified node; if <code>false</code>, clone only the node
+     *             itself (and its attributes, if it is an <code>Element</code>).
+     * @return The duplicate node.
+     */
     public Node cloneNode(boolean deep) {
         return document.cloneNode(deep);
     }
 
+    /**
+     * Puts all <code>Text</code> nodes in the full depth of the sub-tree
+     * underneath this <code>Node</code>, including attribute nodes, into a
+     * "normal" form where only structure (e.g., elements, comments,
+     * processing instructions, CDATA sections, and entity references)
+     * separates <code>Text</code> nodes, i.e., there are neither adjacent
+     * <code>Text</code> nodes nor empty <code>Text</code> nodes. This can
+     * be used to ensure that the DOM view of a document is the same as if
+     * it were saved and re-loaded, and is useful when operations (such as
+     * XPointer  lookups) that depend on a particular document tree
+     * structure are to be used.In cases where the document contains
+     * <code>CDATASections</code>, the normalize operation alone may not be
+     * sufficient, since XPointers do not differentiate between
+     * <code>Text</code> nodes and <code>CDATASection</code> nodes.
+     */
     public void normalize() {
         document.normalize();
     }
 
+    /**
+     * Tests whether the DOM implementation implements a specific feature and
+     * that feature is supported by this node.
+     *
+     * @param feature The name of the feature to test. This is the same name
+     *                which can be passed to the method <code>hasFeature</code> on
+     *                <code>DOMImplementation</code>.
+     * @param version This is the version number of the feature to test. In
+     *                Level 2, version 1, this is the string "2.0". If the version is not
+     *                specified, supporting any version of the feature will cause the
+     *                method to return <code>true</code>.
+     * @return Returns <code>true</code> if the specified feature is
+     *         supported on this node, <code>false</code> otherwise.
+     * @since DOM Level 2
+     */
     public boolean isSupported(String feature, String version) {
         return document.isSupported(feature, version);
     }
 
+    /**
+     * The namespace URI of this node, or <code>null</code> if it is
+     * unspecified.
+     * <br>This is not a computed value that is the result of a namespace
+     * lookup based on an examination of the namespace declarations in
+     * scope. It is merely the namespace URI given at creation time.
+     * <br>For nodes of any type other than <code>ELEMENT_NODE</code> and
+     * <code>ATTRIBUTE_NODE</code> and nodes created with a DOM Level 1
+     * method, such as <code>createElement</code> from the
+     * <code>Document</code> interface, this is always <code>null</code>.Per
+     * the Namespaces in XML Specification  an attribute does not inherit
+     * its namespace from the element it is attached to. If an attribute is
+     * not explicitly given a namespace, it simply has no namespace.
+     *
+     * @since DOM Level 2
+     */
     public String getNamespaceURI() {
         return document.getNamespaceURI();
     }
 
+    /**
+     * The namespace prefix of this node, or <code>null</code> if it is
+     * unspecified.
+     * <br>Note that setting this attribute, when permitted, changes the
+     * <code>nodeName</code> attribute, which holds the qualified name, as
+     * well as the <code>tagName</code> and <code>name</code> attributes of
+     * the <code>Element</code> and <code>Attr</code> interfaces, when
+     * applicable.
+     * <br>Note also that changing the prefix of an attribute that is known to
+     * have a default value, does not make a new attribute with the default
+     * value and the original prefix appear, since the
+     * <code>namespaceURI</code> and <code>localName</code> do not change.
+     * <br>For nodes of any type other than <code>ELEMENT_NODE</code> and
+     * <code>ATTRIBUTE_NODE</code> and nodes created with a DOM Level 1
+     * method, such as <code>createElement</code> from the
+     * <code>Document</code> interface, this is always <code>null</code>.
+     *
+     * @throws DOMException INVALID_CHARACTER_ERR: Raised if the specified prefix contains an
+     *                      illegal character, per the XML 1.0 specification .
+     *                      <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this node is readonly.
+     *                      <br>NAMESPACE_ERR: Raised if the specified <code>prefix</code> is
+     *                      malformed per the Namespaces in XML specification, if the
+     *                      <code>namespaceURI</code> of this node is <code>null</code>, if the
+     *                      specified prefix is "xml" and the <code>namespaceURI</code> of this
+     *                      node is different from "http://www.w3.org/XML/1998/namespace", if
+     *                      this node is an attribute and the specified prefix is "xmlns" and
+     *                      the <code>namespaceURI</code> of this node is different from "
+     *                      http://www.w3.org/2000/xmlns/", or if this node is an attribute and
+     *                      the <code>qualifiedName</code> of this node is "xmlns" .
+     * @since DOM Level 2
+     */
     public String getPrefix() {
         return document.getPrefix();
     }
 
-    public void setPrefix(String prefix) throws DOMException {
-        document.setPrefix(prefix);
+    /**
+     * The namespace prefix of this node, or <code>null</code> if it is
+     * unspecified.
+     * <br>Note that setting this attribute, when permitted, changes the
+     * <code>nodeName</code> attribute, which holds the qualified name, as
+     * well as the <code>tagName</code> and <code>name</code> attributes of
+     * the <code>Element</code> and <code>Attr</code> interfaces, when
+     * applicable.
+     * <br>Note also that changing the prefix of an attribute that is known to
+     * have a default value, does not make a new attribute with the default
+     * value and the original prefix appear, since the
+     * <code>namespaceURI</code> and <code>localName</code> do not change.
+     * <br>For nodes of any type other than <code>ELEMENT_NODE</code> and
+     * <code>ATTRIBUTE_NODE</code> and nodes created with a DOM Level 1
+     * method, such as <code>createElement</code> from the
+     * <code>Document</code> interface, this is always <code>null</code>.
+     *
+     * @throws DOMException INVALID_CHARACTER_ERR: Raised if the specified prefix contains an
+     *                      illegal character, per the XML 1.0 specification .
+     *                      <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this node is readonly.
+     *                      <br>NAMESPACE_ERR: Raised if the specified <code>prefix</code> is
+     *                      malformed per the Namespaces in XML specification, if the
+     *                      <code>namespaceURI</code> of this node is <code>null</code>, if the
+     *                      specified prefix is "xml" and the <code>namespaceURI</code> of this
+     *                      node is different from "http://www.w3.org/XML/1998/namespace", if
+     *                      this node is an attribute and the specified prefix is "xmlns" and
+     *                      the <code>namespaceURI</code> of this node is different from "
+     *                      http://www.w3.org/2000/xmlns/", or if this node is an attribute and
+     *                      the <code>qualifiedName</code> of this node is "xmlns" .
+     * @since DOM Level 2
+     */
+    public void setPrefix(String arg0) throws DOMException {
+        document.setPrefix(arg0);
     }
 
+    /**
+     * Returns the local part of the qualified name of this node.
+     * <br>For nodes of any type other than <code>ELEMENT_NODE</code> and
+     * <code>ATTRIBUTE_NODE</code> and nodes created with a DOM Level 1
+     * method, such as <code>createElement</code> from the
+     * <code>Document</code> interface, this is always <code>null</code>.
+     *
+     * @since DOM Level 2
+     */
     public String getLocalName() {
         return document.getLocalName();
     }
 
+    /**
+     * Returns whether this node (if it is an element) has any attributes.
+     *
+     * @return <code>true</code> if this node has any attributes,
+     *         <code>false</code> otherwise.
+     * @since DOM Level 2
+     */
     public boolean hasAttributes() {
         return document.hasAttributes();
     }
 
-    public String getBaseURI() {
-        return null;  
-    }
-
-    public short compareDocumentPosition(Node other) throws DOMException {
-        return 0;  
+    protected void setMessage(SOAPMessageImpl message) {
+        soapMessage = message;
     }
-
-    public String getTextContent() throws DOMException {
-        return null;  
-    }
-
-    public void setTextContent(String textContent) throws DOMException {
-        
-    }
-
-    public boolean isSameNode(Node other) {
-        return false;  
-    }
-
-    public String lookupPrefix(String namespaceURI) {
-        return null;  
-    }
-
-    public boolean isDefaultNamespace(String namespaceURI) {
-        return false;  
-    }
-
-    public String lookupNamespaceURI(String prefix) {
-        return null;  
-    }
-
-    public boolean isEqualNode(Node arg) {
-        return false;  
-    }
-
-    public Object getFeature(String feature, String version) {
-        return null;  
-    }
-
-    public Object setUserData(String key, Object data, UserDataHandler handler) {
-        return null;  
-    }
-
-    public Object getUserData(String key) {
-        return null;  
-    }
-
 }

Added: webservices/axis2/trunk/java/modules/saaj/src/org/apache/axis2/saaj/TextImplEx.java
URL: http://svn.apache.org/viewcvs/webservices/axis2/trunk/java/modules/saaj/src/org/apache/axis2/saaj/TextImplEx.java?rev=365487&view=auto
==============================================================================
--- webservices/axis2/trunk/java/modules/saaj/src/org/apache/axis2/saaj/TextImplEx.java (added)
+++ webservices/axis2/trunk/java/modules/saaj/src/org/apache/axis2/saaj/TextImplEx.java Mon Jan  2 16:28:43 2006
@@ -0,0 +1,277 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed 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.axis2.saaj;
+
+import org.apache.axis2.om.DOOMAbstractFactory;
+import org.apache.axis2.om.OMContainer;
+import org.apache.axis2.om.OMException;
+import org.apache.axis2.om.impl.OMOutputImpl;
+import org.apache.axis2.om.impl.dom.TextImpl;
+import org.w3c.dom.DOMException;
+
+import javax.xml.soap.Text;
+import javax.xml.stream.XMLStreamException;
+
+public class TextImplEx extends NodeImplEx implements Text {
+
+    //TODO: assign textNode
+
+    private TextImpl textNode;
+
+    public TextImplEx(String data) {
+        textNode = (TextImpl) DOOMAbstractFactory.getOMFactory().createText(data);
+    }
+    /*public TextImplEx(SOAPElementImpl parent, String s) throws SOAPException {
+        //super();
+        //super.setParentElement(parent);
+        OMElement par = parent.getOMElement();
+        omNode =
+        omText =
+                org.apache.axis2.om.OMAbstractFactory.getOMFactory()
+                        .createText(par, s);
+    }
+
+    public TextImplEx(org.w3c.dom.CharacterData data) {
+        if (data == null) {
+            throw new IllegalArgumentException("Text value may not be null.");
+        }
+        omText =
+                org.apache.axis2.om.OMAbstractFactory.getOMFactory()
+                        .createText(data.getData());
+    }
+
+    public TextImplEx(OMText omText) {
+        omNode = this.omText = omText;
+    }*/
+
+    /**
+     * Retrieves whether this <CODE>Text</CODE> object
+     * represents a comment.
+     *
+     * @return <CODE>true</CODE> if this <CODE>Text</CODE> object is
+     *         a comment; <CODE>false</CODE> otherwise
+     */
+    public boolean isComment() {
+        String value = textNode.getText();
+        return value.startsWith("<!--") && value.endsWith("-->");
+    }
+
+    /**
+     * The name of this node, depending on its type; see the table above.
+     */
+    public String getNodeName() {
+        return textNode.getNodeName();
+    }
+
+    /**
+     * A code representing the type of the underlying object, as defined above.
+     */
+    public short getNodeType() {
+        return textNode.getNodeType();
+    }
+
+    /**
+     * Breaks this node into two nodes at the specified <code>offset</code>,
+     * keeping both in the tree as siblings. After being split, this node
+     * will contain all the content up to the <code>offset</code> point. A
+     * new node of the same type, which contains all the content at and
+     * after the <code>offset</code> point, is returned. If the original
+     * node had a parent node, the new node is inserted as the next sibling
+     * of the original node. When the <code>offset</code> is equal to the
+     * length of this node, the new node has no data.
+     *
+     * @param offset The 16-bit unit offset at which to split, starting from
+     *               <code>0</code>.
+     * @return The new node, of the same type as this node.
+     * @throws DOMException INDEX_SIZE_ERR: Raised if the specified offset is negative or greater
+     *                      than the number of 16-bit units in <code>data</code>.
+     *                      <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this node is readonly.
+     */
+    public org.w3c.dom.Text splitText(int offset) throws DOMException {
+        return textNode.splitText(offset);
+    }
+
+    /**
+     * The character data of the node that implements this interface. The DOM
+     * implementation may not put arbitrary limits on the amount of data
+     * that may be stored in a <code>CharacterData</code> node. However,
+     * implementation limits may mean that the entirety of a node's data may
+     * not fit into a single <code>DOMString</code>. In such cases, the user
+     * may call <code>substringData</code> to retrieve the data in
+     * appropriately sized pieces.
+     *
+     * @throws DOMException NO_MODIFICATION_ALLOWED_ERR: Raised when the node is readonly.
+     * @throws DOMException DOMSTRING_SIZE_ERR: Raised when it would return more characters than
+     *                      fit in a <code>DOMString</code> variable on the implementation
+     *                      platform.
+     */
+    public String getData() throws DOMException {
+        return textNode.getData();
+    }
+
+    /**
+     * The character data of the node that implements this interface. The DOM
+     * implementation may not put arbitrary limits on the amount of data
+     * that may be stored in a <code>CharacterData</code> node. However,
+     * implementation limits may mean that the entirety of a node's data may
+     * not fit into a single <code>DOMString</code>. In such cases, the user
+     * may call <code>substringData</code> to retrieve the data in
+     * appropriately sized pieces.
+     *
+     * @throws DOMException NO_MODIFICATION_ALLOWED_ERR: Raised when the node is readonly.
+     * @throws DOMException DOMSTRING_SIZE_ERR: Raised when it would return more characters than
+     *                      fit in a <code>DOMString</code> variable on the implementation
+     *                      platform.
+     */
+    public void setData(String data) throws DOMException {
+        textNode.setData(data);
+    }
+
+    /**
+     * Extracts a range of data from the node.
+     *
+     * @param offset Start offset of substring to extract.
+     * @param count  The number of 16-bit units to extract.
+     * @return The specified substring. If the sum of <code>offset</code> and
+     *         <code>count</code> exceeds the <code>length</code>, then all 16-bit
+     *         units to the end of the data are returned.
+     * @throws DOMException INDEX_SIZE_ERR: Raised if the specified <code>offset</code> is
+     *                      negative or greater than the number of 16-bit units in
+     *                      <code>data</code>, or if the specified <code>count</code> is
+     *                      negative.
+     *                      <br>DOMSTRING_SIZE_ERR: Raised if the specified range of text does
+     *                      not fit into a <code>DOMString</code>.
+     */
+    public String substringData(int offset, int count) throws DOMException {
+        return textNode.substringData(offset, count);
+    }
+
+    /**
+     * Append the string to the end of the character data of the node. Upon
+     * success, <code>data</code> provides access to the concatenation of
+     * <code>data</code> and the <code>DOMString</code> specified.
+     *
+     * @param value The <code>DOMString</code> to append.
+     * @throws DOMException NO_MODIFICATION_ALLOWED_ERR: Raised if this node is readonly.
+     */
+    public void appendData(String value) throws DOMException {
+        textNode.appendData(value);
+    }
+
+    /**
+     * Insert a string at the specified 16-bit unit offset.
+     *
+     * @param offset The character offset at which to insert.
+     * @param data   The <code>DOMString</code> to insert.
+     * @throws DOMException INDEX_SIZE_ERR: Raised if the specified <code>offset</code> is
+     *                      negative or greater than the number of 16-bit units in
+     *                      <code>data</code>.
+     *                      <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this node is readonly.
+     */
+    public void insertData(int offset, String data) throws DOMException {
+        textNode.insertData(offset, data);
+    }
+
+    /**
+     * Remove a range of 16-bit units from the node. Upon success,
+     * <code>data</code> and <code>length</code> reflect the change.
+     *
+     * @param offset The offset from which to start removing.
+     * @param count  The number of 16-bit units to delete. If the sum of
+     *               <code>offset</code> and <code>count</code> exceeds
+     *               <code>length</code> then all 16-bit units from <code>offset</code>
+     *               to the end of the data are deleted.
+     * @throws DOMException INDEX_SIZE_ERR: Raised if the specified <code>offset</code> is
+     *                      negative or greater than the number of 16-bit units in
+     *                      <code>data</code>, or if the specified <code>count</code> is
+     *                      negative.
+     *                      <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this node is readonly.
+     */
+    public void deleteData(int offset, int count) throws DOMException {
+        textNode.deleteData(offset, count);
+    }
+
+    /**
+     * Replace the characters starting at the specified 16-bit unit offset
+     * with the specified string.
+     *
+     * @param offset The offset from which to start replacing.
+     * @param count  The number of 16-bit units to replace. If the sum of
+     *               <code>offset</code> and <code>count</code> exceeds
+     *               <code>length</code>, then all 16-bit units to the end of the data
+     *               are replaced; (i.e., the effect is the same as a <code>remove</code>
+     *               method call with the same range, followed by an <code>append</code>
+     *               method invocation).
+     * @param data   The <code>DOMString</code> with which the range must be
+     *               replaced.
+     * @throws DOMException INDEX_SIZE_ERR: Raised if the specified <code>offset</code> is
+     *                      negative or greater than the number of 16-bit units in
+     *                      <code>data</code>, or if the specified <code>count</code> is
+     *                      negative.
+     *                      <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this node is readonly.
+     */
+    public void replaceData(int offset, int count, String data) throws DOMException {
+        textNode.replaceData(offset, count, data);
+    }
+
+    /* (non-Javadoc)
+      * @see org.apache.axis2.om.impl.OMNodeEx#setParent(org.apache.axis2.om.OMContainer)
+      */
+    public void setParent(OMContainer element) {
+        textNode.setParent(element);
+    }
+
+    /* (non-Javadoc)
+      * @see org.apache.axis2.om.OMNode#getParent()
+      */
+    public OMContainer getParent() {
+        return textNode.getParent();
+    }
+
+    /* (non-Javadoc)
+      * @see org.apache.axis2.om.OMNode#discard()
+      */
+    public void discard() throws OMException {
+        textNode.discard();
+    }
+
+    /* (non-Javadoc)
+      * @see org.apache.axis2.om.OMNode#serialize(org.apache.axis2.om.impl.OMOutputImpl)
+      */
+    public void serialize(OMOutputImpl omOutput) throws XMLStreamException {
+        textNode.serialize(omOutput);
+    }
+
+    /* (non-Javadoc)
+      * @see org.apache.axis2.om.OMNode#serializeAndConsume(org.apache.axis2.om.impl.OMOutputImpl)
+      */
+    public void serializeAndConsume(OMOutputImpl omOutput) throws XMLStreamException {
+        textNode.serializeAndConsume(omOutput);
+    }
+
+    /**
+     * Retrieve the text value (data) of this
+     *
+     * @return The text value (data) of this
+     */
+    public String getValue() {
+        return textNode.getData();
+    }
+
+    public String toString() {
+        return getValue();
+    }
+}

Added: webservices/axis2/trunk/java/modules/saaj/src/org/apache/axis2/util/SAAJUtil.java
URL: http://svn.apache.org/viewcvs/webservices/axis2/trunk/java/modules/saaj/src/org/apache/axis2/util/SAAJUtil.java?rev=365487&view=auto
==============================================================================
--- webservices/axis2/trunk/java/modules/saaj/src/org/apache/axis2/util/SAAJUtil.java (added)
+++ webservices/axis2/trunk/java/modules/saaj/src/org/apache/axis2/util/SAAJUtil.java Mon Jan  2 16:28:43 2006
@@ -0,0 +1,149 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed 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.axis2.saaj.util;
+
+import org.apache.axis2.om.DOOMAbstractFactory;
+import org.apache.axis2.om.OMElement;
+import org.apache.axis2.om.impl.dom.DocumentImpl;
+import org.apache.axis2.om.impl.llom.builder.StAXOMBuilder;
+import org.apache.axis2.soap.SOAP11Constants;
+import org.apache.axis2.soap.SOAP12Constants;
+import org.apache.axis2.soap.SOAPEnvelope;
+import org.apache.axis2.soap.SOAPFactory;
+import org.apache.axis2.soap.impl.llom.builder.StAXSOAPModelBuilder;
+import org.apache.xml.security.utils.XMLUtils;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.stream.XMLInputFactory;
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamReader;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+
+/**
+ * Utility class for the Axis2-WSS4J Module
+ */
+public class SAAJUtil {
+
+    /**
+     * Create a DOM Document using the org.apache.axis2.soap.SOAPEnvelope
+     *
+     * @param env An org.apache.axis2.soap.SOAPEnvelope instance
+     * @return the DOM Document of the given SOAP Envelope
+     */
+    public static Document getDocumentFromSOAPEnvelope(org.apache.axis2.soap.SOAPEnvelope env) {
+        env.build();
+
+        //Check the namespace and find SOAP version and factory
+        String nsURI;
+        SOAPFactory factory;
+        if (env.getNamespace().getName().equals(SOAP11Constants.SOAP_ENVELOPE_NAMESPACE_URI)) {
+            nsURI = SOAP11Constants.SOAP_ENVELOPE_NAMESPACE_URI;
+            factory = DOOMAbstractFactory.getSOAP11Factory();
+        } else {
+            nsURI = SOAP12Constants.SOAP_ENVELOPE_NAMESPACE_URI;
+            factory = DOOMAbstractFactory.getSOAP11Factory();
+        }
+
+        StAXSOAPModelBuilder stAXSOAPModelBuilder = new StAXSOAPModelBuilder(env.getXMLStreamReader(), factory, nsURI);
+        SOAPEnvelope envelope = (stAXSOAPModelBuilder).getSOAPEnvelope();
+        envelope.build();
+
+        Element envElem = (Element) envelope;
+        return envElem.getOwnerDocument();
+    }
+
+    /**
+     * Create a DOM Document using the org.apache.axis2.soap.SOAPEnvelope
+     *
+     * @param env An org.apache.axis2.soap.SOAPEnvelope instance
+     * @return the org.apache.axis2.soap.impl.dom.SOAPEnvelopeImpl of the given SOAP Envelope
+     */
+    public static org.apache.axis2.soap.impl.dom.SOAPEnvelopeImpl
+            toDOOMSOAPEnvelope(org.apache.axis2.soap.SOAPEnvelope env) {
+        env.build();
+
+        //Check the namespace and find SOAP version and factory
+        String nsURI;
+        SOAPFactory factory;
+        if (env.getNamespace().getName().equals(SOAP11Constants.SOAP_ENVELOPE_NAMESPACE_URI)) {
+            nsURI = SOAP11Constants.SOAP_ENVELOPE_NAMESPACE_URI;
+            factory = DOOMAbstractFactory.getSOAP11Factory();
+        } else {
+            nsURI = SOAP12Constants.SOAP_ENVELOPE_NAMESPACE_URI;
+            factory = DOOMAbstractFactory.getSOAP11Factory();
+        }
+
+        StAXSOAPModelBuilder stAXSOAPModelBuilder =
+                new StAXSOAPModelBuilder(env.getXMLStreamReader(), factory, nsURI);
+        SOAPEnvelope envelope = (stAXSOAPModelBuilder).getSOAPEnvelope();
+        envelope.build();
+
+        return (org.apache.axis2.soap.impl.dom.SOAPEnvelopeImpl) envelope;
+    }
+
+    public static SOAPEnvelope getSOAPEnvelopeFromDOOMDocument(DocumentImpl doc) {
+        OMElement docElem = (OMElement) doc.getDocumentElement();
+        StAXSOAPModelBuilder stAXSOAPModelBuilder = new StAXSOAPModelBuilder(docElem.getXMLStreamReader(), null);
+        return stAXSOAPModelBuilder.getSOAPEnvelope();
+    }
+
+    public static SOAPEnvelope toOMSOAPEnvelope(Element elem) {
+        OMElement docElem = (OMElement) elem;
+        StAXSOAPModelBuilder stAXSOAPModelBuilder =
+                new StAXSOAPModelBuilder(docElem.getXMLStreamReader(), null);
+        return stAXSOAPModelBuilder.getSOAPEnvelope();
+    }
+
+    /**
+     * Convert a given DOM Element to an OMElement
+     *
+     * @param element
+     * @return
+     */
+    public static OMElement toOM(Element element) throws XMLStreamException {
+        ByteArrayOutputStream os = new ByteArrayOutputStream();
+        XMLUtils.outputDOM(element, os, true);
+
+        ByteArrayInputStream is = new ByteArrayInputStream(os.toByteArray());
+        XMLStreamReader reader = XMLInputFactory.newInstance().createXMLStreamReader(is);
+
+        StAXOMBuilder builder = new StAXOMBuilder(reader);
+        builder.setCache(true);
+
+        return builder.getDocumentElement();
+    }
+
+    /**
+     * Convert a given OMElement to a DOM Element
+     *
+     * @param element
+     * @return
+     */
+    public static Element toDOM(OMElement element) throws Exception {
+
+        ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        element.serialize(baos);
+        ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
+
+        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
+        factory.setNamespaceAware(true);
+        return factory.newDocumentBuilder().parse(bais).getDocumentElement();
+    }
+}

Modified: webservices/axis2/trunk/java/modules/saaj/test/org/apache/axis2/saaj/AttachmentSerializationTest.java
URL: http://svn.apache.org/viewcvs/webservices/axis2/trunk/java/modules/saaj/test/org/apache/axis2/saaj/AttachmentSerializationTest.java?rev=365487&r1=365486&r2=365487&view=diff
==============================================================================
--- webservices/axis2/trunk/java/modules/saaj/test/org/apache/axis2/saaj/AttachmentSerializationTest.java (original)
+++ webservices/axis2/trunk/java/modules/saaj/test/org/apache/axis2/saaj/AttachmentSerializationTest.java Mon Jan  2 16:28:43 2006
@@ -10,6 +10,11 @@
 import java.io.File;
 import java.io.InputStream;
 import java.io.OutputStream;
+import java.io.FileInputStream;
+import java.util.Iterator;
+
+import org.w3c.dom.Document;
+import org.apache.axis2.om.impl.dom.DocumentImpl;
 
 public class AttachmentSerializationTest extends TestCase {
 
@@ -28,7 +33,9 @@
             int count = saveMsgWithAttachments(bais);
             assertEquals(count, 2);
         } catch (Exception e) {
-            throw new Exception("Fault returned from test: " + e);
+//            throw new Exception("Fault returned from test: " + e);
+            e.printStackTrace();
+            fail("Unexpected Exception : " + e);
         }
     }
 
@@ -41,12 +48,13 @@
         MessageFactory mf = MessageFactory.newInstance();
         SOAPMessage msg = mf.createMessage();
 
-        SOAPPart sp = msg.getSOAPPart();
-        SOAPEnvelope envelope = sp.getEnvelope();
+        SOAPPart soapPart = msg.getSOAPPart();
+        SOAPEnvelope envelope = soapPart.getEnvelope();
         SOAPHeader header = envelope.getHeader();
         SOAPBody body = envelope.getBody();
 
         SOAPElement el = header.addHeaderElement(envelope.createName("field4", NS_PREFIX, NS_URI));
+
         SOAPElement el2 = el.addChildElement("field4b", NS_PREFIX);
         SOAPElement el3 = el2.addTextNode("field4value");
 
@@ -57,10 +65,13 @@
         el2.addTextNode("bodyvalue3b");
         el2 = el.addChildElement("datefield", NS_PREFIX);
 
+        // First Attachment
         AttachmentPart ap = msg.createAttachmentPart();
-        ap.setContent("some attachment text...", "text/plain");
+        final String testText = "some attachment text...";
+        ap.setContent(testText, "text/plain");
         msg.addAttachmentPart(ap);
 
+        // Second attachment
         String jpgfilename = "./test-resources/axis.jpg";
         File myfile = new File(jpgfilename);
         FileDataSource fds = new FileDataSource(myfile);
@@ -71,9 +82,23 @@
 
         MimeHeaders headers = msg.getMimeHeaders();
         assertTrue(headers != null);
-        String [] contentType = headers.getHeader("Content-Type");  
+        String [] contentType = headers.getHeader("Content-Type");
         assertTrue(contentType != null);
-        
+
+        for (Iterator iter = msg.getAttachments(); iter.hasNext();) {
+            AttachmentPart attachmentPart =  (AttachmentPart) iter.next();
+            final Object content = attachmentPart.getDataHandler().getContent();
+            if(content instanceof String){
+                assertEquals(testText, (String) content);
+            } else if(content instanceof FileInputStream){
+                final FileInputStream fis = (FileInputStream) content;
+                /*File file = new File("output-file.jpg");
+                file.createNewFile();
+
+                fis.read(new byte[(int)file.length()])*/
+            }
+        }
+
         msg.writeTo(os);
         os.flush();
         msg.writeTo(System.out);

Modified: webservices/axis2/trunk/java/modules/saaj/test/org/apache/axis2/saaj/AttachmentTest.java
URL: http://svn.apache.org/viewcvs/webservices/axis2/trunk/java/modules/saaj/test/org/apache/axis2/saaj/AttachmentTest.java?rev=365487&r1=365486&r2=365487&view=diff
==============================================================================
--- webservices/axis2/trunk/java/modules/saaj/test/org/apache/axis2/saaj/AttachmentTest.java (original)
+++ webservices/axis2/trunk/java/modules/saaj/test/org/apache/axis2/saaj/AttachmentTest.java Mon Jan  2 16:28:43 2006
@@ -19,46 +19,46 @@
     public AttachmentTest(String name) {
         super(name);
     }
-
+    
     public void testStringAttachment() throws Exception {
-        SOAPConnectionFactory scFactory = SOAPConnectionFactory.newInstance();
-        SOAPConnection con = scFactory.createConnection();
-
-        MessageFactory factory = MessageFactory.newInstance();
-        SOAPMessage message = factory.createMessage();
-        AttachmentPart attachment = message.createAttachmentPart();
-        String stringContent = "Update address for Sunny Skies " +
-                               "Inc., to 10 Upbeat Street, Pleasant Grove, CA 95439";
-
-        attachment.setContent(stringContent, "text/plain");
-        attachment.setContentId("update_address");
-        message.addAttachmentPart(attachment);
-
-        assertTrue(message.countAttachments() == 1);
-
-        java.util.Iterator it = message.getAttachments();
-        while (it.hasNext()) {
-            attachment = (AttachmentPart) it.next();
-            Object content = attachment.getContent();
-            String id = attachment.getContentId();
-            System.out.println("Attachment " + id + " contains: " + content);
-            assertEquals(content, stringContent);
-        }
-        System.out.println("Here is what the XML message looks like:");
-        message.writeTo(System.out);
-
-        message.removeAllAttachments();
-        assertTrue(message.countAttachments() == 0);
+    	SOAPConnectionFactory scFactory = SOAPConnectionFactory.newInstance();
+    	SOAPConnection con = scFactory.createConnection();
+    	
+    	MessageFactory factory = MessageFactory.newInstance();
+    	SOAPMessage message = factory.createMessage();
+    	AttachmentPart attachment = message.createAttachmentPart();
+    	String stringContent = "Update address for Sunny Skies " +
+    			"Inc., to 10 Upbeat Street, Pleasant Grove, CA 95439";
+    	
+    	attachment.setContent(stringContent, "text/plain");
+    	attachment.setContentId("update_address");
+    	message.addAttachmentPart(attachment);
+    	
+    	assertTrue(message.countAttachments()==1);
+    	
+    	java.util.Iterator it = message.getAttachments();
+    	while (it.hasNext()) {
+    		attachment = (AttachmentPart) it.next();
+    		Object content = attachment.getContent();
+    		String id = attachment.getContentId();
+    		System.out.println("Attachment " + id + " contains: " + content);
+    		assertEquals(content,stringContent);
+    	}
+    	System.out.println("Here is what the XML message looks like:");
+    	message.writeTo(System.out);
+    	
+    	message.removeAllAttachments();
+    	assertTrue(message.countAttachments()==0);
     }
-
+    
     public void testMultipleAttachments() throws Exception {
         SOAPConnectionFactory scFactory = SOAPConnectionFactory.newInstance();
         SOAPConnection con = scFactory.createConnection();
 
         MessageFactory factory = MessageFactory.newInstance();
         SOAPMessage msg = factory.createMessage();
-        java.net.URL url1 = new java.net.URL("http://www.apache.org/licenses/LICENSE-2.0.html");
-        java.net.URL url2 = new java.net.URL("http://www.apache.org/licenses/LICENSE-2.0.txt");
+        java.net.URL url1 = new java.net.URL("http://slashdot.org/slashdot.xml");
+        java.net.URL url2 = new java.net.URL("http://www.apache.org/LICENSE.txt");
 
         AttachmentPart a1 = msg.createAttachmentPart(new javax.activation.DataHandler(url1));
         a1.setContentType("text/xml");
@@ -70,58 +70,54 @@
         a3.setContentType("text/plain");
         msg.addAttachmentPart(a3);
 
-        assertTrue(msg.countAttachments() == 3);
+        assertTrue(msg.countAttachments()==3);
 
         javax.xml.soap.MimeHeaders mimeHeaders = new javax.xml.soap.MimeHeaders();
         mimeHeaders.addHeader("Content-Type", "text/xml");
 
         int nAttachments = 0;
         java.util.Iterator iterator = msg.getAttachments(mimeHeaders);
-        while (iterator.hasNext()) {
+	    while (iterator.hasNext()) {
             nAttachments++;
-            AttachmentPart ap = (AttachmentPart) iterator.next();
-            assertTrue(ap.equals(a1) || ap.equals(a2));
-        }
-        assertTrue(nAttachments == 2);
+	        AttachmentPart ap = (AttachmentPart)iterator.next();
+	        assertTrue(ap.equals(a1) || ap.equals(a2));
+	    }
+        assertTrue(nAttachments==2);
     }
-
+    
     public void testBadAttSize() throws Exception {
         MessageFactory factory = MessageFactory.newInstance();
         SOAPMessage message = factory.createMessage();
 
-        ByteArrayInputStream ins = new ByteArrayInputStream(new byte[5]);
-        DataHandler dh = new DataHandler(new Src(ins, "text/plain"));
+        ByteArrayInputStream ins=new ByteArrayInputStream(new byte[5]);
+        DataHandler dh=new DataHandler(new Src(ins,"text/plain"));
         AttachmentPart part = message.createAttachmentPart(dh);
-        assertEquals("Size should match", 5, part.getSize());
+        assertEquals("Size should match",5,part.getSize());
     }
 
-    class Src implements DataSource {
+    class Src implements DataSource{
         InputStream m_src;
         String m_type;
 
-        public Src(InputStream data, String type) {
-            m_src = data;
-            m_type = type;
+        public Src(InputStream data, String type){
+            m_src=data;
+            m_type=type;
         }
-
-        public String getContentType() {
+        public String getContentType(){
             return m_type;
         }
-
-        public InputStream getInputStream() throws IOException {
+        public InputStream getInputStream() throws IOException{
             m_src.reset();
             return m_src;
         }
-
-        public String getName() {
+        public String getName(){
             return "Some-Data";
         }
-
-        public OutputStream getOutputStream() {
+        public OutputStream getOutputStream(){
             throw new UnsupportedOperationException("I don't give output streams");
         }
     }
-
+    
     public static void main(String[] args) throws Exception {
         AttachmentTest tester = new AttachmentTest("TestSAAJ");
         tester.testMultipleAttachments();