Blogs

Madan Agrawal

Enhanced Receiver Determination using JAVA Mapping (DOM Parser)
Madan Agrawal
Business Card
Company: Fujitsu Consulting
Posted on Jul. 02, 2009 11:20 PM in Java Programming, SAP Process Integration (PI)

Subscribe.Subscribe
Print. Print
Permalink Permalink

Have you ever wondered how to configure the receivers dynamically at run time when the input is a complex flat file which can not be converted to XML file? Yes it is possible. We can use JAVA mapping using DOM parser to achieve this.

 

  1. Create a JAVA Mapping using DOM parser to create the Receiver List dynamically
  2. Create Enhanced Receiver Determination with Interface mapping which refers to the JAVA mapping created in step 1.

 

Step1:

To create a receiver list dynamically we need to use the standard Message Type named “Receivers”. The message type “Receivers” is available under SCV “SAP BASIS” and namespace “http://sap.com/xi/XI/System”.

 

 

image

 

Inside JAVA Mapping we will use the DOM parser to create the desired structure of “Receivers” and also to populate the values in the field “Service”.

 

The sample java code using DOM parser is given below.

package SR_SAP2VAN_RD_Package;

 

import java.io.BufferedReader;

import java.io.BufferedWriter;

 

import java.io.InputStream;

import java.io.InputStreamReader;

import java.io.OutputStream;

import java.io.OutputStreamWriter;

import java.util.HashMap;

import java.util.Map;

 

 

import com.sap.aii.mapping.api.StreamTransformationConstants;

import com.sap.aii.mapping.api.StreamTransformation;

import com.sap.aii.mapping.api.StreamTransformationException;

 

import javax.xml.parsers.DocumentBuilder;

import javax.xml.parsers.DocumentBuilderFactory;

 

import javax.xml.transform.Transformer;

import javax.xml.transform.TransformerFactory;

import javax.xml.transform.dom.DOMSource;

import javax.xml.transform.stream.StreamResult;

 

 

import org.w3c.dom.Document;

import org.w3c.dom.Element;

import org.w3c.dom.Text;

 

 

 

 

public class SR_SAP2VAN_RD_Class implements StreamTransformation {

private Map param = null;

public void setParameter (Map param) {

this.param = param;

if (param == null) {

this.param = new HashMap();

}

}

public void execute(InputStream inStream, OutputStream

outStream) throws StreamTransformationException

{

     

try{

 

BufferedReader in = new BufferedReader(new InputStreamReader(inStream));

BufferedWriter out = new BufferedWriter(new      OutputStreamWriter(outStream));

 

 

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();

DocumentBuilder builder = factory.newDocumentBuilder();

 

 

// Create the output DOM

 

Document docOut = builder.newDocument();

 

Element node1 = docOut.createElement("Receivers");

docOut.appendChild(node1);

 

node1.setAttribute("xmlns", "http://sap.com/xi/XI/System");

                 

String strLine;

String File_in_1,File_in_2,File_out_1,File_out_2;

int Flag = 0;

 

   

String senderService = (String) param.get(StreamTransformationConstants.SENDER_SERVICE);

    

while ((strLine = in.readLine()) != null)

 

{

if ((strLine.substring(0,7)).equals("E2EDL24") && Flag == 0)

{

if ((strLine.substring(199,203)).equals("BR18") || (strLine.substring(199,203)).equals("BR1F") )

{

                 

Element node2 = docOut.createElement("Receiver");

node1.appendChild(node2);

                                                           

Element node3 = docOut.createElement("Service");

node2.appendChild(node3);

                                         

if (senderService.equals("BS_SAP_D"))

{

Text node3_1Text = docOut.createTextNode("BS_SAP_D");

node3.appendChild(node3_1Text);                                                                

}

if (senderService.equals("BS_SAP_Q"))

{

Text node3_2Text = docOut.createTextNode("BS_SAP_Q");

node3.appendChild(node3_2Text);                                                                

}                                                          

if (senderService.equals("BS_SAP_P"))

{

Text node3_3Text = docOut.createTextNode("BS_SAP_P");

node3.appendChild(node3_3Text);                                                                

}

                                         

Element node4 = docOut.createElement("Receiver");

node1.appendChild(node4);

                 

Element node5 = docOut.createElement("Service");

node4.appendChild(node5);

 

if (senderService.equals("BS_SAP_D"))

{

Text node5_1Text = docOut.createTextNode("BS_VAN_D");

node5.appendChild(node5_1Text);                                                                

}

if (senderService.equals("BS_SAP_Q"))

{

Text node5_2Text = docOut.createTextNode("BS_VAN_Q");

node5.appendChild(node5_2Text);                                                                

}                                                          

if (senderService.equals("BS_SAP_P"))

{

Text node5_3Text = docOut.createTextNode("BS_VAN_P");

node5.appendChild(node5_3Text);                                                                

}

                                                     

                                                                             

Flag = 1;

}

else

{

      Element node6 = docOut.createElement("Receiver");

node1.appendChild(node6);

                 

Element node7 = docOut.createElement("Service");

node6.appendChild(node7);

 

Text node7Text = docOut.createTextNode("Business_Service_SAP");

node7.appendChild(node7Text);

Flag = 1;

}

     

}

 

}   

 

if (Flag == 0)

{

Element node6 = docOut.createElement("Receiver");

node1.appendChild(node6);

                 

Element node7 = docOut.createElement("Service");

node6.appendChild(node7);

 

Text node7Text = docOut.createTextNode("Business_Service_SAP");

node7.appendChild(node7Text);

Flag = 1;

}

                       

                                                     

// transform the new xml to the output stream

TransformerFactory tf = TransformerFactory.newInstance();

Transformer transform = tf.newTransformer();

transform.transform(new DOMSource(docOut), new StreamResult(out));

}

 catch (Exception e)

{

  e.printStackTrace();

}

   

}

}

 

 

We need to import the library “aii_map_api.jar” in our JAVA package “SR_SAP2VAN_RD_Package”.

The jar file is available in the following XI server folders

“j2ee\cluster\server0\apps\sap.com\com.sap.xi.services”

 

The above java mapping will build receivers dynamically based on input file.

 

In Integration Repository, we have to import the JAVA mapping as an Imported Archive.

 

 

image

 

Now we have to create an Interface Mapping for it.

 

image

Step 2:

In Receiver determination, choose the type of Receiver determination as “Extended” and then use the interface mapping created in step 1.

 

 

image

 

 

 

Madan Agrawal is a SAP Certified PI Consultant for Fujitsu.


Add to: del.icio.us | Digg | Reddit


Comment on this articleSAP XI, PI, JAVA Mapping, DOM Parser
Comment on this weblog
Showing messages 1 through 1 of 1.

Titles Only Full Threads Oldest First

  • Groovy could maybe simplify the mapping
    2009-07-03 06:29:22 Daniel Graversen Business Card [Reply]

    Hi Madan,


    Great example on how to create XML from flat files. You might have a look at my blog about groovy mappings https://www.sdn.sap.com/irj/scn/weblogs?blog=/pub/wlg/14926. It could simplify the coding a bit.


    I also noticed that the sender service is copies down to node3 unchanged. This could probably simplify the mapping a bit.


    /daniel


Showing messages 1 through 1 of 1.