diff --git a/spring-integration-ftp/src/main/java/org/springframework/integration/ftp/session/AbstractFtpSessionFactory.java b/spring-integration-ftp/src/main/java/org/springframework/integration/ftp/session/AbstractFtpSessionFactory.java index 11caead404..1cd438b245 100644 --- a/spring-integration-ftp/src/main/java/org/springframework/integration/ftp/session/AbstractFtpSessionFactory.java +++ b/spring-integration-ftp/src/main/java/org/springframework/integration/ftp/session/AbstractFtpSessionFactory.java @@ -54,13 +54,15 @@ public abstract class AbstractFtpSessionFactory implements protected String password; protected int port = FTP.DEFAULT_PORT; - + protected int bufferSize = 2048; //see https://issues.apache.org/jira/browse/NET-207 protected int clientMode = FTPClient.ACTIVE_LOCAL_DATA_CONNECTION_MODE; protected int fileType = FTP.BINARY_FILE_TYPE; + protected String controlEncoding = FTP.DEFAULT_CONTROL_ENCODING; + /** * File types defined by {@link org.apache.commons.net.ftp.FTP} constants: @@ -76,6 +78,11 @@ public abstract class AbstractFtpSessionFactory implements this.fileType = fileType; } + public void setControlEncoding(String controlEncoding) { + Assert.hasText(controlEncoding); + this.controlEncoding = controlEncoding; + } + public void setConfig(FTPClientConfig config) { Assert.notNull(config); this.config = config; @@ -161,6 +168,7 @@ public abstract class AbstractFtpSessionFactory implements this.updateClientMode(client); client.setFileType(fileType); client.setBufferSize(bufferSize); + client.setControlEncoding(controlEncoding); return client; } diff --git a/spring-integration-ftp/src/test/java/org/springframework/integration/ftp/session/SessionFactoryTests.java b/spring-integration-ftp/src/test/java/org/springframework/integration/ftp/session/SessionFactoryTests.java index f765be91fd..fbc990ec53 100644 --- a/spring-integration-ftp/src/test/java/org/springframework/integration/ftp/session/SessionFactoryTests.java +++ b/spring-integration-ftp/src/test/java/org/springframework/integration/ftp/session/SessionFactoryTests.java @@ -22,6 +22,7 @@ import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicInteger; +import junit.framework.Assert; import org.apache.commons.net.ftp.FTPClient; import org.junit.Ignore; import org.junit.Test; @@ -42,6 +43,37 @@ import static org.junit.Assert.assertEquals; @SuppressWarnings({"rawtypes","unchecked"}) public class SessionFactoryTests { + + @Test + public void testWithControlEncoding() { + DefaultFtpSessionFactory sessionFactory = new DefaultFtpSessionFactory(); + sessionFactory.setControlEncoding("UTF-8"); + Assert.assertEquals("Expected controlEncoding value of 'UTF-8'", + "UTF-8", + TestUtils.getPropertyValue(sessionFactory, "controlEncoding")); + } + + @Test + public void testWithoutControlEncoding() { + DefaultFtpSessionFactory sessionFactory = new DefaultFtpSessionFactory(); + Assert.assertEquals("Expected controlEncoding value of 'ISO-8859-1'", + "ISO-8859-1", + TestUtils.getPropertyValue(sessionFactory, "controlEncoding")); + } + + @Test(expected=IllegalArgumentException.class) + public void testEmptyControlEncoding() { + DefaultFtpSessionFactory sessionFactory = new DefaultFtpSessionFactory(); + sessionFactory.setControlEncoding(""); + } + + @Test(expected=IllegalArgumentException.class) + public void testNullControlEncoding() { + DefaultFtpSessionFactory sessionFactory = new DefaultFtpSessionFactory(); + sessionFactory.setControlEncoding(null); + } + + @Test public void testClientModes() throws Exception{ DefaultFtpSessionFactory sessionFactory = new DefaultFtpSessionFactory();