שימוש במדיאטור Iterate
כאשר נדרש לרוץ על רשימת אובייקטים שאנו מקבלים ב-Payload ולבצע כל פעולה שאינה מצריכה שינוי ב-Payload עצמו – נרצה להשתמש במדיאטור שנקרא Iterate.
זאת בניגוד למדיאטור של foreach, דרכו ניתן לרוץ על אובייקטים ולשנות את ה-payload עצמו בלבד.
נראה דוגמה עם Payload שאנו מקבלים –
'{
"Signers": {
"Signer": [
{
"employeePositionScope": "0.5",
"employeeJobScope": "1",
"employeeFirstName": "ששון",
"employeeLastName": "גבאי",
"employeeWeeklyHours": "40",
"employeePhoneNumber": "0520000000",
"employeeProfessionalLevel": "7",
"employeeEmail": "[email protected]",
"employeeId": "123456789",
"employeeCity": "הוד השרון",
"employeeWeeklyDays": "5",
"employeeEducationInstitute": "מכללת ייל"
},
{
"employeePositionScope": "0.8",
"employeeJobScope": "1.1",
"employeeFirstName": "ישראל",
"employeeLastName": "ישראלי",
"employeeWeeklyHours": "48",
"employeePhoneNumber": "0540000000",
"employeeProfessionalLevel": "3",
"employeeEmail": "[email protected]",
"employeeId": "234567890",
"employeeCity": "כפר סבא",
"employeeWeeklyDays": "6",
"employeeEducationInstitute": "מכללת אורט"
}
]
}
}'
בדוגמה לעיל נוכל לראות שני אובייקטים שנמצאים בתוך ה-jSON, כל אובייקט מכיל את אותם השדות עם נתונים אחרים.
כעת, על מנת שנוכל לרוץ על כל אובייקט בנפרד ולבצע פעולות כאלו ואחרות, נשתמש במדיאטור של iterate.
<iterate expression="json-eval($.Signers.Signer)" id="DataRows">
<target>
<sequence>
<property expression="//employeeFirstName/text()" name="employeeFirstName" scope="default" type="STRING"/>
<property expression="//employeeLastName/text()" name="employeeLastName" scope="default" type="STRING"/>
<property expression="//employeeId/text()" name="employeeId" scope="default" type="STRING"/>
<property expression="//employeeEmail/text()" name="employeeEmail" scope="default" type="STRING"/>
<property expression="//employeeEducationInstitute/text()" name="employeeEducationInstitute" scope="default" type="STRING"/>
<property expression="//employeeCity/text()" name="employeeCity" scope="default" type="STRING"/>
<property expression="//employeeProfessionalLevel/text()" name="employeeProfessionalLevel" scope="default" type="STRING"/>
<property expression="//employeePositionScope/text()" name="employeePositionScope" scope="default" type="STRING"/>
<property expression="//employeeWeeklyHours/text()" name="employeeWeeklyHours" scope="default" type="STRING"/>
<property expression="//employeeWeeklyDays/text()" name="employeeWeeklyDays" scope="default" type="STRING"/>
<property expression="//employeeJobScope/text()" name="employeeJobScope" scope="default" type="STRING"/>
<property expression="//employeePhoneNumber/text()" name="employeePhoneNumber" scope="default" type="STRING"/>
<sequence key="dhContinuousEmploymentPayload"/>
<sequence key="dhCreateFlowFromTemplate"/>
</sequence>
</target>
</iterate>
שימו לב כי בהגדרת ה-iterate, כדי להגיע לאובייקטים בדוגמה שקיבלנו ב-payload לעיל, צריך להגדיר את כל הנתיב – כלומר תחת Signers ואז תחת Signer.
כעת נשמור את כל ה-Properties שרלוונטים לפרויקט שלנו ובסיום נצא החוצה ל-Sequences אחרים שמבצעים פעולות כלשהן. (במקרה שלנו, יציאה ל-Sequence שנקרא 'dhContinuousEmploymentPayload' מבצע הכנה של ה-payload החדש עבור שליחה ל-Doxi, וה-Sequence שנקרא'dhCreateFlowFromTemplate' מבצע הפעלה של השימוש במתודה createFlowFromTemplate ב-Doxi.