0 Replies Latest reply on Jul 15, 2009 5:53 AM by martin buettler

    FTP-Listener

    martin buettler Newbie

      Hi guys...

      Hope you can help me.

      I got a ftp-listener with the following config :

      <ftp-message-filter
       username="username"
       password="pw"
       directory="dir"
       input-suffix="*/*.zip"
       work-suffix=".esbInProcess"
       post-delete="true"
       error-delete="false"
       error-directory="@bhi2unio.ftp.errordirectory@"
       error-suffix=".esbERROR"
       passive="true"
       read-only="false"/>
       </ftp-bus>
      


      The special thing here is that the files on the ftp are in subdirectories of the directory (see input-suffix).

      The listenere config is here:

      <ftp-listener
       name="ImportFTP"
       is-gateway="true"
       busidref="bhi2unio_zip_channel"
       schedule-frequency="@bhi2unio.ftp.pollfrequency@" maxThreads="1" >
       <property name="composer-class" value="com.unio.rmc.transfer.listener.RemoteToLocalMessageComposer"/>
       <property name="local-mirror-dir" value="@local-mirror-dir@"/>
       </ftp-listener>


      Then i wrote a MessageComposer which writes some properties in the message and downloads the file from the ftp server to my local hd..

      Thats the code:

      public class RemoteToLocalMessageComposer<T extends File> implements
       MessageComposer<T> {
      
       static Logger log = Logger.getLogger(RemoteToLocalMessageComposer.class);
      
       public static final String LOCAL_MIRROR_DIR_TAG = "local-mirror-dir";
       public static final String PN_MIRROR_FILE_NAME = "com.unio.rmc.mirror.file.name";
       public static final String PN_FILE_PATH_RELATIVE = "com.unio.rmc.file.path.relative";
       public static final String WORKING_FILE_SUFFIX = ".esbInProcess";
      
       private FTPEpr ftpEpr;
       private File downloadDir;
       private MessagePayloadProxy payloadProxy;
       private File localFileDir;
      
       public void setConfiguration(ConfigTree config)
       throws ConfigurationException {
       EPR epr = ListenerUtil.assembleEpr(config);
      
       if (!(epr instanceof FTPEpr)) {
       throw new ConfigurationException(
       "This Gateway only accepts FTP and SFTP.");
       }
       ftpEpr = (FTPEpr) epr;
      
       // This may look a bit odd... The "file" input dir is our FTP download
       // dir...>
       downloadDir = UnioAbstractFileGateway.getFileInputDirectory(config);
       payloadProxy = new MessagePayloadProxy(config);
       localFileDir = getLocalFileDir(config);
       }
      
       private File getLocalFileDir(ConfigTree config)
       throws ConfigurationException {
       String uriStr = config.getAttribute(LOCAL_MIRROR_DIR_TAG);
       URI uri = null;
       if (uriStr != null) {
       try {
       uri = new URI(uriStr);
       } catch (URISyntaxException e) {
       throw new ConfigurationException("Invalid '"
       + LOCAL_MIRROR_DIR_TAG + "' value '"
       + uriStr + "'. Must be a valid URI.");
       }
       } else {
       config.getRequiredAttribute(LOCAL_MIRROR_DIR_TAG);
       }
       try {
       return new File(uri);
       } catch (Exception e) {
       return new File(uri.getPath());
       }
       }
      
       public Message compose(T inputFile) throws MessageDeliverException {
       AssertArgument.isNotNull(inputFile, "inputFile");
       File localFile = null;
       try {
       localFile = writeRemoteToLocalFile(inputFile);
       } catch (IOException e) {
       throw new MessageDeliverException(
       "Error reading remote input file '"
       + inputFile.getPath() + "'.", e);
       } catch (RemoteFileSystemException e) {
       throw new MessageDeliverException(
       "Error reading remote input file '"
       + inputFile.getPath() + "'.", e);
       }
      
       Message message = MessageFactory.getInstance().getMessage();
       payloadProxy.setPayload(message, getPayload(inputFile));
      
       message.getProperties().setProperty(
       PN_MIRROR_FILE_NAME, localFile.getAbsolutePath());
       log.info("message " + message);
       message.getProperties().setProperty(PN_FILE_PATH_RELATIVE, getRelativeFilePath(inputFile));
       return message;
       }
      
       private String getRelativeFilePath(File remoteFile) {
       String relativeFilePath = remoteFile.getPath();
      
       // remove file name
       if (relativeFilePath.contains(File.separator)) {
       relativeFilePath = relativeFilePath.substring(0, relativeFilePath.lastIndexOf(File.separator));
       } else {
       relativeFilePath = "";
       }
      
       return relativeFilePath;
       }
      
       protected Object getPayload(T inputFile) {
       // we leave the body empty
       return new byte[] {};
       }
      
       public Object decompose(Message message, T inputMessage)
       throws MessageDeliverException {
       log.info("blabalblablabla");
       return payloadProxy.getPayload(message);
       }
      
       private File writeRemoteToLocalFile(File remoteFile) throws IOException,
       RemoteFileSystemException {
       File localFile = null;
       RemoteFileSystem remoteFileSystem = null;
       String localFileName = remoteFile.toString();
       if (localFileName.endsWith(WORKING_FILE_SUFFIX)) {
       localFileName = localFileName.substring(0, localFileName
       .indexOf(WORKING_FILE_SUFFIX));
       }
      
       try {
       localFile = new File(localFileDir, localFileName);
       localFile.mkdirs(); // file could be stored in a sub-directory
       localFile.createNewFile();
      
       remoteFileSystem = RemoteFileSystemFactory.getRemoteFileSystem(ftpEpr, true);
       remoteFileSystem.setRemoteDir(FtpClientUtil.fileToFtpString(downloadDir));
       log.info(FtpClientUtil.fileToFtpString(downloadDir));
       String old = remoteFileSystem.getRemoteDir();
       if (remoteFile.toString().contains(File.separator)){
       int index = remoteFile.toString().lastIndexOf(File.separator);
       remoteFileSystem.setRemoteDir(remoteFileSystem.getRemoteDir() +"/" + remoteFile.toString().substring(0, index));
       remoteFile = new File(remoteFile.toString().substring(index + 1));
       log.info("remoteDir : " + remoteFileSystem.getRemoteDir());
       }
       log.info("remoteFile : " + remoteFile.toString());
      
       remoteFileSystem.downloadFile(remoteFile.toString(), localFile.getAbsolutePath());
       log.info("download done to " + localFile.getAbsolutePath());
       } finally {
       if (null != remoteFileSystem){
       remoteFileSystem.quit();
       }
       }
       return localFile;
       }


      The file will be downloaded but if all goes well the esb cant delete the file on the ftp.....


      11:42:51,895 ERROR [AbstractFileGateway] File test\stx3.xml 2.zip has been processed and renamed to test\stx3.xml 2.zip.esbInProcess, but th
      ere were problems deleting it from the input directory
      org.jboss.soa.esb.listeners.gateway.GatewayException: org.jboss.soa.esb.util.RemoteFileSystemException: Failed to delete remote file: 550 te
      st\stx3.xml 2.zip.esbInProcess: No such file or directory
      
       at org.jboss.soa.esb.listeners.gateway.RemoteGatewayListener.deleteFile(RemoteGatewayListener.java:128)
       at org.jboss.soa.esb.listeners.gateway.AbstractFileGateway.processingComplete(AbstractFileGateway.java:206)
       at org.jboss.soa.esb.listeners.gateway.AbstractFileGateway.onSchedule(AbstractFileGateway.java:198)
       at org.jboss.soa.esb.schedule.ScheduleProvider$ESBScheduledJob.execute(ScheduleProvider.java:227)
       at org.quartz.core.JobRunShell.run(JobRunShell.java:203)
       at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:520)
      Caused by: org.jboss.soa.esb.util.RemoteFileSystemException: Failed to delete remote file: 550 test\stx3.xml 2.zip.esbInProcess: No such fil
      e or directory
      
       at org.jboss.internal.soa.esb.util.FtpImpl.deleteRemoteFile(FtpImpl.java:284)
       at org.jboss.soa.esb.listeners.gateway.RemoteGatewayListener.deleteFile(RemoteGatewayListener.java:120)
       ... 5 more


      I know the problem is that the filename on the ftp is the wrong... But how can i change it?

      I hope u understand me...

      Greets dinozzo