47.5. 引数名の置換

概要

API コンポーネントフレームワークでは、URI オプション名が 各プロキシークラス (Java API クラス) 内で一意 である必要があります。しかし、メソッドの引数名の場合は、必ずしもそうとは限りません。たとえば、API クラスの以下の Java メソッドについて考えてみましょう。

public void doSomething(int id, String name);
public void doSomethingElse(int id, String name);

Maven プロジェクトのビルド時、camel-api-component-maven-plugin は設定クラス ProxyClassEndpointConfiguration を生成します。これには、ProxyClass クラスのすべての引数の getter および setter メソッドが含まれます。たとえば、上記のメソッドを指定すると、プラグインは設定クラスに以下の getter メソッドと setter メソッドを生成します。

public int  getId();
public void setId(int id);
public String getName();
public void   setName(String name);

ただし、以下の例のように、id 引数が異なるタイプとして複数回表示された場合はどうなるでしょうか。

public void doSomething(int id, String name);
public void doSomethingElse(int id, String name);
public String lookupByID(String id);

この場合、コードの生成に失敗します。これは、int を返す getId メソッドと、String を返す getId メソッドを同じスコープで定義できないためです。この問題に対する解決策は、引数名の置換を使用して、引数名と URI オプション名のマッピングをカスタマイズすることです。

構文

substitutions 要素は、以下のように 1 つ以上の substitution 子要素で定義できます。

<substitutions>
  <substitution>
    <method>MethodPattern</method>
    <argName>ArgumentNamePattern</argName>
    <argType>TypeNamePattern</argType>
    <replacement>SubstituteArgName</replacement>
    <replaceWithType>[true|false]</replaceWithType>
  </substitution>
  ...
</substitutions>

argType 要素と replaceWithType 要素は任意であり、省略できます。

スコープ

以下の抜粋で示されているように、substitutions 要素は、任意で apis 要素の子や api 要素の子として表示できます。

<configuration>
  <apis>
    <api>
      <apiName>...</apiName>
      ...
      <substitutions>...</substitutions>
    </api>
    <substitutions>...</substitutions>
    ...
  </apis>
</configuration>

以下のスコープで substitutions 要素を定義できます。

  • api 要素の子として: substitutions は、api 要素で指定された API クラスにのみ適用されます。
  • apis 要素の子として: substitutions は、デフォルトですべての API クラスに適用されますが、api レベルで上書きできます。

子要素

substitution 要素は以下の子要素で定義できます。

メソッド
Java API のメソッド名と一致する正規表現 (java.util.regex 構文) を指定します。
argName
正規表現 (java.util.regex 構文) を指定して、一致したメソッドの引数名とマッチさせます。通常、パターンにはキャプチャーグループが含まれます。
argType
(任意) 引数の型に一致する正規表現 (java.util.regex 構文) を指定します。replaceWithType オプションを true に設定した場合、通常はこの正規表現でキャプチャーグループを使用します。
replacement
method パターン、argName パターン、および (任意の) argType パターンに一致する場合、replacement 要素は代替の引数名を定義します (URI で使用)。代替テキストは、argName 正規表現パターンから取得した文字列を使用して作成できます (構文 $1$2$3 を使用して、それぞれ 第 1、第 2、第 3 のキャプチャーグループを挿入します)。または、replaceWithType オプションを true に設定した場合は、argType 正規表現パターンから取得した文字列を使用して代替テキストを作成することもできます。
replaceWithType
true の場合、代替テキストが argType 正規表現から取得した文字列を使用して作成されるように指定します。デフォルトは false です。

以下の置換例は、接尾辞 Param を引数名に追加して、java.lang.String タイプのすべての引数を変更します。

<substitutions>
  <substitution>
    <method>^.+$</method>
    <argName>^.+$</argName>
    <argType>java.lang.String</argType>
    <replacement>$1Param</replacement>
    <replaceWithType>false</replaceWithType>
  </substitution>
</substitutions>

たとえば、次のようなメソッドの署名があるとします。

public String greetUs(String name1, String name2);

このメソッドの引数は、エンドポイント URI でオプション name1Param および name2Param で指定されます。