この章では、Oracle Continuous Query Language (CQL)の拡張機能であるOracle Javaデータ・カートリッジの使用方法を説明します。Oracle CQLを使用して、Oracle Event ProcessingアプリケーションでJavaクラスを操作するCQLコードを記述できます。
この章では、Oracle Javaデータ・カートリッジが公開する型、メソッド、フィールドおよびコンストラクタについて説明します。これらの型、メソッド、フィールドおよびコンストラクタを、Oracle CQLのネイティブ型と同様に、Oracle CQLの問合せおよびビューで使用できます。
この章の内容は次のとおりです。
Oracle Javaデータ・カートリッジは、Oracle Event ProcessingアプリケーションでJavaクラスを操作するOracle CQL問合せおよびビューを記述できるようにする組込みJavaカートリッジです。
この項では、次の内容について説明します。
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データ・カートリッジの型名を単純化するには、『Oracle Fusion Middleware Oracle Event Processing Oracle CQL言語リファレンス』で説明しているエイリアスを使用できます。
詳細は、クラスのロードを参照してください。
Oracle Javaデータ・カートリッジでは、Oracle CQL問合せが参照するJavaクラスのロードについて、次のポリシーをサポートしています。
詳細は、次を参照してください。
これは、デフォルトのクラス・ローディング・ポリシーです。
このモードでは、Oracle Javaデータ・カートリッジはJavaクラスの検索時に、有効範囲内のアプリケーションのクラス・スペースを使用します。
これは、型がローカル名によってのみ指定されている場合、すなわち識別子が1つで、他の識別子がパッケージで使用されていない場合にのみ適用できます。つまり、次のようになります。
select String(“foo") …
次のようには指定しません。
select java.lang.String(“foo") …
この場合、手順は次のようになります。
通常どおりに、アプリケーションのクラス・スペースを使用して、1つの識別子(ID1と呼びます)で定義されたクラスをロードします。これに失敗した場合、
アプリケーションで、パッケージとは関係なく、バンドルの内部クラス・パス内で名前がID1と一致するクラスが定義されているかどうかを確認します。これに失敗した場合、
アプリケーションでImport-Package MANIFESTヘッダー文が指定されているかどうかを確認します。これとID1を使用して、Javaクラスをロードできます。
例については、「クラスのロード例」を参照してください。
これは、オプションのクラス・ローディング・ポリシーです。このポリシーを使用するには、Oracle Event Processingアプリケーションに次のMANIFESTヘッダー・エントリを含める必要があります。
OCEP_JAVA_CARTRIDGE_CLASS_SPACE: APPLICATION_NO_AUTO_IMPORT_CLASS_SPACE
このモードはアプリケーション・クラス領域ポリシーと似ていますが、Oracle Event ProcessingによってパッケージがID1に組み合されない点が異なります。
詳細は、「アプリケーション・クラス・スペース・ポリシー」を参照してください。
これは、オプションのクラス・ローディング・ポリシーです。このポリシーを使用するには、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ベース・カートリッジの作成が容易になります。
注意:
参照できるJavaクラスはOracle Event Processingアプリケーションの内部クラス・パスにあるJavaクラス(エクスポートされている場合)のみであり、このアプリケーション内のプロセッサが当該Oracle CQL問合せを定義している場合でも参照可能です。
例については、「クラスのロード例」を参照してください。
図6-1の例では、B2がエクスポートするパッケージpackage2をB1がインポートしています。
表6-1は、アプリケーション・クラス領域またはサーバー・クラス領域で実行されているかによって、2つの異なるアプリケーションがアクセスできるクラスをまとめています。
表6-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式は、次のアルゴリズムを使用してメソッドを解決します。
注意:
可変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)
詳細は、「クラスのロード」を参照してください。
Oracle Javaデータ・カートリッジは、Oracle CQLネイティブ・データ型とJavaデータ型間に固定算術マッピングを適用します。
表6-2 Oracle Javaデータ・カートリッジ: Oracle CQLからJavaデータ型へのマッピング
| Oracle CQLネイティブ・データ型 | Javaデータ型 |
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
表6-3 Oracle Javaデータ・カートリッジ: Javaデータ型からOracle CQLへのマッピング
| Javaデータ型 | Oracle CQLネイティブ・データ型 |
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
他のすべてのJavaクラスは、複合型としてマップされます。
これらのデータ型マッピングの詳細は、次の項を参照してください。
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 Javaデータ・カートリッジ型は、SELECTおよびWHERE句内の式で使用できます。
Oracle Javaデータ・カートリッジ型は、ORDER BY句内の式では使用できません。
詳細は、Oracle Javaデータ・カートリッジの使用を参照してください。
この項では、Oracle Event ProcessingアプリケーションでOracle Javaデータ・カートリッジをどのように使用できるかを中心に、次のような一般的な使用例を説明します。
詳細は、Oracle Javaデータ・カートリッジのOracle CQL問合せサポートを参照してください。
この手順は、Javaクラス(Address.java)として定義されたイベント・プロパティ型を持つタプル(Student)として定義された1つのイベント・タイプを使用するOracle Event Processingアプリケーションで、Oracle Javaデータ・カートリッジを使用する方法を説明しています。
Javaクラスを使用して問合せするには:
この手順は、Javaクラス(Address.java)として定義されたイベント・プロパティ型を持つタプル(Student)として定義された1つのイベント・タイプを使用するOracle Event Processingアプリケーションで、Oracle Javaデータ・カートリッジを使用する方法を説明しています。この手順では、Address.javaクラスが個別のOracle Event Processingアプリケーションに属していると想定します。同じOracle Event Processingサーバーにデプロイされた他のOracle Event Processingアプリケーションからアクセスできるように、親アプリケーションにエクスポートされます。
Javaクラスを使用して問合せするには:
JavaカートリッジではJavaキャスト関数が使用可能で、Java拡張可能型から別のJava拡張可能型へのキャストが可能です。ただし、キャスト元からキャスト先を割り当てることができる必要があります。この関数を使用するには、Javaカートリッジがインストールされている必要があります。
構文
T cast@java(l-value, class-literal<T>)
パラメータ
l-value: キャストするデータを持つイベント属性です。l-valueをTから割り当てることができない場合、Java Cartridgeはキャスト関数呼出し時にRuntimeInvocationExceptionをスローします。
class-literal<T>: キャスト先のクラス名です。たとえば、intをlongにキャストする場合、class-literal<T>はLong.classです。
例
次のクラス階層を考慮します。
public class Parent
{
...
}
public class Child extends Parent
{
...
}
次の例では、Child型のオブジェクトがキャストされます。
cast@java(S.parent, Child.class)