Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Comment: Migrated to Confluence 4.0

...

File

...

Expression

...

Language

{:=
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 are related to common use cases working with file path and names. The goal is to allow expressions to be used with the [File|File2] 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 use the same expression name as the method on the {{java.io.File}} object, for instance {{file:absolute}} refers to the {{

The File Expression Language is an extension to the 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.

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

...

FTP

...

component

...

supports

...

some

...

of

...

the

...

options,

...

where

...

as

...

the

...

File

...

component

...

supports

...

all

...

of

...

them.

Wiki Markup


{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 | 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: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 | *Camel 2.5:* refers to the file length returned as a Long type |
| file:modified | Date | yes | no | yes | no | efers 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

...

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:

...

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:

...

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 Constant expression such as myfile.txt:

Code Block
 |

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

...

archieved

...

using

...

an

...

expression

...

like:

{
Code Block
}
fileName="backup/${date:now:yyyyMMdd}/${file:name.noext}.bak"
{code}

relative

...

folder

...

names

...

are

...

also

...

supported

...

so

...

suppose

...

the

...

backup

...

folder

...

should

...

be

...

a

...

sibling

...

folder

...

then

...

you

...

can

...

append

...

..

...

as:

{
Code Block
}
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 Block
}
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 Block
}
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 Block
}
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.

...

Using

...

Spring

...

PropertyPlaceholderConfigurer

...

together

...

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
|File2] 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: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}

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

...

PropertyPlaceholderConfigurer

...

.

{:=
Code Block
title
bundle-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}

{code:title=
Code Block
titlebundle-context.cfg
}
fromEndpoint=activemq:queue:test
toEndpoint=file://fileRoute/out?fileName=test-$simple{date:now:yyyyMMdd}.txt
{code}

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

{
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'
{code}


h3. Dependencies
The File language is part of *

Dependencies

The File language is part of camel-core

...

.