Hi Experts,
My requirement is to replace all the userId with personIdExternal EmpEmployement API. Considering performance, I don't want to use looping process call with splitter as there more than 5L+ userIds. So I am fetching all the userIds from EmpEmployement API initiating the HashMap and retrieving it for the target structure.
Step:1 Source XMl will be the body
<EmpEmployment>
<EmpEmployment>
<compInfoNav>
<EmpCompensation>
<employmentNav>
<EmpEmployment>
<personIdExternal>11111</personIdExternal>
</EmpEmployment>
</employmentNav>
<userId>1</userId>
</EmpCompensation>
</compInfoNav>
<userId>1</userId>
</EmpEmployment>
<EmpEmployment>
<compInfoNav>
<EmpCompensation>
<employmentNav>
<EmpEmployment>
<personIdExternal>22222</personIdExternal>
</EmpEmployment>
</employmentNav>
<userId>2</userId>
</EmpCompensation>
</compInfoNav>
<userId>2</userId>
</EmpEmployment>
<EmpEmployment>
<compInfoNav>
<EmpCompensation>
<employmentNav>
<EmpEmployment>
<personIdExternal>33333</personIdExternal>
</EmpEmployment>
</employmentNav>
<userId>3</userId>
</EmpCompensation>
</compInfoNav>
<userId>3</userId>
</EmpEmployment>
<EmpEmployment>
<compInfoNav>
<EmpCompensation>
<employmentNav>
<EmpEmployment>
<personIdExternal>44444</personIdExternal>
</EmpEmployment>
</employmentNav>
<userId>4</userId>
</EmpCompensation>
</compInfoNav>
<userId>4</userId>
</EmpEmployment>
</EmpEmployment>
Step:2 Initiate the HashMap
import com.sap.gateway.ip.core.customdev.util.Message;
import java.util.HashMap;
import groovy.xml.*;
import java.util.regex.*;
import java.io.*;
def Message processData(Message message) {
def body = message.getBody(java.io.Reader);
HashMap<String, String> hmap1 = new HashMap<String, String>();
map = message.getProperties();
def Root = new XmlSlurper().parse(body);
Root.EmpEmployment.each{
try{
hmap1.put((it.userId.toString()), it.compInfoNav.EmpCompensation.employmentNav.EmpEmployment.personIdExternal.toString())
}
catch(Exception ex){
//do nothing, skip the Stringrecord
}
}
message.setProperty("hashmapOutput", hmap1);
return message;
}
Step:3 Target Body
<Root>
<Records>
<Target_UserIDs>
<BANK_ID>1</BANK_ID>
</Target_UserIDs>
<Target_UserIDs>
<BANK_ID>2</BANK_ID>
</Target_UserIDs>
<Target_UserIDs>
<BANK_ID>3</BANK_ID>
</Target_UserIDs>
<Target_UserIDs>
<BANK_ID>4</BANK_ID>
</Target_UserIDs>
<Target_UserIDs>
<BANK_ID>4</BANK_ID>
</Target_UserIDs>
<Target_UserIDs>
<BANK_ID>5</BANK_ID>
</Target_UserIDs>
</Records>
<Records>
<Access_UserIDs>
<BANK_ID>1</BANK_ID>
</Access_UserIDs>
<Access_UserIDs>
<BANK_ID>2</BANK_ID>
</Access_UserIDs>
</Records>
</Root>
Step:4 Retrieve the HashMap and replaces all the userId with personIdExternal
import com.sap.gateway.ip.core.customdev.util.Message;
import java.util.HashMap;
import groovy.xml.*;
import java.util.regex.*;
import java.io.*;
def Message processData(Message message) {
def body = message.getBody(java.lang.String);
map = message.getProperties();
HashMap hmap1 = map.get("hashmapOutput");
def Root = new XmlParser().parseText(body);
Root.Records.each{r->r.BANK_ID =
hmap1.get(r.BANK_ID.toString())}
message.setBody(XmlUtil.serialize(Root));
return message;
}
Expected Output:
<Root>
<Records>
<Target_UserIDs>
<BANK_ID>11111</BANK_ID>
</Target_UserIDs>
<Target_UserIDs>
<BANK_ID>22222</BANK_ID>
</Target_UserIDs>
<Target_UserIDs>
<BANK_ID>33333</BANK_ID>
</Target_UserIDs>
<Target_UserIDs>
<BANK_ID>44444</BANK_ID>
</Target_UserIDs>
<Target_UserIDs>
<BANK_ID>44444</BANK_ID>
</Target_UserIDs>
<Target_UserIDs>
<BANK_ID></BANK_ID>
</Target_UserIDs>
</Records>
<Records>
<Access_UserIDs>
<BANK_ID>11111</BANK_ID>
</Access_UserIDs>
<Access_UserIDs>
<BANK_ID>22222</BANK_ID>
</Access_UserIDs>
</Records>
</Root>
Any leads will be really helpful.
Regards,
Pavan
Help others by sharing your knowledge.
AnswerRequest clarification before answering.
Hi Yuvraj,
Thanks a lot for your response. I appreciate your effort and time for this.
I had to deliver this and felt the nested xml structure is creating confusion for me in the code. So gave myself a try with HashMapping in after final stage of mapping. So, I changed a bit which is working fine now.
Step:3 Final Mapping Structure
<?xml version="1.0" encoding="UTF-8"?>
<Root>
<Records>
<PERMISSION>PERMISSION</PERMISSION>
<BANK_ID>1</BANK_ID>
<GLOBALSTAFFID>1</GLOBALSTAFFID>
<IS_ADMIN>Y</IS_ADMIN>
<ADMIN_NAME>AAAAA</ADMIN_NAME>
<NULL/>
<EOL>Y</EOL>
</Records>
<Records>
<PERMISSION>PERMISSION</PERMISSION>
<BANK_ID>2</BANK_ID>
<GLOBALSTAFFID>2</GLOBALSTAFFID>
<IS_ADMIN>Y</IS_ADMIN>
<ADMIN_NAME>BBBBB</ADMIN_NAME>
<NULL/>
<EOL>Y</EOL>
</Records>
<Records>
<PERMISSION>PERMISSION</PERMISSION>
<BANK_ID>3</BANK_ID>
<GLOBALSTAFFID>3</GLOBALSTAFFID>
<IS_ADMIN>Y</IS_ADMIN>
<ADMIN_NAME>CCCCC</ADMIN_NAME>
<NULL/>
<EOL>Y</EOL>
</Records>
<Records>
<PERMISSION>PERMISSION</PERMISSION>
<BANK_ID>4</BANK_ID>
<GLOBALSTAFFID>4</GLOBALSTAFFID>
<IS_ADMIN>Y</IS_ADMIN>
<ADMIN_NAME>DDDDD</ADMIN_NAME>
<NULL/>
<EOL>Y</EOL>
</Records>
<Records>
<PERMISSION>PERMISSION</PERMISSION>
<BANK_ID>5</BANK_ID>
<GLOBALSTAFFID>5</GLOBALSTAFFID>
<IS_ADMIN>Y</IS_ADMIN>
<ADMIN_NAME>EEEEE</ADMIN_NAME>
<NULL/>
<EOL>Y</EOL>
</Records>
<Records>
<PERMISSION>PERMISSION</PERMISSION>
<BANK_ID>2</BANK_ID>
<GLOBALSTAFFID>2</GLOBALSTAFFID>
<IS_ADMIN>Y</IS_ADMIN>
<ADMIN_NAME>FFFFF</ADMIN_NAME>
<NULL/>
<EOL>Y</EOL>
</Records>
</Root>
Step: 4 Final Code
import com.sap.gateway.ip.core.customdev.util.Message;
import java.util.HashMap;
import groovy.xml.*;
import java.util.regex.*;
import java.io.*;
def Message processData(Message message) {
def body = message.getBody(java.lang.String);
def map = message.getProperties();
def hmap1 = map.get("hashmapOutput");
def Root = new XmlParser().parseText(body);
Root.Records.each{r->r.BANK_ID[0].value =
hmap1.get(r.BANK_ID[0].text().toString())}
Root.Records.each{r->r.GLOBALSTAFFID[0].value =
hmap1.get(r.GLOBALSTAFFID[0].text().toString())}
message.setBody(XmlUtil.serialize(Root));
return message;
}
Final Output after HashMapping:
<?xml version="1.0" encoding="UTF-8"?><Root>
<Records>
<PERMISSION>PERMISSION</PERMISSION>
<BANK_ID>11111</BANK_ID>
<GLOBALSTAFFID>11111</GLOBALSTAFFID>
<IS_ADMIN>Y</IS_ADMIN>
<ADMIN_NAME>AAAAA</ADMIN_NAME>
<NULL/>
<EOL>Y</EOL>
</Records>
<Records>
<PERMISSION>PERMISSION</PERMISSION>
<BANK_ID>22222</BANK_ID>
<GLOBALSTAFFID>22222</GLOBALSTAFFID>
<IS_ADMIN>Y</IS_ADMIN>
<ADMIN_NAME>BBBBB</ADMIN_NAME>
<NULL/>
<EOL>Y</EOL>
</Records>
<Records>
<PERMISSION>PERMISSION</PERMISSION>
<BANK_ID>33333</BANK_ID>
<GLOBALSTAFFID>33333</GLOBALSTAFFID>
<IS_ADMIN>Y</IS_ADMIN>
<ADMIN_NAME>CCCCC</ADMIN_NAME>
<NULL/>
<EOL>Y</EOL>
</Records>
<Records>
<PERMISSION>PERMISSION</PERMISSION>
<BANK_ID>44444</BANK_ID>
<GLOBALSTAFFID>44444</GLOBALSTAFFID>
<IS_ADMIN>Y</IS_ADMIN>
<ADMIN_NAME>DDDDD</ADMIN_NAME>
<NULL/>
<EOL>Y</EOL>
</Records>
<Records>
<PERMISSION>PERMISSION</PERMISSION>
<BANK_ID>null</BANK_ID>
<GLOBALSTAFFID>null</GLOBALSTAFFID>
<IS_ADMIN>Y</IS_ADMIN>
<ADMIN_NAME>EEEEE</ADMIN_NAME>
<NULL/>
<EOL>Y</EOL>
</Records>
<Records>
<PERMISSION>PERMISSION</PERMISSION>
<BANK_ID>22222</BANK_ID>
<GLOBALSTAFFID>22222</GLOBALSTAFFID>
<IS_ADMIN>Y</IS_ADMIN>
<ADMIN_NAME>FFFFF</ADMIN_NAME>
<NULL/>
<EOL>Y</EOL>
</Records>
</Root>
Regards,
Pavan
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
Hello Pavan,
Change your script as below :
import com.sap.gateway.ip.core.customdev.util.Message;
import java.util.HashMap;
import groovy.xml.*;
import java.util.regex.*;
import java.io.*;
def Message processData(Message message) {
def body = message.getBody(java.lang.String);
map = message.getProperties();
HashMap hmap1 = map.get("hashmapOutput");
def Root = new XmlParser().parseText(body);
Root.Records.each{r->
if (hmap1.containsKey(r.BANK_ID)){
r.BANK_ID[0].value = hmap1.get(r.BANK_ID.toString())}
}
message.setBody(XmlUtil.serialize(Root));
return message;
}
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
Hello Pavan,
Updated script. Check if condition. Hope this helps!
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
| User | Count |
|---|---|
| 4 | |
| 4 | |
| 4 | |
| 3 | |
| 2 | |
| 2 | |
| 2 | |
| 2 | |
| 2 | |
| 2 |
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.