ヘッダーをスキップ
Oracle® Fusion Middleware Oracle Service Bus開発者ガイド
11gリリース1 (11.1.1.7)
B61435-07
  ドキュメント・ライブラリへ移動
ライブラリ
製品リストへ移動
製品
目次へ移動
目次

前
 
次
 

23 カスタムXPath関数の作成と使用

この章では、Oracle Service Bus内でXQuery式のカスタムXPath関数を作成、登録および使用する方法について説明します。

Oracle Service Busでは、カスタムXPath関数を作成するための充実したフレームワークが提供され、カスタムXPath関数は、プロキシ・サービス・メッセージ・フロー、分割-結合、XQuery Mapper変換など、開発時や実行時のツールにおいてXQuery式エディタで使用できます。

カスタムXPath関数を作成および使用するプロセスの概要は次のとおりです。


注意:

Oracle Service Busでは、データベース表の更新やグローバル・トランザクションへの参加といった二次的な動作を含むカスタム関数はサポートされません。XQuery結果のみに影響するカスタム関数を作成し、二次的な動作はJavaコールアウトなど他の機能を使用して実行してください。


23.1 Oracle Service Busでのカスタム関数の登録

カスタム関数は、インストール内のOracle Service Busのすべてのプロジェクトとサービスで使用できます。特定のドメインに限られません。

カスタム関数の登録には、XMLファイル(およびローカライズ用のオプション・プロパティ・ファイル)の作成が必要です。Oracle Service Bus提供の組込み関数はこの関数フレームワークが使用されるため、このような既存の登録リソースをガイダンスとして使用できます。これらのファイルは次の場所にあります。

OSB_ORACLE_HOME/config/xpath-functions/

Oracle Service Busの関数ファイルはosb-built-in.xmlです。このファイルでは、%記号で囲まれたキー(%OSB_FUNCTIONS%など)は対応する.propertiesファイルから値を取得します。

カスタム関数登録ファイルの基本構造は次のとおりです。その後で要素について説明します。

category id
    group id
        function
            name
            comment
            namespaceURI
            className
            method
            isDeterministic

要素にはxpf:接頭辞が付きます。

カスタム関数の要素の説明

カスタム関数がXQuery式エディタに表示されるのは、Oracle Service Busがカスタム・クラスを検出できるようになってからです。次の項では、カスタム・クラスとパッケージを作成して、Oracle Service Busで検出できるようにする方法を説明します。

23.2 カスタム関数のJavaクラスの作成とパッケージ化

次のガイドラインに従って、カスタムXPath関数のクラスを作成してパッケージ化します。

23.2.1 クラスとメソッドの作成

次のガイドラインに従って、カスタム関数のJavaクラスとメソッドを作成します。

  • クラス - クラスはパブリックであることが必要です。

  • メソッド - メソッドはパブリックかつ静的であることが必要です。

  • 引数および戻り値 - 表23-1に、メソッドの引数と戻り値でサポートされる型を示します。この表に含まれない型はサポートされません。内部クラスおよび多次元配列はサポートされません。

    表23-1 カスタム関数でサポートされるJavaメソッドの型

    Javaの型 XQueryの型 XSLTの型

    java.lang.String

    xs:string

    string

    int、java.lang.Integer

    xs:int

    number

    boolean、java.lang.Boolean

    xs:boolean

    boolean

    long、java.lang.Long

    xs:long

    number

    short、java.lang.Short

    xs:short

    number

    byte、java.lang.Byte

    xs:byte

    number

    double、java.lang.Double

    xs:double

    number

    float、java.lang.Float

    xs:float

    number

    char、java.lang.Char

    xs:string

    object

    java.math.BigInteger

    xs:integer

    number

    java.math.BigDecimal

    xs:decimal

    number

    java.util.Date

    xs:datetime

    脚注脚注 1 を参照してください。

    java.sql.Date

    xs:date

    脚注を参照してください。

    java.sql.Time

    xs:time

    脚注を参照してください。

    javax.xml.namespace.QName

    xs:Qname

    脚注を参照してください。

    org.apache.xmlbeans.XmlObject

    element()

    脚注を参照してください。

    org.w3c.dom.Element

    element()

    XSLTのnode-set型はカスタムXPath関数ではサポートされません。


    脚注 1 文字列に変換されてから元の型として渡されます。

23.2.1.1 1次元配列の使用

1次元配列(サポート対象のJavaの型を使用)が、アスタリスク(*)を使用して、対応するXQueryの型にマップされます(アスタリスクは、配列の複数のカーディナリティを暗黙に指定するワイルドカードです)。例:

public static XmlObject[] getArrayOfXmlObjects(XmlObject[] a)

これが次の型にマップされます。

namespace:getArrayOfXmlObjects($arg1 as element()*) as element()*

1次元配列の入力引数または戻り値を含む関数のシグネチャでは、http://docs.oracle.com/javase/6/docs/api/java/lang/Class.html#getName%28%29で説明されている型のエンコーディングを使用する必要があります。次の例は、カスタム関数XMLファイルで、必要な配列エンコーディングを使用して1次元配列のメソッドを指定する方法を示します。

Javaメソッド カスタム関数XMLファイルでの入力

public static String[] myUppercaseStringArray(String[] arg)

Ljava.lang.String; myUppercaseStringArray([Ljava.lang.String;)

public static int[] myAddInts(int[] arg)

[I myAddInts([I)


23.2.2 カスタム関数クラスのパッケージ化

カスタム関数をXQueryエディタに組み込んで使用するためには、Oracle Service Busがそれらのカスタム関数を認識する必要があります。

カスタム関数クラスをJARファイルにパッケージ化し、そのJARを次のいずれかのディレクトリに置きます。

  • OSB_ORACLE_HOME/config/xpath-functions/

  • DOMAIN_HOME/config/osb/xpath-functions/

OSB_ORACLE_HOMEはService Busがインストールされている場所を、DOMAIN_HOMEはService Busドメインがインストールされているディレクトリを表します。

IDEおよびサーバーの起動時に、Service Busは、これらのディレクトリのカスタム関数クラスから使用可能なカスタム関数を検索します。23.1項「Oracle Service Busでのカスタム関数の登録」に従って、カスタム関数のXMLファイルでカスタム・クラスおよびメソッドを正しく参照してください。

新しいカスタム関数を追加したら、IDEと新しい関数を使用するすべてのサーバーを再起動する必要があります。

23.3 カスタム関数の使用

ここでは、Oracle Service Busでカスタム関数を使用する方法について説明します。

23.3.1 インラインXQuery式およびXQueryリソースでのカスタム関数の使用

Oracle Service Bus提供の関数と同様に、インラインXQuery式とXQueryリソースの両方にカスタム関数を含めることができます。

23.3.2 XSLTリソースでのカスタム関数の使用

XSLTリソース内からカスタム関数を呼び出すための構文は、Oracle Service Busで使用するXSLTエンジンによって異なります。次のカスタム関数コードに対して、Xalan XSLTエンジン(Oracle JDK対応のMicrosoft Windowsでのデフォルト)を使用してカスタム関数を呼び出す構文を例23-1に示します。

package tests.pipeline;
public class CustomXQFunctions
{
    public static String myUppercaseString(String arg)
    {
       return arg.toUpperCase(); 
    }
}

例23-1 Xalanエンジンを使用してカスタム関数を呼び出すための構文

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"   version="1.0">
  <xsl:param name="arg-string"/>
  <xsl:template name="myUppercaseString" 
              xmlns:ns0="xalan://tests.pipeline.CustomXQFunctions">
   <xsl:variable name="upcase" select="ns0:myUppercaseString($arg-string)" />
   <originalInput>
     <xsl:value-of  select="$arg-string" />
   </originalInput>
   <result>
     <xsl:value-of select="$upcase" />
   </result>
 </xsl:template>
  <xsl:template match="*">
    <xsl:copy>
        <xsl:call-template name="myUppercaseString"/>
    </xsl:copy>
  </xsl:template>
</xsl:stylesheet>

入力ドキュメントが<example />、入力arg-stringの値がhelloの場合、変換は次のように行われます。

<example>
   <originalInput>hello</originalInput>
   <result>HELLO</result>
</example>

23.4 EclipseでのカスタムXPath関数のテスト

EclipseでカスタムXPath関数を含むXQueryリソースのテストは、接続しているサーバーのみでサポートされています。「Run」「Run As」「Run on Server」コマンドを使用すると、テスト・コンソールでリソースが実行されます。

23.5 クラスタへのカスタム関数のデプロイ

複数のOracle Fusion Middleware製品のホームがある複数サーバー環境では、カスタム関数が使用される環境ごとにすべてのカスタム関数リソースを手動で追加する必要があります。クラスタリングによって、すべての管理対象サーバーにカスタム関数リソースが自動的に配布されるわけではありません。