Editing JAVA mapping Code

Hi Experts,
Need your help in editing the JAVA mapping code...I know it would be done by some external tool like Eclipse, netweaver studio..I just need to make a small change in the code and reimport the same in PI mapping.
Can someone help me in providing the steps or an easy way of editing the JAVA mapping archives.
thanks

Hi Smith,
Java mapping code will be bundled in Imported Archive (Imported Archive will contain .class and .java(optional) files). Download imported archive file (zar file)to local disk.
If .java file is not available in Imported Archive :
Open .class file with Java decompiler and copy code to project in  NWDS or Eclipse tool and do required  modifications
If .java file is available in Imported Archive:
copy .java code to project in  NWDS or Eclipse tool and do required  modifications .
Thanks
Hari.

Similar Messages

  • Problem in Uploading Java mapping Code

    Hi Guys,
                  I never work on Java mapping before, i got the code required for my progrmme in these forums.So i saved it as a text file. now i want to import that fileintomy programme as Java class. i think i have to use Netweaver Studio. what exactly i have o do it.
    Thanks in advance.
    Kartik

    Hello Kartik,
    If your code is handling the Required Mapping.Then what is you need to do is  :
    Create the Jar file using any Java IDE (or) use Netweaver developer studio.
    Before creating the u201Cjaru201D file just make sure that the "path" of the class file in the imported archive. It should be the
    same as your "package" path.
    Once the class file is created, we have to create the jar file with all the necessary files. After creating the jar file, it
    has to be deployed to XI.
    Import the Jar file using Imported Archive  in IR under Mapping Objects.
    See this blog it explains how to load :
    Java Mapping (Part III)
    After doing the necessary setps you can test the Mapping.
    regards
    Gangaprasad

  • Java Mapping Code

    Hi....
    I have done java mapping using file to file scenario....
    I have created two data types, two message types, two message interfaces... in imported archives i have imported
    dom4j-1.6.1.zip and itext.jar files..
    i have written my java code like this:
    package com.xmltopdf;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import com.lowagie.text.xml.XmlToPdf;
    public class MyXmlToPdf {
         public MyXmlToPdf(String inputFile, String outputFile){
                   try {
                        XmlToPdf xtp = new XmlToPdf();
                             System.out.println("Ravi");
                        xtp.parse(new FileInputStream(inputFile), new FileOutputStream(outputFile));
                   }catch(Exception e ) {
                        System.out.println(e);
    in message mapping i have invoked "MyXmlToPdf(String,String) constructor like this:
    MyXmlToPdf xmt= MyXmlTOPdf("C:
    source
    filetofile.xml","C:
    source
    file.pdf");
    return "";
    and i have configured my communication channel, reciever determination, sender aggrement, reciver aggrement, and interface determination.....
    so please tell me whether my code is correct or not... if its correct why i am not getting the pdf file.. if its not correct please tell me whats wrong in my code...
    Thanks & Regards
    Ravi Shankar B

    Hi Ravi,
    Normally Java mapping is used to convert an source XML message to target XML message.If your requirement is to generate a PDF file for the source XML try to write a File adapter module at the receiver end to do this job.
    The problem could be your File path. Please check the following:
    1. Did you check your source file C:\source\filetofile.xml is available in <b>XI server</b>?
    2. Try to give the filename like this : <b>C:/source/filetofile.xml</b>
    Please let me know if u need further help.
    Regards,
    Ananth

  • How to edit Java source code of a generated Web Service?

    I generated a Jax RPC (1.4) Web Service using the JDev Wizard . Everything works fine. But now I need to make some changes in the business logic contained in the source code. The problem is there is no easy way to get to the source code - JDeveloper shows the web service but right clicking on it only lets me go to the WSDL or Mapping file - not the Java source.
    So - how do I get to the source.
    I could do a file -> open and open up the java file and edit it - but this seems like a round about way . Why doesn't JDev let me go back to the Source code easily?
    It does provide a Regeneate from Source option but there is no way (as far as I could tell) to actually jump back into the source code after I've generated the Web Service.
    Thanks!

    Hi,
    just to confirm that Jan is ight. If you seect the generated WSDL icon, which is shown in the Application Navigator, open the Structure Window and you'll see all teh generated interfaces and sourcefiles, as well as your WebService file.
    Alternatively you can use teh System navigator which will show all files in one view (ctrl+shift+N)
    Frank

  • Help with java mapping

    PI File adapter has a processing option u2018Empty-Message Handlingu2019 to ignore or Write Empty Files. In case there is no data created after mapping on target side then this option determines whether to write an empty file or not. But there is a catch to this option when it comes to using it with File Content Conversion which is described in SAP Note u2018821267u2019. It states following:
    I configure the receiver channel with File content conversion mode and I set the 'Empty Message Handling' option to ignore. Input payload to the receiver channel is generated out of mapping and it does not have any record sets. However, this payload has a root element. Why does file receiver create empty output file with zero byte size in the target directory?  Example of such a payload generated from mapping is as follows:                                                           
    <?xml version="1.0" encoding="UTF-8"?>                          
    <ns1:test xmlns:ns1="http://abcd.com/ab"></ns1:test>
    solution :
    If the message payload is empty (i.e., zero bytes in size), then File adapter's empty message handling feature does NOT write files into the target directory. On the other hand, if the payload is a valid XML document (as shown in example) that is generated from mapping with just a root element in it, the File Adapter does not treat it as an empty message and accordingly it writes to the target directory. To achieve your objective of not writing files (that have just a single root element) into the target directory, following could be done:
    Using a Java or ABAP Mapping in order to restrict the creation of node itself during mapping. (This cannot be achieved via Message Mapping)
    Using standard adapter modules to do content conversion first and then write file. 
    can someone help with java mapping that can be used in this case?

    Hi,
        You have not mentioned the version of PI you are working in. In case you are working with PI 7.1 or above then here is the java mapping code you need to add after message mapping in the same interface mapping
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.util.Map;
    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 com.sap.aii.mapping.api.AbstractTransformation;
    import com.sap.aii.mapping.api.StreamTransformationException;
    import com.sap.aii.mapping.api.TransformationInput;
    import com.sap.aii.mapping.api.TransformationOutput;
    public class RemoveRootNode extends AbstractTransformation{
         public void execute(InputStream in, OutputStream out)
         throws StreamTransformationException {
    // TODO Auto-generated method stub
    try
         DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
         DocumentBuilder builderel=factory.newDocumentBuilder();
         /*input document in form of XML*/
         Document docIn=builderel.parse(in);
         /*document after parsing*/
         Document docOut=builderel.newDocument();
         TransformerFactory tf=TransformerFactory.newInstance();
         Transformer transform=tf.newTransformer();
         if(docIn.getDocumentElement().hasChildNodes())
              docOut.appendChild(docOut.importNode(docIn.getDocumentElement(),true));
              transform.transform(new DOMSource(docOut), new StreamResult(out));
         else
              out.write(null);
    catch(Exception e)
    public void setParameter(Map arg0) {
    // TODO Auto-generated method stub
    public static void main(String[] args) {
    // TODO Auto-generated method stub
    try{
         RemoveRootNode genFormat=new RemoveRootNode();
         FileInputStream in=new FileInputStream("C:\\apps\\sdn\\rootNode.xml");
         FileOutputStream out=new FileOutputStream("C:\\apps\\sdn\\rootNode1.xml");
         genFormat.execute(in,out);
         catch(Exception e)
         e.printStackTrace();
    public void transform(TransformationInput arg0, TransformationOutput arg1)
              throws StreamTransformationException {
         // TODO Auto-generated method stub
         this.execute(arg0.getInputPayload().getInputStream(), arg1.getOutputPayload().getOutputStream());
    In case you are working in PI 7.0 you can use this code
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.util.Map;
    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 com.sap.aii.mapping.api.StreamTransformation;
    import com.sap.aii.mapping.api.StreamTransformationException;
    public class RemoveRootNode implements StreamTransformation{
         public void execute(InputStream in, OutputStream out)
         throws StreamTransformationException {
    // TODO Auto-generated method stub
    try
         DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
         DocumentBuilder builderel=factory.newDocumentBuilder();
         /*input document in form of XML*/
         Document docIn=builderel.parse(in);
         /*document after parsing*/
         Document docOut=builderel.newDocument();
         TransformerFactory tf=TransformerFactory.newInstance();
         Transformer transform=tf.newTransformer();
         if(docIn.getDocumentElement().hasChildNodes())
              docOut.appendChild(docOut.importNode(docIn.getDocumentElement(),true));
              transform.transform(new DOMSource(docOut), new StreamResult(out));
         else
              out.write(null);
    catch(Exception e)
    public void setParameter(Map arg0) {
    // TODO Auto-generated method stub
    public static void main(String[] args) {
    // TODO Auto-generated method stub
    try{
         RemoveRootNode genFormat=new RemoveRootNode();
         FileInputStream in=new FileInputStream("C:\\apps\\sdn\\rootNode.xml");
         FileOutputStream out=new FileOutputStream("C:\\apps\\sdn\\rootNode1.xml");
         genFormat.execute(in,out);
         catch(Exception e)
         e.printStackTrace();
    The code for PI 7.0 should also work for PI 7.1 provided you use the right jar files for compilation, but vice-versa is not true.
    Could you please let us know if this code was useful to you or not?
    Regards
    Anupam
    Edited by: anupamsap on Dec 15, 2011 9:43 AM

  • Error while doing java mapping

    Hi,
    I have written a java mapping code .But i have a small doubt when i compile it it is showing errors that package com.sap.aii.mapping.api does not exist.How can i solve the problem.Please help me in this issue.
    Thanks,
    Bhargav

    Hi ,
    check this thread, it may help you.
    https://forums.sdn.sap.com/click.jspa?searchID=3558715&messageID=3229273
    Regards,
    Ramesh.

  • UDF in message mapping instead of Java Mapping. Pls advice urgent

    Hi All,
    My scenario
    CRM --- XI -- CRM
    In XI I have to open socket connection.
    Pls refer link:
    /people/saravanakumar.kuppusamy2/blog/2005/12/15/socket-integration-with-xi
    Can Java Mapping code given in above link for socket connection can be used in Message Mapping (CRM -- CRM)UDF?
    Pls advice urgent
    Regards

    Hi Henry,
    I understood your requirement.
    But as per the architecture of XI/PI some message has to trigger your scenario.
    In this case there is no adapter where you can directly communicate with CRM system.
    Do one thing configure a dummy scenario on the sender side.
    Use File adapter for simplicity. once it pools the file with some dummy data in the file it comes to Interface mapping(message mapping) of the PIPELINE steps. Now use the code as you mentioned above(within UDF) for opening socket to CRM system and implement you business logic within that program and write the response to target interface which will infact talk with CRM system.
    Dont forget to do the coding in an infinite loop with some delay (if required). Other wise every time you have to put a message for File Adapter for triggering purposes.
    You can also acheive the same if you use Java Mapping instead of Graphical mapping with UDF(code for Opening socket and business logic). I suggest you to use Java Mapping.
    I dont know how you will comunicate with CRM system on receiver side.?
    Thanks,
    Gujjeti

  • Regarding Java mapping and ABAP Mapping

    Hello,
         If I suppose to do Java mapping or ABAP mapping, Is there any pre requisite to perform these two mappings?
    If exist what they are?
    How to perform them?
    Thank you

    Hello jyotsna,
    Java mapping can be used when you have complex mapping structures.
    We can do most of the times for our requirements through Graphical mapping.
    When the structures are very complex to build you can go for SAX (Simple API for XML) or DOM (Document Object Model) parsers.
    Message mapping internally generates DOM parser.
    Java Mapping in XI
    https://www.sdn.sap.com/irj/sdn/advancedsearch?cat=sdn_all&query=java+mapping&adv=false&sortby=cm_rnd_rankvalue#
    SAP Network Blog: Implementing a Java Mapping in SAP PI
    /people/carlosivan.prietorubio/blog/2007/12/21/implementing-a-java-mapping-in-sap-pi
    Java Mapping (SAP Library - Partner Connectivity Kit)
    http://help.sap.com/saphelp_nw04/helpdata/en/e2/e13fcd80fe47768df001a558ed10b6/frameset.htm
    SAP Network Blog: XI Java Mapping Helper (DOM)
    /people/alessandro.guarneri/blog/2007/03/25/xi-java-mapping-helper-dom
    SAP Network Blog: Testing and Debugging Java Mapping
    /people/stefan.grube/blog/2006/10/23/testing-and-debugging-java-mapping-in-developer-studio
    Binary Conversion in XI - Java Mapping - Code Gallery - Wiki
    https://www.sdn.sap.com/irj/sdn/wiki?path=/display/snippets/binary%2bconversion%2bin%2bxi%2b-%2bjava%2bmapping
    SAP Network Blog: "JAVA MAPPING", an alternate way of reading a CSV file
    /people/rahul.nawale2/blog/2006/07/18/java-mapping-an-alternate-way-of-reading-a-csv-file
    ABAP mappings run on ABAP Stack and are developed in the ABAP workbench of the Integration Server.
    You normally do not need to use the ABAP mappings and is preferable for someone with ABAP programming background. I should say JAVA functions would suffice any complex scenarios.
    refer step by step guides for ABAP Mapping
    ABAP Mapping
    https://www.sdn.sap.com/irj/sdn/advancedsearch?cat=sdn_all&query=abap+mapping&adv=false&sortby=cm_rnd_rankvalue#
    How to Use ABAP Mapping in Exchange Infrastructure 3.0 (NW2004)
    https://www.sdn.sap.com/irj/sdn/go/portal/prtroot/docs/library/uuid/5c46ab90-0201-0010-42bd-9d0302591383
    SAP Network Blog: Testing ABAP Mapping
    /people/sameer.shadab/blog/2005/09/29/testing-abap-mapping
    SAP Network Blog: How to call XI ABAP Mapping via RFC
    /people/ricardoandres.maienza/blog/2007/04/06/how-to-call-xi-abap-mapping-via-rfc
    SAP Network Blog: XI: ABAP mapping logs - more standard = better visibility
    /people/michal.krawczyk2/blog/2006/09/20/xi-abap-mapping-logs--more-standard-better-visibility
    SAP Network Blog: Dynamically sending a mail to the PO creator using XSLT- ABAP Mapping
    /people/rahul.nawale2/blog/2006/11/01/dynamically-sending-a-mail-to-the-po-creator-using-xslt-abap-mapping
    You need to provide the name of your mapping program maually , you see it is an input box.
    just provide the name of abap mapping program it will work.
    and one more thing you cannot test abap mapping program in integration builer you need to test in abap only.
    use tcode: SXI_MAPPING_TEST for testing abap mapping
    Thanks,
    Satya
    Reward points if it is useful..

  • Java skills for XI java mapping

    I don't want to be novice in Java, wanted to know what is the minimum Java knowledge needed for doing medium complex java mapping. I have done C++ programming during grad school, comfortable with ABAP programming. Please point to books to gain "XI java mapping for dummies". I've started with sun tutorial, but it covers all topics which is difficult to achieve in a short period as my intention was to cover as much XI with java skill to do java mapping.  Also I hear SAX and DOM parsers for mapping between source and target in the forum but don't have sufficient background. Thanks in advance

    Hi,
    You can go thro the java mapping code in these blogs:
    Java mapping blog series:
    /people/prasad.ulagappan2/blog/2005/06/29/java-mapping-part-i
    /people/prasad.ulagappan2/blog/2005/06/29/java-mapping-part-ii
    /people/prasad.ulagappan2/blog/2005/06/29/java-mapping-part-iii
    /people/stefan.grube/blog/2006/10/23/testing-and-debugging-java-mapping-in-developer-studio
    /people/rahul.nawale2/blog/2006/07/18/java-mapping-an-alternate-way-of-reading-a-csv-file
    /people/venkataramanan.parameswaran/blog/2006/12/12/java-mapping-to-handle-flat-files-in-sap-xi
    Regarding SAX and DOM there are lot of threads discussing the same issue.
    In Java Mapping Whether to SAX or DOM ?
    Regards,
    P.Venkat

  • Java Mapping/UDF/ABAP mapping to capture payload

    Hi,
    could you please provide me Java mapping code samples (or UDF code) to save payloads of a message based on Message ID
    i have a synchronous scenario where i have payloads in sxmb_moni for request and response with different message IDs. So pelase let me know how to save those request and response payloads to a file.
    it would be great if you provide the stpes to implement and java code samples....if it is possible with ABAP mapping also please let me know te steps.
    Best Regards....SARAN

    Try with this code
    import com.sap.mw.jco.IFunctionTemplate;
    import com.sap.mw.jco.IRepository;
    import com.sap.mw.jco.JCO;
    public class PayloadExtractor {
        // The MySAP.com system we gonna be using
        static final String SID = "SID";
        // The repository we will be using
       IRepository repository;
        JCO.Field msgkeyField;
        public PayloadExtractor() {
            try {
                System.out.println("*** Creating the Pool... ***");
                JCO.addClientPool(SID, 10, "001", "user", "pwd", "EN", "host", "00");
                repository = JCO.createRepository("RecoverRepository", SID);
            } catch (JCO.Exception ex) {
                System.out.println("RecoverXI Caught an exception: \n" + ex);
        // Retrieves and prints information about the remote system
        public void getPayload() {
            // A messageID from your XI/PI
            String key = "48CD01EB3D27021BE1008000C0A8477D";
            final String pipelineID = "CENTRAL";
            byte[] msgkey = key.getBytes();
            try {
                IFunctionTemplate ftemplate = repository.getFunctionTemplate("SXMB_READ_MESSAGE_VERSION_RAW");
                if (ftemplate != null) {
                    System.out.println("*** Creating client and function... ***");
                    JCO.Function function = ftemplate.getFunction();
                    JCO.Client client = JCO.getClient(SID);
                    JCO.Structure struct = function.getImportParameterList().getStructure("MESSAGEKEY");
                    struct.setValue(key, "MSGID");
                    struct.setValue(pipelineID, "PID");
                    // SELECTION must be like this!
                    function.getImportParameterList().getField("SELECTION").setValue("2");
                    // This is the msg version number, where 000 is the first (Inbound); the last can be caught from the function output (see below).
                    // Setting this strongly depends on what you want to get: basically before or after the mapping...
                    function.getImportParameterList().getField("VERSION_REQUEST").setValue("000");
                    System.out.println("*** Calling... ***");
                    client.execute(function);
                    JCO.Table tb = function.getExportParameterList().getTable("MESSAGEPAYLOAD");
                    if (tb.getNumRows() > 0) {
                        // There could be multiple payloads (even if usually it's only one)
                        do {
                            String plstr = new String(tb.getField("PAYLOAD").getByteArray());
                            System.out.println(
                                "*** Payload found *** " + tb.getField("NAME").getString() + " *** BEGIN ***");
                            System.out.println(
                                "Message Last Version: "
                                    + function.getExportParameterList().getField("MAXVERSION").getString());
                            System.out.println(plstr);
                            System.out.println(
                                "*** Payload found *** " + tb.getField("NAME").getString() + " ***  END  ***");
                        } while (tb.nextRow());
                    } else {
                        System.out.println("*** No payload found! ***");
                    // Release the client into the pool
                    JCO.releaseClient(client);
                } else {
                    System.out.println("Function SXMB_READ_MESSAGE_VERSION_RAW not found in backend system.");
            } catch (Exception ex) {
                System.out.println("Caught an exception: \n" + ex);
        protected void cleanUp() {
            System.out.println("*** Cleaning... ***");
            JCO.removeClientPool(SID);
        public static void main(String[] argv) {
            PayloadExtractor e = new PayloadExtractor();
            e.getPayload();
            e.cleanUp();
    -Madhu

  • Using Container Object in Java Mapping

    Hi All,
    I need to use a Container object inside a Java Mapping, just like the one wich is used in the Graphical Mapping.
    Here is the scenario:
    I have an Interface Mapping with three steps on it.
    The first step is a Java Mapping just to put some info in the Container. The second step is a XSLT transformation that uses an XSLT file to transforms from IDOC to xCBL. The third step is another Java Mapping that get the info from the Container and insert in the xCBL.
    Does any one knows how to do it inside the Java Mapping Code? We cannot make modifications in the XSLT file because of some internal restrictions.
    Thanks,

    Hi,
    If you make the container variable is a part of your message (input of Java Mapping) then you can access as normal fields.
    Just have a look at these discussions-
    How to use Container Variable across Maps
    xi 3.0 - Using BPM variables in messages
    Hope this helps,
    Regards,
    Moorthy

  • About Java Mapping

    Hello,
          Can any one explain Java mapping when I am sending PO to reciever system? And what are the necessary requirements? And what are the transction codes we will use for this?
    Plz...........
    Thank you

    Hi,
    Java mapping can be used when you have complex mapping structures.
    We can do most of the times for our requirements through Graphical mapping.
    When the structures are very complex to build you can go for SAX (Simple API for XML) or DOM (Document Object Model) parsers.
    Message mapping internally generates DOM parser.
    Java Mapping in XI
    https://www.sdn.sap.com/irj/sdn/advancedsearch?cat=sdn_all&query=java+mapping&adv=false&sortby=cm_rnd_rankvalue#
    SAP Network Blog: Implementing a Java Mapping in SAP PI
    /people/carlosivan.prietorubio/blog/2007/12/21/implementing-a-java-mapping-in-sap-pi
    Java Mapping (SAP Library - Partner Connectivity Kit)
    http://help.sap.com/saphelp_nw04/helpdata/en/e2/e13fcd80fe47768df001a558ed10b6/frameset.htm
    SAP Network Blog: XI Java Mapping Helper (DOM)
    /people/alessandro.guarneri/blog/2007/03/25/xi-java-mapping-helper-dom
    SAP Network Blog: Testing and Debugging Java Mapping
    /people/stefan.grube/blog/2006/10/23/testing-and-debugging-java-mapping-in-developer-studio
    Binary Conversion in XI - Java Mapping - Code Gallery - Wiki
    https://www.sdn.sap.com/irj/sdn/wiki?path=/display/snippets/binary%2bconversion%2bin%2bxi%2b-%2bjava%2bmapping
    SAP Network Blog: "JAVA MAPPING", an alternate way of reading a CSV file
    /people/rahul.nawale2/blog/2006/07/18/java-mapping-an-alternate-way-of-reading-a-csv-file
    Difference in using java,xslt,message mapping
    /people/prasad.ulagappan2/blog/2005/06/29/java-mapping-part-i
    /people/prasad.ulagappan2/blog/2005/06/29/java-mapping-part-ii
    /people/prasad.ulagappan2/blog/2005/06/29/java-mapping-part-iii
    /people/ravikumar.allampallam/blog/2005/06/24/convert-any-flat-file-to-any-idoc-java-mapping
    /people/amol.joshi2/blog/2006/03/10/think-objects-when-creating-java-mappings
    http://help.sap.com/saphelp_nw04/helpdata/en/e2/e13fcd80fe47768df001a558ed10b6/content.htm
    http://help.sap.com/saphelp_nw04s/helpdata/en/43/09b16006526e72e10000000a422035/frameset.htm
    /people/venkataramanan.parameswaran/blog/2006/12/12/java-mapping-to-handle-flat-files-in-sap-xi
    Thanks
    Swarup

  • Java Mapping with CDATA

    One simplest way is read the data element value as the string and ignore first  six or seven characters by using substring method or so... Use the return value string for parsing the values from respective tag element using parser or manually

    Hi Xinaxu,
    Here is the java mapping code.
    public class Cdata implements StreamTransformation{
         public static void main(String[] args) {
              try{
                   Cdata genFormat=new Cdata();
                   FileInputStream in=new FileInputStream("C:\\Apps\\acm\\cdata.xml");
                   FileOutputStream out=new FileOutputStream("C:\\Apps\\acm\\cdata1.xml");
                   genFormat.execute(in,out);
                   catch(Exception e)
                   e.printStackTrace();
         public void execute(InputStream in, OutputStream out)
                   throws StreamTransformationException {
              try
                   DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
                   DocumentBuilder builderel=factory.newDocumentBuilder();
                   /*input document in form of XML*/
                   Document docIn=builderel.parse(in);
                   /*document after parsing*/
                   Document docOut=builderel.newDocument();
                   TransformerFactory tf=TransformerFactory.newInstance();
                   Transformer transform=tf.newTransformer();
                   Element root,child,child1;
                   root=docOut.createElement("Header");
                   root.setAttribute("xmlns","urn:bp:xi:hr:edm:test:100");
                   NodeList l;
                   Node n;
                   l=docIn.getElementsByTagName("Data");
                   int i,len=l.getLength();
                   String charSet[]={"&lt;","&gt;","&amp;","&apos;","&quot;"};
                   String replaceSet[]={"<",">","&","'","\""};
                   for(i=0;i<len;++i)
                        child=docOut.createElement("Data");
                        if(l.item(i).hasChildNodes())
                             n=l.item(i).getFirstChild();
                             //System.out.println(n.getNodeType());
                             //System.out.println(n.getNodeValue());
                             int j;
                             if(n.getNodeType()==3 && n.getNodeValue().indexOf("CDATA")>=0)
                                  // that means this is Cdata section
                                  //capture data in a string
                                  String s=n.getNodeValue();
                                  /*if you are sure that string contains
                                   * valid xml tags. You can parse
                                   * the tags.First replace
                                   * &lt; with < less than
                                     &gt; with > greater than
                                     &amp; with & ampersand 
                               &apos; with ' apostrophe
                               &quot; with " quotation mark
                               to avoid exceptions
                                  //System.out.println("s="+s);
                                  for(j=0;j<charSet.length;++j)
                                       s=s.replaceAll(charSet[j], replaceSet[j]);
                                  int ll;
                                  ll=s.length();
                                  String a="";
                                  int count=0;
                                  //extract only xml tags from string
                                  for(j=0;j<ll;++j)
                                       if(count<2)
                                            if(s.charAt(j)=='<')
                                                 count++;
                                            if(count<2)
                                                 continue;
                                       a=a+s.charAt(j);
                                  //System.out.println("a="+a);
                                  for(j=a.length()-1,count=0;j>=0;--j)
                                            if(a.charAt(j)=='>')
                                                 count++;
                                            if(count==2)
                                                 break;
                                  if(j>=0)
                                       s=a.substring(0,j+1);
                                  System.out.println(s);
                                  org.xml.sax.InputSource inStream = new org.xml.sax.InputSource();
                                 inStream.setCharacterStream(new java.io.StringReader(s));
                                  DocumentBuilder b=factory.newDocumentBuilder();
                                  Document cdataSection=b.parse(inStream);
                                  child1=(Element) docOut.importNode(cdataSection.getDocumentElement(),true);
                                  child.appendChild(child1);
                             else if(n.getNodeType()==4)
                                  // that means this is Cdata section
                                  //capture data in a string
                                  String s=n.getNodeValue();
                                  /*if you are sure that string contains
                                   * valid xml tags. You can parse
                                   * the tags.  replace invalid characters
                                   * before parsing
                                  for(j=0;j<charSet.length;++j)
                                       s=s.replaceAll(charSet[j], replaceSet[j]);
                                  org.xml.sax.InputSource inStream = new org.xml.sax.InputSource();
                                 inStream.setCharacterStream(new java.io.StringReader(s));
                                  DocumentBuilder b=factory.newDocumentBuilder();
                                  Document cdataSection=b.parse(inStream);
                                  child1=(Element) docOut.importNode(cdataSection.getDocumentElement(),true);
                                  child.appendChild(child1);
                        root.appendChild(child);
                   docOut.appendChild(root);
                   transform.transform(new DOMSource(docOut), new StreamResult(out));
              catch(Exception e)
                   e.printStackTrace();
         public void setParameter(Map arg0) {
              // TODO Auto-generated method stub
    Hope this solves your problem.
    regards
    Anupam

  • XI AF API call failed. Module exception: Java Mapping

    Hi Experts,
    I have faced a typical error for one of my interface. The Scenario is SOAP to SOAP and we are performing SOAP Lookup  before sending the data to Target web service. We are using one Java Mapping  'FileIns_lookupLoad.java --- com/fi/' and performing the SOAP Lookup from within the code. In the Lookup Communication channel we are using 'Axis' as message protocol and passing couple of values through Module Key parameters. We have same ESR and ID objects in Development, Quality and Production (as per Version ID and History).
    Now the problem is Lookup is failing only in Development but Quality and Production is working fine. I have replaced Quality CC URL with the development WSDL URL, but that worked fine. That means Development Web Service is good. We are getting the below error in Dev:
    <SAP:Stack>StreamTransformationException triggered by application mapping program com/fi/FileIns_lookupLoad; Look Up Failed</SAP:Stack>
    Trace : *
    <Trace level="1"
    type="T"> Some Thing Wrong in LookUpError when calling an adapter by using the communication channel CC_IN_SOAP_GEInsuranceLoadLookup1 (Party: , Service: BusService_GE, Object ID: 4214805c52893ef9b0b3f0ef0902fe9e) XI AF API call failed. Module exception: 'while trying to invoke the method org.apache.axis.types.URI.toString() of an object returned from com.sap.xi.XI.Message._30.QualifiedName.getNamespace()'. Cause Exception: 'while trying to invoke the method org.apache.axis.types.URI.toString() of an object returned from com.sap.xi.XI.Message._30.QualifiedName.getNamespace()'. </Trace>
      <Trace level="1" type="T">*** END APPLICATION TRACE ***</Trace>
      <Trace level="1" type="T">Java mapping com/fi/FileIns_lookupLoad has thrown a StreamTransformationException. Thrown: com.sap.aii.mapping.api.StreamTransformationException: Look Up Failed at com.fi.FileIns_lookupLoad.execute(FileIns_lookupLoad.java:282) at com.fi.FileIns_lookupLoad.transform(FileIns_lookupLoad.java:74) at com.sap.aii.ib.server.mapping.execution.JavaMapping.executeStep(JavaMapping.java:92) at com.sap.aii.ib.server.mapping.execution.Mapping.execute(Mapping.java:60) at com.sap.aii.ib.server.mapping.execution.SequenceMapping.executeStep.................................................
    ................................................................................<Trace level="1" type="T">Application mapping program com/fi/FileIns_lookupLoad throws a stream transformation exception: Look Up Failed Thrown: com.sap.aii.ib.core.mapping.execution.ApplicationException: Application mapping program com/fi/FileIns_lookupLoad throws a stream transformation exception: Look Up Failed at com.sap.aii.ib.server.mapping.execution.JavaMapping.executeStep(JavaMapping.java:95) at com.sap.aii.ib.server.mapping.execution.Mapping.execute(Mapping.java:60) at com.sap.aii.ib.server.mapping.execution.SequenceMapping.executeStep(SequenceMapping.java:40) at com.sap.aii.ib.server.mapping.execution.Mapping.execute
    I have already checked with Basis and as per them JDK and Java versions are identical in Dev, QAS and Prod. It seems something is wrong with 'XI AF API' which we are calling from the channel. If we totally ignore Lookup process and send direct data, it is working fine. Target CC is also using Axis.
    Sequence in CC: afreq ->xireq ->wssec2 ->xires ->afres
    For any more information please let me know.
    Thanks,
    Nabendu.

    Hi Anupam,
    The Java Mapping code is same in Dev , QAS and Prod. Also the versions of the JAR is same.
    Please find the code below.
    package com.fi;
    import java.util.HashMap;
    import com.sap.aii.mapping.api.AbstractTrace;
    import com.sap.aii.mapping.api.AbstractTransformation;
    import com.sap.aii.mapping.api.StreamTransformation;
    import com.sap.aii.mapping.api.StreamTransformationConstants;
    import com.sap.aii.mapping.api.MappingTrace;
    import com.sap.aii.mapping.api.StreamTransformationException;
    import com.sap.aii.mapping.api.DynamicConfiguration;
    import com.sap.aii.mapping.api.DynamicConfigurationKey;
    import com.sap.aii.mapping.api.TransformationInput;
    import com.sap.aii.mapping.api.TransformationOutput;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.util.*;
    import javax.xml.parsers.DocumentBuilder;
    import javax.xml.parsers.DocumentBuilderFactory;
    import javax.xml.parsers.ParserConfigurationException;
    import javax.xml.transform.Result;
    import javax.xml.transform.Source;
    import javax.xml.transform.Transformer;
    import javax.xml.transform.TransformerConfigurationException;
    import javax.xml.transform.TransformerException;
    import javax.xml.transform.TransformerFactory;
    import javax.xml.transform.dom.DOMSource;
    import javax.xml.transform.OutputKeys;
    import javax.xml.transform.stream.StreamResult;
    import org.w3c.dom.*;
    import org.w3c.dom.views.AbstractView;
    import org.xml.sax.SAXException;
    import java.io.ByteArrayInputStream;
    import com.sap.aii.mapping.lookup.*;
    /*import com.sap.aii.utilxi.hmis.server.HmisEnvironment.Accessor;
    //import com.sap.aii.utilxi.lock.api.LockServiceException;
    //import com.pmintl.pppimes.RFCLookup.javamapping.*;
    //import java.io.FileInputStream;
    //import java.io.FileOutputStream;*/
    import java.text.DateFormat;
    import java.text.SimpleDateFormat;
    //import java.text.ParseException;
    import java.util.Date;
    import java.io.*;
    public class FileIns_lookupLoad extends AbstractTransformation{
            private Map param = null;
            private AbstractTrace trace = getTrace();
            String senderService = null;
           String inParamChannel = null;
           String inParamBusService = null;
              //3. Each JAVA Mapping using program 7.1 API must implement the method
              // transform(TransformationInput in, TransformationOutput out)
              // as oppose to execute Method in earlier version.
               public void transform(TransformationInput arg0, TransformationOutput arg1) throws StreamTransformationException {
              // TODO Auto-generated method stub
              //4. An info message is added to trace. An instance of trace of object is obtained by calling
              // the getTrace method of class AbstractTransformation
                    inParamChannel = arg0.getInputParameters().getString("COMM_CHANNEL");
                    inParamBusService = arg0.getInputParameters().getString("BUS_SERVICE");
                    getTrace().addInfo("Input Parameter: " + inParamChannel);
                    getTrace().addInfo("Input Parameter: " + inParamBusService);
                    this.execute(arg0.getInputPayload().getInputStream(),
                          arg1.getOutputPayload().getOutputStream());
              //5. Input payload is obtained by using arg0.getInputPayload().getInputStream()
          * @param args
         public static void main(String[] args) {
                // TODO Auto-generated method stub
         public void execute(InputStream in, OutputStream out)
                   throws StreamTransformationException {
              // TODO Auto-generated method stub
              try
                   //Get The Trace
    //               trace = (AbstractTrace)param.get(StreamTransformationConstants.MAPPING_TRACE );
                   trace = getTrace();
                  getTrace().addInfo("Java Mapping Started");
                   DocumentBuilderFactory ifactory = DocumentBuilderFactory.newInstance();
                   DocumentBuilder ibuilder = ifactory.newDocumentBuilder();
                   Document IDoc  = ibuilder.parse(in);
                   Document TDoc = ibuilder.newDocument();
                   String mrnVal = "";
                   trace.addInfo("Preparing Target Doc");
                   Element message = TDoc.createElementNS("urn:Medtronic.com:CATS_Patient_Transactions","n1:Mt_Insurance");
                   Node tRoot = TDoc.appendChild(message);
                   //trace.addInfo(tRoot.getNodeName());
                   Element sRoot = (Element)IDoc.getFirstChild();
                   //trace.addInfo(sRoot.getNodeName());
                   NodeList nl = sRoot.getChildNodes();
               // trace.addInfo("Len"+nl.getLength());
    ////               for(int i=0;i<nl.getLength();i++)
    //                    Node n1 = TDoc.importNode(nl.item(i), true);
    //                    trace.addInfo("Adding Child Nodes");
    //                    trace.addInfo(nl.item(i).getNodeName());
    //                    tRoot.appendChild(n1);
                   NodeList lmrn = sRoot.getElementsByTagName("Mrn");
                   if(lmrn != null)
                        Node n1 = TDoc.importNode(lmrn.item(0), true);
                        Element e1 = (Element)lmrn.item(0);
                        //trace.addInfo(e1.getNodeName());
                        mrnVal = e1.getTextContent();
                        tRoot.appendChild(n1);
                   NodeList lfsc = sRoot.getElementsByTagName("Fsc");
                   if(lfsc != null)
                        for(int i=0;i<lfsc.getLength();i++){
                             Element n1=TDoc.createElement(lfsc.item(i).getNodeName());
                             tRoot.appendChild(n1);
                             Node fieldch = TDoc.createElement("Fields");
                             n1.appendChild(fieldch);
                             NodeList chl = lfsc.item(i).getChildNodes();
                             trace.addInfo("len11"+chl.getLength());
                             for(int j=0;j<chl.getLength();j++){
                                  if(!chl.item(j).getNodeName().equals("FscNumber")&&!chl.item(j).getNodeName().equals("Priority")){
                                       if(chl.item(j).hasChildNodes()){
                                            trace.addInfo(chl.item(j).getNodeName());
                                       Element fscfield = TDoc.createElement("FSCField");
                                       fieldch.appendChild(fscfield);
                                       NodeList FUQl = chl.item(j).getChildNodes();
                                       for(int p =0;p<FUQl.getLength();p++){
                                            //trace.addInfo(" i: "+i+" J: "+j+" P: "+p);
                                            if(FUQl.item(p).getNodeName().equals("FUQNumber")){
                                                 //Node tFUQ = TDoc.createElement("FUQNumber");
                                                 //tFUQ.setTextContent(FUQl.item(p).getTextContent());
                                                 fscfield.setAttribute("FUQNumber", FUQl.item(p).getTextContent());
                                            if(FUQl.item(p).getNodeName().equals("Value")){
                                                 Node tVal = TDoc.createElement("Value");
                                                 tVal.setTextContent(FUQl.item(p).getTextContent());
                                                 fscfield.appendChild(tVal);
                                                 //Node tName = TDoc.createElement("Field");
                                                 //tName.setTextContent(chl.item(j).getNodeName());
                                                 fscfield.setAttribute("Field", chl.item(j).getNodeName());
    //                                   Node fuqch = chl.item(j).getFirstChild();
    //                                   Node valch = fuqch.getNextSibling();
    //                                   if(fuqch!=null){
    //                                        Node tFUQ = TDoc.createElement("FUQNumber");
    //                                        tFUQ.setTextContent(fuqch.getTextContent());
    //                                        fscfield.appendChild(tFUQ);
    //                                   if(valch!=null){
    //                                        Node tVal = TDoc.createElement("Value");
    //                                        tVal.setTextContent(valch.getTextContent());
    //                                        fscfield.appendChild(tVal);
    //                                        Node tName = TDoc.createElement("Filed");
    //                                        tName.setTextContent(chl.item(j).getNodeName());
    //                                        fscfield.appendChild(tName);
                                  else{
                                       //Node numch =TDoc.importNode(chl.item(j), true);
                                       //Element e1 =(Element)n1;
                                       if(chl.item(j).getNodeName().equals("FscNumber")){
                                            n1.setAttribute("Number", chl.item(j).getTextContent());
                                       if(chl.item(j).getNodeName().equals("Priority")){
                                            n1.setAttribute("Priority", chl.item(j).getTextContent());
                             //tRoot.appendChild(lfsc.item(0));
    //                         Element e1 = (Element)lfsc.item(0);
    //                         trace.addInfo(e1.getNodeName());
    //                         mrnVal = e1.getNodeValue();
    /////Start of Look Up Code////
                   //Preparing Input String
                   String lookUpRequest = "<LoadPatientFullInsuranceDetail><Mrn>"+mrnVal+"</Mrn></LoadPatientFullInsuranceDetail>";
                   trace.addInfo("Request");
                   trace.addInfo(lookUpRequest);
                        SystemAccessor acc;
                        Channel channel;
                        Payload lookupResult;     
                        try
                             channel = LookupService.getChannel(inParamBusService, inParamChannel);
                             trace.addInfo("Got the channel");
                             acc = LookupService.getSystemAccessor(channel);
                             trace.addInfo("Got The Channel and Accessor");
                             InputStream ist = new ByteArrayInputStream(lookUpRequest.getBytes());
                             XmlPayload payload = LookupService.getXmlPayload(ist);
                             if(acc != null){
                                  trace.addInfo("Got The Channel and Accessor");
                                  trace.addInfo("Executing The Webservice");
                                  lookupResult = acc.call(payload);
                                  trace.addInfo("End of Executing The Webservice");
                                  trace.addInfo(lookupResult.toString());
                             if(lookUpRequest!=null){
                                  trace.addInfo("Responce is not null");
                                  InputStream rist = lookupResult.getContent();
                                  Document lresDoc = ibuilder.parse(rist);
                                  Node n1 = lresDoc.getFirstChild();
                                  trace.addInfo(n1.getNodeName());
                                  if(n1.getNodeName().endsWith("LoadPatientFullInsuranceDetailResponse"))
                                       Node ch1 = n1.getFirstChild();
                                       trace.addInfo(ch1.getNodeName());
                                       NodeList lookupnl = ch1.getChildNodes();
                                       //trace.add
                                       for(int i=0;i<lookupnl.getLength();i++)
                                            Node n2 = TDoc.importNode(lookupnl.item(i), true);
                                            trace.addInfo("Adding Child Nodes");
                                            trace.addInfo(lookupnl.item(i).getNodeName());
                                            tRoot.appendChild(n2);
                                  else{
                                  throw new StreamTransformationException("Error in Look Up"+n1.getTextContent());
                                   //while(ch1.hasChildNodes() && !ch1.getNodeName().equals("FSCS")){
                             else{
                                  trace.addWarning("Responce is null");
                                 throw new LookupException();
                        catch(LookupException le)
                             trace.addWarning("Some Thing Wrong in LookUp"+le.getMessage());
                             throw new StreamTransformationException("Look Up Failed");                         
                           Transformer transformer = TransformerFactory.newInstance().newTransformer();
    //                       StreamResult reqResult = new StreamResult(new StringWriter());
                           DOMSource source = new DOMSource(TDoc);
                           Result result = new StreamResult(out);
                           transformer.transform(source,result);
              catch(StreamTransformationException ste)
               throw new StreamTransformationException(ste.getMessage());
              catch(Exception e){
                   trace.addInfo(e.getMessage());
              finally{

  • How to Cache Data  from database for java mapping ?

    Hi
      I have a scenario where  i have to dynamically query  a huge table in some other database from java mapping code.
    Therefore instead of making a new Database trip everytime is there a mechanism by which i can cache the entire table contents into XI first and then use this cache for looking up data through my java mapping.
    Any other alternative also welcome which would give best performance.
    Please Suggest
    regards
    Nilesh Taunk.

    Hi Nilesh,
    I am not sure if you can actually cache the table in XI. You will have to look up directly from your Database everytime your mapping excecutes.
    To perform DB lookup during mapping very efficiently, I would suggest that you take a look at this blog,
    /people/siva.maranani/blog/2005/08/23/lookup146s-in-xi-made-simpler
    Also, instead of doing the DB look up in mapping, you can also use your JDBC adapter as a sender and collect the information you want from your DB,
    If you are using your JDBC as a sender, then your JDBC will poll over your database and select the rows that satisfy your Select Query. Also, there is another field in your JDBC adapter that is very important and that is the Update satatement. Once your JDBC adapter executes your select query and selects rows from the database, you might not need those rows to be selected again. In this csse, you can use the Update statement to update the database.
    http://help.sap.com/saphelp_nw04/helpdata/en/7e/5df96381ec72468a00815dd80f8b63/content.htm
    http://help.sap.com/saphelp_nw04/helpdata/en/2e/96fd3f2d14e869e10000000a155106/content.htm
    The choice between a JDBC sender adapter , and the DB lookup will have to be on the basis of your requirements.
    Regards,
    Bhavesh

Maybe you are looking for