cancel
Showing results for 
Search instead for 
Did you mean: 

CPI: Groovy[HashMap] Data Retrieval Issue

07-07-2022 1:30 PM
babruvahana Contributor
2065 views 4 comments Go to solution
SAP Managed Tags
Subscribe

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

Accepted Solutions (1)

Accepted Solutions (1)

babruvahana
Contributor
0 Likes

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

Answers (2)

Answers (2)

YuvrajKarwar
Explorer

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;
}
babruvahana
Contributor

Hi yu7777 ,

Thanks for your response. I have tried it. Unfortunately, it is failing with NullPointerException.

YuvrajKarwar
Explorer

Hello Pavan,

Updated script. Check if condition. Hope this helps!