THIS IS A TEST INSTANCE. ALL YOUR CHANGES WILL BE LOST!!!!
Wiki Markup |
---|
h2. File Expression Language *Available as of Camel 1.5* {info:title=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. {info} 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 supports some 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.ext | String | yes | no | yes | no | Camel 2.3: refers to the file extension only | | 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 {{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 directory {{.\filelanguage}}. The the file tokens will return as: || Expression || Returns || | file:name | test\hello.txt | | file:name.ext | 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 | 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 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.ext | 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 | 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. {tip:title=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: {code:xml} <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> {code} {tip} h3. Dependencies The File language is part of *camel-core*. |