Input request :

[
{
   "id" : "1",
"make" : "TAHB"
},
{
"id" : "2",
"make" : "Tonda"
},
{
"id" : "3",
"make" : "Tamsung"
}
]


I am using iterate, to send each element of above array as request to a
backend service( In myactual project this is not so simple service i.e. its
reponse is very complex with lots of arrays and sub-arrays(child arrays)in
it . for better understanding of issue I kept it like this ).

The responses of the backend service are aggregated in one soap xml by
AggregateMediator.

Below is response from AggregateMediator

<?xml version='1.0' encoding='utf-8'?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/";>
<soapenv:Body>
<Information>
<jsonObject>
<id>3</id>
<name>Mobile</name>
<model>S8</model>
</jsonObject>
<jsonObject>
<id>2</id>
<name>Car</name>
<model>Tmaze</model>
</jsonObject>
<jsonObject>
<id>1</id>
<name>Home</name>
<area>5000sqft</area>
</jsonObject>
</Information>
</soapenv:Body>
</soapenv:Envelope>

I want to enrich above response from AggregateMediator like below using
input request.
i.e. I want to merge input request and output of backend service.(id is
common between them.)


<?xml version='1.0' encoding='utf-8'?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/";>
<soapenv:Body>
<Information>
<jsonObject>
<id>3</id>
<name>Mobile</name>
<model>S8</model>
<make>Tamsung</make>
</jsonObject>
<jsonObject>
<id>2</id>
<name>Car</name>
<model>Tmaze</model>
<make>Tonda</make>
</jsonObject>
<jsonObject>
<id>1</id>
<name>Home</name>
<area>5000sqft</area>
<make>TAHB</make>
</jsonObject>
</Information>
</soapenv:Body>
</soapenv:Envelope>


I kept input request array in a property before calling backend services
and was able to access it in response flow.
but the problem is both request and response are arrays. How could I run
two foreach on two different arrays simultaneously and also match their id
before updating each array element of response.

Please find attachments.
<?xml version="1.0" encoding="UTF-8"?>
<api context="/foreschTest" name="foreachTest" xmlns="http://ws.apache.org/ns/synapse";>
    <resource methods="POST GET" uri-template="/hi">
        <inSequence>
            <log level="full"/>
            <log level="custom">
                <property expression="//jsonArray" name="message"/>
            </log>
            <property expression="//jsonArray" name="req" scope="default" type="STRING"/>
            <foreach expression="//jsonArray/jsonElement" id="Loop">
                <sequence>
                    <property expression="get-property('Loop_FOREACH_COUNTER')" name="countid" scope="default" type="STRING"/>
                    <!-- <enrich>
                        <source clone="true" property="INCOMING_REQUEST" type="property"/>
                        <target type="body"/>
                    </enrich>
                    <enrich>
                        <source clone="true" type="inline">
                            <id xmlns="">Y</id>
                        </source>
                        <target action="sibling" xpath="//jsonElement"/>
                    </enrich>  -->
                    <!--<enrich>
					    <source clone="true" type="property" property="INCOMING_REQUEST"></source>
					    <target action="replace" type="body"></target>
					</enrich>   -->
                    <!-- Temporily commented   <enrich>
                        <source clone="true" type="inline">
                            <uniqueId xmlns="">Y</uniqueId>
                        </source>
                        <target action="child" xpath="//jsonElement/data[2]"/>
                    </enrich>
                    <enrich>
                        <source clone="true" property="countid" type="property"/>
                        <target xpath="//jsonElement/data[2]/uniqueId"/>
                    </enrich>  -->
                    <log level="custom">
                        <property expression="get-property('countid')" name="mgs7"/>
                    </log>
                    <log description="" level="custom">
                        <property expression="get-property('Loop_FOREACH_ORIGINAL_MESSAGE')" name="mgs5"/>
                        <property expression="get-property('Loop_FOREACH_COUNTER')" name="mgs6"/>
                        <property expression="//jsonElement" name="msg8"/>
                    </log>
                    <log description="" level="custom">
                        <property expression="//jsonElement/data[0]" name="msg9"/>
                        <property expression="//jsonElement/data[1]" name="msg10"/>
                        <property expression="//jsonElement/data[2]" name="msg11"/>
                    </log>
                </sequence>
            </foreach>
            <iterate expression="//jsonArray/jsonElement" id="1">
                <target>
                    <sequence>
                        <log level="custom">
                            <property name="msg2" value="&quot;Inside iterate&quot;"/>
                        </log>
                        <log level="full"/>
                        <send>
                            <endpoint key="modifyAgrRespEP"/>
                        </send>
                    </sequence>
                </target>
            </iterate>
        </inSequence>
        <outSequence>
            <property name="info" scope="default">
                <Information xmlns=""/>
            </property>
            <aggregate id="1">
                <completeCondition>
                    <messageCount max="-1" min="-1"/>
                </completeCondition>
                <onComplete enclosingElementProperty="info" expression="//jsonObject">
                    <log level="custom">
                        <property name="msg3" value="&quot;Inside Aggr&quot;"/>
                    </log>
                    <log level="full"/>
                    <foreach expression="//Information/jsonObject">
                        <sequence>
                            <log level="custom">
                                <property name="msg4" value="&quot;Inside Foreach&quot;"/>
                            </log>
                            <property expression="$body" name="agr" scope="default" type="STRING"/>
                            <log level="custom">
                                <property expression="get-property('agr')" name="agr"/>
                            </log>
                            <!--    <log level="full"/>  -->
                        </sequence>
                    </foreach>
                </onComplete>
            </aggregate>
        </outSequence>
        <faultSequence/>
    </resource>
</api>
<?xml version="1.0" encoding="UTF-8"?>
<api context="/mod" name="modifyAgrRes" xmlns="http://ws.apache.org/ns/synapse";>
    <resource methods="POST GET" uri-template="/aggr">
        <inSequence>
            <log level="custom">
                <property name="message" value="&quot;Inside Modify Service *************************&quot;"/>
            </log>
            <log level="custom">
                <property expression="//jsonObject" name="location"/>
            </log>
            <switch source="//jsonObject/id">
                <case regex="1">
                    <enrich>
                        <source clone="true" type="inline">
                            <name xmlns="">Home</name>
                        </source>
                        <target action="child" xpath="//jsonObject"/>
                    </enrich>
                    <enrich>
                        <source clone="true" type="inline">
                            <area xmlns="">5000sqft</area>
                        </source>
                        <target action="child" xpath="//jsonObject"/>
                    </enrich>
                </case>
                <case regex="2">
                    <enrich>
                        <source clone="true" type="inline">
                            <name xmlns="">Car</name>
                        </source>
                        <target action="child" xpath="//jsonObject"/>
                    </enrich>
                    <enrich>
                        <source clone="true" type="inline">
                            <model xmlns="">Amaze</model>
                        </source>
                        <target action="child" xpath="//jsonObject"/>
                    </enrich>
                </case>
                <case regex="3">
                    <enrich>
                        <source clone="true" type="inline">
                            <name xmlns="">Mobile</name>
                        </source>
                        <target action="child" xpath="//jsonObject"/>
                    </enrich>
                    <enrich>
                        <source clone="true" type="inline">
                            <model xmlns="">S8</model>
                        </source>
                        <target action="child" xpath="//jsonObject"/>
                    </enrich>
                </case>
                <default/>
            </switch>
            <log level="custom">
                <property expression="//jsonObject" name="msg20"/>
            </log>
            <enrich>
	            <source clone="true" xpath="//jsonObject"/>
	            <target type="body"/>
	         </enrich>
            <!-- <enrich>
                <source clone="true" type="inline">
                    <name xmlns="">Y</name>
                </source>
                <target action="child" xpath="//jsonElement/data[2]"/>
            </enrich>
            <enrich>
                <source clone="true" property="countid" type="property"/>
                <target xpath="//jsonElement/data[2]/uniqueId"/>
            </enrich> -->
            <log level="full"/>
            <respond/>
        </inSequence>
        <outSequence>
            <send/>
        </outSequence>
        <faultSequence/>
    </resource>
</api>
_______________________________________________
Dev mailing list
[email protected]
http://wso2.org/cgi-bin/mailman/listinfo/dev

Reply via email to