この章では、JavaでJava XPathクラスとして関数を実装する方法、JDeveloperでXPath/XSL関数をデプロイする方法、およびアプリケーション・サーバーでXPath/XSL関数をデプロイする方法について説明します。
この章の内容は次のとおりです。
カスタム関数はXPathまたはXSL関数として呼び出すことができるため、実装クラスで両方を処理する必要があります。このため、ホスティング・クラスには少なくとも次が含まれている必要があります。
関数名と同じ名前のpublic staticメソッド。
このメソッドは、XSL関数の呼出しで使用されます。現在、カスタム関数のオプション・パラメータは、JDeveloperへの登録時にサポートされません。このため、オプション・パラメータがある関数は使用しないことをお薦めします。
oracle.fabric.common.xml.xpath.IXPathFunctionを実装するpublic static内部クラス
このインタフェースには次のメソッドがあります。
XPath関数の呼出し時にサービス・エンジンによってコールされるObject call (IXPathContext context, List args) throws XPathFunctionException。関数がコールされると、ランタイム・エンジンによって、XPathContextおよび関数に渡される引数のリストが渡されます。IXPathContextを使用すると、実行コンテキスト内のBPEL変数値にアクセスできます。このメソッドの実装は、関数を表すpublic staticメソッドに必然的に委任することになります。
例4-1に、現在の日付を取得するカスタム関数の実装を示します。実装では、XSLとXPathの両方のサポートを処理する必要があります。関数には、オーバーロードされたメソッドの実装方法を示すオプションのパラメータもあります。
例4-1 現在の日付を取得するためのカスタム関数の実装
package oracle.apps.aia.core;• import java.text.SimpleDateFormat; import java.util.Date; import java.util.List; import oracle.fabric.common.xml.xpath.IXPathContext; import oracle.fabric.common.xml.xpath.IXPathFunction; import oracle.fabric.common.xml.xpath.XPathFunctionException; public class DateUtils { public static class GetCurrentDateFunction implements IXPathFunction { public Object call(IXPathContext context, List args) throws XPathFunctionException { if (args.size() == 1) { String mask = (String) args.get(0); if(mask==null || mask.equals("")) mask = "yyyy-MM-dd"; return getCurrentDate(mask); } throw new XPathFunctionException("must pass one argument."); } } public static String getCurrentDate(String formatMask) { SimpleDateFormat df = new SimpleDateFormat(formatMask) String s = df. format (new Date()); return s; } . . . }
次のネーミング標準が適用されます。
関数名
関数実装クラス
関数実装メソッド
関数内部クラス
関数ネームスペース
関数ネームスペース接頭辞
関数名は、名前がローワー・キャメルケースである標準のJavaメソッド・ネーミング標準に従う必要があります。
例: getCurrentDate
、getEBMHeaderValue
など。
同じクラスに1つ以上の関数を実装できます。クラス名は、名前がアッパー・キャメルケースであるJavaクラス・ネーミング標準に従い、実装される機能の機能性を伝える必要があります
例: EBMHeaderUtils
、RoutingUtils
など。
実装クラスには、各XPath関数に対するメソッドが含まれます。メソッドには、関数名と同じ名前を付ける必要があります。パラメータのデータ型は、関数のパラメータのデータ型と一致する必要があります。関数にオプションのパラメータがある場合は、特別なオプションのパラメータを処理するために、別のオーバーロードされたメソッドを設定する必要があります。
例: getCurrentDate
、getEBMHeaderValue
など。
各XPath関数に対して、その関数のアッパー・キャメルケースにFunction接尾辞を付加したとおりの名前の内部クラスが必要です。内部クラスは、BPELからXPath関数にアクセスするためにのみ必要です。内部クラスでは、com.oracle.bpel.xml.XPath.IXPathFunctionインタフェースを実装する必要があります。
例: GetESBHeaderValueFunction
など
BPEL式ビルダー・ウィザードとXSLマッパーの両方に関数が表示されるようにするには、ネームスペースがhttp://www.oracle.com/XSL/Transform/java/で始まり、その後に、関数を実装するJavaクラスの完全修飾名が続く必要があります。
例:
http://www.oracle.com/XSL/Transform/java/oracle.apps.aia.core.ebmheader.EBMHeaderUtils
http://www.oracle.com/XSL/Transform/java/oracle.apps.aia.order.route.RoutingUtils
XPath 1.0とXSL 1.0のデータ型は、表4-1に示すように、関数への戻りパラメータまたは入力パラメータとしてサポートされます。
Table 4-1 XPath関数に対してサポートされているデータ型
XPath 1.0/XSL 1.0 | Java |
---|---|
Node-set |
XMLNodeList |
Boolean |
Boolean |
String |
String |
Number |
Int、float、doubleなど |
Tree |
XMLDocumentFragment |
カスタム関数をBPEL式ビルダーおよびXSLマッパーで表示できるようにするには、JDeveloperで登録する必要があります。これを実行するには、例4-2に示すように、ユーザー定義拡張関数構成ファイル[ext-soa-xpath-functions-config.xml]を指定し、それをFilePreferencesXSLマップを介してJDeveloperに登録します。
実装クラスは、zip/jar形式で圧縮して、$SOA_HOME/soa/modules/oracle.soa.ext_11.x.x/classesフォルダに格納する必要があります。このように、これらのクラスは、WebLogicサーバーのクラスパスに配置されます。
例4-2 ユーザー定義拡張関数の構成ファイル
<?xml version="1.0" encoding="UTF-8"?> <soa-xpath-functions xmlns=http://xmlns.oracle.com/soa/config/xpath xmlns:utl="http://www.oracle.com/XSL/Transform/java/oracle.apps.aia.core.DateUtils" <function name="utl:getCurrentDate"> <className>oracle.xpath.CustomFunction</className> <return type="string"/> <params> <param name="formatMask" type="string"/> <params> </function> <function ...> . . . </function> </functions>
Java XPath関数は、アプリケーション・サーバーに登録する必要があります。これを実行するには、$SOA_HOME/soa/modules/oracle.soa.ext_11.x.x/classes\META-INFにあるext-soa-xpath-functions-config.xmlファイルにエントリを追加します。このファイルには、システムに定義されているすべてのXPath関数のリストと説明が含まれています。
このファイルの各関数エントリの情報は、次のとおりです。
<function>: XPath関数名を定義する名前属性が含まれます。
<classname>: XPath実装クラス名を定義します。この場合は、内部クラス名です。
<return>: 戻りタイプの定義に使用します。
<params>:
関数に必要なすべてのパラメータ。
<param name="formatMask" type="string"/>
渡される各パラメータで、名前と入力のデータ型を指定します。
<function name="utl:getCurrentDate"> <className>oracle.xpath.CustomFunction</className> <return type="string"/> <params> <param name="formatMask" type="string"/> <params> </function>
実装クラスは、$SOA_HOME/soa/modules/oracle.soa.ext_11.x.x/classesフォルダに格納する必要があります。このように、これらのクラスは、SOAコンテナのクラスパスに配置され、クラスローダーで使用できます。