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