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/10/03 09:54:35 UTC

svn commit: r1003927 - in /camel/trunk: camel-core/src/main/java/org/apache/camel/component/file/ camel-core/src/test/java/org/apache/camel/component/file/strategy/ components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/ components/c...

Author: davsclaus
Date: Sun Oct  3 07:54:34 2010
New Revision: 1003927

URL: http://svn.apache.org/viewvc?rev=1003927&view=rev
Log:
CAMEL-3174: FTP consumers will use - change back to parent dir when polling sub folders - strategy. API change in FileOperators.

Added:
    camel/trunk/components/camel-ftp/src/test/java/org/apache/camel/component/file/remote/sftp/SftpSimpleConsumeAbsoluteTest.java
      - copied, changed from r1003830, camel/trunk/components/camel-ftp/src/test/java/org/apache/camel/component/file/remote/sftp/SftpSimpleConsumeTest.java
Modified:
    camel/trunk/camel-core/src/main/java/org/apache/camel/component/file/FileOperations.java
    camel/trunk/camel-core/src/main/java/org/apache/camel/component/file/GenericFileOperations.java
    camel/trunk/camel-core/src/test/java/org/apache/camel/component/file/strategy/GenericFileDeleteProcessStrategyTest.java
    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/SftpConsumer.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/sftp/SftpServerTestSupport.java

Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/component/file/FileOperations.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/component/file/FileOperations.java?rev=1003927&r1=1003926&r2=1003927&view=diff
==============================================================================
--- camel/trunk/camel-core/src/main/java/org/apache/camel/component/file/FileOperations.java (original)
+++ camel/trunk/camel-core/src/main/java/org/apache/camel/component/file/FileOperations.java Sun Oct  3 07:54:34 2010
@@ -133,6 +133,10 @@ public class FileOperations implements G
         // noop
     }
 
+    public void changeToParentDirectory() throws GenericFileOperationFailedException {
+        // noop
+    }
+
     public String getCurrentDirectory() throws GenericFileOperationFailedException {
         // noop
         return null;

Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/component/file/GenericFileOperations.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/component/file/GenericFileOperations.java?rev=1003927&r1=1003926&r2=1003927&view=diff
==============================================================================
--- camel/trunk/camel-core/src/main/java/org/apache/camel/component/file/GenericFileOperations.java (original)
+++ camel/trunk/camel-core/src/main/java/org/apache/camel/component/file/GenericFileOperations.java Sun Oct  3 07:54:34 2010
@@ -105,6 +105,13 @@ public interface GenericFileOperations<T
     void changeCurrentDirectory(String path) throws GenericFileOperationFailedException;
 
     /**
+     * Change the current remote directory to the parent
+     *
+     * @throws GenericFileOperationFailedException can be thrown
+     */
+    void changeToParentDirectory() throws GenericFileOperationFailedException;
+
+    /**
      * List the files in the current directory
      *
      * @return a list of backing objects representing the files

Modified: camel/trunk/camel-core/src/test/java/org/apache/camel/component/file/strategy/GenericFileDeleteProcessStrategyTest.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/component/file/strategy/GenericFileDeleteProcessStrategyTest.java?rev=1003927&r1=1003926&r2=1003927&view=diff
==============================================================================
--- camel/trunk/camel-core/src/test/java/org/apache/camel/component/file/strategy/GenericFileDeleteProcessStrategyTest.java (original)
+++ camel/trunk/camel-core/src/test/java/org/apache/camel/component/file/strategy/GenericFileDeleteProcessStrategyTest.java Sun Oct  3 07:54:34 2010
@@ -82,6 +82,9 @@ public class GenericFileDeleteProcessStr
         public void changeCurrentDirectory(String path) throws GenericFileOperationFailedException {
         }
 
+        public void changeToParentDirectory() throws GenericFileOperationFailedException {
+        }
+
         public List<Object> listFiles() throws GenericFileOperationFailedException {
             return null;
         }

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=1003927&r1=1003926&r2=1003927&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 Sun Oct  3 07:54:34 2010
@@ -37,18 +37,22 @@ 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);
+        // strip trailing slash
+        fileName = FileUtil.stripTrailingSeparator(fileName);
 
+        boolean answer = doPollDirectory(fileName, null, fileList);
         operations.changeCurrentDirectory(currentDir);
+
+        return answer;
+    }
+
+    protected boolean pollSubDirectory(String absolutePath, String dirName, List<GenericFile<FTPFile>> fileList) {
+        boolean answer = doPollDirectory(absolutePath, dirName, fileList);
+        // change back to parent directory when finished polling sub directory
+        operations.changeToParentDirectory();
         return answer;
     }
 
@@ -94,7 +98,7 @@ public class FtpConsumer extends RemoteF
                     // recursive scan and add the sub files and folders
                     String subDirectory = file.getName();
                     String path = absolutePath + "/" + subDirectory;
-                    boolean canPollMore = pollDirectory(path, subDirectory, fileList);
+                    boolean canPollMore = pollSubDirectory(path, subDirectory, fileList);
                     if (!canPollMore) {
                         return false;
                     }

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=1003927&r1=1003926&r2=1003927&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 Sun Oct  3 07:54:34 2010
@@ -500,11 +500,18 @@ public class FtpOperations implements Re
             return;
         }
 
+        // if it starts with the root path then a little special handling for that
+        if (path.startsWith("/") || path.startsWith("\\")) {
+            // change to root path
+            doChangeDirectory(path.substring(0, 1));
+            path = path.substring(1);
+        }
+
         // split into multiple dirs
         final String[] dirs = path.split("/|\\\\");
 
         if (dirs == null || dirs.length == 0) {
-            // this is the root path
+            // path was just a relative single path
             doChangeDirectory(path);
             return;
         }
@@ -516,7 +523,7 @@ public class FtpOperations implements Re
     }
 
     private void doChangeDirectory(String path) {
-        if (path == null || ".".equals(path)) {
+        if (path == null || ".".equals(path) || ObjectHelper.isEmpty(path)) {
             return;
         }
 
@@ -534,6 +541,14 @@ public class FtpOperations implements Re
         }
     }
 
+    public void changeToParentDirectory() throws GenericFileOperationFailedException {
+        try {
+            client.changeToParentDirectory();
+        } catch (IOException e) {
+            throw new GenericFileOperationFailedException(client.getReplyCode(), client.getReplyString(), e.getMessage(), e);
+        }
+    }
+
     public List<FTPFile> listFiles() throws GenericFileOperationFailedException {
         if (log.isTraceEnabled()) {
             log.trace("listFiles()");

Modified: camel/trunk/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/SftpConsumer.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/SftpConsumer.java?rev=1003927&r1=1003926&r2=1003927&view=diff
==============================================================================
--- camel/trunk/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/SftpConsumer.java (original)
+++ camel/trunk/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/SftpConsumer.java Sun Oct  3 07:54:34 2010
@@ -37,31 +37,51 @@ public class SftpConsumer extends Remote
     }
 
     protected boolean pollDirectory(String fileName, List<GenericFile<ChannelSftp.LsEntry>> fileList) {
-        if (log.isTraceEnabled()) {
-            log.trace("pollDirectory from fileName: " + fileName);
-        }
+        // must remember current dir so we stay in that directory after the poll
+        String currentDir = operations.getCurrentDirectory();
 
-        if (fileName == null) {
-            return true;
+        // strip trailing slash
+        fileName = FileUtil.stripTrailingSeparator(fileName);
+
+        boolean answer = doPollDirectory(fileName, null, fileList);
+
+        operations.changeCurrentDirectory(currentDir);
+        return answer;
+    }
+
+    protected boolean pollSubDirectory(String absolutePath, String dirName, List<GenericFile<ChannelSftp.LsEntry>> fileList) {
+        boolean answer = doPollDirectory(absolutePath, dirName, fileList);
+        // change back to parent directory when finished polling sub directory
+        operations.changeToParentDirectory();
+        return answer;
+    }
+
+    protected boolean doPollDirectory(String absolutePath, String dirName, List<GenericFile<ChannelSftp.LsEntry>> fileList) {
+        if (log.isTraceEnabled()) {
+            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<ChannelSftp.LsEntry> files = operations.listFiles(fileName);
+        List<ChannelSftp.LsEntry> 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);
             }
         }
 
@@ -73,11 +93,12 @@ public class SftpConsumer extends Remote
             }
 
             if (file.getAttrs().isDir()) {
-                RemoteFile<ChannelSftp.LsEntry> remote = asRemoteFile(fileName, file);
+                RemoteFile<ChannelSftp.LsEntry> remote = asRemoteFile(absolutePath, file);
                 if (endpoint.isRecursive() && isValidFile(remote, true)) {
                     // recursive scan and add the sub files and folders
-                    String subDirectory = fileName + "/" + file.getFilename();
-                    boolean canPollMore = pollDirectory(subDirectory, fileList);
+                    String subDirectory = file.getFilename();
+                    String path = absolutePath + "/" + subDirectory;
+                    boolean canPollMore = pollSubDirectory(path, subDirectory, fileList);
                     if (!canPollMore) {
                         return false;
                     }
@@ -85,7 +106,7 @@ public class SftpConsumer extends Remote
                 // we cannot use file.getAttrs().isLink on Windows, so we dont invoke the method
                 // just assuming its a file we should poll
             } else {
-                RemoteFile<ChannelSftp.LsEntry> remote = asRemoteFile(fileName, file);
+                RemoteFile<ChannelSftp.LsEntry> remote = asRemoteFile(absolutePath, file);
                 if (isValidFile(remote, false)) {
                     if (isInProgress(remote)) {
                         if (log.isTraceEnabled()) {
@@ -102,7 +123,7 @@ public class SftpConsumer extends Remote
         return true;
     }
 
-    private RemoteFile<ChannelSftp.LsEntry> asRemoteFile(String directory, ChannelSftp.LsEntry file) {
+    private RemoteFile<ChannelSftp.LsEntry> asRemoteFile(String absolutePath, ChannelSftp.LsEntry file) {
         RemoteFile<ChannelSftp.LsEntry> answer = new RemoteFile<ChannelSftp.LsEntry>();
 
         answer.setEndpointPath(endpointPath);
@@ -116,7 +137,8 @@ public class SftpConsumer extends Remote
         answer.setAbsolute(false);
 
         // create a pseudo absolute name
-        String absoluteFileName = (ObjectHelper.isNotEmpty(directory) ? directory + "/" : "") + file.getFilename();
+        String dir = FileUtil.stripTrailingSeparator(absolutePath);
+        String absoluteFileName = dir + "/" + file.getFilename();
         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/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=1003927&r1=1003926&r2=1003927&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 Sun Oct  3 07:54:34 2010
@@ -347,11 +347,18 @@ public class SftpOperations implements R
             return;
         }
 
+        // if it starts with the root path then a little special handling for that
+        if (path.startsWith("/") || path.startsWith("\\")) {
+            // change to root path
+            doChangeDirectory(path.substring(0, 1));
+            path = path.substring(1);
+        }
+
         // split into multiple dirs
         final String[] dirs = path.split("/|\\\\");
 
         if (dirs == null || dirs.length == 0) {
-            // this is the root path
+            // path was just a relative single path
             doChangeDirectory(path);
             return;
         }
@@ -363,7 +370,7 @@ public class SftpOperations implements R
     }
 
     private void doChangeDirectory(String path) {
-        if (path == null || ".".equals(path)) {
+        if (path == null || ".".equals(path) || ObjectHelper.isEmpty(path)) {
             return;
         }
 
@@ -377,6 +384,18 @@ public class SftpOperations implements R
         }
     }
 
+    public void changeToParentDirectory() throws GenericFileOperationFailedException {
+        String current = getCurrentDirectory();
+
+        String parent = FileUtil.compactPath(current + "/..");
+        // must start with absolute
+        if (!parent.startsWith("/")) {
+            parent = "/" + parent;
+        }
+
+        changeCurrentDirectory(parent);
+    }
+
     public List<ChannelSftp.LsEntry> listFiles() throws GenericFileOperationFailedException {
         return listFiles(".");
     }

Modified: camel/trunk/components/camel-ftp/src/test/java/org/apache/camel/component/file/remote/sftp/SftpServerTestSupport.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-ftp/src/test/java/org/apache/camel/component/file/remote/sftp/SftpServerTestSupport.java?rev=1003927&r1=1003926&r2=1003927&view=diff
==============================================================================
--- camel/trunk/components/camel-ftp/src/test/java/org/apache/camel/component/file/remote/sftp/SftpServerTestSupport.java (original)
+++ camel/trunk/components/camel-ftp/src/test/java/org/apache/camel/component/file/remote/sftp/SftpServerTestSupport.java Sun Oct  3 07:54:34 2010
@@ -35,7 +35,7 @@ import org.junit.Before;
  */
 public class SftpServerTestSupport extends BaseServerTestSupport {
 
-    protected static final String FTP_ROOT_DIR = "./res/home/";
+    protected static final String FTP_ROOT_DIR = "res/home/";
     protected SshServer sshd;
     protected boolean canTest;
 

Copied: camel/trunk/components/camel-ftp/src/test/java/org/apache/camel/component/file/remote/sftp/SftpSimpleConsumeAbsoluteTest.java (from r1003830, camel/trunk/components/camel-ftp/src/test/java/org/apache/camel/component/file/remote/sftp/SftpSimpleConsumeTest.java)
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-ftp/src/test/java/org/apache/camel/component/file/remote/sftp/SftpSimpleConsumeAbsoluteTest.java?p2=camel/trunk/components/camel-ftp/src/test/java/org/apache/camel/component/file/remote/sftp/SftpSimpleConsumeAbsoluteTest.java&p1=camel/trunk/components/camel-ftp/src/test/java/org/apache/camel/component/file/remote/sftp/SftpSimpleConsumeTest.java&r1=1003830&r2=1003927&rev=1003927&view=diff
==============================================================================
--- camel/trunk/components/camel-ftp/src/test/java/org/apache/camel/component/file/remote/sftp/SftpSimpleConsumeTest.java (original)
+++ camel/trunk/components/camel-ftp/src/test/java/org/apache/camel/component/file/remote/sftp/SftpSimpleConsumeAbsoluteTest.java Sun Oct  3 07:54:34 2010
@@ -19,15 +19,17 @@ package org.apache.camel.component.file.
 import org.apache.camel.Exchange;
 import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.component.mock.MockEndpoint;
+import org.junit.Ignore;
 import org.junit.Test;
 
 /**
  * @version $Revision$
  */
-public class SftpSimpleConsumeTest extends SftpServerTestSupport {
+@Ignore("Absolute do not work with Apache SSHD")
+public class SftpSimpleConsumeAbsoluteTest extends SftpServerTestSupport {
 
     @Test
-    public void testSftpSimpleConsume() throws Exception {
+    public void testSftpSimpleConsumeAbsolute() throws Exception {
         if (!canTest()) {
             return;
         }
@@ -35,7 +37,7 @@ public class SftpSimpleConsumeTest exten
         String expected = "Hello World";
 
         // create file using regular file
-        template.sendBodyAndHeader("file://" + FTP_ROOT_DIR, expected, Exchange.FILE_NAME, "hello.txt");
+        template.sendBodyAndHeader("file:////tmp", expected, Exchange.FILE_NAME, "hello.txt");
 
         MockEndpoint mock = getMockEndpoint("mock:result");
         mock.expectedMessageCount(1);
@@ -51,7 +53,7 @@ public class SftpSimpleConsumeTest exten
         return new RouteBuilder() {
             @Override
             public void configure() throws Exception {
-                from("sftp://localhost:" + getPort() + "/" + FTP_ROOT_DIR + "?username=admin&password=admin&delay=10s&disconnect=true")
+                from("sftp://localhost:" + getPort() + "//tmp?username=admin&password=admin&delay=10s&disconnect=true")
                     .routeId("foo").noAutoStartup()
                     .to("mock:result");
             }