This is an automated email from the ASF dual-hosted git repository.
davsclaus pushed a commit to branch camel-2.19.x
in repository https://gitbox.apache.org/repos/asf/camel.git
The following commit(s) were added to refs/heads/camel-2.19.x by this push:
new 040b129 CAMEL-12094: file/ftp producer fixed so moveExisting works
when using temp filename as well.
040b129 is described below
commit 040b1298e6896e3af43990efcc4700f6f96bd954
Author: Claus Ibsen <[email protected]>
AuthorDate: Tue Dec 26 12:01:53 2017 +0100
CAMEL-12094: file/ftp producer fixed so moveExisting works when using temp
filename as well.
---
.../camel/component/file/GenericFileProducer.java | 29 +++++++++++++++++++++-
.../file/FileProducerMoveExistingTest.java | 13 ++++++++++
.../file/remote/FtpProducerMoveExistingTest.java | 12 +++++++++
3 files changed, 53 insertions(+), 1 deletion(-)
diff --git
a/camel-core/src/main/java/org/apache/camel/component/file/GenericFileProducer.java
b/camel-core/src/main/java/org/apache/camel/component/file/GenericFileProducer.java
index a4769ec..f49a55e 100644
---
a/camel-core/src/main/java/org/apache/camel/component/file/GenericFileProducer.java
+++
b/camel-core/src/main/java/org/apache/camel/component/file/GenericFileProducer.java
@@ -116,7 +116,7 @@ public class GenericFileProducer<T> extends DefaultProducer
{
boolean writeAsTempAndRename =
ObjectHelper.isNotEmpty(endpoint.getTempFileName());
String tempTarget = null;
// remember if target exists to avoid checking twice
- Boolean targetExists = null;
+ Boolean targetExists;
if (writeAsTempAndRename) {
// compute temporary name with the temp prefix
tempTarget = createTempFileName(exchange, target);
@@ -141,6 +141,9 @@ public class GenericFileProducer<T> extends DefaultProducer
{
return;
} else if (endpoint.getFileExist() ==
GenericFileExist.Fail) {
throw new
GenericFileOperationFailedException("File already exist: " + target + ". Cannot
write new file.");
+ } else if (endpoint.getFileExist() ==
GenericFileExist.Move) {
+ // move any existing file first
+ doMoveExistingFile(target);
} else if (endpoint.isEagerDeleteTargetFile() &&
endpoint.getFileExist() == GenericFileExist.Override) {
// we override the target so we do this by
deleting it so the temp file can be renamed later
// with success as the existing target file have
been deleted
@@ -230,6 +233,30 @@ public class GenericFileProducer<T> extends
DefaultProducer {
postWriteCheck(exchange);
}
+ private void doMoveExistingFile(String fileName) throws
GenericFileOperationFailedException {
+ // need to evaluate using a dummy and simulate the file first, to have
access to all the file attributes
+ // create a dummy exchange as Exchange is needed for expression
evaluation
+ // we support only the following 3 tokens.
+ Exchange dummy = endpoint.createExchange();
+ String parent = FileUtil.onlyPath(fileName);
+ String onlyName = FileUtil.stripPath(fileName);
+ dummy.getIn().setHeader(Exchange.FILE_NAME, fileName);
+ dummy.getIn().setHeader(Exchange.FILE_NAME_ONLY, onlyName);
+ dummy.getIn().setHeader(Exchange.FILE_PARENT, parent);
+
+ String to = endpoint.getMoveExisting().evaluate(dummy, String.class);
+ // we must normalize it (to avoid having both \ and / in the name
which confuses java.io.File)
+ to = FileUtil.normalizePath(to);
+ if (ObjectHelper.isEmpty(to)) {
+ throw new GenericFileOperationFailedException("moveExisting
evaluated as empty String, cannot move existing file: " + fileName);
+ }
+
+ boolean renamed = operations.renameFile(fileName, to);
+ if (!renamed) {
+ throw new GenericFileOperationFailedException("Cannot rename file
from: " + fileName + " to: " + to);
+ }
+ }
+
/**
* If we fail writing out a file, we will call this method. This hook is
* provided to disconnect from servers or clean up files we created (if
needed).
diff --git
a/camel-core/src/test/java/org/apache/camel/component/file/FileProducerMoveExistingTest.java
b/camel-core/src/test/java/org/apache/camel/component/file/FileProducerMoveExistingTest.java
index 947c868..a3f833e 100644
---
a/camel-core/src/test/java/org/apache/camel/component/file/FileProducerMoveExistingTest.java
+++
b/camel-core/src/test/java/org/apache/camel/component/file/FileProducerMoveExistingTest.java
@@ -54,6 +54,19 @@ public class FileProducerMoveExistingTest extends
ContextTestSupport {
assertEquals("Hello World",
context.getTypeConverter().convertTo(String.class, new
File("target/file/renamed-hello.txt")));
}
+ public void testExistingFileExistsTempFileName() throws Exception {
+
template.sendBodyAndHeader("file://target/file?tempFileName=${file:onlyname}.temp&fileExist=Move&moveExisting=${file:parent}/renamed-${file:onlyname}",
+ "Hello World", Exchange.FILE_NAME, "hello.txt");
+
template.sendBodyAndHeader("file://target/file?tempFileName=${file:onlyname}.temp&fileExist=Move&moveExisting=${file:parent}/renamed-${file:onlyname}",
+ "Bye World", Exchange.FILE_NAME, "hello.txt");
+
+ assertFileExists("target/file/hello.txt");
+ assertEquals("Bye World",
context.getTypeConverter().convertTo(String.class, new
File("target/file/hello.txt")));
+
+ assertFileExists("target/file/renamed-hello.txt");
+ assertEquals("Hello World",
context.getTypeConverter().convertTo(String.class, new
File("target/file/renamed-hello.txt")));
+ }
+
public void testExistingFileExistsMoveSubDir() throws Exception {
template.sendBodyAndHeader("file://target/file?fileExist=Move&moveExisting=backup",
"Hello World", Exchange.FILE_NAME, "hello.txt");
template.sendBodyAndHeader("file://target/file?fileExist=Move&moveExisting=backup",
"Bye World", Exchange.FILE_NAME, "hello.txt");
diff --git
a/components/camel-ftp/src/test/java/org/apache/camel/component/file/remote/FtpProducerMoveExistingTest.java
b/components/camel-ftp/src/test/java/org/apache/camel/component/file/remote/FtpProducerMoveExistingTest.java
index 2e3201a..f610b0b 100644
---
a/components/camel-ftp/src/test/java/org/apache/camel/component/file/remote/FtpProducerMoveExistingTest.java
+++
b/components/camel-ftp/src/test/java/org/apache/camel/component/file/remote/FtpProducerMoveExistingTest.java
@@ -53,6 +53,18 @@ public class FtpProducerMoveExistingTest extends
FtpServerTestSupport {
}
@Test
+ public void testExistingFileExistsTempFilename() throws Exception {
+ template.sendBodyAndHeader(getFtpUrl() +
"&tempFileName=${file:onlyname}.temp&moveExisting=${file:parent}/renamed-${file:onlyname}",
"Hello World", Exchange.FILE_NAME, "hello.txt");
+ template.sendBodyAndHeader(getFtpUrl() +
"&tempFileName=${file:onlyname}.temp&moveExisting=${file:parent}/renamed-${file:onlyname}",
"Bye World", Exchange.FILE_NAME, "hello.txt");
+
+ assertFileExists(FTP_ROOT_DIR + "/move/hello.txt");
+ assertEquals("Bye World",
context.getTypeConverter().convertTo(String.class, new File(FTP_ROOT_DIR +
"/move/hello.txt")));
+
+ assertFileExists(FTP_ROOT_DIR + "/move/renamed-hello.txt");
+ assertEquals("Hello World",
context.getTypeConverter().convertTo(String.class, new File(FTP_ROOT_DIR +
"/move/renamed-hello.txt")));
+ }
+
+ @Test
public void testExistingFileExistsMoveSubDir() throws Exception {
template.sendBodyAndHeader(getFtpUrl() + "&moveExisting=backup",
"Hello World", Exchange.FILE_NAME, "hello.txt");
template.sendBodyAndHeader(getFtpUrl() + "&moveExisting=backup", "Bye
World", Exchange.FILE_NAME, "hello.txt");
--
To stop receiving notification emails like this one, please contact
['"[email protected]" <[email protected]>'].