Function Mapper

JSP-EL では、<prefix>:<localName>(…) 形式の関数参照を式の中で使用することができます。JSP-EL ベースの Expression Manager は、こうした関数参照の解決を関数マッパーに委任します。Java における関数マッパーは、javax.servlet.jsp.el.FunctionMapper インターフェイスの実装です。関数マッパーの役割は、プレフィックスとローカル名を、Expression Manager が式を評価する過程で呼び出すことのできる静的 Java 関数(java.lang.reflect.Method のインスタンス)に解決することです。

Expression Manager 構築ブロックには、関数マッパーの実装が、Expression Manager バンドルの一部としてデプロイされた OSGi サービスの形で提供されています。この実装は、同じ CRX コンテナにデプロイされている他のバンドルに対し、式の中で使用できるようにエクスポートしている関数がないか問い合わせることによって関数のレジストリを作成します。したがって、この関数マッパーに渡すプレフィックスとローカル名は、この集約されたレジストリ内のいずれかの関数に解決可能である必要があります。Expression Manager は、バンドルによってエクスポートできる 2 種類の関数をサポートしています。
  • リモート関数:リモート関数は、Bean が実装するインターフェイス上で宣言されたメソッドに解決されます。ホストバンドルによる Bean の公開は、OSGi サービスのほか、Flex リモートサービス経由で実現されます。リモート関数は、次のどちらからでも呼び出すことができます。
    • サーバー側の Expression Manager(同じ CRX コンテナにデプロイされているからです)

    • クライアント側の Expression Manager(該当する関数が Flex リモートサービス経由で公開されているからです)

    リモート関数には、「REMOTE_」というキーワードで始まるプレフィックスが使用されます。

  • ローカル関数:式の評価が行われるランタイムに対してローカルな関数です。Java におけるローカル関数は、Java のクラスに定義された静的関数と対応しています。Flex におけるローカル関数は、ActionScript のクラスに定義された通常のメソッドと対応しています。Expression Manager の実装は、2 つのローカル関数が、一方は Java で、もう一方は Flex で実装され、互いに対称の関係にあることを前提としています。

    例えば、'str:substring(…)' という論理関数があるとします。'com.adobe.exm.java.StringUtils' という Java クラスに定義された静的 'substring' メソッドが Java の実装です。このとき、Flex の実装として、'com.adobe.exm.flex.StringUtilities' という ActionScript クラスに 'substr' メソッドが定義されており、両者は対称の関係にあります。

最初の部分が「REMOTE_」キーワードではないプレフィックスはすべて、ローカル関数にマップされます。Expresion Manager の関数マッパーは両方の種類の関数を扱うことができますが、その区別は、関数プレフィックスが「REMOTE_」キーワードで始まるかどうかに基づいて行われます。この関数マッパーは、Spring コンテキスト内で使用できるパブリッククラスとしては利用できません。あくまで Expression Manager バンドルにホストされた OSGi サービスであり、それを利用する側のバンドルのカスタム Spring コンテキストに BluePrint を介してインポートする必要があります。
<bp:reference id="<mapper_id> " 
    interface="javax.servlet.jsp.el.FunctionMapper" 
filter="(exm.function.mapper.id=lc.exm.compositeFunctionMapper)"/>

インポートされたサービスは、カスタム Spring コンテキストで設定された DefaultEXPEvaluator Bean に対し、<mapper_id> を参照として注入することができます。