| [[file-language]] |
| = File Language |
| :page-source: core/camel-base/src/main/docs/file-language.adoc |
| |
| *Available as of Camel version 1.1* |
| |
| The file language is merged with |
| xref:simple-language.adoc[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 |
| xref:simple-language.adoc[Simple] language, adding file related capabilities. |
| These capabilities are related to common use cases working with file |
| path and names. The goal is to allow expressions to be used with the |
| File and FTP components for setting |
| dynamic file patterns for both consumer and producer. |
| |
| == File Language options |
| |
| // language options: START |
| The File language supports 2 options, which are listed below. |
| |
| |
| |
| [width="100%",cols="2,1m,1m,6",options="header"] |
| |=== |
| | Name | Default | Java Type | Description |
| | resultType | | String | Sets the class name of the result type (type from output) |
| | trim | true | Boolean | Whether to trim the value to remove leading and trailing whitespaces and line breaks |
| |=== |
| // language options: END |
| |
| == Syntax |
| |
| This language is an *extension* to the xref:simple-language.adoc[Simple] language |
| so the xref:simple-language.adoc[Simple] syntax applies also. So the table below |
| only lists the additional. + |
| As opposed to xref:simple-language.adoc[Simple] language |
| xref:file-language.adoc[File Language] also supports |
| xref:constant-language.adoc[Constant] expressions so you can enter a fixed |
| filename. |
| |
| All the file tokens use 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 are |
| supported by the current Exchange. For instance the xref:components::ftp-component.adoc[FTP] |
| component supports some of the options, where as the |
| File component supports all of them. |
| |
| |
| [width="100%",cols="10%,10%,10%,10%,10%,25%,25%",options="header",] |
| |=== |
| |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 |refers to the file extension only |
| |
| |file:name.ext.single |String |yes |no |yes |no |refers to the file extension. If the file |
| extension has mutiple dots, then this expression strips and only returns |
| the last part. |
| |
| |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:name.noext.single |String |yes |no |yes |no |refers to the file name with no extension (is |
| relative to the starting directory, see note below). If the file |
| extension has multiple dots, then this expression strips only the last |
| part, and keep the others. |
| |
| |file:onlyname |String |yes |no |yes |no |refers to the file name only with no leading paths. |
| |
| |file:onlyname.noext |String |yes |no |yes |no |refers to the file name only with no extension and with no leading |
| paths. |
| |
| |file:onlyname.noext.single |String |yes |no |yes |no |refers to the file name only with no extension and |
| with no leading paths. If the file extension has multiple dots, then |
| this expression strips only the last part, and keep the others. |
| |
| |file:ext |String |yes |no |yes |no |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 |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:size |Long |yes |no |yes |no |refers to the file length returned as a Long type |
| |
| |file:modified |Date |yes |no |yes |no |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.SimpleDateFormat` patterns. Is |
| an *extension* to the xref:simple-language.adoc[Simple] language. Additional |
| command is: *file* (consumers only) for the last modified timestamp of |
| the file. Notice: all the commands from the xref:simple-language.adoc[Simple] |
| language can also be used. |
| |=== |
| |
| == 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 |
| our endpoint to use this starting directory `.\filelanguage`. The file |
| tokens will return as: |
| |
| [width="100%",cols="50%,50%",options="header",] |
| |=== |
| |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 |
| |=== |
| |
| === 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 file tokens will |
| return as: |
| |
| [width="100%",cols="50%,50%",options="header",] |
| |=== |
| |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 |
| |=== |
| |
| == Samples |
| |
| You can enter a fixed xref:constant-language.adoc[Constant] expression such as |
| `myfile.txt`: |
| |
| [source] |
| ---- |
| 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 archieved using an expression like: |
| |
| [source] |
| ---- |
| fileName="backup/${date:now:yyyyMMdd}/${file:name.noext}.bak" |
| ---- |
| |
| relative folder names are also supported so suppose the backup folder |
| should be a sibling folder then you can append .. as: |
| |
| [source] |
| ---- |
| fileName="../backup/${date:now:yyyyMMdd}/${file:name.noext}.bak" |
| ---- |
| |
| As this is an extension to the xref:simple-language.adoc[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: |
| |
| [source] |
| ---- |
| 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. |
| |
| [source] |
| ---- |
| 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: |
| |
| [source] |
| ---- |
| fileName="uniquefile-${bean:myguidgenerator.generateid}.txt" |
| ---- |
| |
| And of course all this can be combined in one expression where you can |
| use the xref:file-language.adoc[File Language], xref:file-language.adoc[Simple] |
| and the xref:components::bean-component.adoc[Bean] language in one combined expression. This |
| is pretty powerful for those common file path patterns. |
| |
| == Using Spring PropertyPlaceholderConfigurer together with the File component |
| |
| In Camel you can use the xref:file-language.adoc[File Language] directly |
| from the xref:simple-language.adoc[Simple] language which makes a |
| Content Based Router easier to do in |
| Spring XML, where we can route based on file extensions as shown below: |
| |
| [source,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> |
| ---- |
| |
| If you use the `fileName` option on the File endpoint |
| to set a dynamic filename using the xref:file-language.adoc[File Language] then make sure you + |
| use the alternative syntax to avoid |
| clashing with Springs `PropertyPlaceholderConfigurer`. |
| |
| *bundle-context.xml* |
| |
| [source,xml] |
| ---- |
| <bean id="propertyPlaceholder" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> |
| <property name="location" value="classpath:bundle-context.cfg" /> |
| </bean> |
| |
| <bean id="sampleRoute" class="SampleRoute"> |
| <property name="fromEndpoint" value="${fromEndpoint}" /> |
| <property name="toEndpoint" value="${toEndpoint}" /> |
| </bean> |
| ---- |
| |
| *bundle-context.cfg* |
| |
| [source] |
| ---- |
| fromEndpoint=activemq:queue:test |
| toEndpoint=file://fileRoute/out?fileName=test-$simple{date:now:yyyyMMdd}.txt |
| ---- |
| |
| Notice how we use the $simple\{ } syntax in the `toEndpoint` above. + |
| If you don't do this, there is a clash and Spring will throw an |
| exception like |
| |
| [source,java] |
| ---------------------------------------------------------------------------------------------------- |
| org.springframework.beans.factory.BeanDefinitionStoreException: |
| Invalid bean definition with name 'sampleRoute' defined in class path resource [bundle-context.xml]: |
| Could not resolve placeholder 'date:now:yyyyMMdd' |
| ---------------------------------------------------------------------------------------------------- |
| |
| == Dependencies |
| |
| The File language is part of *camel-core*. |