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/06 10:08:56 UTC

svn commit: r1004923 - in /camel/trunk: camel-core/src/main/java/org/apache/camel/util/ camel-core/src/test/java/org/apache/camel/util/ components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/ components/camel-ftp/src/test/java/org/ap...

Author: davsclaus
Date: Wed Oct  6 08:08:56 2010
New Revision: 1004923

URL: http://svn.apache.org/viewvc?rev=1004923&view=rev
Log:
CAMEL-3174: Fixed camel-ftp changing directory and downloading files when using absolute paths.

Modified:
    camel/trunk/camel-core/src/main/java/org/apache/camel/util/FileUtil.java
    camel/trunk/camel-core/src/test/java/org/apache/camel/util/FileUtilTest.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/RemoteFile.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/FtpSimpleConsumeAbsoluteTest.java
    camel/trunk/components/camel-ftp/src/test/java/org/apache/camel/component/file/remote/sftp/SftpServerTestSupport.java
    camel/trunk/components/camel-ftp/src/test/java/org/apache/camel/component/file/remote/sftp/SftpSimpleConsumeAbsoluteTest.java

Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/util/FileUtil.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/util/FileUtil.java?rev=1004923&r1=1004922&r2=1004923&view=diff
==============================================================================
--- camel/trunk/camel-core/src/main/java/org/apache/camel/util/FileUtil.java (original)
+++ camel/trunk/camel-core/src/main/java/org/apache/camel/util/FileUtil.java Wed Oct  6 08:08:56 2010
@@ -90,6 +90,19 @@ public final class FileUtil {
     }
 
     /**
+     * Does the name start with a leading separator
+     */
+    public static boolean hasLeadingSeparator(String name) {
+        if (name == null) {
+            return false;
+        }
+        if (name.startsWith("/") || name.startsWith(File.separator)) {
+            return true;
+        }
+        return false;
+    }
+
+    /**
      * Strip first leading separator
      */
     public static String stripFirstLeadingSeparator(String name) {

Modified: camel/trunk/camel-core/src/test/java/org/apache/camel/util/FileUtilTest.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/util/FileUtilTest.java?rev=1004923&r1=1004922&r2=1004923&view=diff
==============================================================================
--- camel/trunk/camel-core/src/test/java/org/apache/camel/util/FileUtilTest.java (original)
+++ camel/trunk/camel-core/src/test/java/org/apache/camel/util/FileUtilTest.java Wed Oct  6 08:08:56 2010
@@ -43,6 +43,16 @@ public class FileUtilTest extends TestCa
         assertEquals("foo/bar", FileUtil.stripLeadingSeparator("///foo/bar"));
     }
 
+    public void testHasLeadingSeparator() {
+        assertEquals(false, FileUtil.hasLeadingSeparator(null));
+        assertEquals(false, FileUtil.hasLeadingSeparator("foo"));
+        assertEquals(false, FileUtil.hasLeadingSeparator("foo/bar"));
+        assertEquals(false, FileUtil.hasLeadingSeparator("foo/"));
+        assertEquals(true, FileUtil.hasLeadingSeparator("/foo/bar"));
+        assertEquals(true, FileUtil.hasLeadingSeparator("//foo/bar"));
+        assertEquals(true, FileUtil.hasLeadingSeparator("///foo/bar"));
+    }
+
     public void testStripFirstLeadingSeparator() {
         assertEquals(null, FileUtil.stripFirstLeadingSeparator(null));
         assertEquals("foo", FileUtil.stripFirstLeadingSeparator("foo"));

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=1004923&r1=1004922&r2=1004923&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 Wed Oct  6 08:08:56 2010
@@ -135,12 +135,17 @@ public class FtpConsumer extends RemoteF
         }
         answer.setHostname(((RemoteFileConfiguration) endpoint.getConfiguration()).getHost());
 
-        // all ftp files is considered as relative
-        answer.setAbsolute(false);
+        // absolute or relative path
+        boolean absolute = FileUtil.hasLeadingSeparator(absolutePath);
+        answer.setAbsolute(absolute);
 
         // create a pseudo absolute name
         String dir = FileUtil.stripTrailingSeparator(absolutePath);
-        String absoluteFileName = dir + "/" + file.getName();
+        String absoluteFileName = FileUtil.stripLeadingSeparator(dir + "/" + file.getName());
+        // if absolute start with a leading separator otherwise let it be relative
+        if (absolute) {
+            absoluteFileName = "/" + absoluteFileName;
+        }
         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=1004923&r1=1004922&r2=1004923&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 Wed Oct  6 08:08:56 2010
@@ -501,7 +501,7 @@ public class FtpOperations implements Re
         }
 
         // if it starts with the root path then a little special handling for that
-        if (path.startsWith("/") || path.startsWith("\\")) {
+        if (FileUtil.hasLeadingSeparator(path)) {
             // change to root path
             doChangeDirectory(path.substring(0, 1));
             path = path.substring(1);

Modified: camel/trunk/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/RemoteFile.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/RemoteFile.java?rev=1004923&r1=1004922&r2=1004923&view=diff
==============================================================================
--- camel/trunk/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/RemoteFile.java (original)
+++ camel/trunk/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/RemoteFile.java Wed Oct  6 08:08:56 2010
@@ -18,7 +18,6 @@ package org.apache.camel.component.file.
 
 import org.apache.camel.component.file.GenericFile;
 import org.apache.camel.component.file.GenericFileMessage;
-import org.apache.camel.util.FileUtil;
 
 /**
  * Represents a remote file of some sort of backing object
@@ -73,9 +72,4 @@ public class RemoteFile<T> extends Gener
         remoteResult.setHostname(remoteSource.getHostname());
     }
 
-    protected String normalizePathToProtocol(String path) {
-        path = super.normalizePathToProtocol(path);        
-        // strip leading / for FTP protocol to avoid files with absolute paths
-        return FileUtil.stripLeadingSeparator(path);
-    }
 }

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=1004923&r1=1004922&r2=1004923&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 Wed Oct  6 08:08:56 2010
@@ -133,12 +133,17 @@ public class SftpConsumer extends Remote
         answer.setLastModified(file.getAttrs().getMTime() * 1000L);
         answer.setHostname(((RemoteFileConfiguration) endpoint.getConfiguration()).getHost());
 
-        // all ftp files is considered as relative
-        answer.setAbsolute(false);
+        // absolute or relative path
+        boolean absolute = FileUtil.hasLeadingSeparator(absolutePath);
+        answer.setAbsolute(absolute);
 
         // create a pseudo absolute name
         String dir = FileUtil.stripTrailingSeparator(absolutePath);
-        String absoluteFileName = dir + "/" + file.getFilename();
+        String absoluteFileName = FileUtil.stripLeadingSeparator(dir + "/" + file.getFilename());
+        // if absolute start with a leading separator otherwise let it be relative
+        if (absolute) {
+            absoluteFileName = "/" + absoluteFileName;
+        }
         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=1004923&r1=1004922&r2=1004923&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 Wed Oct  6 08:08:56 2010
@@ -357,7 +357,7 @@ public class SftpOperations implements R
         }
 
         // if it starts with the root path then a little special handling for that
-        if (path.startsWith("/") || path.startsWith("\\")) {
+        if (FileUtil.hasLeadingSeparator(path)) {
             // change to root path
             doChangeDirectory(path.substring(0, 1));
             path = path.substring(1);

Modified: camel/trunk/components/camel-ftp/src/test/java/org/apache/camel/component/file/remote/FtpSimpleConsumeAbsoluteTest.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-ftp/src/test/java/org/apache/camel/component/file/remote/FtpSimpleConsumeAbsoluteTest.java?rev=1004923&r1=1004922&r2=1004923&view=diff
==============================================================================
--- camel/trunk/components/camel-ftp/src/test/java/org/apache/camel/component/file/remote/FtpSimpleConsumeAbsoluteTest.java (original)
+++ camel/trunk/components/camel-ftp/src/test/java/org/apache/camel/component/file/remote/FtpSimpleConsumeAbsoluteTest.java Wed Oct  6 08:08:56 2010
@@ -19,13 +19,11 @@ 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$
  */
-@Ignore("Absolute do not work with Apache FTP Server")
 public class FtpSimpleConsumeAbsoluteTest extends FtpServerTestSupport {
 
     @Test
@@ -37,7 +35,10 @@ public class FtpSimpleConsumeAbsoluteTes
         String expected = "Hello World";
 
         // create file using regular file
-        template.sendBodyAndHeader("file:///tmp/mytemp", expected, Exchange.FILE_NAME, "hello.txt");
+
+        // FTP Server does not support absolute path, so lets simulate it
+        String path = FTP_ROOT_DIR + "/tmp/mytemp";
+        template.sendBodyAndHeader("file:" + path, expected, Exchange.FILE_NAME, "hello.txt");
 
         MockEndpoint mock = getMockEndpoint("mock:result");
         mock.expectedMessageCount(1);
@@ -53,6 +54,8 @@ public class FtpSimpleConsumeAbsoluteTes
         return new RouteBuilder() {
             @Override
             public void configure() throws Exception {
+                // notice we use an absolute starting path: /tmp/mytemp
+                // - we must remember to use // slash because of the url separator
                 from("ftp://localhost:" + getPort() + "//tmp/mytemp?username=admin&password=admin&delay=10s&disconnect=true")
                     .routeId("foo").noAutoStartup()
                     .to("mock:result");

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=1004923&r1=1004922&r2=1004923&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 Wed Oct  6 08:08:56 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;
 

Modified: camel/trunk/components/camel-ftp/src/test/java/org/apache/camel/component/file/remote/sftp/SftpSimpleConsumeAbsoluteTest.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-ftp/src/test/java/org/apache/camel/component/file/remote/sftp/SftpSimpleConsumeAbsoluteTest.java?rev=1004923&r1=1004922&r2=1004923&view=diff
==============================================================================
--- camel/trunk/components/camel-ftp/src/test/java/org/apache/camel/component/file/remote/sftp/SftpSimpleConsumeAbsoluteTest.java (original)
+++ camel/trunk/components/camel-ftp/src/test/java/org/apache/camel/component/file/remote/sftp/SftpSimpleConsumeAbsoluteTest.java Wed Oct  6 08:08:56 2010
@@ -19,13 +19,11 @@ 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$
  */
-@Ignore("Absolute do not work with Apache SSHD")
 public class SftpSimpleConsumeAbsoluteTest extends SftpServerTestSupport {
 
     @Test
@@ -36,8 +34,9 @@ public class SftpSimpleConsumeAbsoluteTe
 
         String expected = "Hello World";
 
-        // create file using regular file
-        template.sendBodyAndHeader("file:///tmp/mytemp", expected, Exchange.FILE_NAME, "hello.txt");
+        // FTP Server does not support absolute path, so lets simulate it
+        String path = FTP_ROOT_DIR + "/tmp/mytemp";
+        template.sendBodyAndHeader("file:" + path, expected, Exchange.FILE_NAME, "hello.txt");
 
         MockEndpoint mock = getMockEndpoint("mock:result");
         mock.expectedMessageCount(1);
@@ -53,7 +52,9 @@ public class SftpSimpleConsumeAbsoluteTe
         return new RouteBuilder() {
             @Override
             public void configure() throws Exception {
-                from("sftp://localhost:" + getPort() + "//tmp/mytemp?username=admin&password=admin&delay=10s&disconnect=true")
+                // notice we use an absolute starting path: /res/home/tmp/mytemp
+                // - we must remember to use // slash because of the url separator
+                from("sftp://localhost:" + getPort() + "//" + FTP_ROOT_DIR + "/tmp/mytemp?username=admin&password=admin&delay=10s&disconnect=true")
                     .routeId("foo").noAutoStartup()
                     .to("mock:result");
             }