Author: davsclaus
Date: Tue Jul  6 15:16:00 2010
New Revision: 960914

URL: http://svn.apache.org/viewvc?rev=960914&view=rev
Log:
CAMEL-2912: Added timeout options to camel-ftp to make it easier to configure 
timeouts instead of messing with ftpClient properties. Also connect timeout is 
now possible with SFTP.

Added:
    
camel/trunk/components/camel-ftp/src/test/java/org/apache/camel/component/file/remote/FromFtpClientSoTimeout2Test.java
      - copied, changed from r960894, 
camel/trunk/components/camel-ftp/src/test/java/org/apache/camel/component/file/remote/FromFtpClientSoTimeoutTest.java
    
camel/trunk/components/camel-ftp/src/test/java/org/apache/camel/component/file/remote/FtpConnectTimeoutTest.java
   (contents, props changed)
      - copied, changed from r960894, 
camel/trunk/components/camel-ftp/src/test/java/org/apache/camel/component/file/remote/FromFtpClientDataTimeoutTest.java
Modified:
    
camel/trunk/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/FtpEndpoint.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/FtpsEndpoint.java
    
camel/trunk/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/RemoteFileConfiguration.java
    
camel/trunk/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/RemoteFileEndpoint.java
    
camel/trunk/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/SftpEndpoint.java
    
camel/trunk/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/SftpOperations.java

Modified: 
camel/trunk/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/FtpEndpoint.java
URL: 
http://svn.apache.org/viewvc/camel/trunk/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/FtpEndpoint.java?rev=960914&r1=960913&r2=960914&view=diff
==============================================================================
--- 
camel/trunk/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/FtpEndpoint.java
 (original)
+++ 
camel/trunk/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/FtpEndpoint.java
 Tue Jul  6 15:16:00 2010
@@ -37,6 +37,7 @@ public class FtpEndpoint<T extends FTPFi
     protected Map<String, Object> ftpClientParameters;
     protected Map<String, Object> ftpClientConfigParameters;
     protected int soTimeout;
+    protected int dataTimeout;
 
     public FtpEndpoint() {
     }
@@ -51,6 +52,11 @@ public class FtpEndpoint<T extends FTPFi
     }
 
     @Override
+    public RemoteFileConfiguration getConfiguration() {
+        return (RemoteFileConfiguration) super.getConfiguration();
+    }
+
+    @Override
     protected RemoteFileConsumer<FTPFile> buildConsumer(Processor processor) {
         try {
             return new FtpConsumer(this, processor, 
createRemoteFileOperations());
@@ -76,12 +82,27 @@ public class FtpEndpoint<T extends FTPFi
             client = createFtpClient();
         }
 
+        // set any endpoint configured timeouts
+        if (getConfiguration().getConnectTimeout() > -1) {
+            client.setConnectTimeout(getConfiguration().getConnectTimeout());
+        }
+        if (getConfiguration().getSoTimeout() > -1) {
+            soTimeout = getConfiguration().getSoTimeout();
+        }
+        dataTimeout = getConfiguration().getTimeout();
+
+        // then lookup ftp client parameters and set those
         if (ftpClientParameters != null) {
             // setting soTimeout has to be done later on FTPClient (after it 
has connected)
             Object timeout = ftpClientParameters.remove("soTimeout");
             if (timeout != null) {
                 soTimeout = 
getCamelContext().getTypeConverter().convertTo(int.class, timeout);
             }
+            // and we want to keep data timeout so we can log it later
+            timeout = ftpClientParameters.remove("dataTimeout");
+            if (timeout != null) {
+                dataTimeout = 
getCamelContext().getTypeConverter().convertTo(int.class, dataTimeout);
+            }
             IntrospectionSupport.setProperties(client, ftpClientParameters);
         }
         
@@ -93,6 +114,14 @@ public class FtpEndpoint<T extends FTPFi
             IntrospectionSupport.setProperties(ftpClientConfig, 
ftpClientConfigParameters);
         }
 
+        if (dataTimeout > 0) {
+            client.setDataTimeout(dataTimeout);
+        }
+
+        if (log.isDebugEnabled()) {
+            log.debug("Created FTPClient [connectTimeout: " + 
client.getConnectTimeout() + ", soTimeout: " + getSoTimeout() + ", dataTimeout: 
" + dataTimeout + "]: " + client);
+        }
+
         FtpOperations operations = new FtpOperations(client, 
getFtpClientConfig());
         operations.setEndpoint(this);
         return operations;
@@ -137,7 +166,9 @@ public class FtpEndpoint<T extends FTPFi
     }
 
     /**
-     * Sets the soTimeout option to be used by FTPClient.
+     * Sets the soTimeout option.
+     * <p/>
+     * Used by FTPClient
      */
     public void setSoTimeout(int soTimeout) {
         this.soTimeout = soTimeout;

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=960914&r1=960913&r2=960914&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
 Tue Jul  6 15:16:00 2010
@@ -77,7 +77,7 @@ public class FtpOperations implements Re
         }
 
         if (log.isTraceEnabled()) {
-            log.trace("Connecting to " + 
configuration.remoteServerInformation());
+            log.trace("Connecting to " + 
configuration.remoteServerInformation() + " using connection timeout: " + 
client.getConnectTimeout());
         }
 
         boolean connected = false;

Modified: 
camel/trunk/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/FtpsEndpoint.java
URL: 
http://svn.apache.org/viewvc/camel/trunk/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/FtpsEndpoint.java?rev=960914&r1=960913&r2=960914&view=diff
==============================================================================
--- 
camel/trunk/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/FtpsEndpoint.java
 (original)
+++ 
camel/trunk/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/FtpsEndpoint.java
 Tue Jul  6 15:16:00 2010
@@ -42,6 +42,7 @@ public class FtpsEndpoint extends FtpEnd
     protected Map<String, Object> ftpClientTrustStoreParameters;
 
     public FtpsEndpoint() {
+        super();
     }
 
     public FtpsEndpoint(String uri, RemoteFileComponent<FTPFile> 
remoteFileComponent, RemoteFileConfiguration configuration) {
@@ -120,12 +121,26 @@ public class FtpsEndpoint extends FtpEnd
             client = (FTPSClient) createFtpClient();
         }
 
+        // set any endpoint configured timeouts
+        if (getConfiguration().getConnectTimeout() > -1) {
+            client.setConnectTimeout(getConfiguration().getConnectTimeout());
+        }
+        if (getConfiguration().getSoTimeout() > -1) {
+            soTimeout = getConfiguration().getSoTimeout();
+        }
+        dataTimeout = getConfiguration().getTimeout();
+
         if (ftpClientParameters != null) {
             // setting soTimeout has to be done later on FTPClient (after it 
has connected)
             Object timeout = ftpClientParameters.remove("soTimeout");
             if (timeout != null) {
                 soTimeout = 
getCamelContext().getTypeConverter().convertTo(int.class, timeout);
             }
+            // and we want to keep data timeout so we can log it later
+            timeout = ftpClientParameters.remove("dataTimeout");
+            if (timeout != null) {
+                dataTimeout = 
getCamelContext().getTypeConverter().convertTo(int.class, dataTimeout);
+            }
             IntrospectionSupport.setProperties(client, ftpClientParameters);
         }
 
@@ -137,6 +152,14 @@ public class FtpsEndpoint extends FtpEnd
             IntrospectionSupport.setProperties(ftpClientConfig, 
ftpClientConfigParameters);
         }
 
+        if (dataTimeout > 0) {
+            client.setDataTimeout(dataTimeout);
+        }
+
+        if (log.isDebugEnabled()) {
+            log.debug("Created FTPSClient [connectTimeout: " + 
client.getConnectTimeout() + ", soTimeout: " + getSoTimeout() + ", dataTimeout: 
" + dataTimeout + "]: " + client);
+        }
+
         FtpsOperations operations = new FtpsOperations(client, 
getFtpClientConfig());
         operations.setEndpoint(this);
         return operations;

Modified: 
camel/trunk/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/RemoteFileConfiguration.java
URL: 
http://svn.apache.org/viewvc/camel/trunk/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/RemoteFileConfiguration.java?rev=960914&r1=960913&r2=960914&view=diff
==============================================================================
--- 
camel/trunk/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/RemoteFileConfiguration.java
 (original)
+++ 
camel/trunk/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/RemoteFileConfiguration.java
 Tue Jul  6 15:16:00 2010
@@ -31,6 +31,9 @@ public abstract class RemoteFileConfigur
     private String password;
     private boolean binary;
     private boolean passiveMode;
+    private int connectTimeout = 10000;
+    private int timeout = 30000;
+    private int soTimeout;
 
     public RemoteFileConfiguration() {
     }
@@ -127,4 +130,42 @@ public abstract class RemoteFileConfigur
         this.passiveMode = passiveMode;
     }
 
+    public int getConnectTimeout() {
+        return connectTimeout;
+    }
+
+    /**
+     * Sets the connect timeout for waiting for a connection to be established
+     * <p/>
+     * Used by both FTPClient and JSCH
+     */
+    public void setConnectTimeout(int connectTimeout) {
+        this.connectTimeout = connectTimeout;
+    }
+
+    public int getTimeout() {
+        return timeout;
+    }
+
+    /**
+     * Sets the data timeout for waiting for reply
+     * <p/>
+     * Used only by FTPClient
+     */
+    public void setTimeout(int timeout) {
+        this.timeout = timeout;
+    }
+
+    public int getSoTimeout() {
+        return soTimeout;
+    }
+
+    /**
+     * Sets the so timeout
+     * <p/>
+     * Used only by FTPClient
+     */
+    public void setSoTimeout(int soTimeout) {
+        this.soTimeout = soTimeout;
+    }
 }

Modified: 
camel/trunk/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/RemoteFileEndpoint.java
URL: 
http://svn.apache.org/viewvc/camel/trunk/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/RemoteFileEndpoint.java?rev=960914&r1=960913&r2=960914&view=diff
==============================================================================
--- 
camel/trunk/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/RemoteFileEndpoint.java
 (original)
+++ 
camel/trunk/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/RemoteFileEndpoint.java
 Tue Jul  6 15:16:00 2010
@@ -19,6 +19,7 @@ package org.apache.camel.component.file.
 import org.apache.camel.Exchange;
 import org.apache.camel.Processor;
 import org.apache.camel.component.file.GenericFile;
+import org.apache.camel.component.file.GenericFileConfiguration;
 import org.apache.camel.component.file.GenericFileEndpoint;
 import org.apache.camel.component.file.GenericFileProducer;
 import org.apache.camel.impl.DefaultExchange;
@@ -44,6 +45,11 @@ public abstract class RemoteFileEndpoint
     }
 
     @Override
+    public RemoteFileConfiguration getConfiguration() {
+        return (RemoteFileConfiguration) this.configuration;
+    }
+
+    @Override
     public Exchange createExchange(GenericFile<T> file) {
         Exchange answer = new DefaultExchange(this);
         if (file != null) {

Modified: 
camel/trunk/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/SftpEndpoint.java
URL: 
http://svn.apache.org/viewvc/camel/trunk/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/SftpEndpoint.java?rev=960914&r1=960913&r2=960914&view=diff
==============================================================================
--- 
camel/trunk/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/SftpEndpoint.java
 (original)
+++ 
camel/trunk/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/SftpEndpoint.java
 Tue Jul  6 15:16:00 2010
@@ -18,6 +18,7 @@ package org.apache.camel.component.file.
 
 import com.jcraft.jsch.ChannelSftp;
 import org.apache.camel.Processor;
+import org.apache.camel.component.file.GenericFileConfiguration;
 import org.apache.camel.component.file.GenericFileProducer;
 
 /**
@@ -33,6 +34,11 @@ public class SftpEndpoint extends Remote
     }
 
     @Override
+    public RemoteFileConfiguration getConfiguration() {
+        return (RemoteFileConfiguration) super.getConfiguration();
+    }
+
+    @Override
     protected RemoteFileConsumer<ChannelSftp.LsEntry> buildConsumer(Processor 
processor) {
         return new SftpConsumer(this, processor, createRemoteFileOperations());
     }

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=960914&r1=960913&r2=960914&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
 Tue Jul  6 15:16:00 2010
@@ -80,11 +80,25 @@ public class SftpOperations implements R
                     if (session == null || !session.isConnected()) {
                         LOG.trace("Session isn't connected, trying to recreate 
and connect.");
                         session = createSession(configuration);
-                        session.connect();
+                        if (endpoint.getConfiguration().getConnectTimeout() > 
0) {
+                            LOG.trace("Connecting use connectTimeout: " + 
endpoint.getConfiguration().getConnectTimeout() + " ...");
+                            
session.connect(endpoint.getConfiguration().getConnectTimeout());
+                        } else {
+                            LOG.trace("Connecting ...");
+                            session.connect();
+                        }
                     }
+
                     LOG.trace("Channel isn't connected, trying to recreate and 
connect.");
                     channel = (ChannelSftp) session.openChannel("sftp");
-                    channel.connect();
+
+                    if (endpoint.getConfiguration().getConnectTimeout() > 0) {
+                        LOG.trace("Connecting use connectTimeout: " + 
endpoint.getConfiguration().getConnectTimeout() + " ...");
+                        
channel.connect(endpoint.getConfiguration().getConnectTimeout());
+                    } else {
+                        LOG.trace("Connecting ...");
+                        channel.connect();
+                    }
                     LOG.info("Connected to " + 
configuration.remoteServerInformation());
                 }
 

Copied: 
camel/trunk/components/camel-ftp/src/test/java/org/apache/camel/component/file/remote/FromFtpClientSoTimeout2Test.java
 (from r960894, 
camel/trunk/components/camel-ftp/src/test/java/org/apache/camel/component/file/remote/FromFtpClientSoTimeoutTest.java)
URL: 
http://svn.apache.org/viewvc/camel/trunk/components/camel-ftp/src/test/java/org/apache/camel/component/file/remote/FromFtpClientSoTimeout2Test.java?p2=camel/trunk/components/camel-ftp/src/test/java/org/apache/camel/component/file/remote/FromFtpClientSoTimeout2Test.java&p1=camel/trunk/components/camel-ftp/src/test/java/org/apache/camel/component/file/remote/FromFtpClientSoTimeoutTest.java&r1=960894&r2=960914&rev=960914&view=diff
==============================================================================
--- 
camel/trunk/components/camel-ftp/src/test/java/org/apache/camel/component/file/remote/FromFtpClientSoTimeoutTest.java
 (original)
+++ 
camel/trunk/components/camel-ftp/src/test/java/org/apache/camel/component/file/remote/FromFtpClientSoTimeout2Test.java
 Tue Jul  6 15:16:00 2010
@@ -27,10 +27,10 @@ import org.junit.Test;
 /**
  * @version $Revision$
  */
-public class FromFtpClientSoTimeoutTest extends FtpServerTestSupport {
+public class FromFtpClientSoTimeout2Test extends FtpServerTestSupport {
 
     private String getFtpUrl() {
-        return "ftp://ad...@localhost:"; + getPort() + 
"/timeout/?password=admin&ftpClient.soTimeout=5000";
+        return "ftp://ad...@localhost:"; + getPort() + 
"/timeout/?password=admin&soTimeout=5000";
     }
 
     @Override

Copied: 
camel/trunk/components/camel-ftp/src/test/java/org/apache/camel/component/file/remote/FtpConnectTimeoutTest.java
 (from r960894, 
camel/trunk/components/camel-ftp/src/test/java/org/apache/camel/component/file/remote/FromFtpClientDataTimeoutTest.java)
URL: 
http://svn.apache.org/viewvc/camel/trunk/components/camel-ftp/src/test/java/org/apache/camel/component/file/remote/FtpConnectTimeoutTest.java?p2=camel/trunk/components/camel-ftp/src/test/java/org/apache/camel/component/file/remote/FtpConnectTimeoutTest.java&p1=camel/trunk/components/camel-ftp/src/test/java/org/apache/camel/component/file/remote/FromFtpClientDataTimeoutTest.java&r1=960894&r2=960914&rev=960914&view=diff
==============================================================================
--- 
camel/trunk/components/camel-ftp/src/test/java/org/apache/camel/component/file/remote/FromFtpClientDataTimeoutTest.java
 (original)
+++ 
camel/trunk/components/camel-ftp/src/test/java/org/apache/camel/component/file/remote/FtpConnectTimeoutTest.java
 Tue Jul  6 15:16:00 2010
@@ -16,48 +16,27 @@
  */
 package org.apache.camel.component.file.remote;
 
-import org.apache.camel.Endpoint;
-import org.apache.camel.Exchange;
-import org.apache.camel.Producer;
 import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.component.mock.MockEndpoint;
-import org.junit.Before;
 import org.junit.Test;
 
 /**
  * @version $Revision$
  */
-public class FromFtpClientDataTimeoutTest extends FtpServerTestSupport {
+public class FtpConnectTimeoutTest extends FtpServerTestSupport {
 
     private String getFtpUrl() {
-        return "ftp://ad...@localhost:"; + getPort() + 
"/timeout/?password=admin&ftpClient.dataTimeout=5000";
+        return "ftp://ad...@localhost:"; + getPort() + 
"/timeout/?password=admin&connectTimeout=2000";
     }
 
-    @Override
-    @Before
-    public void setUp() throws Exception {
-        super.setUp();
-        prepareFtpServer();
-    }
-    
     @Test
     public void testTimeout() throws Exception {
         MockEndpoint mock = getMockEndpoint("mock:result");
         mock.expectedBodiesReceived("Hello World");
-        
-        mock.assertIsSatisfied();
-    }
 
-    private void prepareFtpServer() throws Exception {
-        // prepares the FTP Server by creating a file on the server
-        Endpoint endpoint = context.getEndpoint(getFtpUrl());
-        Exchange exchange = endpoint.createExchange();
-        exchange.getIn().setBody("Hello World");
-        exchange.getIn().setHeader(Exchange.FILE_NAME, "hello.txt");
-        Producer producer = endpoint.createProducer();
-        producer.start();
-        producer.process(exchange);
-        producer.stop();
+        sendFile(getFtpUrl(), "Hello World", "hello.txt");
+
+        mock.assertIsSatisfied();
     }
 
     protected RouteBuilder createRouteBuilder() throws Exception {

Propchange: 
camel/trunk/components/camel-ftp/src/test/java/org/apache/camel/component/file/remote/FtpConnectTimeoutTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
camel/trunk/components/camel-ftp/src/test/java/org/apache/camel/component/file/remote/FtpConnectTimeoutTest.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date


Reply via email to