[
https://issues.apache.org/jira/browse/CAMEL-13931?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Dimitri Kotlovsky updated CAMEL-13931:
--------------------------------------
Affects Version/s: 2.24.1
> 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
> them. However, it only does this for the tempFileName path, if it is *relativ
> "after" the endpoint path*.
> 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]).
--
This message was sent by Atlassian Jira
(v8.3.2#803003)