Author: ningjiang
Date: Wed Dec 19 15:11:24 2012
New Revision: 1423871
URL: http://svn.apache.org/viewvc?rev=1423871&view=rev
Log:
CAMEL-5881 FTP endpoints should support charset property like File endpoint
does, with thanks to Preben
Added:
camel/trunk/components/camel-ftp/src/test/java/org/apache/camel/component/file/remote/FtpConsumerWithCharsetTest.java
camel/trunk/components/camel-ftp/src/test/java/org/apache/camel/component/file/remote/FtpProducerFileWithCharsetTest.java
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
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=1423871&r1=1423870&r2=1423871&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 Dec 19 15:11:24 2012
@@ -184,6 +184,7 @@ public class FtpConsumer extends RemoteF
// the file name should be the relative path
answer.setFileName(answer.getRelativeFilePath());
+ answer.setCharset(endpoint.getCharset());
return answer;
}
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=1423871&r1=1423870&r2=1423871&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 Dec 19 15:11:24 2012
@@ -516,7 +516,15 @@ public class FtpOperations implements Re
try {
if (is == null) {
- is = exchange.getIn().getMandatoryBody(InputStream.class);
+ String charset = endpoint.getCharset();
+ if (charset != null) {
+ // charset configured so we must convert to the desired
+ // charset so we can write with encoding
+ is = new
ByteArrayInputStream(exchange.getIn().getMandatoryBody(String.class).getBytes(charset));
+ log.trace("Using InputStream {} with charset {}.", is,
charset);
+ } else {
+ is = exchange.getIn().getMandatoryBody(InputStream.class);
+ }
}
if (endpoint.getFileExist() == GenericFileExist.Append) {
log.trace("Client appendFile: {}", targetName);
Added:
camel/trunk/components/camel-ftp/src/test/java/org/apache/camel/component/file/remote/FtpConsumerWithCharsetTest.java
URL:
http://svn.apache.org/viewvc/camel/trunk/components/camel-ftp/src/test/java/org/apache/camel/component/file/remote/FtpConsumerWithCharsetTest.java?rev=1423871&view=auto
==============================================================================
---
camel/trunk/components/camel-ftp/src/test/java/org/apache/camel/component/file/remote/FtpConsumerWithCharsetTest.java
(added)
+++
camel/trunk/components/camel-ftp/src/test/java/org/apache/camel/component/file/remote/FtpConsumerWithCharsetTest.java
Wed Dec 19 15:11:24 2012
@@ -0,0 +1,126 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.file.remote;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.InputStream;
+import java.nio.charset.Charset;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.file.FileComponent;
+import org.apache.camel.component.mock.MockEndpoint;
+import org.apache.camel.util.IOHelper;
+import org.junit.Before;
+import org.junit.Test;
+
+public class FtpConsumerWithCharsetTest extends FtpServerTestSupport {
+
+ private final String payload = "æøå ©";
+
+ private String getFtpUrl() {
+ return "ftp://admin@localhost:" + getPort() +
"/upload?password=admin&charset=iso-8859-1";
+ }
+
+ @Override
+ @Before
+ public void setUp() throws Exception {
+ super.setUp();
+ byte[] iso = payload.getBytes("iso-8859-1");
+ byte[] utf = payload.getBytes("utf-8");
+
+ log.debug("iso: {}", new String(iso, Charset.forName("iso-8859-1")));
+ log.debug("utf: {}", new String(utf, Charset.forName("utf-8")));
+
+ for (byte b : iso) {
+ log.debug("iso byte: {}", b);
+ }
+
+ for (byte b : utf) {
+ log.debug("utf byte: {}", b);
+ }
+
+ prepareFtpServer();
+ // Check that the payload exists in upload and is in iso charset.Ã
+ File file = new File(FTP_ROOT_DIR + "/upload/iso.txt");
+ assertTrue("The uploaded file should exists", file.exists());
+
+ // Lets also test byte wise
+ InputStream fis = IOHelper.buffered(new FileInputStream(file));
+ byte[] buffer = new byte[100];
+
+ int len = fis.read(buffer);
+ assertTrue("Should read data: " + len, len != -1);
+ byte[] data = new byte[len];
+ System.arraycopy(buffer, 0, data, 0, len);
+ fis.close();
+
+ // data should be in iso, where the danish ae is -26, oe is -8 aa is
-27
+ // and copyright is -87
+ assertEquals(5, data.length);
+ assertEquals(-26, data[0]);
+ assertEquals(-8, data[1]);
+ assertEquals(-27, data[2]);
+ assertEquals(32, data[3]);
+ assertEquals(-87, data[4]);
+ }
+
+
+ @Test
+ public void testConsumerWithCharset() throws Exception {
+ MockEndpoint mock = getMockEndpoint("mock:result");
+ mock.expectedBodiesReceived(payload);
+ assertMockEndpointsSatisfied();
+
+ Exchange exchange = mock.getExchanges().get(0);
+ RemoteFile<?> file = (RemoteFile<?>)
exchange.getProperty(FileComponent.FILE_EXCHANGE_FILE);
+ assertNotNull(file);
+ assertEquals("iso-8859-1", file.getCharset());
+ // The String will be encoded with UTF-8 by default
+ byte[] data = exchange.getIn().getBody(String.class).getBytes("UTF-8");
+ // data should be in iso, where the danish ae is -61 -90, oe is -61 -72
+ // aa is -61 -91
+ // and copyright is -62 -87
+ assertEquals(9, data.length);
+ assertEquals(-61, data[0]);
+ assertEquals(-90, data[1]);
+
+ assertEquals(-61, data[2]);
+ assertEquals(-72, data[3]);
+
+ assertEquals(-61, data[4]);
+ assertEquals(-91, data[5]);
+
+ assertEquals(32, data[6]);
+
+ assertEquals(-62, data[7]);
+ assertEquals(-87, data[8]);
+ }
+
+ private void prepareFtpServer() throws Exception {
+ sendFile(getFtpUrl(), payload, "iso.txt");
+ }
+
+ protected RouteBuilder createRouteBuilder() throws Exception {
+ return new RouteBuilder() {
+ public void configure() throws Exception {
+ from(getFtpUrl()).to("mock:result");
+ }
+ };
+ }
+}
\ No newline at end of file
Added:
camel/trunk/components/camel-ftp/src/test/java/org/apache/camel/component/file/remote/FtpProducerFileWithCharsetTest.java
URL:
http://svn.apache.org/viewvc/camel/trunk/components/camel-ftp/src/test/java/org/apache/camel/component/file/remote/FtpProducerFileWithCharsetTest.java?rev=1423871&view=auto
==============================================================================
---
camel/trunk/components/camel-ftp/src/test/java/org/apache/camel/component/file/remote/FtpProducerFileWithCharsetTest.java
(added)
+++
camel/trunk/components/camel-ftp/src/test/java/org/apache/camel/component/file/remote/FtpProducerFileWithCharsetTest.java
Wed Dec 19 15:11:24 2012
@@ -0,0 +1,80 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.file.remote;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.InputStream;
+import java.nio.charset.Charset;
+
+import org.apache.camel.converter.IOConverter;
+import org.apache.camel.util.IOHelper;
+import org.junit.Test;
+
+public class FtpProducerFileWithCharsetTest extends FtpServerTestSupport {
+ private String payload = "æøå ©";
+
+ private String getFtpUrl() {
+ return "ftp://admin@localhost:" + getPort() +
"/upload?charset=iso-8859-1&password=admin";
+ }
+
+ @Override
+ public void setUp() throws Exception {
+ byte[] utf = payload.getBytes("utf-8");
+ byte[] iso = payload.getBytes("iso-8859-1");
+
+ log.debug("utf: {}", new String(utf, Charset.forName("utf-8")));
+ log.debug("iso: {}", new String(iso, Charset.forName("iso-8859-1")));
+
+ for (byte b : utf) {
+ log.debug("utf byte: {}", b);
+ }
+ for (byte b : iso) {
+ log.debug("iso byte: {}", b);
+ }
+ super.setUp();
+ }
+
+ @Test
+ public void testProducerWithCharset() throws Exception {
+ sendFile(getFtpUrl(), payload, "charset/iso.txt");
+
+ File file = new File(FTP_ROOT_DIR + "/upload/charset/iso.txt");
+ assertTrue("The uploaded file should exists", file.exists());
+ String fileContent = new String(IOConverter.toByteArray(file),
"iso-8859-1");
+ assertEquals(fileContent, payload);
+
+ // Lets also test byte wise
+ InputStream fis = IOHelper.buffered(new FileInputStream(file));
+ byte[] buffer = new byte[100];
+
+ int len = fis.read(buffer);
+ assertTrue("Should read data: " + len, len != -1);
+ byte[] data = new byte[len];
+ System.arraycopy(buffer, 0, data, 0, len);
+ fis.close();
+
+ // data should be in iso, where the danish ae is -26, oe is -8 aa is
-27
+ // and copyright is -87
+ assertEquals(5, data.length);
+ assertEquals(-26, data[0]);
+ assertEquals(-8, data[1]);
+ assertEquals(-27, data[2]);
+ assertEquals(32, data[3]);
+ assertEquals(-87, data[4]);
+ }
+}
\ No newline at end of file