You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by da...@apache.org on 2010/07/17 11:45:53 UTC

svn commit: r965043 - in /camel/trunk/components/camel-ftp/src: main/java/org/apache/camel/component/file/remote/ test/java/org/apache/camel/component/file/remote/

Author: davsclaus
Date: Sat Jul 17 09:45:53 2010
New Revision: 965043

URL: http://svn.apache.org/viewvc?rev=965043&view=rev
Log:
CAMEL-2952: camel-ftp supports polling from MVS file system. Using new strategy to cd when traversing directories.

Modified:
    camel/trunk/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/FtpConsumer.java
    camel/trunk/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/FtpOperations.java
    camel/trunk/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/SftpOperations.java
    camel/trunk/components/camel-ftp/src/test/java/org/apache/camel/component/file/remote/FromFtpRecursiveNoopTest.java
    camel/trunk/components/camel-ftp/src/test/java/org/apache/camel/component/file/remote/FtpConsumerMultipleDirectoriesTest.java

Modified: camel/trunk/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/FtpConsumer.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/FtpConsumer.java?rev=965043&r1=965042&r2=965043&view=diff
==============================================================================
--- camel/trunk/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/FtpConsumer.java (original)
+++ camel/trunk/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/FtpConsumer.java Sat Jul 17 09:45:53 2010
@@ -37,30 +37,47 @@ public class FtpConsumer extends RemoteF
     }
 
     protected boolean pollDirectory(String fileName, List<GenericFile<FTPFile>> fileList) {
+        // strip trailing slash
+        fileName = FileUtil.stripTrailingSeparator(fileName);
+        return pollDirectory(fileName, null, fileList);
+    }
+
+    protected boolean pollDirectory(String absolutePath, String dirName, List<GenericFile<FTPFile>> fileList) {
+        // must remember current dir so we stay in that directory after the poll
+        String currentDir = operations.getCurrentDirectory();
+
+        boolean answer = doPollDirectory(absolutePath, dirName, fileList);
+
+        operations.changeCurrentDirectory(currentDir);
+        return answer;
+    }
+
+    protected boolean doPollDirectory(String absolutePath, String dirName, List<GenericFile<FTPFile>> fileList) {
         if (log.isTraceEnabled()) {
-            log.trace("pollDirectory from fileName: " + fileName);
-        }
-        if (fileName == null) {
-            return true;
+            log.trace("doPollDirectory from absolutePath: " + absolutePath + ", dirName: " + dirName);
         }
 
         // remove trailing /
-        fileName = FileUtil.stripTrailingSeparator(fileName);
+        dirName = FileUtil.stripTrailingSeparator(dirName);
+        String dir = ObjectHelper.isNotEmpty(dirName) ? dirName : absolutePath;
+
+        // change into directory (to ensure most FTP servers can list files)
+        operations.changeCurrentDirectory(dir);
 
         if (log.isTraceEnabled()) {
-            log.trace("Polling directory: " + fileName);
+            log.trace("Polling directory: " + dir);
         }
-        List<FTPFile> files = operations.listFiles(fileName);
+        List<FTPFile> files = operations.listFiles();
         if (files == null || files.isEmpty()) {
             // no files in this directory to poll
             if (log.isTraceEnabled()) {
-                log.trace("No files found in directory: " + fileName);
+                log.trace("No files found in directory: " + dir);
             }
             return true;
         } else {
             // we found some files
             if (log.isTraceEnabled()) {
-                log.trace("Found " + files.size() + " in directory: " + fileName);
+                log.trace("Found " + files.size() + " in directory: " + dir);
             }
         }
 
@@ -72,17 +89,18 @@ public class FtpConsumer extends RemoteF
             }
 
             if (file.isDirectory()) {
-                RemoteFile<FTPFile> remote = asRemoteFile(fileName, file);
+                RemoteFile<FTPFile> remote = asRemoteFile(absolutePath, file);
                 if (endpoint.isRecursive() && isValidFile(remote, true)) {
                     // recursive scan and add the sub files and folders
-                    String subDirectory = fileName + "/" + file.getName();
-                    boolean canPollMore = pollDirectory(subDirectory, fileList);
+                    String subDirectory = file.getName();
+                    String path = absolutePath + "/" + subDirectory;
+                    boolean canPollMore = pollDirectory(path, subDirectory, fileList);
                     if (!canPollMore) {
                         return false;
                     }
                 }
             } else if (file.isFile()) {
-                RemoteFile<FTPFile> remote = asRemoteFile(fileName, file);
+                RemoteFile<FTPFile> remote = asRemoteFile(absolutePath, file);
                 if (isValidFile(remote, false)) {
                     if (isInProgress(remote)) {
                         if (log.isTraceEnabled()) {
@@ -101,7 +119,7 @@ public class FtpConsumer extends RemoteF
         return true;
     }
 
-    private RemoteFile<FTPFile> asRemoteFile(String directory, FTPFile file) {
+    private RemoteFile<FTPFile> asRemoteFile(String absolutePath, FTPFile file) {
         RemoteFile<FTPFile> answer = new RemoteFile<FTPFile>();
 
         answer.setEndpointPath(endpointPath);
@@ -118,7 +136,8 @@ public class FtpConsumer extends RemoteF
         answer.setAbsolute(false);
 
         // create a pseudo absolute name
-        String absoluteFileName = (ObjectHelper.isNotEmpty(directory) ? directory + "/" : "") + file.getName();
+        String dir = FileUtil.stripTrailingSeparator(absolutePath);
+        String absoluteFileName = dir + "/" + file.getName();
         answer.setAbsoluteFilePath(absoluteFileName);
 
         // the relative filename, skip the leading endpoint configured path

Modified: camel/trunk/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/FtpOperations.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/FtpOperations.java?rev=965043&r1=965042&r2=965043&view=diff
==============================================================================
--- camel/trunk/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/FtpOperations.java (original)
+++ camel/trunk/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/FtpOperations.java Sat Jul 17 09:45:53 2010
@@ -410,9 +410,12 @@ public class FtpOperations implements Re
         }
     }
 
-    public void changeCurrentDirectory(String newDirectory) throws GenericFileOperationFailedException {
+    public void changeCurrentDirectory(String path) throws GenericFileOperationFailedException {
+        if (log.isTraceEnabled()) {
+            log.trace("Changing current directory to: " + path);
+        }
         try {
-            client.changeWorkingDirectory(newDirectory);
+            client.changeWorkingDirectory(path);
         } catch (IOException e) {
             throw new GenericFileOperationFailedException(client.getReplyCode(), client.getReplyString(), e.getMessage(), e);
         }

Modified: camel/trunk/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/SftpOperations.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/SftpOperations.java?rev=965043&r1=965042&r2=965043&view=diff
==============================================================================
--- camel/trunk/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/SftpOperations.java (original)
+++ camel/trunk/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/SftpOperations.java Sat Jul 17 09:45:53 2010
@@ -336,6 +336,9 @@ public class SftpOperations implements R
     }
 
     public void changeCurrentDirectory(String path) throws GenericFileOperationFailedException {
+        if (LOG.isTraceEnabled()) {
+            LOG.trace("Changing current directory to: " + path);
+        }
         try {
             channel.cd(path);
         } catch (SftpException e) {

Modified: camel/trunk/components/camel-ftp/src/test/java/org/apache/camel/component/file/remote/FromFtpRecursiveNoopTest.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-ftp/src/test/java/org/apache/camel/component/file/remote/FromFtpRecursiveNoopTest.java?rev=965043&r1=965042&r2=965043&view=diff
==============================================================================
--- camel/trunk/components/camel-ftp/src/test/java/org/apache/camel/component/file/remote/FromFtpRecursiveNoopTest.java (original)
+++ camel/trunk/components/camel-ftp/src/test/java/org/apache/camel/component/file/remote/FromFtpRecursiveNoopTest.java Sat Jul 17 09:45:53 2010
@@ -27,20 +27,25 @@ import org.junit.Test;
 public class FromFtpRecursiveNoopTest extends FtpServerTestSupport {
 
     private String getFtpUrl() {
-        return "ftp://admin@localhost:" + getPort() + "/noop?password=admin&binary=false"
+        return "ftp://admin@localhost:" + getPort() + "/noop?password=admin&binary=false&initialDelay=3000"
                 + "&recursive=true&noop=true";
     }
 
-    @Test
-    public void testRecursiveNoop() throws Exception {
-        MockEndpoint mock = getMockEndpoint("mock:result");
-        mock.expectedBodiesReceivedInAnyOrder("a", "b", "a2", "c", "b2");
+    @Override
+    public void setUp() throws Exception {
+        super.setUp();
 
         template.sendBodyAndHeader(getFtpUrl(), "a", Exchange.FILE_NAME, "a.txt");
         template.sendBodyAndHeader(getFtpUrl(), "b", Exchange.FILE_NAME, "b.txt");
         template.sendBodyAndHeader(getFtpUrl(), "a2", Exchange.FILE_NAME, "foo/a.txt");
         template.sendBodyAndHeader(getFtpUrl(), "c", Exchange.FILE_NAME, "bar/c.txt");
         template.sendBodyAndHeader(getFtpUrl(), "b2", Exchange.FILE_NAME, "bar/b.txt");
+    }
+
+    @Test
+    public void testRecursiveNoop() throws Exception {
+        MockEndpoint mock = getMockEndpoint("mock:result");
+        mock.expectedBodiesReceivedInAnyOrder("a", "b", "a2", "c", "b2");
 
         assertMockEndpointsSatisfied();
 
@@ -60,6 +65,7 @@ public class FromFtpRecursiveNoopTest ex
             public void configure() throws Exception {
                 from(getFtpUrl())
                     .convertBodyTo(String.class)
+                    .to("log:ftp")
                     .to("mock:result");
             }
         };

Modified: camel/trunk/components/camel-ftp/src/test/java/org/apache/camel/component/file/remote/FtpConsumerMultipleDirectoriesTest.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-ftp/src/test/java/org/apache/camel/component/file/remote/FtpConsumerMultipleDirectoriesTest.java?rev=965043&r1=965042&r2=965043&view=diff
==============================================================================
--- camel/trunk/components/camel-ftp/src/test/java/org/apache/camel/component/file/remote/FtpConsumerMultipleDirectoriesTest.java (original)
+++ camel/trunk/components/camel-ftp/src/test/java/org/apache/camel/component/file/remote/FtpConsumerMultipleDirectoriesTest.java Sat Jul 17 09:45:53 2010
@@ -42,7 +42,7 @@ public class FtpConsumerMultipleDirector
     @Test
     public void testMultiDir() throws Exception {
         MockEndpoint mock = getMockEndpoint("mock:result");
-        mock.expectedBodiesReceived("Bye World", "Hello World", "Godday World");
+        mock.expectedBodiesReceived("Bye World", "Hello World", "Goodday World");
 
         assertMockEndpointsSatisfied();
 
@@ -71,7 +71,7 @@ public class FtpConsumerMultipleDirector
     private void prepareFtpServer() throws Exception {
         sendFile(getFtpUrl(), "Bye World", "bye.txt");
         sendFile(getFtpUrl(), "Hello World", "sub/hello.txt");
-        sendFile(getFtpUrl(), "Godday World", "sub/sub2/godday.txt");
+        sendFile(getFtpUrl(), "Goodday World", "sub/sub2/godday.txt");
     }
 
     protected RouteBuilder createRouteBuilder() throws Exception {