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 di...@apache.org on 2004/06/29 15:32:29 UTC

cvs commit: ws-axis/java/test/saaj TestDOM.java

dims        2004/06/29 06:32:29

  Modified:    java/src/org/apache/axis/message RPCElement.java
                        SOAPEnvelope.java SOAPHeader.java
                        SOAPHeaderElement.java
               java/src/org/apache/axis/encoding
                        SerializationContextImpl.java
               java/test/saaj TestDOM.java
  Log:
  Fix for AXIS-1415 - some problem will isDirty flag
  
  Notes:
  - Basically ensure that if we use message.writeTo or XMLUtils.PrettyDocumentToString(message.getSOAPPart()) the results are the same.
  
  Revision  Changes    Path
  1.93      +14 -5     ws-axis/java/src/org/apache/axis/message/RPCElement.java
  
  Index: RPCElement.java
  ===================================================================
  RCS file: /home/cvs/ws-axis/java/src/org/apache/axis/message/RPCElement.java,v
  retrieving revision 1.92
  retrieving revision 1.93
  diff -u -r1.92 -r1.93
  --- RPCElement.java	27 Jun 2004 12:28:31 -0000	1.92
  +++ RPCElement.java	29 Jun 2004 13:32:28 -0000	1.93
  @@ -40,6 +40,7 @@
   import java.util.ArrayList;
   import java.util.Enumeration;
   import java.util.Vector;
  +import java.util.Iterator;
   
   public class RPCElement extends SOAPBodyElement
   {
  @@ -342,12 +343,20 @@
               context.startElement(new QName(getNamespaceURI(), name), attributes);
           }
   
  -        for (int i = 0; i < params.size(); i++) {
  -            RPCParam param = (RPCParam)params.elementAt(i);
  -            if (!hasOperationElement && encodingStyle != null && encodingStyle.equals("")) {
  -                context.registerPrefixForURI("", param.getQName().getNamespaceURI());
  +        if(noParams) {
  +            if (children != null) {
  +                for (Iterator it = children.iterator(); it.hasNext();) {
  +                    ((NodeImpl)it.next()).output(context);
  +                }
  +            }
  +        } else {
  +            for (int i = 0; i < params.size(); i++) {
  +                RPCParam param = (RPCParam)params.elementAt(i);
  +                if (!hasOperationElement && encodingStyle != null && encodingStyle.equals("")) {
  +                    context.registerPrefixForURI("", param.getQName().getNamespaceURI());
  +                }
  +                param.serialize(context);
               }
  -            param.serialize(context);
           }
   
           if (hasOperationElement || noParams) {
  
  
  
  1.98      +6 -0      ws-axis/java/src/org/apache/axis/message/SOAPEnvelope.java
  
  Index: SOAPEnvelope.java
  ===================================================================
  RCS file: /home/cvs/ws-axis/java/src/org/apache/axis/message/SOAPEnvelope.java,v
  retrieving revision 1.97
  retrieving revision 1.98
  diff -u -r1.97 -r1.98
  --- SOAPEnvelope.java	28 Jun 2004 09:46:34 -0000	1.97
  +++ SOAPEnvelope.java	29 Jun 2004 13:32:28 -0000	1.98
  @@ -260,6 +260,9 @@
        * @param hdr
        */ 
       public void setHeader(SOAPHeader hdr) {
  +        if(this.header != null) {
  +            removeChild(this.header);
  +        }
           header = hdr;
           try {
               header.setParentElement(this);
  @@ -296,6 +299,9 @@
        * @param body
        */ 
       public void setBody(SOAPBody body) {
  +        if(this.body != null) {
  +            removeChild(this.body);
  +        }
           this.body = body;
           try {
               body.setParentElement(this);
  
  
  
  1.84      +18 -1     ws-axis/java/src/org/apache/axis/message/SOAPHeader.java
  
  Index: SOAPHeader.java
  ===================================================================
  RCS file: /home/cvs/ws-axis/java/src/org/apache/axis/message/SOAPHeader.java,v
  retrieving revision 1.83
  retrieving revision 1.84
  diff -u -r1.83 -r1.84
  --- SOAPHeader.java	27 Jun 2004 12:28:31 -0000	1.83
  +++ SOAPHeader.java	29 Jun 2004 13:32:28 -0000	1.84
  @@ -27,6 +27,9 @@
   import org.apache.axis.utils.Messages;
   import org.apache.commons.logging.Log;
   import org.xml.sax.Attributes;
  +import org.w3c.dom.Node;
  +import org.w3c.dom.DOMException;
  +import org.w3c.dom.Element;
   
   import javax.xml.namespace.QName;
   import javax.xml.soap.Name;
  @@ -322,7 +325,7 @@
               Iterator enumeration = headers.iterator();
               while (enumeration.hasNext()) {
                   // Output this header element
  -                ((SOAPHeaderElement)enumeration.next()).output(context);
  +                ((NodeImpl)enumeration.next()).output(context);
               }
               // Output </SOAP-ENV:Header>
               context.endElement();
  @@ -382,5 +385,19 @@
           child.addNamespaceDeclaration(prefix, uri);
           addChildElement(child);
           return child;
  +    }
  +
  +    public Node appendChild(Node newChild) throws DOMException {
  +        SOAPHeaderElement headerElement = null;
  +        if(newChild instanceof SOAPHeaderElement)
  +            headerElement = (SOAPHeaderElement)newChild;
  +        else 
  +            headerElement = new SOAPHeaderElement((Element)newChild);
  +        try {
  +            addChildElement(headerElement);
  +        } catch (SOAPException e) {
  +            throw new DOMException(DOMException.INVALID_STATE_ERR,e.toString());
  +        }
  +        return headerElement;
       }
   }
  
  
  
  1.36      +48 -8     ws-axis/java/src/org/apache/axis/message/SOAPHeaderElement.java
  
  Index: SOAPHeaderElement.java
  ===================================================================
  RCS file: /home/cvs/ws-axis/java/src/org/apache/axis/message/SOAPHeaderElement.java,v
  retrieving revision 1.35
  retrieving revision 1.36
  diff -u -r1.35 -r1.36
  --- SOAPHeaderElement.java	27 Jun 2004 12:28:31 -0000	1.35
  +++ SOAPHeaderElement.java	29 Jun 2004 13:32:28 -0000	1.36
  @@ -22,7 +22,9 @@
   import org.apache.axis.soap.SOAPConstants;
   import org.apache.axis.utils.Messages;
   import org.w3c.dom.Element;
  +import org.w3c.dom.NamedNodeMap;
   import org.xml.sax.Attributes;
  +import org.xml.sax.helpers.AttributesImpl;
   
   import javax.xml.namespace.QName;
   import javax.xml.soap.Name;
  @@ -78,10 +80,7 @@
   
           // FIXME : This needs to come from someplace reasonable, perhaps
           // TLS (SOAPConstants.getCurrentVersion() ?)
  -        SOAPConstants soapConstants = SOAPConstants.SOAP11_CONSTANTS;
  -
  -        if (getNamespaceURI() != null && getNamespaceURI().equals(SOAPConstants.SOAP12_CONSTANTS.getEnvelopeURI()))
  -            soapConstants = SOAPConstants.SOAP12_CONSTANTS;
  +        SOAPConstants soapConstants = getSOAPConstants();
   
           String val = elem.getAttributeNS(soapConstants.getEnvelopeURI(),
                                            Constants.ATTR_MUST_UNDERSTAND);
  @@ -134,9 +133,7 @@
       {
           super(namespace, localPart, prefix, attributes, context);
   
  -        SOAPConstants soapConstants = context.getMessageContext() == null ?
  -                                        SOAPConstants.SOAP11_CONSTANTS :
  -                                        context.getMessageContext().getSOAPConstants();
  +        SOAPConstants soapConstants = getSOAPConstants();
   
           // Check for mustUnderstand
           String val = attributes.getValue(soapConstants.getEnvelopeURI(),
  @@ -227,7 +224,7 @@
        */
       protected void outputImpl(SerializationContext context) throws Exception {
           if (!alreadySerialized) {
  -            SOAPConstants soapVer = getEnvelope().getSOAPConstants();
  +            SOAPConstants soapVer = getSOAPConstants();
               QName roleQName = soapVer.getRoleAttributeQName();
   
               if (actor != null) {
  @@ -252,5 +249,48 @@
           }
   
           super.outputImpl(context);
  +    }
  +
  +    public NamedNodeMap getAttributes() {
  +        makeAttributesEditable();
  +        SOAPConstants soapConstants = getSOAPConstants();
  +        String mustUnderstand = attributes.getValue(soapConstants.getEnvelopeURI(),
  +                                         Constants.ATTR_MUST_UNDERSTAND);
  +        QName roleQName = soapConstants.getRoleAttributeQName();
  +        String actor = attributes.getValue(roleQName.getNamespaceURI(),roleQName.getLocalPart());
  +        
  +        if(mustUnderstand == null){
  +            if (soapConstants == SOAPConstants.SOAP12_CONSTANTS) {
  +                setAttributeNS(soapConstants.getEnvelopeURI(), 
  +                            Constants.ATTR_MUST_UNDERSTAND,"false");
  +            } else {
  +                setAttributeNS(soapConstants.getEnvelopeURI(), 
  +                            Constants.ATTR_MUST_UNDERSTAND,"0");
  +            }
  +        }
  +        if(actor == null){
  +            setAttributeNS(roleQName.getNamespaceURI(),
  +                         roleQName.getLocalPart(), this.actor);
  +        }
  +        return super.getAttributes();
  +    }
  +
  +    private SOAPConstants getSOAPConstants() {
  +        SOAPConstants soapConstants = null;
  +        if (getNamespaceURI() != null &&
  +                getNamespaceURI().equals(SOAPConstants.SOAP12_CONSTANTS.getEnvelopeURI())) {
  +            soapConstants = SOAPConstants.SOAP12_CONSTANTS;
  +        }
  +        if (soapConstants == null && getEnvelope() != null) {
  +            soapConstants = getEnvelope().getSOAPConstants();
  +        }
  +        if (soapConstants == null && context != null &&
  +                context.getMessageContext() != null) {
  +            soapConstants = context.getMessageContext().getSOAPConstants();
  +        }
  +        if (soapConstants == null) {
  +            soapConstants = SOAPConstants.SOAP11_CONSTANTS;
  +        }
  +        return soapConstants;
       }
   }
  
  
  
  1.112     +16 -2     ws-axis/java/src/org/apache/axis/encoding/SerializationContextImpl.java
  
  Index: SerializationContextImpl.java
  ===================================================================
  RCS file: /home/cvs/ws-axis/java/src/org/apache/axis/encoding/SerializationContextImpl.java,v
  retrieving revision 1.111
  retrieving revision 1.112
  diff -u -r1.111 -r1.112
  --- SerializationContextImpl.java	24 Jun 2004 12:27:37 -0000	1.111
  +++ SerializationContextImpl.java	29 Jun 2004 13:32:29 -0000	1.112
  @@ -466,6 +466,20 @@
       {
           String prefix = null;
           String namespaceURI = qName.getNamespaceURI();
  +        String localPart = qName.getLocalPart();
  +        
  +        if(localPart != null && localPart.length() > 0) {
  +            int index = localPart.indexOf(':');
  +            if(index!=-1){
  +                prefix = localPart.substring(0,index);
  +                if(prefix.length()>0 && !prefix.equals("urn")){
  +                    registerPrefixForURI(prefix, namespaceURI);
  +                    localPart = localPart.substring(index+1);
  +                } else {
  +                    prefix = null;
  +                }
  +            }
  +        }
   
           if (namespaceURI.length() == 0) {
               if (writeNS) {
  @@ -481,9 +495,9 @@
           }
   
           if ((prefix == null) || (prefix.length() == 0))
  -           return qName.getLocalPart();
  +           return localPart;
   
  -        return prefix + ':' + qName.getLocalPart();
  +        return prefix + ':' + localPart;
       }
   
       public String qName2String(QName qName)
  
  
  
  1.2       +92 -1     ws-axis/java/test/saaj/TestDOM.java
  
  Index: TestDOM.java
  ===================================================================
  RCS file: /home/cvs/ws-axis/java/test/saaj/TestDOM.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- TestDOM.java	28 Jun 2004 12:52:24 -0000	1.1
  +++ TestDOM.java	29 Jun 2004 13:32:29 -0000	1.2
  @@ -1,10 +1,24 @@
   package test.saaj;
   
  +import org.apache.axis.utils.XMLUtils;
  +import org.w3c.dom.Element;
  +import org.custommonkey.xmlunit.XMLUnit;
  +
   import javax.xml.soap.MessageFactory;
  +import javax.xml.soap.MimeHeaders;
  +import javax.xml.soap.Name;
  +import javax.xml.soap.SOAPEnvelope;
  +import javax.xml.soap.SOAPFactory;
  +import javax.xml.soap.SOAPHeader;
  +import javax.xml.soap.SOAPHeaderElement;
   import javax.xml.soap.SOAPMessage;
   import javax.xml.soap.SOAPPart;
  +import java.io.ByteArrayInputStream;
  +import java.io.ByteArrayOutputStream;
  +
  +import test.AxisTestBase;
   
  -public class TestDOM extends junit.framework.TestCase {
  +public class TestDOM extends AxisTestBase {
       public TestDOM(String name) {
           super(name);
       }
  @@ -20,4 +34,81 @@
                   "soap part's document element's owner document should not be null",
                   soapPart.getDocumentElement().getOwnerDocument());
       }
  +
  +    private static final String SAMPLE_1 = 
  +            "<SOAP-ENV:Envelope xmlns:SOAP-ENV=\"http://schemas.xmlsoap.org/soap/envelope/\">" + "\n" +
  +                "<SOAP-ENV:Body> " + "\n" +
  +                    "<m:GetLastTradePrice xmlns:m=\"http://wombat.ztrade.com\">" + "\n" +
  +                        "<symbol>SUNW</symbol> " + "\n" +
  +                    "</m:GetLastTradePrice> " + "\n" +
  +                "</SOAP-ENV:Body> " + "\n" +
  +            "</SOAP-ENV:Envelope>";
  +
  +    private SOAPMessage getSOAPMessageFromString(String str) throws Exception {
  +        MimeHeaders mimeHeaders = new MimeHeaders();
  +        mimeHeaders.addHeader("content-type", "text/xml");
  +        SOAPMessage message = MessageFactory.newInstance().createMessage(
  +                mimeHeaders,
  +                new ByteArrayInputStream(str.getBytes()));
  +        SOAPEnvelope envelope = message.getSOAPPart().getEnvelope();
  +        SOAPHeader header = message.getSOAPHeader();
  +        if (header == null) {
  +            header = envelope.addHeader();
  +        }
  +        return message;
  +    }
  +    
  +    public void testSAAJSerialization() throws Exception {
  +        SOAPMessage message1 = this.getSOAPMessageFromString(SAMPLE_1);
  +        SOAPHeader header1 = message1.getSOAPHeader();
  +
  +        boolean oldIgnore = XMLUnit.getIgnoreWhitespace();
  +        XMLUnit.setIgnoreWhitespace(true);
  +        try {
  +            //this is how header element is added in sun's example
  +            SOAPFactory soapFactory = SOAPFactory.newInstance();
  +            Name headerName = soapFactory.createName("Claim",
  +                    "wsi", "http://ws-i.org/schemas/conformanceClaim/");
  +            SOAPHeaderElement headerElement =
  +                    header1.addHeaderElement(headerName);
  +            headerElement.addAttribute(soapFactory.createName("conformsTo"), "http://ws-i.org/profiles/basic1.0/");
  +            final String domToString1 = XMLUtils.PrettyDocumentToString(
  +                    message1.getSOAPPart());
  +            final String messageToString1 = messageToString(message1);
  +    
  +            assertXMLEqual(domToString1, messageToString1);
  +        } finally {
  +            XMLUnit.setIgnoreWhitespace(oldIgnore);            
  +        }
  +    }
  +
  +    public void testSAAJSerialization2() throws Exception {
  +        SOAPMessage message2 = this.getSOAPMessageFromString(SAMPLE_1);
  +        SOAPHeader header2 = message2.getSOAPHeader();
  +
  +        boolean oldIgnore = XMLUnit.getIgnoreWhitespace();
  +        XMLUnit.setIgnoreWhitespace(true);
  +        try {
  +            Element header2Element = header2.getOwnerDocument().createElementNS(
  +                    "http://ws-i.org/schemas/conformanceClaim/", "wsi:Claim");
  +            header2Element.setAttributeNS(
  +                    "http://ws-i.org/schemas/conformanceClaim/",
  +                    "wsi:conformsTo", "http://ws-i.org/profiles/basic1.0/");
  +            header2.appendChild(header2Element);
  +            final String domToString2 = XMLUtils.PrettyDocumentToString(
  +                    message2.getSOAPPart());
  +            final String messageToString2 = messageToString(message2);
  +
  +            assertXMLEqual(domToString2, messageToString2);
  +        } finally {
  +            XMLUnit.setIgnoreWhitespace(oldIgnore);            
  +        }
  +    }
  +
  +    private String messageToString(SOAPMessage message) throws Exception {
  +        ByteArrayOutputStream baos = new ByteArrayOutputStream(1024);
  +        message.writeTo(baos);
  +        return new String(baos.toByteArray());
  +    }
  +
   }