File Expression Language
Available as of Camel 1.5
File language is now merged with Simple language
From Camel 2.2 onwards, the file language is now merged with Simple language which means you can use all the file syntax directly within the simple language.
The File Expression Language is an extension to the Simple language, adding file related capabilities. These capabilities is related to common use cases working with file path and names. The goal is to allow expression to be used with the [File] and FTP components for setting dynamic file patterns for both consumer and producer.
Syntax
This language is an extension to the Simple language so the Simple syntax applies also. So the table below only lists the additional.
As opposed to Simple language File Language also supports Constant expressions so you can enter a fixed filename.
All the file tokens uses the same expression name as the method on the java.io.File
object, for instance file:absolute
refers to the java.io.File.getAbsolute()
method. Notice that not all expressions is supported by the current Exchange. For instance the FTP component supports some of the options, where as the [File] component support all of them.
Expression |
Type |
File Consumer |
File Producer |
FTP Consumer |
FTP Producer |
Description |
---|---|---|---|---|---|---|
file:name | String |
yes |
no |
yes |
no |
refers to the file name (is relative to the starting directory, see note below) |
file:name.noext | String |
yes |
no |
yes |
no |
refers to the file name with no extension (is relative to the starting directory, see note below) |
file:onlyname | String |
yes |
no |
yes |
no |
Camel 2.0: refers to the file name only with no leading paths. |
file:onlyname.noext | String |
yes |
no |
yes |
no |
Camel 2.0: refers to the file name only with no extension and with no leading paths. |
file:ext | String |
yes |
no |
yes |
no |
Camel 1.6.1/Camel 2.0: refers to the file extension only |
file:parent | String |
yes |
no |
yes |
no |
refers to the file parent |
file:path | String |
yes |
no |
yes |
no |
refers to the file path |
file:absolute | Boolean |
yes |
no |
no |
no |
Camel 2.0: refers to whether the file is regarded as absolute or relative |
file:absolute.path | String |
yes |
no |
no |
no |
refers to the absolute file path |
file:length | Long |
yes |
no |
yes |
no |
refers to the file length returned as a Long type |
file:modified | Date |
yes |
no |
yes |
no |
Camel 2.0: refers to the file last modified returned as a Date type |
date:command:pattern |
String |
yes |
yes |
yes |
yes |
for date formatting using the |
File token example
Relative paths
We have a java.io.File
handle for the file hello.txt
in the following relative directory: .\filelanguage\test
. And we configure out endpoint to use this starting directory .\filelanguage
. The the file tokens will return as:
Expression |
Returns |
---|---|
file:name | test\hello.txt |
file:name.noext | test\hello |
file:onlyname | hello.txt |
file:onlyname.noext | hello |
file:ext | txt |
file:parent | filelanguage\test |
file:path | filelanguage\test\hello.txt |
file:absolute | false |
file:absolute.path | \workspace\camel\camel-core\target\filelanguage\test\hello.txt |
Absolute paths
We have a java.io.File
handle for the file hello.txt
in the following absolute directory: \workspace\camel\camel-core\target\filelanguage\test
. And we configure out endpoint to use the absolute starting directory \workspace\camel\camel-core\target\filelanguage
. The the file tokens will return as:
Expression |
Returns |
---|---|
file:name | test\hello.txt |
file:name.noext | test\hello |
file:onlyname | hello.txt |
file:onlyname.noext | hello |
file:ext | txt |
file:parent | \workspace\camel\camel-core\target\filelanguage\test |
file:path | \workspace\camel\camel-core\target\filelanguage\test\hello.txt |
file:absolute | true |
file:absolute.path | \workspace\camel\camel-core\target\filelanguage\test\hello.txt |
Samples
You can enter a fixed Constant expression such as myfile.txt
:
fileName="myfile.txt"
Lets assume we use the file consumer to read files and want to move the read files to backup folder with the current date as a sub folder. This can be archived using an expression like:
fileName="backup/${date:now:yyyyMMdd}/${file:name.noext}.bak"
relative folder names is also supported so suppose the backup folder should be a sibling folder then you can append .. as:
fileName="../backup/${date:now:yyyyMMdd}/${file:name.noext}.bak"
As this is an extension to the Simple language we have access to all the goodies from this language also, so in this use case we want to use the in.header.type as a parameter in the dynamic expression:
fileName="../backup/${date:now:yyyyMMdd}/type-${in.header.type}/backup-of-${file:name.noext}.bak"
If you have a custom Date you want to use in the expression then Camel supports retrieving dates from the message header.
fileName="orders/order-${in.header.customerId}-${date:in.header.orderDate:yyyyMMdd}.xml"
And finally we can also use a bean expression to invoke a POJO class that generates some String output (or convertible to String) to be used:
fileName="uniquefile-${bean:myguidgenerator.generateid}.txt"
And of course all this can be combined in one expression where you can use the File Language, Simple and the Bean language in one combined expression. This is pretty powerful for those common file path patterns.
Can be used in Spring XML
In Camel 2.2 you can use the File Language directly from the Simple language which makes a Content Based Router more easy to do in Spring XML, where we can route based on file extensions as shown below:
<from uri="file://input/orders"/> <choice> <when> <simple>${file:ext} == 'txt'</simple> <to uri="bean:orderService?method=handleTextFiles"/> </when> <when> <simple>${file:ext} == 'xml'</simple> <to uri="bean:orderService?method=handleXmlFiles"/> </when> <otherwise> <to uri="bean:orderService?method=handleOtherFiles"/> </otherwise> </choice>
Dependencies
The File language is part of camel-core.