Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

The Script Mediator is used to invoke the functions of a variety of scripting languages such as JavaScript, Groovy, or Ruby.

Note

WSO2 ESB uses Rhino engine to execute JavaScripts. Rhino engine converts the script to a method inside a Java class. Thereby, when processing large JSON data volumes the code length must be less than 65536 characters since the Script mediator converts the payload into a Java object. However, you can use the following alternative options to process large JSON data volumes.

  • Achieve the same functionality via a Class mediator.
  • If the original message consists of repetitive sections, you can use the Iterate mediator to generate a relatively small payload using those repetitive sections which will then allow you to use the Script mediator.

A Script mediator can be created in one of the following methods.

...

Return?Method NameDescription
YesgetPayloadXML()This gets an XML representation of SOAP Body payload.
NosetPayloadXML(payload)This sets the SOAP body payload from XML.
NoaddHeader(mustUnderstand, content)This adds a new SOAP header to the message.
YesgetEnvelopeXML()This gets the XML representation of the complete SOAP envelope.
NosetTo(reference)This is used to set the value which specifies the receiver of the message.
YessetFaultTo(reference)This is used to set the value which specifies the receiver of the faults relating to the message.
NosetFrom(reference)This is used to set the value which specifies the sender of the message.
NosetReplyTo(reference)This is used to set the value which specifies the receiver of the replies to the message.
YesgetPayloadJSON()This gets the JSON representation of a SOAP Body payload.
NosetPayloadJSON(payload)This sets the JSON representation of a payload obtained via the getPayloadJSON() method and sets it in the current message context.
YesgetProperty(name)This gets a property from the current message context.
NosetProperty(key, value)This is used to set a property in the current message context. The previously set property values are replaced by this method.

...

Return?Method NameExample
YesgetPayloadXML()

The script invoked can be as follows.

Code Block
languagejs
// sample.js02.function transformRequestFunction(mc) {
var symbol = mc.getPayloadXML()..*::Code.toString();
mc.setPayloadXML(
	<m:getquote m="http://services.samples">
		<m:request>
			<m:symbol>{symbol}</m:symbol>
		</m:request>
	</m:getquote>);
}

mc.getPayloadXML() returns the response received in XML form.

NosetPayloadXML(payload)See the example above for the getPayloadXML() method. mc.setPayloadXML( <m:getquote m="http://services.samples"> <m:request> <m:symbol>{symbol}</m:symbol </m:request> </m:getquote> ) is used in that script to set the XML representation of the SOAP body (obtained using the getPayloadXML() method) to the current message context.
NoaddHeader(mustUnderstand, Object content)

The script invoked can be as follows.

Code Block
languagejs
<script language="js"> 
var wsse = new Namespace('http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd'); 
var envelope = mc.getEnvelopeXML(); 
var username = envelope..wsse::Username.toString(); 
var password = envelope..wsse::Password.toString();   
mc.addHeader(false, <urn:AuthenticationInfo><urn:userName>{username}</urn:userName><urn:password>{password}</urn:password></urn:AuthenticationInfo>); 
</script> 

The addHeader method configured as

mc.addHeader(false, <urn:AuthenticationInfo><urn:userName>{username}</urn:userName><urn:password>{password}</urn:password></urn:AuthenticationInfo>) in the above script is used to extract user name and password values included in the request and add them to the header structure required for the backend service.

NogetEnvelopeXML()

The script invoked can be as follows.

Code Block
languagejs
<script language="js"> 
var wsse = new Namespace('http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd'); 
var envelope = mc.getEnvelopeXML(); 
var username = envelope..wsse::Username.toString(); 
var password = envelope..wsse::Password.toString();   
mc.addHeader(false, <urn:AuthenticationInfo><urn:userName>{username}</urn:userName><urn:password>{password}</urn:password></urn:AuthenticationInfo>); </script> - See more at: http://sajithblogs.blogspot.com/2013/08/wso2-esb-adding-complex-soap-headers-to.html#sthash.jqpiEmf0.dpuf
YesgetPayloadJSON()

The script invoked can be as follows.

Code Block
languagejs
function transform(mc) {
    payload = mc.getPayloadJSON();
    results = payload.results;
    var response = new Array();
    for (i = 0; i < results.length; ++i) {
        location_object = results[i];
        l = new Object();
        l.name = location_object.name;
        l.tags = location_object.types;
        l.id = "ID:" + (location_object.id);
        response[i] = l;
    }
    mc.setPayloadJSON(response);
}

mc.getPayloadJSON() returns the JSON payload (received as the response) as a JavaScript object. This object can be manipulated as a normal JavaScript variable within a script as shown in the above JavaScript code. See JSON Support for further information about how this script is used.

 

NosetPayloadJSON(payload)

See the example script for the getPayloadJSON() method.

The mc.setPayloadJSON() method can be used to replace the existing payload with a new payload. In the above script, we build a new array object by using the fields of the incoming JSON payload and set that array object as the new payload. See JSON Support for further information about how this script is used

YesgetProperty (name)

The script invoked can be as follows.

Code Block
languagejava
<script language="js">
 var time1 = mc.getProperty("TIME_1");
 var time2 = mc.getProperty("TIME_2");
 var timeTaken = time2 - time1;
 print("Time Duration :  " + timeTaken + " ms ");
 mc.setProperty("RESPONSE_TIME", timeTaken);
</script>

In this example, the getProperty method is used to get two time durations. The difference between the two time durations is calculated and the setProperty method is used to set this difference in the message context.

NosetProperty(property)

See the example for the getProperty method. The setProperty method is used to set the response time calculated from the time durations obtained (using the getProperty method) in the message context.

...