You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@synapse.apache.org by ve...@apache.org on 2009/03/20 09:58:15 UTC

svn commit: r756377 - /synapse/trunk/java/modules/extensions/src/main/java/org/apache/synapse/mediators/bsf/ScriptMessageContext.java

Author: veithen
Date: Fri Mar 20 08:58:13 2009
New Revision: 756377

URL: http://svn.apache.org/viewvc?rev=756377&view=rev
Log:
Added an addHeader method in ScriptMessageContext to make it easy to add new SOAP headers in scripts:

<script language="js"><![CDATA[
var sessionId = mc.getProperty('sessionId');
mc.addHeader(true,
  <SessionHeader xmlns="http://soap.sforce.com/schemas/class/MyService">
    <sessionId>{sessionId}</sessionId>
  </SessionHeader>
);
]]></script>

Modified:
    synapse/trunk/java/modules/extensions/src/main/java/org/apache/synapse/mediators/bsf/ScriptMessageContext.java

Modified: synapse/trunk/java/modules/extensions/src/main/java/org/apache/synapse/mediators/bsf/ScriptMessageContext.java
URL: http://svn.apache.org/viewvc/synapse/trunk/java/modules/extensions/src/main/java/org/apache/synapse/mediators/bsf/ScriptMessageContext.java?rev=756377&r1=756376&r2=756377&view=diff
==============================================================================
--- synapse/trunk/java/modules/extensions/src/main/java/org/apache/synapse/mediators/bsf/ScriptMessageContext.java (original)
+++ synapse/trunk/java/modules/extensions/src/main/java/org/apache/synapse/mediators/bsf/ScriptMessageContext.java Fri Mar 20 08:58:13 2009
@@ -19,16 +19,22 @@
 
 package org.apache.synapse.mediators.bsf;
 
+import java.util.Iterator;
 import java.util.Set;
 import java.util.Stack;
 import java.util.Map;
 
 import javax.script.ScriptException;
 
+import org.apache.axiom.om.OMAttribute;
 import org.apache.axiom.om.OMElement;
 import org.apache.axiom.om.OMException;
+import org.apache.axiom.om.OMNode;
 import org.apache.axiom.soap.SOAPBody;
 import org.apache.axiom.soap.SOAPEnvelope;
+import org.apache.axiom.soap.SOAPFactory;
+import org.apache.axiom.soap.SOAPHeader;
+import org.apache.axiom.soap.SOAPHeaderBlock;
 import org.apache.axis2.AxisFault;
 import org.apache.axis2.addressing.EndpointReference;
 import org.apache.axis2.addressing.RelatesTo;
@@ -90,6 +96,38 @@
     }
 
     /**
+     * Add a new SOAP header to the message.
+     * 
+     * @param mustUnderstand the value for the <code>soapenv:mustUnderstand</code> attribute
+     * @param content the XML for the new header
+     * @throws ScriptException if an error occurs when converting the XML to OM
+     */
+    public void addHeader(boolean mustUnderstand, Object content) throws ScriptException {
+        SOAPEnvelope envelope = mc.getEnvelope();
+        SOAPFactory factory = (SOAPFactory)envelope.getOMFactory();
+        SOAPHeader header = envelope.getHeader();
+        if (header == null) {
+            header = factory.createSOAPHeader(envelope);
+        }
+        OMElement element = xmlHelper.toOMElement(content);
+        // We can't add the element directly to the SOAPHeader. Instead, we need to copy the
+        // information over to a SOAPHeaderBlock.
+        SOAPHeaderBlock headerBlock = header.addHeaderBlock(element.getLocalName(),
+                element.getNamespace());
+        for (Iterator it = element.getAllAttributes(); it.hasNext(); ) {
+            headerBlock.addAttribute((OMAttribute)it.next());
+        }
+        headerBlock.setMustUnderstand(mustUnderstand);
+        OMNode child = element.getFirstOMChild();
+        while (child != null) {
+            // Get the next child before addChild will detach the node from its original place. 
+            OMNode next = child.getNextOMSibling();
+            headerBlock.addChild(child);
+            child = next;
+        }
+    }
+    
+    /**
      * Get the XML representation of the complete SOAP envelope
      * @return return an object that represents the payload in the current scripting language
      * @throws ScriptException For erroing when geting the XML representation of SOAP envelope