ヘッダーをスキップ
Oracle® Fusion Middleware Oracle Event Processing CQL言語リファレンス
11gリリース1 (11.1.1.7)
B61613-06
  目次へ移動
目次

前
 
次
 

15 Oracle Javaデータ・カートリッジ

この章では、Oracle Event ProcessingアプリケーションのJavaクラスとシームレスに対話するCQLコードを記述できる、Oracle Continuous Query Language (Oracle CQL)の拡張であるOracle Javaデータ・カートリッジの使用方法について説明します。

この章では、Oracle Javaデータ・カートリッジが公開する型、メソッド、フィールドおよびコンストラクタについて説明します。これらの型、メソッド、フィールドおよびコンストラクタを、Oracle CQLのネイティブ型と同様に、Oracle CQLの問合せおよびビューで使用できます。

この章の内容は次のとおりです。

詳細は、次を参照してください。

15.1 Oracle Javaデータ・カートリッジについて

Oracle Javaデータ・カートリッジは、Oracle Event ProcessingアプリケーションでJavaクラスとシームレスに対話するOracle CQLの問合せおよびビューを記述できる組込みのJavaカートリッジです。

この項の内容は、次のとおりです。

15.1.1 データ・カートリッジ名

Oracle Javaデータ・カートリッジでは、カートリッジID com.oracle.cep.cartrdiges.javaを使用します。

Oracle Javaデータ・カートリッジは、Oracle Event Processingのデフォルトのデータ・カートリッジです。

デフォルトのJavaパッケージ名の下の型、またはjava.langシステム・パッケージの下の型について、Oracle CQL問合せでパッケージ名またはデータ・カートリッジ名で修飾されていないJava型を参照できます。

<query id="q1"><![CDATA[
    select String(“foo”) …
]]></query>

注意:

Oracle Javaデータ・カートリッジの型名を簡易化するために、2.7.2項「Aliases要素を使用した別名の定義」に示すように別名を使用できます。


詳細は、次を参照してください。

15.1.2 クラスのロード

Oracle Javaデータ・カートリッジでは、Oracle CQL問合せが参照するJavaクラスのロードについて、次のポリシーをサポートしています。

詳細は、次を参照してください。

15.1.2.1 アプリケーション・クラス・スペース・ポリシー

これは、デフォルトのクラス・ローディング・ポリシーです。

このモードでは、Oracle Javaデータ・カートリッジはJavaクラスの検索時に、有効範囲内のアプリケーションのクラス・スペースを使用します。

これは、型がローカル名によってのみ指定されている場合、すなわち識別子が1つで、他の識別子がパッケージで使用されていない場合にのみ適用できます。次のような場合です。

select String(“foo”) …

次の場合には適用できません。

select java.lang.String(“foo”) …

この場合、手順は次のようになります。

  • 通常どおりに、アプリケーションのクラス・スペースを使用して、1つの識別子(ID1と呼びます)で定義されたクラスをロードします。これに失敗した場合、

  • アプリケーションで、パッケージとは関係なく、バンドルの内部クラス・パス内で名前がID1と一致するクラスが定義されているかどうかを確認します。これに失敗した場合、

  • アプリケーションでImport-Package MANIFESTヘッダー文が指定されているかどうかを確認します。これとID1を使用して、Javaクラスをロードできます。

例については、15.1.2.4項「クラスのロード例」を参照してください。

15.1.2.2 自動インポートなしクラス・スペース・ポリシー

これは、オプションのクラス・ローディング・ポリシーです。このポリシーを使用するには、Oracle Event Processingアプリケーションに次のMANIFESTヘッダー・エントリを含める必要があります。

OCEP_JAVA_CARTRIDGE_CLASS_SPACE: APPLICATION_NO_AUTO_IMPORT_CLASS_SPACE

このモードは、パッケージが指定されていない場合に、Oracle Event Processingがパッケージの自動インポートを試行しない点を除いて、アプリケーション・クラス・スペース・ポリシーとほぼ同じです。

詳細は、15.1.2.1項「アプリケーション・クラス・スペース・ポリシー」を参照してください。

15.1.2.3 サーバー・クラス・スペース・ポリシー

これは、オプションのクラス・ローディング・ポリシーです。このポリシーを使用するには、Oracle Event Processingアプリケーションに次のMANIFESTヘッダー・エントリを含める必要があります。

OCEP_JAVA_CARTRIDGE_CLASS_SPACE: SERVER_CLASS_SPACE

Oracle CQL問合せでは、エクスポート元のアプリケーションやモジュールに関係なく、エクスポートされたすべてのJavaクラスを参照できます。

また、問合せでは、ランタイムJDKクラスを含む、OSGiフレームワークの親クラス・ローダーに表示されるすべてのクラスにアクセスできます。

すなわち、Oracle CQLアプリケーションには、他のOracle Event Processingアプリケーションで定義されたクラスを、それらがエクスポートされているかぎり参照するOracle CQL問合せを含めることができます。これにより、新しいJavaライブラリを提供することが唯一の目的であるJavaベース・カートリッジの作成が容易になります。


注意:

Oracle Event Processingアプリケーション内のプロセッサがOracle CQL問合せを定義する場合であっても、このアプリケーションの内部クラス・パスの一部であるJavaクラスを参照できるのは、これがエクスポートされている場合のみです。


例については、15.1.2.4項「クラスのロード例」を参照してください。

15.1.2.4 クラスのロード例

図15-1に示す例があるとします。アプリケーションB1は、アプリケーションB2がエクスポートするパッケージmypackage3をインポートします。

図15-1 Oracle Event Processingアプリケーションの例

図15-1の説明が続きます
「図15-1 Oracle Event Processingアプリケーションの例」の説明

表15-1に、アプリケーション・クラス・スペースまたはサーバー・クラス・スペースのどちらで実行されているかによって、これら2つの異なるアプリケーションがアクセスできるクラスを示します。

表15-1 クラス・ローディング・ポリシー別のクラスのアクセシビリティ

クラス・ローディング・ポリシー アプリケーションB1 アプリケーションB2

アプリケーション・クラス・スペース

  • mypackage1.A

  • myprivatepackage1.B

  • package2.C

  • package2.C

  • privatepackage2.D

サーバー・クラス・スペース

  • package2.C

  • package2.C


アプリケーションB1では、Oracle CQL問合せでJavaクラスA、BおよびCのいずれも使用できます。

select A …
select B …
select C …

しかし、アプリケーションB2では、Oracle CQL問合せでJavaクラスAおよびBは使用できません。JavaクラスCおよびDのみ使用できます。

select C …
select D …

15.1.3 メソッドの解決

JavaメソッドにアクセスするOracle CQL式は、次のアルゴリズムを使用してメソッドを解決します。

  1. すべてのパラメータは、15.1.4項「データ型マッピング」に説明されているように、Java型に変換されます。

    たとえば、Oracle CQL INTEGERはJavaプリミティブintに変換されます。

  2. 標準のJavaメソッド解決ルールが、Java言語仕様の第3版、15.12項「Method Invocation Expressions」に説明されているとおりに適用されます。


注意:

可変arityメソッドはサポートされていません。詳細は、Java言語仕様の第3版、12.12.2.4項を参照してください。


例として、次のOracle CQL式を考えてみます。

attribute.methodA(10)

attributeは、オーバーロードされた次のメソッドを定義する型mypackage.MyTypeです。

  • methodA(int)

  • methodA(Integer)

  • methodA(Object)

  • methodA(long)

リテラル10はプリミティブ型intであるため、優先順位は次のとおりです。

  • methodA(int)

  • methodA(long)

  • methodA(Integer)

  • methodA(Object)

詳細は、15.1.2項「クラスのロード」を参照してください。

15.1.4 データ型マッピング

Oracle Javaデータ・カートリッジは、Oracle CQLネイティブのデータ型とJavaデータ型の間に、固定の非対称なマッピングを適用します。

  • 表15-2に、Oracle CQLネイティブのデータ型とJavaデータ型の間のマッピングを示します。

  • 表15-3に、Javaデータ型とOracle CQLネイティブのデータ型の間のマッピングを示します。

表15-2 Oracle Javaデータ・カートリッジ: Oracle CQLからJavaデータ型へのマッピング

Oracle CQLネイティブのデータ型 Javaデータ型

BIGINT

long脚注1

BOOLEAN

boolean脚注1

BYTE

byte[]脚注1

CHAR

java.lang.String

DOUBLE

double脚注1

FLOAT

float脚注1

INTEGER

int脚注1

INTERVAL

long脚注1

XMLTYPE

java.lang.String


脚注 1 プリミティブなJavaデータ型

表15-3 Oracle Javaデータ・カートリッジ: Javaデータ型からOracle CQLへのマッピング

Javaデータ型 Oracle CQLネイティブのデータ型

long脚注1

BIGINT

boolean脚注1

BOOLEAN

byte[]脚注1

BYTE

java.lang.String

CHAR

double脚注1

DOUBLE

float脚注1

FLOAT

int脚注1

INTEGER

java.sql.Date

java.sql.Timestamp

INTERVAL

java.sql.SQLXML

XMLTYPE


脚注 1 プリミティブなJavaデータ型

他のすべてのJavaクラスは、複合型としてマップされます。

これらのデータ型マッピングの詳細は、次の項を参照してください。

Oracle CQLネイティブのデータ型とその暗黙的および明示的なデータ型変換の詳細は、2.1項「データ型」を参照してください。

15.1.4.1 Javaデータ型文字列とOracle CQLデータ型CHAR

Oracle CQLデータ型CHARjava.lang.Stringにマップされ、java.lang.StringはOracle CQLデータ型CHARにマップされます。すなわち、Oracle CQL CHARとして定義された属性のjava.lang.Stringメンバー・フィールドおよびメソッドにアクセスできます。たとえば、a1がOracle CQL CHAR型として宣言されている場合、次のような問合せを記述できます。

<query id="q1"><![CDATA[ 
    select a1.substring(1,2)
]]></query>

15.1.4.2 リテラル

Oracle CQL CHARリテラルであっても、リテラルのメンバー・フィールドおよびメソッドにはアクセスできません。たとえば、次のような問合せは使用できません

<query id="q1-forbidden"><![CDATA[ 
    select "hello".substring(1,2)
]]></query>

15.1.4.3 配列

Javaの配列はOracle CQLデータ・カートリッジの配列に変換され、Oracle CQLデータ・カートリッジの配列はJavaの配列に変換されます。これは、複合型と単純型の両方に適用されます。

データ・カートリッジのTABLE句を使用して、Oracle CQL問合せのFROM句内のデータ・カートリッジ関数から返された複数の行にアクセスできます。

詳細は、次を参照してください。

15.1.4.4 コレクション

通常、Oracle Javaデータ・カートリッジはjava.util.Collectionインタフェースを実装するインスタンスをOracle CQL複合型に変換します。

Oracle CQL問合せは、java.util.Collectionのメンバーを介して繰り返すことができます。

データ・カートリッジのTABLE句を使用して、Oracle CQL問合せのFROM句内のデータ・カートリッジ関数から返された複数の行にアクセスできます。

詳細は、次を参照してください。

15.1.5 Oracle Javaデータ・カートリッジのOracle CQL問合せサポート

Oracle Javaデータ・カートリッジ型は、SELECTおよびWHERE句内の式で使用できます。

Oracle Javaデータ・カートリッジ型は、ORDER BY句内の式では使用できません。

詳細は、次を参照してください。

15.2 Oracle Javaデータ・カートリッジの使用

この項では、Oracle Event ProcessingアプリケーションでOracle Javaデータ・カートリッジをどのように使用できるかを中心に、次のような一般的な使用例を説明します。

詳細は、次を参照してください。

15.2.1 Java APIを使用する問合せ方法

この手順では、Javaクラス(Address.java)として定義されたイベント・プロパティ・タイプを持つ、タプル(Student)として定義された1つのイベント・タイプを使用するOracle Event Processingアプリケーションで、Oracle Javaデータ・カートリッジを使用する方法について説明します。

Javaクラスを使用して問合せするには:

  1. Address.javaクラスを、例15-1に示すように実装します。

    例15-1 Address.javaクラス

    package test;
    
    class Address {
        String street;
        String state;
        String city;
        String [] phones;
    }
    

    この例では、Address.javaクラスがこのアプリケーションに属すると仮定します。

    Address.javaクラスが他のOracle Event Processingアプリケーションに属する場合、親アプリケーションでエクスポートする必要があります。詳細は、15.2.2項「エクスポートしたJavaクラスを使用する問合せ方法」を参照してください。

  2. イベント・タイプ・リポジトリを、例15-2に示すように定義します。

    例15-2 イベント・タイプ・リポジトリ

    <event-type-repository>
        <event-type name="Student">
            <properties>
                <property name="name" type="char"/>
                <property name="address" type="Address"/>
            </properties>
        </event-type>
    
        <event-type name="Address">
            <class-name>test.Address</class-name>
        </event-type>
    <event-type-repository>
    

    test.Addressクラスは、このアプリケーションに属しているため、イベント・タイプ・リポジトリで宣言できます。これにより、自動的にこのアプリケーション内でクラスに対してグローバルにアクセスできるようになります。パッケージをエクスポートする必要はありません。

  3. 例15-3に示すように、アダプタがStudentイベントをチャネルStudentStreamに提供していると仮定します。

    例15-3 チャネル

    <channel id="StudentStream" event-type="Student"/>
    
  4. 例15-4に示すように、StudentStreamがOracle CQL問合せq1でプロセッサに結び付けられると仮定します。

    例15-4 Oracle CQL問合せ

    <processor> 
        <rules>
            <query id="q1"><![CDATA[ 
                select 
                    name, 
                    address.street as street, 
                    address.phones[0] as primary_phone 
                from 
                    StudentStream
            ]]></query>
        </rules>
    </processor>
    

    Oracle Javaデータ・カートリッジでは、標準のJava APIを使用してOracle CQL問合せからaddressイベント・プロパティにアクセスできます。

15.2.2 エクスポートしたJavaクラスを使用する問合せ方法

この手順では、Javaクラス(Address.java)として定義されたイベント・プロパティ・タイプを持つ、タプル(Student)として定義された1つのイベント・タイプを使用するOracle Event Processingアプリケーションで、Oracle Javaデータ・カートリッジを使用する方法について説明します。この手順では、Address.javaクラスは別のOracle Event Processingアプリケーションに属します。これは、同じOracle Event Processingサーバーにデプロイされた他のOracle Event Processingアプリケーションにアクセスできるように、親アプリケーションでエクスポートされます。

Javaクラスを使用して問合せするには:

  1. Address.javaクラスを、例15-1に示すように実装します。

    例15-5 Address.javaクラス

    package test;
    
    class Address {
        String street;
        String state;
        String city;
        String [] phones;
    }
    
  2. Address.javaクラスを含むtestパッケージをエクスポートします。

    詳細は、『Oracle Fusion Middleware Oracle Event Processing開発者ガイドfor Eclipse』のパッケージのエクスポート方法に関する項を参照してください。

    testパッケージは、このOracle Event Processingアプリケーションの一部であるか、このアプリケーションと同じOracle Event Processingサーバーにデプロイされた他のOracle Event Processingアプリケーションの一部です。

  3. イベント・タイプ・リポジトリを、例15-2に示すように定義します。

    例15-6 イベント・タイプ・リポジトリ

    <event-type-repository>
        <event-type name="Student">
            <property name="name" type="char"/>
            <property name="address" type="Address"/>
        </event-type>
    <event-type-repository>
    
  4. 例15-3に示すように、アダプタがStudentイベントをチャネルStudentStreamに提供していると仮定します。

    例15-7 チャネル

    <channel id="StudentStream" event-type="Student"/>
    
  5. 例15-4に示すように、StudentStreamがOracle CQL問合せq1でプロセッサに結び付けられると仮定します。

    例15-8 Oracle CQL問合せ

    <processor> 
        <rules>
            <query id="q1"><![CDATA[ 
                select 
                    name, 
                    address.street as street, 
                    address.phones[0] as primary_phone 
                from 
                    StudentStream
            ]]></query>
        </rules>
    </processor>
    

    Oracle Javaデータ・カートリッジでは、標準のJava APIを使用してOracle CQL問合せからaddressイベント・プロパティにアクセスできます。