Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

Info
titleFile 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.

...

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 By contrast to the Simple language, the File Language also supports the use of Constant expressions so you can to enter a fixed filename, for example.

All the file tokens use the same expression name as the method on the java.io.File object, for instance . For example: file:absolute refers to the java.io.File.getAbsolute() method. Notice that

Info
Note: not all expressions are supported by the current Exchange. For

...

example, the FTP component supports some of the options,

...

whereas the File component supports all of them.
Div
classconfluenceTableSmall
parent the file parent absolute Boolean no whether size Long 5 the file length returned as a Long type

Expression

Type

File Consumer

File Producer

FTP Consumer

FTP Producer

Description

date:command:pattern

String

yes

yes

yes

yes

For date formatting using the java.text.SimpleDateFormat patterns which is an extension to the Simple language.

Additional command is: file (consumers only) for the last modified timestamp of the file.

Note: all the commands from the Simple language can also be used.

file:name absolute

String Boolean

yes

no

yes no

no

refers Refers to whether the file name ( is regarded as absolute or relative to the starting directory, see note below) .

file:absolute.path

String

yes

no

no

no

Refers to the absolute file path.

file:name.ext

String

yes

no

yes

no

Camel 2.3: refers Refers to the file extension only.

file:name.noext length

String Long

yes

no

yes

no refers

Refers to the file name with no extension (is relative to the starting directory, see note below) length returned as a Long type.

file:onlyname modified

String Date

yes

no

yes

no refers

Refers to the file name only with no leading pathslast modified returned as a Date type.

file:onlyname.noext name

String

yes

no

yes

no refers

Refers to the file name only with no extension and with no leading paths(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.ext.singleStringyesnoyesnoCamel 2.14.4/2.15.3: refers to the file extension. If the file extension has multiple dots, then this expression strips and only returns the last part.
file:path name.noext

String

yes

no

yes

no

refers Refers to the file path name with no extension (is relative to the starting directory, see note below).

file:name.noext.singleStringyesnoyesnoCamel 2.14.4/2.15.3: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 is regarded as absolute or relative file:absolute.path

String

yes

no no

yes

no

refers Refers to the absolute file path file name only with no leading paths.

file:length onlyname.noext

Long String

yes

no

yes

no

refers Refers to the file length returned as a Long type name only with no extension and with no leading paths.

file:onlyname.noext.singleStringyesnoyesnoCamel 2.14.4/2.15.3: 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:parent

String

file:modified

Date

yes

no

yes

no

efers Refers to the file last modified returned as a Date type date:command:pattern parent.

file:path

String

yes yes

no

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.

File token example

...

no

Refers to the file path.

file:size

Long

yes

no

yes

no

Camel 2.5: refers to the file length returned as a Long type.

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 asreturned are:

Expression

Returns

file:absolute

false

file:absolute.path

\workspace\camel\camel-core\target\filelanguage\test\hello.txt

file:ext

txt

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 asare:

Expression

Returns

file:absolute

true

file:absolute.path

\workspace\camel\camel-core\target\filelanguage\test\hello.txt

file:ext

txt

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

Examples

You can enter a fixed Constant expression such as myfile.txt:

Code Block
languagejava

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 achieved using an expression like:

Code Block
languagejava

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 append .. as:

Code Block
languagejava

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 the in.header.type as a parameter in the dynamic expression:

Code Block
languagejava

fileName="../backup/${date:now:yyyyMMdd}/type-${in.header.type}/backup-of-${file:name.noext}.bak"

If you have a custom custom Date you want to use in the expression then Camel supports retrieving dates from the message header.

Code Block
languagejava

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 some String output (or convertible to String) to be used:

Code Block
languagejava

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.

Using Spring's PropertyPlaceholderConfigurer

...

with the File

...

Component

In Camel you can use the File Language directly from the 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:

Code Block
xml
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 File Language then make sure you
use the alternative syntax (available from Camel 2.5 onwards) to avoid clashing with Springs Spring's PropertyPlaceholderConfigurer.

Code Block
languagexml
titlebundle-context.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>
Code Block
titlebundle-context.cfg

fromEndpoint=activemq:queue:test
toEndpoint=file://fileRoute/out?fileName=test-$simple{date:now:yyyyMMdd}.txt

Notice how we use the the $simple{} syntax in the toEndpoint above.
If you don't do this, there is a they will clash and Spring will throw an exception like:

Code Block

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'

...

The File language is part of camel-core.