Wednesday, January 23, 2013

For Each Action In OSB


I was replying to OTN  forum post regarding OSB For each action at :


So thought of writing it down to make it more clear.....

  1. I have made xml based proxy service.



2. I assumed the payload would be 

<request>
<CompanyCollection>
<company>
<name>name1</name>
</company>
<company>
<name>name2</name>
</company>
</CompanyCollection>
<CompanyCollection>
<company>
<name>name3</name>
</company>
<company>
<name>name4</name>
</company>
</CompanyCollection>
</request>

3. Assigned $body to companycollreq ( user defined variable) using Assign action
    
4. To keep a count of companycollection elemennt in the  request payload
   Assign count($companycollreq/request/CompanyCollection) to  companyCount
   


5. Now use a for each action to iterate over companycollection
    For each expression would like as:
   For Each variable companycoll   in ./request/CompanyCollection of variable  companycollreq 
   Indexed by variable currIndex with total count in variable  companycount


6.  Under Do 
      I am logging the companycollection element based upon the currindex count in for loop.
      This is important as we need to pass payload under iteration in for loop. 

     Assign $companycollreq/request/CompanyCollection[xs:int($currIndex)] in log action with annotation 
     of companycoll

Now Testing is done with above payload.


In Console logs obtained:



This is how for each action works.
Log action runs twice as companycollection count was two in payload passed.
In place of log action we can use service callout/Publish/Java callout .
The payload passed must contain currIndex as xquery predicates expression while passing value to other services being called from for loop.