How to convert list of list response of wso2 aggregate mediator into single list

Viewed 153

I tried to convert my list of list aggregate response into single list. I tried with js script mediator. but its not support, since i have very big data lists.

this is my iterate and aggregate function.

   <iterate id="iterate-over-users" expression="json-eval($.pages)">
        <target sequence="backendcall-seqence" />
    </iterate>
    <aggregate id="iterate-over-users">
        <completeCondition>
            <messageCount min="-1" max="-1" />
        </completeCondition>
        <onComplete expression="json-eval($.rawData)" sequence="out-sequence">
            <respond />
        </onComplete>
   </aggregate>

my out-sequence is,

<script language="js">
        <![CDATA[
        data = JSON.parse(mc.getProperty("data"))
        res = [];
        data = mc.getPayloadJSON();
        for (i = 0; i < data.length; i++) {
            res=res.concat(data[i]);
        }
        mc.setPayloadJSON(res);
        ]]>
    </script>
    <property expression="json-eval($.)" name="data" scope="default" />

when data lis is very big it will throw and array from js function.

ERROR {org.apache.synapse.mediators.bsf.ScriptMediator} - The script engine returned an Exception executing the external js script : null function mediate java.lang.IllegalArgumentException: out of range index
    at org.mozilla.classfile.ClassFileWriter.add(ClassFileWriter.java:579)
    at org.mozilla.classfile.ClassFileWriter.addLoadConstant(ClassFileWriter.java:647)
    at org.mozilla.classfile.ClassFileWriter.addPush(ClassFileWriter.java:884)
    at org.mozilla.javascript.optimizer.Codegen.emitConstantDudeInitializers(Codegen.java:1038)
    at org.mozilla.javascript.optimizer.Codegen.generateCode(Codegen.java:321)
    at org.mozilla.javascript.optimizer.Codegen.compileToClassFile(Codegen.java:166)
    at org.mozilla.javascript.optimizer.Codegen.compile(Codegen.java:75)
    at org.mozilla.javascript.Context.compileImpl(Context.java:2377)
    at org.mozilla.javascript.Context.compileReader(Context.java:1296)
    at org.mozilla.javascript.Context.compileReader(Context.java:1268)
    at org.mozilla.javascript.Context.evaluateReader(Context.java:1107)
    at com.sun.phobos.script.javascript.RhinoScriptEngine.eval(RhinoScriptEngine.java:172)
    at com.sun.phobos.script.javascript.RhinoScriptEngine.eval(RhinoScriptEngine.java:198)
    at javax.script.AbstractScriptEngine.eval(AbstractScriptEngine.java:264)
    at org.apache.synapse.mediators.bsf.ScriptMediator.processJSONPayload(ScriptMediator.java:417)
    at org.apache.synapse.mediators.bsf.ScriptMediator.mediateForInlineScript(ScriptMediator.java:389)
    at org.apache.synapse.mediators.bsf.ScriptMediator.invokeScript(ScriptMediator.java:290)
    at org.apache.synapse.mediators.bsf.ScriptMediator.mediate(ScriptMediator.java:258)
    at org.apache.synapse.mediators.AbstractListMediator.mediate(AbstractListMediator.java:109)
    at org.apache.synapse.mediators.AbstractListMediator.mediate(AbstractListMediator.java:71)
    at org.apache.synapse.mediators.base.SequenceMediator.mediate(SequenceMediator.java:158)
    at org.apache.synapse.mediators.eip.aggregator.AggregateMediator.completeAggregate(AggregateMediator.java:512)
    at org.apache.synapse.mediators.eip.aggregator.AggregateMediator.mediate(AggregateMediator.java:351)
    at org.apache.synapse.mediators.AbstractListMediator.mediate(AbstractListMediator.java:109)
    at org.apache.synapse.mediators.filters.SwitchMediator.mediate(SwitchMediator.java:194)
    at org.apache.synapse.mediators.base.SequenceMediator.mediate(SequenceMediator.java:267)
    at org.apache.synapse.core.axis2.Axis2SynapseEnvironment.mediateFromContinuationStateStack(Axis2SynapseEnvironment.java:807)
    at org.apache.synapse.core.axis2.Axis2SynapseEnvironment.injectMessage(Axis2SynapseEnvironment.java:305)
    at org.apache.synapse.core.axis2.SynapseCallbackReceiver.handleMessage(SynapseCallbackReceiver.java:578)
    at org.apache.synapse.core.axis2.SynapseCallbackReceiver.receive(SynapseCallbackReceiver.java:195)
    at org.apache.axis2.engine.AxisEngine.receive(AxisEngine.java:180)
    at org.apache.synapse.transport.passthru.ClientWorker.run(ClientWorker.java:284)
    at org.apache.axis2.transport.base.threads.NativeWorkerPool$1.run(NativeWorkerPool.java:172)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:748)

my backend response is something like,

{
   "a":"a",
   "b":"b",
   "rawData":[
     {'a1':12,'b1':'sd'},
    {'a1':12,'b1':'sd'}
    ]
}

after aggregate my responce issomthing like,

[
[{'a1':12,'b1':'sd'},
        {'a1':12,'b1':'sd'}],
[{'a1':12,'b1':'sd'},
        {'a1':12,'b1':'sd'}],
[{'a1':12,'b1':'sd'},
        {'a1':12,'b1':'sd'}]
]

but i need response is,

[
{'a1':12,'b1':'sd'},
        {'a1':12,'b1':'sd'},
{'a1':12,'b1':'sd'},
        {'a1':12,'b1':'sd'},
{'a1':12,'b1':'sd'},
        {'a1':12,'b1':'sd'}]

please anyone can help me.

1 Answers

Here no need to ise script mediator. because we can simply convert list of list into single list using expression,

json-eval($.AllData[*][*])

here AllData is the key of your list of list.

Related