BEA ホーム | 製品 | デベロッパ・センタ | support | askBEA
 ドキュメントのダウンロード   サイト マップ   用語集 
検索

開発者ガイド

 前 次 目次 索引 PDFで表示  

Expression パッケージの使用

ここでは、Expression パッケージのサービスの使い方について説明します。 Expression パッケージは、 WebLogic Portal のパーソナライゼーションおよび対話管理機能の一部です。 Expression パッケージを利用すると、計算、ビジネス ポリシー、決定木、その他の処理を Java コードの外に出すことができます。

この章では、以下の内容について説明します。

 


Expression パッケージとは

前述のとおり、Expression パッケージを利用すると、ビジネス ロジックや数式を Java コードの外に出すことができます。 Expression パッケージを使用すると、任意の数式、ブール式、関係式、または条件式を表現できます。 Expression パッケージを使用して、独自のビジネス ロジックを動的に組み立てたり評価できます。

Expression パッケージの使用例としては、レンタカーの取次店が考えられます。頻繁に変更されるレンタル料を計算するために、Expression パッケージを使用できます。 Java のステートメントを使用して計算する代わりに、計算部分を XML ドキュメントとして、Java コードの外に出し、実行時に解釈します。

WebLogic Portal では、式の例を提供しています。 例を表示するには、次の手順を実行します。

  1. 次のようにして、Personalization サーバを起動します。

    [スタート|プログラム|BEA WebLogic Platform 7.0|WebLogic Portal 7.0 |Portal Examples |Personalization Examples|Launch Personalization Server]

  2. Personalization サーバが起動したら、次のようにして、Personalization Examples を起動します。

    [スタート |BEA WebLogic Platform 7.0|WebLogic Portal 7.0 |Portal Examples |Personalization Examples |Start Personalization Examples]

    ブラウザには、図 16-1に示すような [Personalization Examples Index] が表示されます。

    図16-1 Personalization Examples Index


     

  3. ログインしていない、またはユーザを作成していない場合は、[Please visit the User Login example first] をクリックします。 ログイン、またはユーザ作成用の別ページに移動するためのページが表示されます。

  4. ログイン、またはユーザ作成が完了したら、ページの左側のカラムから、[Expressions|式の実行]を選択します。 図 16-8 に示すような [式の実行 Example] ページが表示されます。

    図16-2 [式の実行 Example]


     

    このウィンドウには、Expression パッケージの簡単なアプリケーションが表示されています。パラメータは、ドロップ ダウン リストを使って設定できます。

  5. 左側のカラムの [View Source] をクリックします。 新しいページが開いて、図 16-3 に示すような JSP ソースが表示されます。

    図16-3 JSP ソース


     

    このページには、Expression Example の JSP ソース (exec_expression.jsp) が表示されています。 この式が実行される(および、パラメータが変更される)と、その結果が exec_expression_results.jsp に保存されます。 どちらの JSP ファイルも <BEA_HOME>¥weblogic700¥samples¥portal¥p13nDomain¥beaApps¥p13nApp¥p13n ディレクトリにあります。

    次のステップでは、式がどのように動作するかについての情報を表示します。

  6. [式の実行 Example] ページの [How does it work?] リンクをクリックします。 新しいブラウザ ウィンドウが開き、図 16-4 に示すような説明が表示されます。

    図16-4 [How Does It Work?] 式の実行


     

    このページは、Expression Example の動作の仕組みについての説明です。 ここには、式に対する理解を深めるための練習も含まれています。

  7. [式の実行 Example] ページの [Preview Expression XML] ボタンをクリックします。 図 16-5に示すような XML を表すページが表示されます。

    図16-5 [Preview Expression as XML]


     

    このページには、実行前の Expression Example の XML が表示されています。

次の節では、Expression パッケージとルール フレームワークの違いについて説明します。

ルールまたは式の使用

ルール マネージャを適用する目的の 1 つは、ビジネス ルールを使用して、ユーザやグループを適切なコンテンツに結び付けることです。 ルール マネージャは、Expressions パッケージと同様に、WebLogic Portal パーソナライゼーションおよび対話管理の一部です。

Expression パッケージとルール マネージャの最大の違いは、Expression パッケージが名前付きの変数を使用するのに対して、ルール エンジンは名前付きの変数を使用しない点です。 さらに、ルール マネージャはルール セットを使用します。1 つのルールが別のルールを起動するというように、ルールを連結させることができます。

一般に、変数に値(通常は 1つだけ)をバインドしたい場合は、式を使用します。パターンを検出して、変数に対して考えられるすべてのバインドを評価したい場合は、ルールを使用します。

ルール エンジンは、非常に強力なパターン マッチング機能と推論機能を持っています。 ただし、これらの機能を使用すると、パフォーマンスが低下します。 名前付きのルールを繰り返し実行していることに気付いた場合は、そのルールを式に変換することを検討してください。 ルール エンジンの推論機能を利用しない場合や、考えられる変数と値のバインドを複数利用しない場合は、式を使用します。

式を使用して、UnificationList やカスタム Unifier によって明示的に変数と値をバインドする場合と、ルール エンジンを使用して、可能性のあるバインドをすべて探索する場合のパフォーマンスの違いを注意深く評価する必要があります。

表16-1 は、ルールと式を使用する場合の例を示しています。

表16-1 式とルールの比較

特徴

ルール

ビジネス ロジックを Java コードの外部に出す

はい

はい

アプリケーション コードと独立に、ビジネス ロジックを素早くデプロイできる

はい

はい

プログラマでなくても、JSP や Swing GUI を使用してビジネス ロジックを組み立てられる

はい

はい

推論機能

いいえ

はい
1 つのルールの発火によって、別のルールを発火させることができる。

変数に値を明示的にバインドする

はい

いいえ
値は、クラス タイプを使用して変数にバインドされる。 可能性のあるすべてのバインドが自動的にテストされる。

ビジネス ロジックの永続期間が長い

はい

はい
ビジネス ロジックは、XML ドキュメントとして保持される。 XML スキーマによって、Java コードからの独立性が保たれる。

ビジネス ロジックをプロセス間で渡すことができる

はい

はい
ビジネス ロジックを定義した XML ドキュメントは、シリアライズまたはWeb サービス間で渡すことができる。

XML 解析のキャッシュ

いいえ

はい
ルール マネージャは、ルールセット ドキュメント用に TTL キャッシュを実装している。

式のキャッシュと最適化

はい

はい
ルール エンジンは、内部で Expression パッケージを使用してるため、その最適化を利用している。


 

ルールの例を表示するには、次の手順を実行します。

  1. [Personalization Examples] ウィンドウで、[ルール| Rules Manager] を選択します。 図 16-6 に示すような [Rules Manager Example] が表示されます。

    図16-6 [Rules Manager Example]


     

    このページには、ルールの一例が表示されます。 この例は、あるルールのアクションが、別のルールの条件を満たすことを示しています。 この機能は、Expression パッケージにはありません。

  2. 詳細については、[How does it work?] リンクをクリックしてください。 図 16-7 に示すような説明が表示されます。

    図16-7 [How Does It Work?] ルール マネージャ


     

Expression パッケージのクラス

Expression パッケージを利用すると、ユーザは、XML ベースの式を動的に組み立てて実行できます。 このパッケージには、様々な種類の演算子を表す Java クラスが定義されています。また、これらの演算子のインスタンスで構成された式を評価するためのサービスも含まれています。

Expression パッケージには、基本 Expression クラス、Variable クラス、および式と変数を操作するための次のような演算子クラスが含まれています。

Expression パッケージには、式を操作するための次のようなサービスも含まれています。

Java 内に直接記述され、Java プログラム内で実行される式とは異なり、Expression パッケージを利用すると、Java プログラム内から、式を動的に組み合わせたり変更できます。 式は、評価の前でも後でも、何回でも変更できます。 Expression パッケージを使用して式を組み立てると、式のキャッシュ、検証、最適化など、Expression パッケージのさらに高度な機能を利用できます。

Expression パッケージは、BEA ルール エンジンの基盤としての役割を果たしています。 ルール エンジンは、ルールの条件式とアクション式を評価するために、このパッケージを利用しています。 同様に、Expression パッケージを使用して、独自のビジネス ロジックを動的に組み立てたり評価できます。

Expression パッケージのパッケージ構成

Expression パッケージのインタフェースと抽象クラスは、 com.bea.p13n.expression パッケージにあります。

Expression パッケージの演算子は、次のパッケージにまとめられています。

基本言語演算子—com.bea.p13n.expression.operators

論理演算子—com.bea.p13n.expression.operators.logical

文字列演算子—com.bea.p13n.expression.operators.string

算術演算子—com.bea.p13n.expression.operators.math

比較演算子—com.bea.p13n.expression.operators.comparative

集合演算子—com.bea.p13n.expression.operators.collection


 

Expression パッケージ関連のクラスは、p13n_util.jar アーカイブにまとめられています。

 


式の組み立てと管理

式を使い始める前に、Expression パッケージの様々な演算子クラスを使用して、式を体系的に組み立てる方法を学ぶ必要があります。

1 つの式は、1 つのツリーとして表現されます。このツリーの各ノードは、別の式、または単純な Java オブジェクトです。 式を表すツリーは、ボトムアップに組み立てられます。最初に、子の式または Java オブジェクトが作成され、次に、親の式に追加されます。

図 16-8 は、式ツリーが構築されていく様子を表しています。

親子関係のメンテナンス

Expression パッケージで定義されている演算子クラスは、すべて共通の基本クラスを拡張したものです。この基本クラスには、親子関係をメンテナンスするために必要なロジックが含まれています。したがって、式の組み立て中に、親子関係のメンテナンスについて心配する必要はありません。 ただし、式を作成した後で、式の構造を変更することができます。

表16-2 は、1 つの式の中の部分式を追加、変更、削除するための Expression インタフェース内の操作を示しています。

表16-2 式ツリーを構築するためのメソッド

Java メソッド

解説

addSubExpression

式オブジェクトに子(部分式になる)を追加する。

removeSubExpression

式オブジェクトからオブジェクト(部分式になる)を削除する。

setSubExpression

既存の(式の)オブジェクトを、与えられたオブジェクト(部分式になる)で置き換える。

getSubExpression

式オブジェクトの子にアクセスするために使用する。

getParent

式オブジェクトの親にアクセスするために使用する。


 

Expression インタフェースの詳細については、『Javadoc 』を参照してください。

Expression キャッシュの管理

Expression インタフェースには、結果のキャッシュを管理するメソッドも含まれています。 式を評価した結果は、それぞれの式オブジェクト内にキャッシュされます。 式に対するキャッシュが有効な場合は、同じ式を 2 回目に評価したときには、キャッシュされた値が返されます。

注意: デフォルトでは、キャッシュはオフになっています。 MethodCall など、いくつかの演算子に対しては、キャッシュをオフのままにしておきたい場合があります。

表16-3 は、結果のキャッシュを管理するための Expression インタフェース内のメソッドを示しています。

表16-3 結果のキャッシュを管理するメソッド

Java メソッド

解説

setCacheEnabled

式のキャッシュを有効にしたり、無効にするために使用する。

isCacheEnabled

式のキャッシュが有効かどうかをチェックするために使用する。

isCached

式の結果が現在キャッシュがされているかどうかをチェックするために使用する。

getCachedValue

式の評価結果として現在キャッシュされている値を取得するために使用する。


 

Expression インタフェースの詳細については、『Javadoc 』を参照してください。

 


式の扱い

式を組み立てたら、Expression パッケージの様々なサービスを使用して、式を扱うことができます。 これらのサービスを利用すると、組み立てた式を評価するための準備、式の形式が正しいかどうかの検証、式の構造の最適化、そして最後に式の評価ができます。

この節では、以下のトピックを扱います。

Expression Factory

ExpressionFactory は、Expression パッケージの様々なサービスや、そのサービスで使われるデータ構造を作成するメソッドを提供します。

たとえば、次のメソッドは、Validator サービスのインスタンスを作成します。

ExpressionFactory.createValidator(null);

Expression パッケージの様々なサービスの作成方法の詳細については、『Javadoc 』を参照してください。

Expression パッケージのサービス

Expression パッケージは、Expression パッケージ内の演算子を使用して構築された任意の式に対して使用できるサービスを提供しています。

統合サービス

Unifier は、式の中の変数を統合する(変数に値を割り当てる)ために使います。 Unifier は、UnificationList と呼ばれるデータ構造を使用します。UnificationList には、変数名とその変数に対応する値が格納されています。 Unifierと同様に、UnificationList のインスタンスは、ExpressionFactory によって作成されます。 Unifier は、変数名をキーにして UnificationList を検索し、特定の変数の値を取得します。次に、取得した値をその変数にバインドします。

Unifier インタフェースと ExpressionFactory クラスの詳細については、『Javadoc 』を参照してください。

最適化サービス

Optimizer は、式を最適化するために使われます。 Optimizer が使用するデフォルトの最適化アルゴリズムは次のとおりです。

Optimizer インタフェースと ExpressionFactory クラスの詳細については、『Javadoc 』を参照してください。

検証サービス

Validator は、式を検証するために使われます。 Validator が使用するデフォルトの検証アルゴリズムは次のとおりです。

ある演算子のすべてのオペランドに対して

Validator は、ステートレスまたはステートフル モードで使用できます。 ステートレス モードの場合は、検証に必要なすべての式の評価は、ステートレス モードで実行されます。

ステートレスおよびステートフル評価モードの詳細については、次の節の評価サービスを参照してください。

Validator インタフェースと ExpressionFactory クラスの詳細については、『Javadoc 』を参照してください。

評価サービス

Evaluator は、式を評価するために使われます。 式は、ステートフルまたはステートレス モードで評価できます。

ステートフル モード

このモードでは、式の中の各変数の値を、その変数内の値セットを取得することによって決定します。

つまり、ステートフル モードは、Unifier によって事前に統合されている式に依存します。

ステートフル モードで式が評価され、結果のキャッシュがオンの場合は、評価結果は式の内部にキャッシュされます。

ステートレス モード

このモードでは、式の中の各変数の値を、外部のデータ構造でその変数名にバインドされている値を検索することによって決定します。

つまり、評価プロセスは、式の状態に依存しません。したがって、評価の前に式を統合しておく必要がありません。

変数に対する名前と値のマッピングを含むデータ構造は、UnificationList と呼ばれ、Evaluator と関連付けられています。 Evaluator と同様に、UnificationList のインスタンスはExpressionFactory を使用して作成されます。

ステートレス モードの副作用は、式の評価の際に、結果のキャッシュが利用できないことです。

ステートフル モードは、シングル スレッドで式を評価する場合に使用できます。 1 つの式をマルチスレッドで評価する場合は、ステートレス モードを使用しなければなりません。

注意: 式の中に変数が含まれない場合は、この 2 つの評価モードの間に違いはありません。

Evaluator インタフェースと ExpressionFactory クラスの詳細については、『Javadoc 』を参照してください。

実行サービス

Executor は、統合サービス検証サービス、および 評価サービスを集約したものです。 Executorexecute メソッドは、UnifierValidator、および Evaluator を使用して、統合-検証-評価の一連のサイクルを実行します。

Executor が使用するデフォルトのアルゴリズムは次のとおりです。

統合

注意: Executor に渡される式が既に統合済みの場合や、式をステートレス モードで評価する場合は、Unifier を null にする必要があります。

検証

評価

注意: 渡された Evaluator がステートレスの場合は、Unifier は null でなければなりません。

Executor インタフェースと ExpressionFactory クラスの詳細については、『Javadoc 』を参照してください。

コード例

この節では、式を体系的に構築する方法と、Expression パッケージのサービスの使用方法を示す例を紹介します。

ここでは、以下のコード例を扱います。

単純な式のステートフル評価

論理式を作成して、ステートフル モードで実行します。 この式には、変数が含まれません。

コード リスト 16-1 例

この式を作成して評価するためのソース コードを以下に示します。

Expression expression = new LogicalAnd(Boolean.TRUE, Boolean.FALSE);
// Executor を作成するための準備として、ステートフルな
// Evaluator を作成します。 この式には変数が含まれていないので、
// この例では、Validator や Unifier を使用しません。
// したがって、これらは作成しません。
// 環境 Map には null が渡されます。
Evaluator evaluator = ExpressionFactory.createEvaluator(null);
// 環境 Map には null が渡されます。
Executor executor = ExpressionFactory.createExecutor(null);
// Unifier パラメータと Validator パラメータの両方に null を渡して、
// 上の式を実行します。
Object result = executor.execute(expression, null, null, evaluator);
// 結果は Boolean.FALSE になります。

変数を含む式のステートフル評価

変数を含む式を作成し、ステートフル モードで評価します。

コード リスト 16-2 例

式を作成して、ステートフル モードで実行するためのソース コードを以下に示します。

// Boolean 型のオブジェクトを格納する変数を作成します。
// 変数名は "booleanVariable" です。
Variable booleanVariable = new Variable(“?booleanVariable”, Boolean.class);
// これから、上のステップで作成した変数を使用します。
Expression expression = new LogicalAnd(Boolean.TRUE, booleanVariable);
// 次に、式の中のすべての変数をバインドし、式を統合します。
// 上の場合は、式の中に変数が 1 つあるので、
// この変数に値を割り当てる必要があります。
// その様子を以下に示します。
// UnificationList を作成し、変数名と値を
// キーと値のペアとして格納します。
UnificationList unificationList = ExpressionFactory.createUnificationList(null);
UnificationList.addObject(“?booleanVariable”, Boolean.FALSE);
// Unifier を作成します。
Unifier unifier = ExpressionFactory.createUnifier(null, unificationList);
// Executor を作成するための準備として、ステートフルな
// evaluator. を作成します。 この例では、Validator は使用しません。
// したがって、Unifier は作成しません。
// 環境 Map には null が渡されます。
Evaluator evaluator = ExpressionFactory.createEvaluator(null);
// 環境 Map には null が渡されます。
Executor executor = ExpressionFactory.createExecutor(null);
// Unifier パラメータと、null の Validator を渡して、
// 上の式を実行します。
Object result = executor.execute(expression, unifier, null, evaluator);
// 結果は Boolean.FALSE になります。

注意: execute メソッドを呼び出す前に、式を統合することもできます。それには、Unifierunify メソッドを呼び出します。 いったん式が統合された後は、execute メソッドに Unifier を渡す必要はありません。

変数を含む式のステートレスな検証と評価

変数を含む式を作成して、ステートレス モードで評価します。 Validator サービスは、式を検証するために使われます。

コード リスト 16-3 例

式を作成して、ステートレス モードで実行するためのソース コードを以下に示します。

// Boolean 型のオブジェクトを格納する変数を作成します。
// 変数名は "booleanVariable" です。
Variable booleanVariable = new Variable(“?booleanVariable”, Boolean.class);
// これから、上のステップで作成した変数を使用します。
Expression expression = new LogicalAnd(Boolean.TRUE, booleanVariable);
// 次に、式の中のすべての変数をバインドし、式を統合します。
// 上の場合は、式の中に変数が 1 つあるので、
// この変数に値を割り当てる必要があります。
// その様子を以下に示します。
// UnificationList を作成し、変数名と値を
// キーと値のペアとして格納します。
UnificationList unificationList = ExpressionFactory.createUnificationList(null);
UnificationList.addObject(“?booleanVariable”, Boolean.FALSE);
// Executor を作成するための準備として、ステートレスな
// Evaluator を作成します。 この例では、Unifier は使用しません。
// したがって、Unifier は作成しません。
// 環境 Map と UnificationList に null を渡して、
// ステートレスな Evaluator を作成します。
Evaluator evaluator = ExpressionFactory.createEvaluator(null, unificationList);
// ステートレスな Validator を作成します。
Validator validator = ExpressionFactory.createValidator(null, evaluator);
// Executor を作成します。
Executor executor = ExpressionFactory.createExecutor(null);
// Unifier には null を、Validator には null でない値を渡して、
// 上の式を実行します。
Object result = executor.execute(expression, null, validator, evaluator)
// 結果は Boolean.FALSE になります。
// execute メソッドを呼び出した後は、上で使われたどのサービスも
// 与えられた式を変更できません。
// ステートレスな実行モードは、式を複数のスレッドで共有する場合に
// 役立ちます。

変数を含む式のステートフルな検証と評価

変数を含む式を作成し、ステートフル モードで評価します。 Validator サービスは、式を検証するために使われます。

コード リスト 16-4 例

式を作成して、ステートフル モードで実行するためのソース コードを以下に示します。

// Boolean 型のオブジェクトを格納する変数を作成します。
// 変数名は "booleanVariable" です。
Variable booleanVariable = new Variable(“?booleanVariable”, Boolean.class);
// これから、上のステップで作成した変数を使用します。
Expression expression = new LogicalAnd(Boolean.TRUE, booleanVariable);
// 次に、式の中のすべての変数をバインドし、式を統合します。
// 上の場合には、式の中に変数が 1 つあるので、
// この変数に値を割り当てる必要があります。
// その様子を以下に示します。
// UnificationList を作成し、変数名と値を
// キーと値のペアとして格納します。
UnificationList unificationList = ExpressionFactory.createUnificationList(null);
UnificationList.addObject(“?booleanVariable”, Boolean.FALSE);
// Unifier を作成します。
Unifier unifier = ExpressionFactory.createUnifier(null, unificationList);
// Executor を作成するための準備として、ステートフルな
// Evaluator Validator を作成します。
// 環境 Map には null が渡されます。
Evaluator evaluator = ExpressionFactory.createEvaluator(null);
// 環境 Map には null が渡されます。
// Validator を作成します。
Validator validator = ExpressionFactory.createValidator(null);
// Executor を作成します。
Executor executor = ExpressionFactory.createExecutor(null);
// Unifier と、null でない Validator を渡して、
// 上の式を実行します。
Object result = executor.execute(expression, unifier, validator, evaluator);
// 結果は Boolean.FALSE になります。

注意: execute メソッドを呼び出す前に、式を統合することもできます。それには、Unifierunify メソッドを呼び出します。 一旦式が統合された後は、Executorexecute メソッドに Unifier を渡す必要はありません。 validate メソッドを呼び出すことによって、直接検証サービスを使用することもできます。 与えられた式が無効な場合は、validate メソッドは、InvalidExpressionException を送出します。

 


Expression パッケージの設定

expression.properties ファイルには、Expression パッケージの設定が含まれています。このファイルは、注意深く変更しなければなりません。

このファイルは、com.bea.p13n.expression パッケージの下の p13n_util.jar アーカイブにまとめられています。

##
# 式 Comparator の null の扱い
#
# 次のプロパティを true に設定すると、
# 式 Comparator は、null でない値と null を比較したときに
# 実行された比較の種類に関わらず
# false を返します。
#
# デフォルトは true に設定されています。
##
expression.comparator.nullcheck=true
##
# 式 Comparator の等価比較のイプシロン
#
# 次のプロパティは、数値の等価比較の際の
# イプシロン値を決定します。
#
# デフォルトは 0 に設定されています。
##
expression.comparator.epsilon=0.00001
##
# 式 Introspector のメソッド配列のキャッシング
#
# 次のプロパティを true に設定すると、
# 式 Introspector は、Java クラスで実装された
# メソッドの配列をキャッシュします。
#
# デフォルトは true に設定されています。 
##
expression.introspector.method.array.cache=true
##
# 式 Introspector のメソッドのキャッシング
#
# 次のプロパティを true に設定すると、
# 式 Introspector は、シグネチャによってメソッドをキャッシュします。
#
# デフォルトは true に設定されています。
##
expression.introspector.method.cache=true
##
# 式パーザのノード サポート クラス
#
# このプロパティは、基本 AST NodeSupport クラスを拡張したクラスの
# カンマ区切りのリストをサポートします。 このようなクラスは、与えられた式インスタンスの
# 中間的な AST 表現を作成するために必要な
# 式スキーマ用ネームスペースの作成をサポートします。
#
# NodeSupport のすべてのサブクラスは、
# 要求された CoreNodeSupport インスタンスと共存しなければなりません。
##
parser.node.support.list=¥
com.bea.p13n.expression.internal.parser.expression.ExpressionNodeSupport
##
# 式パーザの Transform Visitor クラス
#
# このプロパティは、ExpressionTranformVisitor または
# 中間的な AST-to-Expression 変換のために使われる
# サブクラスを指定します。
#
##
parser.transform=¥
com.bea.p13n.expression.internal.parser.expression.ExpressionTransformVisitor

 

ページの先頭 前 次