Getting principal data as null in Adapter Module

Hello Everyone,
I am trying to work with Attachments in my Module.
The Scenario I have configured is that I have a Sender File Adapter, which picks up 2 files one as body and the second as attachment :
https://www.sdn.sap.com/irj/sdn/weblogs?blog=/pub/wlg/1685 [original link is broken] [original link is broken] [original link is broken] [original link is broken]
In my Module I want to put the content of the attachment file into the main payload but the following line of Code returns a null value
Message msg = (Message)moduledata.getPrincipalData();
I can see the data in this case is present as Supplementary Data but the Principal Data in the moduledata is null.
Is this expected behavior in this case / all case where we would have attachments in the payload or something is wrong in the Configurations?
Can somebody clear my doubt as to what is exactly contained in the Principal Data and what is contained in the Supplementary Data ?
Any help will be greatly appreciated.
Best Regards,
Kanwaljit

Hi Kanwaljit,
I haven't tried to pull attachments, but I use the following code successfully to get the XI message. It looks equivalent to what you're doing. Have you already manipulated the message before this point, using another module. Maybe you've swapped the principal and supplementary data?
     public ModuleData process(ModuleContext moduleContext, ModuleData inputModuleData)
          throws ModuleException {
          Object obj = null;
          Message msg = null;
          try {
               obj = inputModuleData.getPrincipalData();
               msg = (Message) obj;
          } catch (Exception e) {
               ModuleException me = new ModuleException(e);
               throw me;
I would look in the JavaDocs for the com.sap.aii.af.mp.module.ModuleData class to see what's available. This SAP Help page tells where to find the JavaDocs.
http://help.sap.com/saphelp_nw2004s/helpdata/en/32/43d84072378031e10000000a1550b0/content.htm
Thanks,
J Wolff

Similar Messages

  • Get/set message interface name in adapter module

    Hello,
    From an adapter module, I'd like to get or even set the Message Interface name of the message that is handed over to the function "process" of the adapter module.
    I've got two context's, sessioncontext and modulecontext. With both contexts, you can get values from that context. I'm not sure which context has the message interface name of the message currently being processed, and I'm also not sure what that value is called (moduleContext.getContextData("name");).
    The reason for this is that sometimes you'd like to do something different depending on the type of message being processed.
    If anyone knows how to do this, I'd be glad to hear.
    Thanks in advance for any advice!
    Greetings, Walter.

    Hi Walter,
    It is fairly easy to get the interface name. When you have extracted the XIMessage there is a parameter, which allows you get the Action, where you can get the interface name.
    I have tried to change the interface name. You need to create a new message an copy the content from the old message over to this. This is a little tricky and I'm not able to get any code samples for you.
    /daniel

  • How to get file name in adapter module

    Hi all
    Is it possible to get the file name in a adapte module? If so how can I achieve this?

    Hi,
    Check below thread. it shows code for file name.
    [Re: Query regarding Adapter Module development]
    -Gouri

  • How to read Sender Interface name in adapter Module in PI 7.31

    Hello All,
    I am working on Adapter module .it accomplish to generate file with message id,message key ,sent time,received time,FromService(Business system names),toServiece(Business system name),sender interface name,receiver interface name .
    i got all details in my file by calling module data by method get principal data,but i am fail to get sender interface in that file .
    can you please guide me how to get sender interface name in adapter module.
    I am getting some information from this following blogs
    https://scn.sap.com/thread/1583665
    How to read Sender Interface name in Adapter module
    but i am facing same error what they faced.
    Please guide me to how to get sender interface name in adapter module.
    Thanks
    Ganesh

    Hi Ganesh
    Write a module in the sender adapter and use this piece of code
    Message mes = null;
    mes = (Message) inputModuleData.getPrincipalData();
    String SI = mes.getAction().getName();
    Also you can read the same by creating a UDF in message mapping
    Following is the code
    InputHeader inputHeader = container.getInputHeader();
    String SI = inputHeader.getInterface() ;

  • Testing Adapter Module in NWDS

    hi,
    I have got a code for adapter module,I wanted to test it standalone using NWDS.
    class XML2EdifactBean
    public ModuleData process(ModuleContext moduleContext, ModuleData inputModuleData)
              throws ModuleException { //Some Code... }
    I am getting some error while executing the adapter module ,so I want to call the function using main method.Can you provide me with a sample code for this.
    regards,
    Ujjwal Kumar.

    This would be too complex to do all necessary steps for a stand alone test.
    I recommend to split the generic adapter module stuff and the part, you really want to do something.
    For the adapter modul, which we used on Teched session:
    GetHostName.java code for 3.0/7.0
    I did following: I introduced a helper class and passed the DOM code
    public class HelperClass {
         String hostElementName = "host";
         String hostName = "host";
        public static void main(String[] args) {
            try {
                InputStream in = new FileInputStream(new File("in.xml"));
                OutputStream out = new FileOutputStream(new File("out.xml"));
                new HelperClass().execute(in, out);
            } catch (Exception e) {
                e.printStackTrace();
        public void setHostElementName(String hostElementName){
             this.hostElementName = hostElementName;
        public void setHostName(String hostName){
             this.hostName = hostName;
        public void execute(InputStream in, OutputStream out){
             try  {
                  DocumentBuilderFactory factory;
            factory = DocumentBuilderFactory.newInstance();
            DocumentBuilder builder = factory.newDocumentBuilder();
            Document document = builder.parse(in);
            Element rootNode = document.getDocumentElement();
            if(rootNode != null)  {
                Element childElement =
                document.createElement(hostElementName);
                childElement.appendChild(document.createTextNode(hostName));
                rootNode.appendChild(childElement);
            // Transforming the DOM object to Stream object.
            TransformerFactory tfactory = TransformerFactory.newInstance();
            Transformer transformer = tfactory.newTransformer();
            Source src = new DOMSource(document);
            Result dest = new StreamResult(out);
            transformer.transform(src,dest);
             } catch(Exception e){}
    in the bean class, I used the helper class:
         XMLPayload xmlpayload = msg.getDocument();
                InputStream in = xmlpayload.getInputStream();
                ByteArrayOutputStream out = new ByteArrayOutputStream();
                HelperClass hc = new HelperClass();
                hc.setHostElementName(hostElementName);
                hc.setHostName(hostName);
                hc.execute(in,out);
                byte[] docContent = out.toByteArray();
                if(docContent != null)  {
                    xmlpayload.setContent(docContent);
                    inputModuleData.setPrincipalData(msg);
    Now I can test the parser in the NWDI
    Regards
    Stefan

  • How to get the sent date in Adapter Module

    Hi
    How to get Sent Date in Adapter Module. I have used message.getSentTime(). But i am getting in 1179051733406 format is there any way to change this format.
    Is there any other way to get the date when file sending.?
    Is it possible to get Soap Header data Run Time xml file elements (<SAP:Date>) in SXMB_MONI into my Adapter Module.
    Please Help Me
    Best Regards
    Ravi Shankar B

    Is it possible to get Soap Header data Run Time xml file elements (<SAP:Date>) in SXMB_MONI into my Adapter Module.?
    Hi ravi, if you enable Adapter specific Message Attributes in your Adapter CC,(Source File TimeStamp), you can access the same in your ADapter code as a dynamic configuration
    Regards
    krishna

  • Dummy XML not getting generated from empty file by J2EE adapter module

    Hi All,
    i know when XI gets an empty input text file, it does not generate a send message for it in sender communication channel.
    in my scenario, if i get a file with data, i have to generate an XML message for it using file content conversion - this i have done...........
    but if i get an empty text file, then i have to generate a dummy XML send message for it for my BPM.......
    So i made a J2EE adapter module to generate dummy xml for empty file.....<b>when i give a file with data in it, then my adapter module is called..... but when i give an empty file, then my adapter module is not called</b>.........
    <b><i>Can anybody suggest why the module processor is not invoking my customer-adapter module when an empty file is given.............but the module processor is invoking my customer-adapter module when a file with data is given</i>.</b>
    Thanks,
    Rajeev Gupta

    Hi Amit,
    Below is the code of process method which i used:
    <i>public ModuleData process(ModuleContext moduleContext,
      ModuleData inputModuleData)
        throws ModuleException
    Object obj;
    Message msg_audit;
    AuditMessageKey amk;
    try
    File f = new File("/components/XITEMP/sample/PWC/check.txt");
    PrintStream ps;
    if (f.canWrite())
    FileOutputStream fos =new FileOutputStream(f);
    ps = new PrintStream(fos);  
    ps.println("Testing");
    ps.close();
    fos.close(); 
    else
      f = new File("/components/XITEMP/sample/PWC/check4.txt");
      if (f.exists() ==false)
      f.createNewFile();
    obj = inputModuleData.getPrincipalData();
    if (obj!=null)
    msg_audit = (Message)obj;
    amk = new AuditMessageKey(msg_audit.getMessageId(),AuditDirection.OUTBOUND);
    Audit.addAuditLogEntry(amk,AuditLogStatus.SUCCESS,"FileCheck: Module called");
    else
      String str = new String();
    String str1 = new String();     
                  str1="<?xml version=\"1.0\" encoding=\"utf-8\" ?>";
                 str1+="<ns:MT_PWC_RECORD xmlns:ns=\"urn://PWC_SR3_01/PWC/Customer\">";
             str1+="<RECORD_SET>";     
                 str1+="<RECORD>";
             str1+="<RECORD_DATA>BLANK_FILE</RECORD_DATA>";
             str1+="</RECORD>";
             str1+="</RECORD_SET>";
             str1+="</ns:MT_PWC_RECORD>";     
    str=str1; 
    inputModuleData.setPrincipalData(str);
    catch(Exception e)
    try
    File f = new File("/components/XITEMP/sample/PWC/check.txt");
    PrintStream ps;
    if (f.canWrite())
      FileOutputStream fos =new FileOutputStream(f);
      ps = new PrintStream(fos);  
      ps.println(e.toString());
      ps.close();
      fos.close(); 
    catch(Exception ex)
    return inputModuleData;
       }</i>
    in the above methood, i  used file operations at start just to see whether the module is getting invoked or not...so when i give a data file, then the file operations are performed and messages are written in audit log.........but when i give an empty file, then the file operations are not performed - meaning the module is not getting invoked........
    Thanks,
    Rajeev Gupta

  • ModuleData.getPrincipalData returns null in the adapter module development

    Hi gurus,
    i am doing a test on the adapter module development following an article written by William Li:
    http://www.sdn.sap.com/irj/scn/go/portal/prtroot/docs/library/uuid/f0ac06cf-6ee2-2c10-df98-e17430ca5949?QuickLink=index&overridelayout=true
    my problem is after the EJB has been deployed, it seems that the return of inputModuleData.getPrincipalData() is always null which makes the program can not get the xml payload from the framework.
    the main process of the example has been simplified like this:
         public ModuleData process(ModuleContext moduleContext, ModuleData inputModuleData) throws ModuleException {
              Object           obj = null;
              try {
              obj = inputModuleData.getPrincipalData();
              Message     msg1 = (Message) obj;          
                    XMLPayload xmlpayload = msg1.getDocument();}          
              catch (Exception e) {
                   ModuleException me = new ModuleException(e);
                   throw me;
              return inputModuleData;
    after deployed, i get the following error in the adapter monitor of RWB: (my JNDI is testtest)
    17.02.2012 17:13:44.643 Information Send binary file  "test8.xml" from FTP server "10.18.48.150:/encrypt_test/", size 206 bytes with QoS EO
    17.02.2012 17:13:44.644 Information MP: processing local module localejbs/CallSapAdapter
    17.02.2012 17:13:44.644 Information Application attempting to send an XI message asynchronously using connection File_http://sap.com/xi/XI/System
    17.02.2012 17:13:44.645 Information Trying to put the message into the send queue
    17.02.2012 17:13:44.648 Information MP: processing local module localejbs/testtest
    17.02.2012 17:13:44.648 Error MP: exception caught with cause java.lang.NullPointerException: while trying to invoke the method com.sap.engine.interfaces.messaging.api.Message.getDocument() of an object loaded from local variable 'msg1'
    whereas if the code has been changed like this:
         public ModuleData process(ModuleContext moduleContext, ModuleData inputModuleData) throws ModuleException {
              Object           obj = null;
              try {
                   obj = inputModuleData.getPrincipalData();
                   Message     msg1 = (Message) obj;     
                   if (obj != null )
                        XMLPayload xmlpayload = msg1.getDocument();
              catch (Exception e) {
                   ModuleException me = new ModuleException(e);
                   throw me;
              return inputModuleData;
    the file can be read by the file adapter.
    i just quite confused that why the return of the getPrincipalData() is null? where is the problem? thanks
    Edited by: Stephen Xue on Feb 17, 2012 5:22 AM

    I'm gonna reply to myself here. I changed the processing sequence of the adapter modules in the  in the FileSender channel so that my module comes first then CallSapAdapter. Then getPrincipalData() contains the message.
    Hope this helps someone else.

  • File adapter modules : Access to file data before content conversion

    I have a file sender channel for which content conversion in applied. The incoming file has data in comma separated values format.
    e.g.
    102366,Amol Joshi,DEPT1
    107752,XYZ PQR,DEPT2
    I want to access the the actual data in the file before content conversion takes place. Is it possible to access this data inside the adaper module? I tried creating an adapter module and put it before CallSAPAdapter,it still gets the XML after content conversion as the input data to the module.
    Any pointers?

    Hi Amol,
    I dont know if it is the right approach.
    But if u r not able to meet ur requirement u can do one work around.
    Use Message Transformation Bean to convert it once again in to CSV (flat file structure) and then proceed with ur module.
    There should be a better way than this.
    Hope we could find a better solution in the forum.
    Regards,
    Sudharshan

  • Creation of flat data in Adapter Module

    Hello,
    I'm writing an Adapter Module that supposed to convert XML source to a flat output (similar to StrictXml2PlainBean). But I'm not sure how to set the new flat content to the Message object that I'm getting from ModuleData supplied to process method of module bean. There is a method setDocument but it only accepts XMLPayload when I need TextPayload.
    Can someone give the code snippet or refer to some blog where it is explained?
    Also is there a source code for StrictXml2PlainBean?
    Thanks,
    Maxim.

    Modules are a means of editing and manipulating the data in between the message entering or leaving  the adapter. So you will receive an XML payload and you HAVE to return and XML playload only to the adapter. If you want to convert it to flat file, you need to use file adapter as your receiver and use fcc parameters to do that.
    VJ

  • J2EE adapter module not getting invoked by module processor

    Hi All,
    i have deployed my .ear file in SDM Repository successfully.
    but my J2EE adapter module is not getting invoked by module processor......this i can say because i have written code to audit log my message in the java class...but when i gave input an empty file, the audit log of that file in Message Audit Log showed only 3 Steps of file converted to XML format, no data found so not generating message, deletion of my empty file.
    Can anybody suggest how to enable my J2EE adapter module as i have created this module so that if i give empty file, then in the adapter i am creating a dummy XML for my message.
    Thanks and Regards,
    Rajeev Gupta

    Hi Stefan,
    1. JNDI name in visual admin is CustomerMeter
    2. the files in .ear file are:
    libraries,
    ejb project file,
    META-INF folder
    in ejb project file the following files are there:
    ejb-j2ee-engine.xml
    ejb-jar.xml
    CustomerMeter.class
    Please tell what to do now.
    Hi Amol,
    in audit log only 3 messages are coming: File converted to XML format, no data in document  so not sending message, deleting of empty file.
    i have given audit log statements in java class but my audit-log statements are not coming in the audit log
    this means my adapter module is not getting invoked.
    Please tell what to do to correct this error.
    Thanks and Regards,
    Rajeev Gupta

  • Getting Hashcode of a file in an Adapter Module

    Hi all
    Does anybody know to dynamically get the hashcode of a file in an Adapter Module.

    Hi Michal
    contentToString()
              String serialization for logging purposes.
    getPrincipalData()
              Retrieves the current principle data, usually the message
    getSupplementalData(String name)
              Gets one supplement data value.
    getSupplementalDataNames()
              Returns the names of all currently existing supplement data.
    setPrincipalData(Object principalData)
              Sets the principle data that represents usually the message to be processed.
    setSupplementalData(String name, Object supplementalData)
              Sets a supplement data for the rest of the module chain
    this all methods I can see. Can u please elaborate a bit

  • Adapter moduler in file adapter receiver - get Target Directory from param

    Hi everybody,
    We are in PI 7.1
    I need in an adapter module (file adapter receiver) to access to the Target Directory comming from parameters
    I foound the code in a weblog
    /people/sap.user72/blog/2005/07/15/copy-a-file-with-same-filename-using-xi
    Here is the code I found
    public ModuleData process(
              ModuleContext moduleContext,
              ModuleData inputModuleData)
              throws ModuleException {
              Object obj = null;
              Message msg = null;
              try {
                   Channel ch = new Channel(moduleContext.getChannelID());
                   obj = inputModuleData.getPrincipalData();
                   msg = (Message) obj;
                   XMLPayload xmlpayload = msg.getDocument();
                   String path = ch.getValueAsString("file.targetDir");
                   if (!path.endsWith("
    ") && !path.endsWith("/"))                    
                             if(path.indexOf("
    ")!=-1)
                                  path+="
                             else
                                  path += "/";
                   if (xmlpayload != null) {
                        convert(xmlpayload.getContent(), path);
                   inputModuleData.setPrincipalData(msg);
              } catch (Exception e) {}
              return null;
         private void convert(byte[] bs, String path) throws Exception {
              String bs_out = new String(bs);
              String filename =
                   bs_out.substring(
                        bs_out.indexOf("<FileName>") + 10,
                        bs_out.lastIndexOf("</FileName>"));
              bs_out =
                   bs_out.substring(
                        bs_out.indexOf("<Base64>") + 8,
                        bs_out.lastIndexOf("</Base64>"));
              byte bb[] = com.sap.aii.utilxi.base64.api.Base64.decode(bs_out);
              File f1 = new File(path + filename);
              FileOutputStream fos = new FileOutputStream(f1);
              fos.write(bb);
              fos.close();
    The object Channel come s from the package import com.sap.aii.af.service.cpa.Channel;
    The jar is in the build path (com.sap.aii.af.service.cpa.jar);
    When I write in NWDS
    Channel ch = new Channel(moduleContext.getChannelID());
    NDWS gives me an error "Cannot instantiate the type Channel".
    Can somebody help me about that, please?
    Does that code dosn't work in pi 7.1?
    Thanks in Advance for your help.
    Best Regards.
    E. Koralewski
    Edited by: Eric Koralewski on Feb 3, 2011 1:40 PM

    > When I write in NWDS
    > Channel ch = new Channel(moduleContext.getChannelID());
    > NDWS gives me an error "Cannot instantiate the type Channel".
    it should be:
    Channel ch = (Channel) LookupManager.getInstance().getCPAObject(CPAObjectType.CHANNEL, moduleContext.getChannelID());
    (taken from sample module ConvertCRLFfromToLF)
    http://help.sap.com/javadocs/pi/pi711sp03/index.html?com/sap/aii/af/service/cpa/Channel.html
    Edited by: Stefan Grube on Feb 3, 2011 2:02 PM

  • Get/set message Queue ID in PI 7.1 Adapter module

    Hello,
    I have a special requirment to  get and set message Queue ID in PI 7.1 adapter module.
    I tried to use the method setConversationID  for the Message Class, but this doest seem to available any more.
    Any pointers to which class and method can be used.
    Thanks in advance
    Regards,
    Abhishek

    Hi, try [setSequenceId|http://help.sap.com/javadocs/pi/pi711sp03/com/sap/engine/interfaces/messaging/api/Message.html#setSequenceId(java.lang.String)]. Maybe you have to use setDeliverySemantics before in order to set EOIO.
    regards, Martin

  • Get poll interval parameter from adapter module

    Hi,
    I'd like to make special treatment in my adapter module based on the "poll interval" information filled in Processing Parameters part of the adapter configuration.
    Can an adapter module access this information?
    regards
    Yann

    Hi Yann,
    >>>>Can an adapter module access this information?
    of course it can you just have to use
    a correct parameter's name
    check this post to get the java code
    Re: Access the URL Parameter from a Adaptermodule
    Regards,
    michal
    <a href="/people/michal.krawczyk2/blog/2005/06/28/xipi-faq-frequently-asked-questions"><b>XI / PI FAQ - Frequently Asked Questions</b></a>

Maybe you are looking for

  • Change shopping cart status to reject when older than certain period

    Hi Guru's, I'm new to this environment. Please help me with advice and sample code for the following. I need to check if shopping cart is open for more than 20 days then change status to reject, daily background job. Then need to inform user of new s

  • Media Browser

    when the program opens,                                         It is not showing the media browser area Also to drag and drop area.

  • How to import jsf  hello world project in eclipse

    Hi , I m inam, have downloaded a jsf hello world project from www.mkyong.com, and trying to import that into eclipse ide, but not able to import, Please help me,and specify the steps, so that i could feel relax,i m too eager to know the solution to t

  • How do I move and install Lightroom 5 onto another comupter?

    I have Lightroom 5 installed on a laptop (Windows 7), but want to get the program downloaded to a new desktop that runs on Windows 8. The videos are great, but cover copying photo files, and don't explain the best way to get Lightroom downloaded to a

  • My InDesign

    Hello, In InDesign CC, how do I change the language from German to English? I have downloaded the creative cloud, installed the programs and now they are all in German. I did not see a function to select English. Many thanks, almartin000