Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Wiki Markup
h2. File Expression Language

*Available as of Camel 1.5*

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. 

h3. 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 only supports a few of the options, where as the [File] component support all of them.

{div:class=confluenceTableSmall}
|| 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 relative file name with no extension with no leading paths. |
| file:ext | String | yes | no | yes | no | Camel 2.0: refers to the file extension only |
| file:name.ext | String | yes | no | yes | no | Camel 1.5: 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 {{java.text.SimepleDataFormat}} patterns. Is an *extension* to the [Simple] language. Additional command is: *file* (consumers only) for the last modified timestamp of the file. Notice: all the commands from the [Simple] language can also be used. |
{div}

h3. File token example

h4. 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 {{D:\projectdirectory {{.\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 | filelanguage\test\hello.txt |

h4. 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 thisthe absolute starting directory {{D:\projectworkspace\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:nameonlyname | 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 | falsetrue |
| file:absolute.path | D:\projectworkspace\camel\camel-core\target\filelanguage\test\hello.txt |

h3. Samples
You can enter a fixed [Constant] expression such as {{myfile.txt}}:
{code}
fileName="myfile.txt"
{code}

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:
{code}
fileName="backup/${date:now:yyyyMMdd}/${file:name.noext}.bak"
{code}

relative folder names is also supported so suppose the backup folder should be a sibling folder then you can append .. as:
{code}
fileName="../backup/${date:now:yyyyMMdd}/${file:name.noext}.bak"
{code}

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:
{code}
fileName="../backup/${date:now:yyyyMMdd}/type-${in.header.type}/backup-of-${file:name.noext}.bak"
{code}

If you have a custom Date you want to use in the expression then Camel supports retrieving dates from the message header.
{code}
fileName="orders/order-${in.header.customerId}-${date:in.header.orderDate:yyyyMMdd}.xml"
{code}

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:
{code}
fileName="uniquefile-${bean:myguidgenerator.generateid}.txt"
{code}

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.

h3. Dependencies
The File language is part of *camel-core*.