[
https://issues.apache.org/jira/browse/CAMEL-13931?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Dimitri Kotlovsky updated CAMEL-13931:
--------------------------------------
Description:
Hi,
I face a requirement to place temp files in a folder at the same hierarchy as
the output folder like this:
* {{target/data/output/claus.txt}}
* {{target/data/temp/claus.tmp}}
Using a simple route definition like:
{code:java}
from("direct:a").to("file://target/data/output/?tempFileName=../temp/${file:name.noext}.tmp"){code}
If the temp folder does not exist, the GenericFileProducer should auto-create
it. However, it only does so correctly for the tempFileName path, if it is
*relativ "after" the endpoint path*. If it is above/before the endpoint path
the tempFileName path will be created as a child of the endpoint path instead:
* {{target/data/output/target/data/temp}}
This results in a NoSuchFileException when camel tries to write the temp file
into the "correct" temp directory target/data/temp afterwards.
A very easy way to reproduce this is to use the 'parentFileUrl' instead of the
'fileUrl' in the createRouteBuilder method of FileProduceTempFileNameTest.java
([https://github.com/apache/camel/blob/master/core/camel-core/src/test/java/org/apache/camel/component/file/FileProduceTempFileNameTest.java]).
was:
Hi,
I face a requirement to place temp files in a folder at the same hierarchy as
the output folder like this:
* {{target/data/output/claus.txt}}
* {{target/data/temp/claus.tmp}}
Using a simple route definition like:
{code:java}
from("direct:a").to("file://target/data/output/?tempFileName=../temp/${file:name.noext}.tmp"){code}
If the temp folder does not exist, the GenericFileProducer should auto-create
them. However, it only does this correctly for the tempFileName path, if it is
*relativ "after" the endpoint path*. If it is above the endpoint path the
tempFileName path will be created as a child of the endpoint path instead:
* {{target/data/output/target/data/temp}}
This results in a NoSuchFileException when camel tries to write the temp file
into the "correct" temp directory target/data/temp afterwards.
Here is a snippet from FileOperations.java that is responsible for building the
directory:
{code:java}
public boolean buildDirectory(String directory, boolean absolute) throws
GenericFileOperationFailedException {
ObjectHelper.notNull(endpoint, "endpoint");
// always create endpoint defined directory
if (endpoint.isAutoCreate() && !endpoint.getFile().exists()) {
LOG.trace("Building starting directory: {}", endpoint.getFile());
buildDirectory(endpoint.getFile(), endpoint.getDirectoryPermissions(),
absolute);
}
if (ObjectHelper.isEmpty(directory)) {
// no directory to build so return true to indicate ok
return true;
}
File endpointPath = endpoint.getFile();
File target = new File(directory);
File path;
if (absolute) {
// absolute path
path = target;
} else if (endpointPath.equals(target)) {
// its just the root of the endpoint path
path = endpointPath;
} else {
// relative after the endpoint path
String afterRoot = StringHelper.after(directory, endpointPath.getPath()
+ File.separator);
if (ObjectHelper.isNotEmpty(afterRoot)) {
// dir is under the root path
path = new File(endpoint.getFile(), afterRoot);
} else {
// dir is relative to the root path
path = new File(endpoint.getFile(), directory);
}
}
// We need to make sure that this is thread-safe and only one thread tries
to create the path directory at the same time.
synchronized (this) {
if (path.isDirectory() && path.exists()) {
// the directory already exists
return true;
} else {
LOG.trace("Building directory: {}", path);
return buildDirectory(path, endpoint.getDirectoryPermissions(),
absolute);
}
}
}{code}
A very easy way to reproduce this is to use the 'parentFileUrl' instead of the
'fileUrl' in the createRouteBuilder method of FileProduceTempFileNameTest.java
([https://github.com/apache/camel/blob/master/core/camel-core/src/test/java/org/apache/camel/component/file/FileProduceTempFileNameTest.java]).
> tempFileName directory is not auto-created if it is relative before the
> endpoint path
> -------------------------------------------------------------------------------------
>
> Key: CAMEL-13931
> URL: https://issues.apache.org/jira/browse/CAMEL-13931
> Project: Camel
> Issue Type: Bug
> Components: camel-core
> Affects Versions: 2.23.3, 2.22.5, 2.24.1, 3.0.0.M4
> Reporter: Dimitri Kotlovsky
> Priority: Minor
>
> Hi,
> I face a requirement to place temp files in a folder at the same hierarchy as
> the output folder like this:
> * {{target/data/output/claus.txt}}
> * {{target/data/temp/claus.tmp}}
> Using a simple route definition like:
> {code:java}
> from("direct:a").to("file://target/data/output/?tempFileName=../temp/${file:name.noext}.tmp"){code}
>
> If the temp folder does not exist, the GenericFileProducer should auto-create
> it. However, it only does so correctly for the tempFileName path, if it is
> *relativ "after" the endpoint path*. If it is above/before the endpoint path
> the tempFileName path will be created as a child of the endpoint path instead:
> * {{target/data/output/target/data/temp}}
> This results in a NoSuchFileException when camel tries to write the temp file
> into the "correct" temp directory target/data/temp afterwards.
>
>
> A very easy way to reproduce this is to use the 'parentFileUrl' instead of
> the 'fileUrl' in the createRouteBuilder method of
> FileProduceTempFileNameTest.java
> ([https://github.com/apache/camel/blob/master/core/camel-core/src/test/java/org/apache/camel/component/file/FileProduceTempFileNameTest.java]).
--
This message was sent by Atlassian Jira
(v8.3.2#803003)