You are viewing a plain text version of this content. The canonical link for it is here.
Posted to java-dev@axis.apache.org by ga...@apache.org on 2008/05/20 20:26:44 UTC

svn commit: r658375 - in /webservices/axis2/trunk/java/modules/saaj: src/org/apache/axis2/saaj/ test/org/apache/axis2/saaj/

Author: gawor
Date: Tue May 20 11:26:44 2008
New Revision: 658375

URL: http://svn.apache.org/viewvc?rev=658375&view=rev
Log:
basic implementation of appendChild() method (AXIS2-3808)

Modified:
    webservices/axis2/trunk/java/modules/saaj/src/org/apache/axis2/saaj/SOAPBodyImpl.java
    webservices/axis2/trunk/java/modules/saaj/src/org/apache/axis2/saaj/SOAPElementImpl.java
    webservices/axis2/trunk/java/modules/saaj/src/org/apache/axis2/saaj/SOAPHeaderImpl.java
    webservices/axis2/trunk/java/modules/saaj/test/org/apache/axis2/saaj/SOAPBodyTest.java
    webservices/axis2/trunk/java/modules/saaj/test/org/apache/axis2/saaj/SOAPElementTest.java
    webservices/axis2/trunk/java/modules/saaj/test/org/apache/axis2/saaj/SOAPEnvelopeTest.java
    webservices/axis2/trunk/java/modules/saaj/test/org/apache/axis2/saaj/SOAPHeaderTest.java

Modified: webservices/axis2/trunk/java/modules/saaj/src/org/apache/axis2/saaj/SOAPBodyImpl.java
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/saaj/src/org/apache/axis2/saaj/SOAPBodyImpl.java?rev=658375&r1=658374&r2=658375&view=diff
==============================================================================
--- webservices/axis2/trunk/java/modules/saaj/src/org/apache/axis2/saaj/SOAPBodyImpl.java (original)
+++ webservices/axis2/trunk/java/modules/saaj/src/org/apache/axis2/saaj/SOAPBodyImpl.java Tue May 20 11:26:44 2008
@@ -97,6 +97,23 @@
         return childEle;
     }
 
+    @Override
+    protected Element appendElement(ElementImpl child) throws SOAPException {    
+        String namespaceURI = child.getNamespaceURI();
+        String prefix = child.getPrefix();
+
+        element.declareNamespace(namespaceURI, prefix);
+        
+        SOAPBodyElementImpl childEle = new SOAPBodyElementImpl(child);
+
+        childEle.element.setUserData(SAAJ_NODE, childEle, null);
+        childEle.element.setNamespace(childEle.element.declareNamespace(namespaceURI, prefix));
+        element.appendChild(childEle.element);
+        ((NodeImpl)childEle.element.getParentNode()).setUserData(SAAJ_NODE, this, null);
+        childEle.setParentElement(this);
+        return childEle;
+    }
+    
     public SOAPElement addChildElement(SOAPElement soapElement) throws SOAPException {
         String namespaceURI = soapElement.getNamespaceURI();
         String prefix = soapElement.getPrefix();

Modified: webservices/axis2/trunk/java/modules/saaj/src/org/apache/axis2/saaj/SOAPElementImpl.java
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/saaj/src/org/apache/axis2/saaj/SOAPElementImpl.java?rev=658375&r1=658374&r2=658375&view=diff
==============================================================================
--- webservices/axis2/trunk/java/modules/saaj/src/org/apache/axis2/saaj/SOAPElementImpl.java (original)
+++ webservices/axis2/trunk/java/modules/saaj/src/org/apache/axis2/saaj/SOAPElementImpl.java Tue May 20 11:26:44 2008
@@ -35,6 +35,7 @@
 import org.w3c.dom.Attr;
 import org.w3c.dom.DOMException;
 import org.w3c.dom.Document;
+import org.w3c.dom.Element;
 import org.w3c.dom.NamedNodeMap;
 import org.w3c.dom.Node;
 import org.w3c.dom.NodeList;
@@ -864,4 +865,72 @@
     public String toString() {
         return element.toString();
     }
+        
+    public Node appendChild(Node child) throws DOMException {        
+        if (getOwnerDocument() != child.getOwnerDocument()) {
+            throw new DOMException(DOMException.WRONG_DOCUMENT_ERR, "Wrong document");
+        }
+        try {
+            if (child instanceof Text) {
+                return appendText((Text)child);
+            } else if (child instanceof ElementImpl) {
+                return appendElement((ElementImpl)child);
+            }
+        } catch (SOAPException e) {
+            DOMException ex = 
+                new DOMException(DOMException.HIERARCHY_REQUEST_ERR, e.getMessage());
+            ex.initCause(e);
+            throw ex;
+        }
+        
+        return super.appendChild(child);        
+    }
+    
+    protected Text appendText(Text child) throws SOAPException {
+        String text = child.getData();
+        Text textNode = getOwnerDocument().createTextNode(text);
+        NodeImpl node = ((NodeImpl)element.appendChild(textNode));
+        TextImplEx saajTextNode = new TextImplEx(text, this);
+        node.setUserData(SAAJ_NODE, saajTextNode, null);
+        return saajTextNode;
+    }
+    
+    protected Element appendElement(ElementImpl child) throws SOAPException {
+        String namespaceURI = child.getNamespaceURI();
+        String prefix = child.getPrefix();
+
+        SOAPElementImpl childEle = new SOAPElementImpl(child);
+        
+        childEle.element.setUserData(SAAJ_NODE, childEle, null);
+        if (namespaceURI != null && namespaceURI.trim().length() > 0) {
+            childEle.element.setNamespace(childEle.element.declareNamespace(namespaceURI, prefix));
+        }
+        element.appendChild(childEle.element);
+        ((NodeImpl)childEle.element.getParentNode()).setUserData(SAAJ_NODE, this, null);
+        childEle.setParentElement(this);
+        return childEle;
+    }
+    
+    protected void copyContents(SOAPElementImpl childEle, Node child) throws SOAPException {
+        NamedNodeMap attributes = child.getAttributes();
+        for (int i = 0; i < attributes.getLength(); i++) {
+            Attr node = (Attr)attributes.item(i);
+            QName name;
+            if (node.getPrefix() == null) {
+                name = new QName(node.getNamespaceURI(), 
+                                 node.getLocalName());
+            } else {
+                name = new QName(node.getNamespaceURI(), 
+                                 node.getLocalName(),
+                                 node.getPrefix());
+            }
+            childEle.addAttribute(name, node.getValue());
+        }
+
+        NodeList children = child.getChildNodes();        
+        for (int i = 0; i < children.getLength(); i++) {
+            Node node = children.item(i);
+            childEle.appendChild(node);
+        }
+    }
 }

Modified: webservices/axis2/trunk/java/modules/saaj/src/org/apache/axis2/saaj/SOAPHeaderImpl.java
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/saaj/src/org/apache/axis2/saaj/SOAPHeaderImpl.java?rev=658375&r1=658374&r2=658375&view=diff
==============================================================================
--- webservices/axis2/trunk/java/modules/saaj/src/org/apache/axis2/saaj/SOAPHeaderImpl.java (original)
+++ webservices/axis2/trunk/java/modules/saaj/src/org/apache/axis2/saaj/SOAPHeaderImpl.java Tue May 20 11:26:44 2008
@@ -31,6 +31,7 @@
 import org.apache.axiom.soap.impl.dom.soap12.SOAP12Factory;
 import org.apache.axiom.soap.impl.dom.soap12.SOAP12HeaderBlockImpl;
 import org.apache.axis2.namespace.Constants;
+import org.w3c.dom.Element;
 
 import javax.xml.namespace.QName;
 import javax.xml.soap.Name;
@@ -128,6 +129,31 @@
         return soapHeaderElement;
     }
 
+    @Override
+    protected Element appendElement(ElementImpl child) throws SOAPException {     
+        OMNamespace ns = new NamespaceImpl(child.getNamespaceURI(),
+                                           child.getPrefix());
+        SOAPHeaderBlock headerBlock = null;
+        if (this.element.getOMFactory() instanceof SOAP11Factory) {
+            headerBlock = new SOAP11HeaderBlockImpl(child.getLocalName(), ns,
+                                                    omSOAPHeader,
+                                                    (SOAPFactory)this.element.getOMFactory());
+        } else {
+            headerBlock = new SOAP12HeaderBlockImpl(child.getLocalName(), ns,
+                                                    omSOAPHeader,
+                                                    (SOAPFactory)this.element.getOMFactory());
+
+        }
+     
+        element.setUserData(SAAJ_NODE, this, null);
+        
+        SOAPHeaderElementImpl soapHeaderElement = new SOAPHeaderElementImpl(headerBlock);
+        copyContents(soapHeaderElement, child);
+        soapHeaderElement.element.setUserData(SAAJ_NODE, soapHeaderElement, null);
+        soapHeaderElement.setParentElement(this);
+        return soapHeaderElement;
+    }
+    
     /**
      * Creates a new <CODE>SOAPHeaderElement</CODE> object initialized with the specified name and
      * adds it to this <CODE>SOAPHeader</CODE> object.

Modified: webservices/axis2/trunk/java/modules/saaj/test/org/apache/axis2/saaj/SOAPBodyTest.java
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/saaj/test/org/apache/axis2/saaj/SOAPBodyTest.java?rev=658375&r1=658374&r2=658375&view=diff
==============================================================================
--- webservices/axis2/trunk/java/modules/saaj/test/org/apache/axis2/saaj/SOAPBodyTest.java (original)
+++ webservices/axis2/trunk/java/modules/saaj/test/org/apache/axis2/saaj/SOAPBodyTest.java Tue May 20 11:26:44 2008
@@ -263,5 +263,53 @@
         }
     }
 
-
+    public void testAppendChild() throws Exception {
+        MessageFactory fact = MessageFactory.newInstance();
+        SOAPMessage message = fact.createMessage();
+        SOAPBody soapBody = message.getSOAPBody();
+        
+        assertEquals(0, soapBody.getChildNodes().getLength());
+        assertFalse(soapBody.getChildElements().hasNext());
+                      
+        Document doc = soapBody.getOwnerDocument();        
+        String namespace = "http://example.com";
+        String localName = "GetLastTradePrice";
+        Element getLastTradePrice = doc.createElementNS(namespace, localName);        
+        Element symbol = doc.createElement("symbol");
+        symbol.setAttribute("foo", "bar");
+        getLastTradePrice.appendChild(symbol);
+        org.w3c.dom.Text def = doc.createTextNode("DEF");
+        symbol.appendChild(def);
+                        
+        soapBody.appendChild(getLastTradePrice);
+        
+        assertEquals(1, soapBody.getChildNodes().getLength());
+        Iterator iter = soapBody.getChildElements();
+        assertTrue(iter.hasNext()); 
+        Object obj = iter.next();
+        // must be SOAPBodyElement
+        assertTrue(obj instanceof SOAPBodyElement);  
+        SOAPElement soapElement = (SOAPElement)obj;
+        assertEquals(namespace, soapElement.getNamespaceURI());
+        assertEquals(localName, soapElement.getLocalName());
+        assertFalse(iter.hasNext());
+        
+        iter = soapElement.getChildElements();
+        assertTrue(iter.hasNext()); 
+        obj = iter.next();
+        assertTrue(obj instanceof SOAPElement);  
+        soapElement = (SOAPElement)obj;
+        assertEquals(null, soapElement.getNamespaceURI());
+        assertEquals("symbol", soapElement.getLocalName());
+        assertFalse(iter.hasNext());
+        
+        iter = soapElement.getChildElements();
+        assertTrue(iter.hasNext()); 
+        obj = iter.next();
+        assertTrue(obj instanceof Text);  
+        Text text = (Text)obj;
+        assertEquals("DEF", text.getData());
+        assertFalse(iter.hasNext());   
+    }
+        
 }

Modified: webservices/axis2/trunk/java/modules/saaj/test/org/apache/axis2/saaj/SOAPElementTest.java
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/saaj/test/org/apache/axis2/saaj/SOAPElementTest.java?rev=658375&r1=658374&r2=658375&view=diff
==============================================================================
--- webservices/axis2/trunk/java/modules/saaj/test/org/apache/axis2/saaj/SOAPElementTest.java (original)
+++ webservices/axis2/trunk/java/modules/saaj/test/org/apache/axis2/saaj/SOAPElementTest.java Tue May 20 11:26:44 2008
@@ -21,6 +21,8 @@
 
 import junit.framework.TestCase;
 import org.apache.axiom.om.impl.dom.NodeImpl;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
 
 import javax.xml.namespace.QName;
 import javax.xml.soap.MessageFactory;
@@ -767,4 +769,54 @@
             fail("Error : " + e);
         }
     }
+    
+    public void testAppendChild() throws Exception {
+        MessageFactory fact = MessageFactory.newInstance();
+        SOAPMessage message = fact.createMessage();
+        SOAPBody soapBody = message.getSOAPBody();
+
+        QName qname1 = new QName("http://wombat.ztrade.com",
+                                 "GetLastTradePrice", "ztrade");
+        SOAPElement child = soapBody.addChildElement(qname1);
+        
+        assertFalse(child.getChildElements().hasNext());
+        
+        Document doc = child.getOwnerDocument();        
+        String namespace = "http://example.com";
+        String localName = "GetLastTradePrice";
+        Element getLastTradePrice = doc.createElementNS(namespace, localName);        
+        Element symbol = doc.createElement("symbol");
+        symbol.setAttribute("foo", "bar");
+        getLastTradePrice.appendChild(symbol);
+        org.w3c.dom.Text def = doc.createTextNode("DEF");
+        symbol.appendChild(def);
+                
+        child.appendChild(getLastTradePrice);
+        
+        Iterator iter = child.getChildElements();
+        assertTrue(iter.hasNext()); 
+        Object obj = iter.next();
+        assertTrue(obj instanceof SOAPElement);  
+        SOAPElement soapElement = (SOAPElement)obj;
+        assertEquals(namespace, soapElement.getNamespaceURI());
+        assertEquals(localName, soapElement.getLocalName());
+        assertFalse(iter.hasNext());
+        
+        iter = soapElement.getChildElements();
+        assertTrue(iter.hasNext()); 
+        obj = iter.next();
+        assertTrue(obj instanceof SOAPElement);  
+        soapElement = (SOAPElement)obj;
+        assertEquals(null, soapElement.getNamespaceURI());
+        assertEquals("symbol", soapElement.getLocalName());
+        assertFalse(iter.hasNext());
+        
+        iter = soapElement.getChildElements();
+        assertTrue(iter.hasNext()); 
+        obj = iter.next();
+        assertTrue(obj instanceof Text);  
+        Text text = (Text)obj;
+        assertEquals("DEF", text.getData());
+        assertFalse(iter.hasNext());               
+    }
 }

Modified: webservices/axis2/trunk/java/modules/saaj/test/org/apache/axis2/saaj/SOAPEnvelopeTest.java
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/saaj/test/org/apache/axis2/saaj/SOAPEnvelopeTest.java?rev=658375&r1=658374&r2=658375&view=diff
==============================================================================
--- webservices/axis2/trunk/java/modules/saaj/test/org/apache/axis2/saaj/SOAPEnvelopeTest.java (original)
+++ webservices/axis2/trunk/java/modules/saaj/test/org/apache/axis2/saaj/SOAPEnvelopeTest.java Tue May 20 11:26:44 2008
@@ -21,6 +21,8 @@
 
 import junit.framework.TestCase;
 
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
 import javax.xml.soap.Detail;
 import javax.xml.soap.DetailEntry;
 import javax.xml.soap.MessageFactory;
@@ -28,6 +30,7 @@
 import javax.xml.soap.Name;
 import javax.xml.soap.Node;
 import javax.xml.soap.SOAPBody;
+import javax.xml.soap.SOAPBodyElement;
 import javax.xml.soap.SOAPConstants;
 import javax.xml.soap.SOAPElement;
 import javax.xml.soap.SOAPEnvelope;
@@ -38,6 +41,16 @@
 import javax.xml.soap.SOAPMessage;
 import javax.xml.soap.SOAPPart;
 import javax.xml.soap.Text;
+import javax.xml.transform.Result;
+import javax.xml.transform.Source;
+import javax.xml.transform.Transformer;
+import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.dom.DOMResult;
+import javax.xml.transform.dom.DOMSource;
+
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+
 import java.io.ByteArrayInputStream;
 import java.util.Iterator;
 
@@ -565,4 +578,55 @@
             fail("Unexpected Exception: " + e.getMessage());
         }
     }
+    
+    public void testTransform() throws Exception {
+        MessageFactory fact = MessageFactory.newInstance();
+        SOAPMessage message = fact.createMessage();
+        SOAPBody body = message.getSOAPBody();
+        Source source = new DOMSource(createDocument());
+        Result result = new DOMResult(body);
+        TransformerFactory transformerFactory = TransformerFactory.newInstance();
+        Transformer transformer = transformerFactory.newTransformer();
+        transformer.transform(source, result);
+        
+        assertEquals(1, body.getChildNodes().getLength());
+        Iterator iter = body.getChildElements();
+        assertTrue(iter.hasNext()); 
+        Object obj = iter.next();
+        assertTrue(obj instanceof SOAPBodyElement);  
+        SOAPElement soapElement = (SOAPElement)obj;
+        assertEquals("http://example.com", soapElement.getNamespaceURI());
+        assertEquals("GetLastTradePrice", soapElement.getLocalName());
+        
+        iter = soapElement.getChildElements();
+        assertTrue(iter.hasNext()); 
+        obj = iter.next();
+        assertTrue(obj instanceof SOAPElement);  
+        soapElement = (SOAPElement)obj;
+        assertEquals("", soapElement.getNamespaceURI());
+        assertEquals("symbol", soapElement.getLocalName());
+        assertFalse(iter.hasNext());
+        
+        iter = soapElement.getChildElements();
+        assertTrue(iter.hasNext()); 
+        obj = iter.next();
+        assertTrue(obj instanceof Text);  
+        Text text = (Text)obj;
+        assertEquals("DEF", text.getData());
+        assertFalse(iter.hasNext());
+    }
+    
+    private Element createDocument() throws Exception {
+        DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
+        documentBuilderFactory.setNamespaceAware(true);
+        DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
+        Document document = documentBuilder.newDocument();
+        Element getLastTradePrice = document.createElementNS("http://example.com", "m:GetLastTradePrice");        
+        Element symbol = document.createElement("symbol");
+        getLastTradePrice.appendChild(symbol);
+        org.w3c.dom.Text def = document.createTextNode("DEF");
+        symbol.appendChild(def);
+        document.appendChild(getLastTradePrice);
+        return getLastTradePrice;
+    }
 }
\ No newline at end of file

Modified: webservices/axis2/trunk/java/modules/saaj/test/org/apache/axis2/saaj/SOAPHeaderTest.java
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/saaj/test/org/apache/axis2/saaj/SOAPHeaderTest.java?rev=658375&r1=658374&r2=658375&view=diff
==============================================================================
--- webservices/axis2/trunk/java/modules/saaj/test/org/apache/axis2/saaj/SOAPHeaderTest.java (original)
+++ webservices/axis2/trunk/java/modules/saaj/test/org/apache/axis2/saaj/SOAPHeaderTest.java Tue May 20 11:26:44 2008
@@ -34,6 +34,11 @@
 import javax.xml.soap.SOAPHeaderElement;
 import javax.xml.soap.SOAPMessage;
 import javax.xml.soap.SOAPPart;
+import javax.xml.soap.Text;
+
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+
 import java.util.ArrayList;
 import java.util.Iterator;
 
@@ -361,4 +366,52 @@
             fail("Unexpected Exception: " + e.getMessage());
         }
     }
+    
+    public void testAppendChild() throws Exception {
+        MessageFactory fact = MessageFactory.newInstance();
+        SOAPMessage message = fact.createMessage();
+        SOAPHeader soapHeader = message.getSOAPHeader();
+        
+        assertEquals(0, soapHeader.getChildNodes().getLength());
+        assertFalse(soapHeader.getChildElements().hasNext());
+        
+        Document doc = soapHeader.getOwnerDocument();        
+        String namespace = "http://example.com";
+        String localName = "GetLastTradePrice";
+        Element getLastTradePrice = doc.createElementNS(namespace, localName);        
+        Element symbol = doc.createElement("symbol");
+        symbol.setAttribute("foo", "bar");
+        getLastTradePrice.appendChild(symbol);
+        org.w3c.dom.Text def = doc.createTextNode("DEF");
+        symbol.appendChild(def);
+                        
+        soapHeader.appendChild(getLastTradePrice);
+                
+        assertEquals(1, soapHeader.getChildNodes().getLength());
+        Iterator iter = soapHeader.getChildElements();
+        assertTrue(iter.hasNext()); 
+        Object obj = iter.next();
+        // must be SOAPHeaderElement
+        assertTrue(obj instanceof SOAPHeaderElement);  
+        SOAPElement soapElement = (SOAPElement)obj;
+        assertEquals(namespace, soapElement.getNamespaceURI());
+        assertEquals(localName, soapElement.getLocalName());
+        
+        iter = soapElement.getChildElements();
+        assertTrue(iter.hasNext()); 
+        obj = iter.next();
+        assertTrue(obj instanceof SOAPElement);  
+        soapElement = (SOAPElement)obj;
+        assertEquals(null, soapElement.getNamespaceURI());
+        assertEquals("symbol", soapElement.getLocalName());
+        assertFalse(iter.hasNext());
+        
+        iter = soapElement.getChildElements();
+        assertTrue(iter.hasNext()); 
+        obj = iter.next();
+        assertTrue(obj instanceof Text);  
+        Text text = (Text)obj;
+        assertEquals("DEF", text.getData());
+        assertFalse(iter.hasNext());   
+    }
 }
\ No newline at end of file