この章では、Oracle Javaデータ・カートリッジが公開する型、メソッド、フィールドおよびコンストラクタについて説明します。これらの型、メソッド、フィールドおよびコンストラクタを、Oracle CQLのネイティブ型と同様に、Oracle CQLの問合せおよびビューで使用できます。
この章の内容は、次のとおりです。
詳細は、以下を参照してください。
Oracle Javaデータ・カートリッジは、Oracle CEPアプリケーションでJavaクラスとシームレスに対話するOracle CQLの問合せおよびビューを記述するための、組込みのJavaカートリッジです。
この項の内容は、次のとおりです。
Oracle Javaデータ・カートリッジでは、カートリッジID com.oracle.cep.cartrdiges.java
を使用します。
Oracle Javaデータ・カートリッジは、Oracle CEPのデフォルトのデータ・カートリッジです。
デフォルトのJavaパッケージ名の下の型、またはjava.lang
システム・パッケージの下の型について、Oracle CQL問合せでパッケージ名またはデータ・カートリッジ名で修飾されていないJava型を参照できます。
<query id="q1"><![CDATA[ select String(“foo”) … ]]></query>
詳細は、以下を参照してください。
Oracle Javaデータ・カートリッジでは、Oracle CQL問合せが参照するJavaクラスのロードについて、次のポリシーをサポートしています。
詳細は、以下を参照してください。
Eclipse用Oracle CEP開発者ガイドのパッケージのエクスポート方法に関する項
このモードでは、Oracle Javaデータ・カートリッジはJavaクラスの検索時に、有効範囲内のアプリケーションのクラス・スペースを使用します。
これは、型がローカル名によってのみ指定されている場合、すなわち識別子が1つで、他の識別子がパッケージで使用されていない場合にのみ適用できます。次のような場合です。
select String(“foo”) …
次の場合には適用できません。
select java.lang.String(“foo”) …
この場合、手順は次のようになります。
通常どおりに、アプリケーションのクラス・スペースを使用して、1つの識別子(ID1
と呼びます)で定義されたクラスをロードします。これに失敗した場合、
アプリケーションで、パッケージとは関係なく、バンドルの内部クラス・パス内で名前がID1
と一致するクラスが定義されているかどうかを確認します。これに失敗した場合、
アプリケーションでImport-Package
MANIFEST
ヘッダー文が指定されているかどうかを確認します。これとID1
を使用して、Javaクラスをロードできます。
例については、15.1.2.4項「クラスのロード例」を参照してください。
これは、オプションのクラス・ロード・ポリシーです。このポリシーを使用するには、Oracle CEPアプリケーションに次のMANIFEST
ヘッダー・エントリを含める必要があります。
OCEP_JAVA_CARTRIDGE_CLASS_SPACE: APPLICATION_NO_AUTO_IMPORT_CLASS_SPACE
このモードは、パッケージが指定されていない場合に、Oracle CEPがパッケージの自動インポートを試行しない点を除いて、アプリケーション・クラス・スペース・ポリシーとほぼ同じです。
詳細は、15.1.2.1項「アプリケーション・クラス・スペース・ポリシー」を参照してください。
これは、オプションのクラス・ロード・ポリシーです。このポリシーを使用するには、Oracle CEPアプリケーションに次のMANIFEST
ヘッダー・エントリを含める必要があります。
OCEP_JAVA_CARTRIDGE_CLASS_SPACE: SERVER_CLASS_SPACE
このモードでも、Oracle CEPはアプリケーションのクラス・スペースを使用しますが、パッケージが指定されていない場合はパッケージの自動インポートを試行しません。
Oracle CQL問合せでは、エクスポートしているアプリケーションやモジュールに関係なく、エクスポートされたすべてのJavaクラスを参照できます。
また、問合せでは、ランタイムJDKクラスを含む、OSGiフレームワークの親クラス・ローダーに表示されるすべてのクラスにアクセスできます。
すなわち、Oracle CQLアプリケーションには、他のOracle CEPアプリケーションで定義されたクラスを参照するOracle CQL問合せを含めることができます(エクスポートされているかぎり)。これにより、新しいJavaライブラリを提供することが唯一の目的であるJavaベース・カートリッジの作成が容易になります。
注意: Oracle CEPアプリケーション内のプロセッサがOracle CQL問合せを定義する場合であっても、Oracle CEPアプリケーションの内部クラス・パスの一部であるJavaクラスを参照できるのは、これがエクスポートされている場合のみです。 |
例については、15.1.2.4項「クラスのロード例」を参照してください。
図15-1に示す例があるとします。アプリケーションB1
は、アプリケーションB2
がエクスポートするパッケージmypackage3
をインポートします。
表15-1に、アプリケーション・クラス・スペースまたはサーバー・クラス・スペースのどちらで実行されているかによって、これら2つの異なるアプリケーションがアクセスできるクラスを示します。
表15-1 クラス・ロード・ポリシー別のクラスのアクセシビリティ
クラス・ロード・ポリシー | アプリケーションB1 | アプリケーションB2 |
---|---|---|
アプリケーション・クラス・スペース |
|
|
サーバー・クラス・スペース |
|
|
アプリケーション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 …
JavaメソッドにアクセスするOracle CQL式は、次のアルゴリズムを使用してメソッドを解決します。
すべてのパラメータは、15.1.4項「データ型マッピング」に説明されているように、Java型に変換されます。
たとえば、Oracle CQL INTEGER
はJavaプリミティブint
に変換されます。
標準の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項「クラスのロード」を参照してください。
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データ型 |
---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
脚注1プリミティブなJavaデータ型
表15-3 Oracle Javaデータ・カートリッジ: Javaデータ型からOracle CQLへのマッピング
Javaデータ型 | Oracle CQLネイティブのデータ型 |
---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
脚注1プリミティブなJavaデータ型
他のすべてのJavaクラスは、複合型としてマップされます。
これらのデータ型マッピングの詳細は、次の項を参照してください。
Oracle CQLネイティブのデータ型とその暗黙的および明示的なデータ型変換の詳細は、2.2項「データ型」を参照してください。
Oracle CQLデータ型CHAR
はjava.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>
Oracle CQL CHAR
リテラルであっても、リテラルのメンバー・フィールドおよびメソッドにはアクセスできません。たとえば、次のような問合せは使用できません。
<query id="q1-forbidden"><![CDATA[ select "hello".substring(1,2) ]]></query>
Javaの配列はOracle CQLデータ・カートリッジの配列に変換され、Oracle CQLデータ・カートリッジの配列はJavaの配列に変換されます。これは、複合型と単純型の両方に適用されます。
データ・カートリッジのTABLE
句を使用して、Oracle CQL問合せのFROM
句内のデータ・カートリッジ関数から返された複数の行にアクセスできます。
詳細は、以下を参照してください。
通常、Oracle Javaデータ・カートリッジはjava.util.Collection
インタフェースを実装するインスタンスをOracle CQL複合型に変換します。
Oracle CQL問合せは、java.util.Collection
のメンバーを介して繰り返すことができます。
データ・カートリッジのTABLE
句を使用して、Oracle CQL問合せのFROM
句内のデータ・カートリッジ関数から返された複数の行にアクセスできます。
詳細は、以下を参照してください。
この項では、Oracle CEPアプリケーションでOracle Javaデータ・カートリッジをどのように使用できるかを中心に、一般的な使用例を説明します。内容は次のとおりです。
この手順では、Javaクラス(Address.java
)として定義されたイベント・プロパティ・タイプを持つ、タプル(Student
)として定義された1つのイベント・タイプを使用するOracle CEPアプリケーションで、Oracle Javaデータ・カートリッジを使用する方法について説明します。
Javaクラスを使用して問合せするには:
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 CEPアプリケーションに属する場合、親アプリケーションでエクスポートする必要があります。詳細は、15.2.2項「エクスポートしたJavaクラスを使用する問合せ方法」を参照してください。
イベント・タイプ・リポジトリを、例15-2に示すように定義します。
例15-2 イベント・タイプ・リポジトリ
<event-type-repository> <event-type name="Student"> <property name="name" type="char"/> <property name="address" type="Address"/> </event-type> <event-type name="Address"> <class-name>test.Address</class-name> </event-type> <event-type-repository>
test.Address
クラスはこのアプリケーションに属するため、イベント・タイプ・リポジトリで宣言できます。これにより自動的に、このアプリケーション内でクラスにグローバルにアクセスできるようになります。パッケージをエクスポートする必要はありません。
例15-3に示すように、アダプタがStudent
イベントをチャネルStudentStream
に提供していると仮定します。
例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
イベント・プロパティにアクセスできます。
この手順では、Javaクラス(Address.java
)として定義されたイベント・プロパティ・タイプを持つ、タプル(Student
)として定義された1つのイベント・タイプを使用するOracle CEPアプリケーションで、Oracle Javaデータ・カートリッジを使用する方法について説明します。この手順では、Address.javaクラスは別のOracle CEPアプリケーションに属します。同じOracle CEPサーバーにデプロイされた他のOracle CEPアプリケーションからアクセスできるように、親アプリケーションでエクスポートされます。
Javaクラスを使用して問合せするには:
Address.java
クラスを、例15-1に示すように実装します。
Address.java
クラスを含むtest
パッケージをエクスポートします。
詳細は、Eclipse用Oracle CEP開発者ガイドのパッケージのエクスポート方法に関する項を参照してください。
test
パッケージはこのOracle CEPアプリケーションの一部であるか、このアプリケーションと同じOracle CEPサーバーにデプロイされた他のOracle CEPアプリケーションの一部です。
イベント・タイプ・リポジトリを、例15-2に示すように定義します。
例15-3に示すように、アダプタがStudent
イベントをチャネルStudentStream
に提供していると仮定します。
例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
イベント・プロパティにアクセスできます。