Skip to Content
Author's profile photo srikanth kakani

Dynamic Directory Using Adapter module in SAP PI (Generic)

Sometimes we might have requirement in such a way that we need to send the files to different customer folders in one FTP server based on the file name.

Dyndir.jpg

We can easily handle this requirement with an UDF if a Message mapping is involved in the scenario.

But what about the scenarios which have simple file transformation of files with extension as .pdf , .xls , .csv etc…

In this case we can’t go for UDF’s as no mapping is involved.

Here I have a simple and generic solution for this problem.

By using custom adapter module we can place the file dynamically in a specific target directory based on the file name.

Below are the required configurations to be done:

Communication channel configurations:

/wp-content/uploads/2013/09/1_dyd_274229.jpg

Select the ASMA parameters

/wp-content/uploads/2013/09/2_274227.jpg

/wp-content/uploads/2013/09/3_274192.jpg

Java code for Adapter Module:

package com.sap.adaptermodule;

import java.rmi.RemoteException;

import javax.ejb.EJBException;
import javax.ejb.SessionBean;
import javax.ejb.SessionContext;
import javax.ejb.Timer;
import com.sap.aii.af.lib.mp.module.Module;
import com.sap.aii.af.lib.mp.module.ModuleContext;
import com.sap.aii.af.lib.mp.module.ModuleData;
import com.sap.aii.af.lib.mp.module.ModuleException;
import com.sap.engine.interfaces.messaging.api.Message;
import com.sap.engine.interfaces.messaging.api.MessageKey;
import com.sap.engine.interfaces.messaging.api.MessagePropertyKey;
import com.sap.engine.interfaces.messaging.api.PublicAPIAccessFactory;
import com.sap.engine.interfaces.messaging.api.auditlog.AuditAccess;
import com.sap.engine.interfaces.messaging.api.auditlog.AuditLogStatus;
import com.sap.tc.logging.Location;

/**
 * @author Srikanth
 *
 */
public class DynamicDirectoryBean implements SessionBean, Module {
                public static final String VERSION_ID ="$Id://tc/aii/30_REL/src/_adapters/_sample/java/user/module/DynamicFileName.java#1 $";
               
               
                public ModuleData process(ModuleContext moduleContext, ModuleData inputModuleData)
                throws ModuleException {
                                Location location = null;
                                AuditAccess audit = null;
                                String filename = null;
                                String dynamicpath = null;
                                String filename1 = null;
                                String filename2= null;
                                String filename3= null;
                                String filename4= null;
                                String filename5= null;
                                String filename6= null;
                                String filename7= null;
                                String filename8= null;
                                String filename9= null;
                                                               
                                String filepath1= null;
                                String filepath2= null;
                                String filepath3= null;
                                String filepath4= null;
                                String filepath5= null;
                                String filepath6= null;
                                String filepath7= null;
                                String filepath8= null;
                                String filepath9= null;
               
                                Object obj = null;
                                Message msg = null;
                                MessageKey key = null;
                                MessagePropertyKey inpfile=null;
                                MessagePropertyKey dir = null;
                               
                                try{
                                                obj = inputModuleData.getPrincipalData();
                                               msg = (Message) obj;
            key = new MessageKey(msg.getMessageId(), msg.getMessageDirection());
            audit = PublicAPIAccessFactory.getPublicAPIAccess().getAuditAccess();
            // creating object for audit log
            audit.addAuditLogEntry(key, AuditLogStatus.SUCCESS, "DynamicDirestory: New Module called");       
           // getting FileName and Directory from ASMA parameters
            filename = msg.getMessageProperty("http://sap.com/xi/XI/System/File", "FileName");
            dynamicpath = msg.getMessageProperty("http://sap.com/xi/XI/System/File", "Directory");
 audit.addAuditLogEntry(key, AuditLogStatus.SUCCESS,"input FileName:" + filename);
          
           /*Setting the runtime parameters which we can pass from Communication channel as Adapter Module
           parameters to the Module Context*/
          
            filename1 = moduleContext.getContextData("filename1");
            filename2 = moduleContext.getContextData("filename2");
             filename3 = moduleContext.getContextData("filename3");
            filename4 = moduleContext.getContextData("filename4");
              filename5 = moduleContext.getContextData("filename5");
             filename6 = moduleContext.getContextData("filename6");
              filename7 = moduleContext.getContextData("filename7");
              filename8 = moduleContext.getContextData("filename8");
            filename9 = moduleContext.getContextData("filename9");
          
            filepath1 = moduleContext.getContextData("filepath1");
           filepath2 = moduleContext.getContextData("filepath2");
          filepath3 = moduleContext.getContextData("filepath3");
          filepath4 = moduleContext.getContextData("filepath4");
         filepath5 = moduleContext.getContextData("filepath5");
          filepath6 = moduleContext.getContextData("filepath6");
           filepath7 = moduleContext.getContextData("filepath7");
           filepath8 = moduleContext.getContextData("filepath8");
            filepath9 = moduleContext.getContextData("filepath9");
 
           // setting dynamic directory
            dir = new MessagePropertyKey("Directory","http://sap.com/xi/XI/System/File");
           
 if(filename.startsWith(filename1)){
               
                dynamicpath = filepath1;                   
            }
            else if(filename.startsWith(filename2)) {
               
                dynamicpath = filepath2; 
            }
            else if(filename.startsWith(filename3)) {
               
                dynamicpath = filepath3; 
            }
            else if(filename.startsWith(filename4)) {
               
                dynamicpath = filepath4; 
            }
                                                else if(filename.startsWith(filename5)) {
               
                dynamicpath = filepath5; 
            }
                                                else if(filename.startsWith(filename6)) {
               
                dynamicpath = filepath6; 
            }
                                                else if(filename.startsWith(filename7)) {
               
                dynamicpath = filepath7; 
            }
                                                else if(filename.startsWith(filename8)) {
               
                dynamicpath = filepath8; 
            }
                                                else if(filename.startsWith(filename9)) {
               
                dynamicpath = filepath9; 
            }
            //Setting message property
 msg.setMessageProperty(dir,dynamicpath);            
           
 audit.addAuditLogEntry(key, AuditLogStatus.SUCCESS,"target Directory:" + dynamicpath);
            return inputModuleData;
                                }
                                catch (Exception e) {
                                                ModuleException me = new ModuleException(e);
                                                throw me; 
                                                }        
                }
                /* (non-Javadoc)
                 * @see javax.ejb.SessionBean#ejbActivate()
                 */
                public void ejbActivate() throws EJBException, RemoteException {
                                // TODO Auto-generated method stub

                }
                /* (non-Javadoc)
                 * @see javax.ejb.SessionBean#ejbPassivate()
                 */
               
                public void ejbPassivate() throws EJBException, RemoteException {
                                // TODO Auto-generated method stub

                }
                /* (non-Javadoc)
                 * @see javax.ejb.SessionBean#ejbRemove()
                 */
               
                public void ejbRemove() throws EJBException, RemoteException {
                                // TODO Auto-generated method stub

                }
                /* (non-Javadoc)
                 * @see javax.ejb.SessionBean#setSessionContext(javax.ejb.SessionContext)
                 */
               
                public void setSessionContext(SessionContext arg0) throws EJBException,
                                                RemoteException {
                                // TODO Auto-generated method stub

                }

                /* (non-Javadoc)
                 * @see javax.ejb.TimedObject#ejbTimeout(javax.ejb.Timer)
                 */
                public void ejbTimeout(Timer arg0) {
                                // TODO Auto-generated method stub
                }
                public void ejbCreate() throws javax.ejb.CreateException {
                }
}

Testing :

Files placed in the source directory for testing

/wp-content/uploads/2013/09/4_274230.jpg

Files successfully placed in their respective target directories based on the Source File name

filename1 is Placed in filepath1:

/wp-content/uploads/2013/09/5_274235.jpg

filename2 is Placed in filepath2:

/wp-content/uploads/2013/09/6_274236.jpg

filename4 is Placed in filepath4:

/wp-content/uploads/2013/09/7_274237.jpg

Note: In the module code I am checking for 9 filenames and placing the files in 9 different directories. But it’s not mandatory that we need to give all the 9 parameters (filenames and directory) in the module configuration.


Assigned Tags

      5 Comments
      You must be Logged on to comment or reply to a post.
      Author's profile photo Former Member
      Former Member

      Thanks Srikanth.. 🙂

      This blog helps to gain more knowledge on Adapter Module for freshers like me.

      Author's profile photo Former Member
      Former Member

      Hi Srikanth,

      Simple and very helpful.

      Thanks,

      Swetha.

      Author's profile photo Former Member
      Former Member

      Hi Srikanth,

      Which environment do you develop this adapter module? Which version of EJB do you use?

      I've been developing the adapter module in NWDS 7.3 using development components. I'm experiencing the deployment issue.

      My module works fine if it is developed in standard EJB/EAR project in NWDS.

      I raised a discussion in SCN. Any ideas?

      Re: NWDS 7.3 Adapter Module Deployment Error

      Author's profile photo Former Member
      Former Member

      Good one Srikanth 🙂

      Author's profile photo Former Member
      Former Member

      Srikanth Annaya,

      Good one 🙂