Hi

I'm trying to control message properties in messages processed by Apache Synapse server from script executed in script mediator.

Using properties it is possible to set property for 4 different scopes:
<property name="MsgPropertyDef" value="28" scope="default" type="INTEGER"/> <property name="MsgPropertyTran" value="28" scope="transport" type="INTEGER"/>
 <property name="MsgPropertyAx" value="28" scope="axis2" type="INTEGER"/>
<property name="MsgPropertyAxCl" value="28" scope="axis2-client" type="INTEGER"/>


When using script mediator with groovy script:
"""
import org.apache.synapse.MessageContext;
import java.io.File;
import java.util.Map;
def test1(MessageContext mc) {
    File f
    f = new File("/tmp/out.log")

    Map<String,Object> ce = mc.getContextEntries()

    Set sp = mc.getPropertyKeySet()
    f << "PropertyKeySet size: " + sp.size() + "\n"
sp.each() { key -> f << "${key} == " + mc.getProperty(key).toString() + "\n" }
}
"""

I am able to get to property set by:
<property name="MsgPropertyDef" value="28" scope="default" type="INTEGER"/>
But I am not able to get to properties defined in other scopes - Axis2, Axis2 - client, Transport.

Question:
Is it possible from scipt mediator get to properties in scope transport / axis2 / axis2-client?



What I found:
In 'http://www.docjar.org/html/api/org/apache/synapse/mediators/builtin/PropertyMediator.java.html' there is following code: 87 if (scope == null || XMLConfigConstants.SCOPE_DEFAULT.equals(scope)) {
   88                   //Setting property into the Synapse Context
   89                   synCtx.setProperty(name, resultValue);
   90
   91               } else if (XMLConfigConstants.SCOPE_AXIS2.equals(scope)
   92                       && synCtx instanceof Axis2MessageContext) {
   93                   //Setting property into the  Axis2 Message Context
94 Axis2MessageContext axis2smc = (Axis2MessageContext) synCtx;
   95 org.apache.axis2.context.MessageContext axis2MessageCtx =
   96 axis2smc.getAxis2MessageContext();
   97                   axis2MessageCtx.setProperty(name, resultValue);
   98
99 } else if (XMLConfigConstants.SCOPE_CLIENT.equals(scope)
  100                       && synCtx instanceof Axis2MessageContext) {
101 //Setting property into the Axis2 Message Context client options 102 Axis2MessageContext axis2smc = (Axis2MessageContext) synCtx;
  103 org.apache.axis2.context.MessageContext axis2MessageCtx =
  104 axis2smc.getAxis2MessageContext();
  105 axis2MessageCtx.getOptions().setProperty(name, resultValue);
  106
107 } else if (XMLConfigConstants.SCOPE_TRANSPORT.equals(scope)
  108                       && synCtx instanceof Axis2MessageContext) {
  109                   //Setting Transport Headers
110 Axis2MessageContext axis2smc = (Axis2MessageContext) synCtx;
  111 org.apache.axis2.context.MessageContext axis2MessageCtx =
  112 axis2smc.getAxis2MessageContext();
  113                   Object headers = axis2MessageCtx.getProperty(
  114 org.apache.axis2.context.MessageContext.TRANSPORT_HEADERS);
  115
  116                   if (headers != null && headers instanceof Map) {
  117                       Map headersMap = (HashMap) headers;
  118                       headersMap.put(name, resultValue);
  119                   }
  120                   if (headers == null) {
  121                       Map headersMap = new HashMap();
  122                       headersMap.put(name, resultValue);
  123                       axis2MessageCtx.setProperty(
  124 org.apache.axis2.context.MessageContext.TRANSPORT_HEADERS,
  125                               headersMap);
  126                   }
  127               }


IMO in the code I can see how one can get to various scopes - SCOPE_DEFAULT, SCOPE_AXIS2, SCOPE_CLIENT, SCOPE_TRANSPORT. BUT:
1. default scope:
   89                   synCtx.setProperty(name, resultValue);
synCtx is instance of: org.apache.synapse.MessageContext;
2. other scopes:
for all other scopes 'synCtx' must be instance of org.apache.synapse.core.axis2.Axis2MessageContext. BUT in script mediator (see sample at the top) 'mc' is instance of org.apache.synapse.MessageContext. But it is not an instance of org.apache.synapse.core.axis2.Axis2MessageContext. It is instance of org.apache.synapse.mediators.bsf.ScriptMessageContext so there is not available IMHO key method 'axis2smc.getAxis2MessageContext()'. Is it possible to get to 'axis2smc.getAxis2MessageContext()' different way in script mediator?

Best regards
Standa

Reply via email to