298.5. 演算子サポート

パーサーは、単一の演算子のみをサポートするように制限されています。

有効にするには、左の値を $\{ } で囲む必要があります。構文は以下のようになります。

${leftValue} OP rightValue

rightValue は、' ' で囲まれた文字列リテラル、null、定数値、または $\{ } で囲まれた別の式に指定できます。

重要

演算子の前後にはスペースが 必要 です。

Camel は rightValue 型を leftValue 型に自動的に型変換します。文字列を数値に変換して、数値に対して > 比較を使用できるようにします。

次の演算子がサポートされています。

Operator説明

==

等しい

=~

Camel 2.16: equals は大文字と小文字を区別しません (文字列値を比較するときに大文字と小文字を区別しません)

>

は次の値よりも大きい:

>=

より大きいか等しい

<

は次の値よりも小さい:

より小さいか等しい

!=

等しくない

contains

文字列ベースの値に含まれているかどうかをテストします

not contains

文字列ベースの値に含まれていないかどうかをテストします

~~

文字列ベースの値で大文字と小文字の区別を無視して含まれているかどうかをテストします

regex

文字列値として定義された特定の正規表現パターンと照合するため

not regex

文字列値として定義された特定の正規表現パターンと一致しない場合

in

一連の値があり、各要素をコンマで区切る必要がある場合に照合するため空の値を含める場合は 2 つのコンマを使用して定義する必要があります。たとえば、',,bronze,silver,gold' のように、空の値と 3 つのメダルを含めた 4 つの値のセットです。

not in

値がセットでなく、各要素をコンマで区切る必要がある場合に照合するため。空の値を含める場合は 2 つのコンマを使用して定義する必要があります。たとえば、',,bronze,silver,gold' のように、空の値と 3 つのメダルを含めた 4 つの値のセットです。

is

左側の型が値のインスタンスである場合に照合するため。

not is

左側の型が値のインスタンスでない場合に照合するため。

range

左辺が数値として定義された値の範囲内にある場合に照合するため (from..to)。Camel 2.9 以降では、範囲の値を一重引用符で囲む必要があります。

not range

左辺が数値として定義された値の範囲内にない場合に照合するため (from..toCamel 2.9 以降では、範囲の値を一重引用符で囲む必要があります。

starts with

Camel 2.17.1, 2.18: 左辺の文字列が右辺の文字列で開始するかどうかをテストします

ends with

Camel 2.17.1, 2.18: 左辺の文字列が右辺の文字列で終了するかどうかをテストします

また、次の単項演算子を使用できます。

演算子説明

++

Camel 2.9: 数値を 1 ずつ増やします。左辺は関数でなければならず、それ以外の場合はリテラルとして解析されます。

 — 

Camel 2.9: 数値を 1 ずつ減らします。左辺は関数でなければならず、それ以外の場合はリテラルとして解析されます。

\

Camel 2.9.3 から 2.10.x 値をエスケープするには、たとえば \$ で $ 記号を示します。特殊: 改行には \n、タブには \t、キャリッジリターンには \r を使用します。注意: File Language を使用したエスケープはサポートされ ていません注意: Camel 2.11 以降、エスケープ文字はサポートされなくなりましたが、次の 3 つの特別なエスケープ文字に置き換えられました。

\n

Camel 2.11: 改行文字を使用する場合。

\t

Camel 2.11: タブ文字を使用する場合。

\r

Camel 2.11: キャリッジリターン文字を使用する場合。

\}

Camel 2.18: } 文字をテキストとして使用する場合。

また、次の論理演算子を使用して式をグループ化できます。

演算子説明

および

非推奨 代わりに && を使用します。and 論理演算子は、2 つの式のグループ化に使用されます。

または

|| 非推奨 代わりに || を使用します。or 論理演算子は、2 つの式のグループ化に使用されます。

&&

Camel 2.9: and 論理演算子は、2 つの式のグループ化に使用されます。

||

Camel 2.9: or 論理演算子は、2 つの式のグループ化に使用されます。

重要

and、or 演算子の使用 Camel 2.4 以前ではand または or は simple 言語式で 1 回しか 使用できません。Camel 2.5 以降では、これらの演算子を複数回使用できます。

AND の構文は次のとおりです。

${leftValue} OP rightValue and ${leftValue} OP rightValue

OR の構文は次のとおりです。

${leftValue} OP rightValue or ${leftValue} OP rightValue

例:

// exact equals match
simple("${in.header.foo} == 'foo'")

// ignore case when comparing, so if the header has value FOO this will match
simple("${in.header.foo} =~ 'foo'")

// here Camel will type convert '100' into the type of in.header.bar and if it is an Integer '100' will also be converter to an Integer
simple("${in.header.bar} == '100'")

simple("${in.header.bar} == 100")

// 100 will be converter to the type of in.header.bar so we can do > comparison
simple("${in.header.bar} > 100")

298.5.1. さまざまなタイプとの比較

String や int などの異なる型と比較する場合は、少し注意が必要です。Camel は左辺のタイプを優先して使用します。右辺の型に基づいて両方の値を比較できなかった場合は、右辺の型にフォールバックします。
これは、値を反転して特定のタイプを適用できることを意味します。上記のバーの値が文字列であるとします。次に、方程式を反転できます。

simple("100 < ${in.header.bar}")

これにより、int 型が最優先で使用されます。

これは、Camel チームがバイナリー比較演算を改善して、文字列ベースよりも数値型を優先する場合に、今後変更される可能性があります。数値と比較するときに問題を引き起こすのは、ほとんどの場合 String 型です。

// testing for null
simple("${in.header.baz} == null")

// testing for not null
simple("${in.header.baz} != null")

また、正しい値が別の式である場合の、もう少し高度な例

simple("${in.header.date} == ${date:now:yyyyMMdd}")

simple("${in.header.type} == ${bean:orderService?method=getOrderType}")

contains が含まれる例。タイトルに Camel という用語が含まれるかをテストします。

simple("${in.header.title} contains 'Camel'")

正規表現が含まれる例。数のヘッダーが 4 桁の値かどうかをテストします。

simple("${in.header.number} regex '\\d{4}'")

最後に、ヘッダーがリスト内のいずれかの値と等しい場合の例を示します。各要素はコンマで区切る必要があり、前後にスペースを入れないでください。
Camel は各要素を左辺の型に変換するため、これは数値などにも機能します。

simple("${in.header.type} in 'gold,silver'")

また、最後の 3 つについては、not を使用した否定テストもサポートしています。

simple("${in.header.type} not in 'gold,silver'")

そして、文字列など、タイプが特定のインスタンスであるかどうかをテストできます。

simple("${in.header.type} is 'java.lang.String'")

次のように記述できるように、すべての java.lang タイプの短縮形を追加しました。

simple("${in.header.type} is 'String'")

範囲もサポートされています。範囲間隔には数字が必要で、最初と最後の両方の値が含まれます。たとえば、値が 100 から 199 の間であるかどうかをテストするには、次のようにします。

simple("${in.header.number} range 100..199")

スペースなしの範囲で .. を使用していることに注意してください。Groovy と同じ構文に基づいています。

Camel 2.9 以降では、範囲の値は一重引用符で囲む必要があります

simple("${in.header.number} range '100..199'")

298.5.2. Spring XML の使用

Spring XML は、さまざまなビルダーメソッドをすべて備えた Java DSL ほど強力ではないため、単純な演算子でテストするには、他の言語を使用する必要があります。これで、Simple 言語でこれを行うことができます。以下のサンプルでは、ヘッダーがウィジェットの注文かどうかをテストします。

<from uri="seda:orders">
   <filter>
       <simple>${in.header.type} == 'widget'</simple>
       <to uri="bean:orderService?method=handleWidget"/>
   </filter>
</from>