対話管理ガイド

     前  次    新しいウインドウで目次を開く     
ここから内容

ルールを使用した高度なパーソナライゼーションの作成

ユーザ セグメント、キャンペーン、プレースホルダ、およびコンテンツ セレクタを使用するパーソナライゼーションは、JSP タグを使用して開発でき、Java コーディングの必要はほとんどありません。しかし、より柔軟性のあるパーソナライゼーションの開発が必要となる場合もあります。これは、ルール コントロールと RulesManager EJB を使用するルール セットを作成してデプロイすることによって実現できます。

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

ルール サービスは、高度なパーソナライゼーション機能を作成するのに役立ちます。高度なパーソナライゼーション機能を使用すると、ページフローから各ユーザのパスを制御したり、実行時情報をコード内の条件付きロジックへの動的な入力として使用したりできます。高度なパーソナライゼーションを開発するには、XML とスキーマ (上級者向けの DTD) による作業経験があり、Java 開発について中級レベルの知識を持っていることが必要です。


ポータル アプリケーションでのルールの使用

WebLogic Portal には、ポータル アプリケーションでユーザが行う操作をパーソナライズするためのツール セットが用意されています。各ユーザがブラウズするコンテンツ、受信する自動電子メール メッセージ、コマース アプリケーションで各ユーザに適用される割引のタイプなどを制御できます。このようなパーソナライゼーションを実現するには、Workshop for WebLogic でユーザ セグメント、コンテンツ セレクタ、およびキャンペーンを作成します。これらのツールを用いたパーソナライゼーションの開発では JSP タグが利用できるため、Java を使用したコーディングはほとんど必要ありません。このタイプのパーソナライゼーションの開発後には、ポータル管理者が WebLogic Portal Administration Console を使用してパーソナライゼーションの動作を修正することができます。この場合、コーディングはまったく必要ありません。

しかし、より強力で柔軟性のあるパーソナライゼーションの開発が必要となる場合もあります。たとえば、パーソナライゼーションを使用してページフローから各ユーザのパスを制御したり、実行時情報を動的な入力としてコード内の条件付きロジックに使用するなどが考えられます。

ルール サービスには、次の 2 つのタイプのコンポーネントを使用してアクセスできます。

この概要の節では、次のトピックについて説明します。

パーソナライゼーション コンポーネントの選択

表 10-4 は、WebLogic Portal に用意されているパーソナライゼーション ツールの一覧です。この表では、ルールサービスに直接アクセスすることによって実現されるプログラム能力の向上をわかりやすく説明するために、ユーザ セグメント、キャンペーン、コンテンツ セレクタ、およびパーソナライゼーション用の JSP タグについて説明しています。

表 10-4 の入力オブジェクトとアクションの列は、ルール コントロールと RulesManager EJB を使用することによって柔軟性と機能が強化されることを示しています。

表 10-4 WebLogic Portal のパーソナライゼーション コンポーネント
コンポーネント
説明
入力オブジェクト
アクション (入力オブジェクトがルールの条件に一致した場合)
ユーザ セグメント
ユーザが特定の条件を満たしている場合、それらのユーザをグループまたはセグメントに動的に割り当てる。
セグメント ルールは Workshop for WebLogic のユーザ セグメント エディタで作成する。ルールは、WebLogic Portal Administration Console で変更できる。
セグメント ルールは、ユーザ プロファイル プロパティ、HTTP セッションまたはリクエストのプロパティ、日付と時間の値および範囲を使用して定義できる。
アクションは 1 つのみ : すべての条件が「true」であると評価された場合、ユーザはセグメントのメンバーと見なされる。セグメントは、キャンペーン、コンテンツ セレクタ、および <pz:div> JSP タグ内で使用できる。
キャンペーン
特定の条件を満たしているユーザにパーソナライズされたアクションを実行するか、または特定のアクションを実行する。
キャンペーン ルールは Workshop for WebLogic のキャンペーン エディタで作成する。ルールは WebLogic Portal Administration Console で変更できる。
キャンペーン ルールは、ユーザ セグメント、ユーザ プロファイル プロパティ、HTTP セッションまたはリクエストのプロパティ、イベントの特性、日付と時間の値および範囲、ショッピング カートとカタログ条件、無作為抽出を使用して定義できる。
アクション タイプは最大 3 つまで : 1 つのパーソナライズされたコンテンツ項目を表示する、定義済み電子メールを自動送信する、割引を適用する。
コンテンツ セレクタ
特定の条件を満たしているユーザに特定のコンテンツ項目を表示する。
コンテンツ選択ルールは Workshop for WebLogic のコンテンツ セレクタ エディタで作成する。ルールは、Administration Console で変更できる。
コンテンツ選択ルールは、ユーザ セグメント、ユーザ プロファイル プロパティ、HTTP セッションまたはリクエストのプロパティ、日付と時間の値および範囲を使用して定義できる。
アクションは 1 つのみ : 1 つまたは複数のパーソナライズされたコンテンツ項目を表示する。
パーソナライゼーション (対話管理) JSP タグ
これらのタグの一部は、セグメント、キャンペーン、コンテンツ セレクタの各ルールの結果を表示する場合に使用される。
表示されるコンテンツは、ユーザ セグメント、キャンペーン、またはコンテンツ セレクタの各ルールに基づく。
アクションは 1 つのみ : パーソナライズされたコンテンツ項目を表示する。
ルール コントロール
Rules Executor コントロールを使用すると、定義済みのルール セットに対して入力オブジェクト (ユーザ プロファイルのプロパティなど) を評価できる。入力オブジェクトに基づいてルールが「true」であると評価された場合は、定義済みのアクション (特定の分類へのユーザの割り当てなど) が実行される。Rules Manager コントロールを使用すると、ルール セットに関する情報を検索できる。これらのルール コントロールは、RulesManager EJB へのインタフェースとして機能する。
ページフローまたは Web サービスでのルール コントロールの追加およびコンフィグレーションは、Workshop for WebLogic のグラフィカル ユーザ インタフェースを使用して行う。ルールは手作業で XML 形式で作成する。
入力オブジェクト タイプに制限なし : XML 形式で作成したルールを使用して、作業メモリに配置したどのオブジェクトでも評価できる (「ルール サービスの呼び出しによるオブジェクトの評価」を参照)。
アクション タイプに制限なし : 作業メモリ内のオブジェクトをフィルタ処理し (「結果のフィルタ処理」を参照)、ルール セットの XML で定義されているどのアクションでも実行できる。
RulesManager EJB
ページフローおよび Web サービス以外のアプリケーション領域で、ルール コントロールと同じ機能を提供する。RulesManager EJB を使用してルール サービスにアクセスするには、Java のコーディングが必要。

ルール サービスの概要

ルール サービスは、作業メモリに配置されているオブジェクトを読み込み、それらを XML ファイルに定義されている一連のルールと比較して評価します (作業メモリは、ルール サービスでルールが処理される間、オブジェクトを一時的に格納する場所です)。メモリ内のオブジェクトが、ルール セットに定義されている条件 (複数のルールで構成することもできます) と一致すると、ルール セットに定義されているアクションが実行されます。たとえば、ユーザ プロファイルや、Web サービスの計算結果などから取得したユーザの信用度スコアを作業メモリに配置した場合、ルール セット内のルールとして、「ユーザの信用度スコアが 10 点以上であれば、そのユーザをゴールド カスタマとして分類する」というアクションを実行するように XML 形式で定義することができます。

このルール処理の結果は、さまざまな方法でアプリケーションに使用できます。たとえば、ページ フローを開発している場合は、「ゴールド カスタマ」だけを gold.jsp ファイルに送信し、残りのすべてのカスタマを別の JSP ファイルに送信することができます。

ルール サービスの使用

ルール サービスは、前向き推論用に最適化されている Rete アルゴリズムに基づいています。ルールの評価プロセスは、以下の順序で実行されます。このプロセスでは、Rules Executor コントロールを例として使用しています。

  1. Portal のルール サービスが初期化され、作業メモリが作成されます。
  2. Rules Executor コントロールによって、使用するルール セット、評価するルール (デフォルトは all)、および結果をフィルタ処理するかどうか (オプションで指定した場合) が識別されます。これらのパラメータはすべて、コントロールにコンフィグレーションできます。
  3. 開発者が作業メモリにオブジェクトを作成 (または追加) します。オブジェクトの例としては、ユーザのプロファイル、Request などがあります。これらのパラメータは引数としてルール コントロールの evaluate*() メソッドに渡されます。
  4. Rules Executor コントロールによってルール サービスが呼び出され、以下のアルゴリズムが使用されます。
    1. 照合 - ルールの左側 (Left Hand Side : LHS) を評価し、作業メモリ内で指定された現在の内容と合致しているものを判別します。
    2. 衝突の解決 - LHS が満たされているルールを 1 つ選択します。LHS が満たされているルールがない場合、インタープリタは停止します。
    3. 実行 - 選択されたルールの右側 (Right Hand Side : RHS) に定義されているアクションを実行します。
    4. プロセスの繰り返し - 手順 a に戻ります。
  5. ルール サービスが繰り返し実行され、入力オブジェクトの状態とルール条件に従ってルールが適用されます。一度に適用できるルールは 1 つだけです。条件が満たされ、ルールが適用されたら、別のオブジェクトを作業メモリに追加して評価することができます。
  6. 適用するルールがこれ以上ない状態に達すると、ルール サービスが停止します。作業メモリには、最初の入力オブジェクトの他に、ルールの評価の結果として作成された新しいオブジェクトも存在している場合があります。
  7. 入力オブジェクトは結果の一部であるため、クラスに基づいて結果をフィルタ処理することができます。たとえば、Java クラス com.bea.p13n.usermgmt.profile.ProfileWrapper の結果だけを返すように指定できます。
  8. オブジェクトが呼び出し元に返されます。返されたデータをどのように使用するかは呼び出し元が決定します。たとえば、ユーザに新しいページを表示したり、ユーザ プロファイルのプロパティを更新することができます。

図 10-16 は、Rules Executor コントロールをページフローに使用したルールの評価プロセスを基本的な図で表したものです。この図では、ルール サービス プロセスから返された結果を、ページフローからのユーザのパスを特定することに使用しています。また、この図では、分かりやすいように、コードの代わりに自然言語を使用しています (実際のページフローでのパラメータの設定とコントロールの呼び出しについては、「ページフローにおけるコントロールを使用したユーザのパスの特定」を参照)。

図 10-16 ルールによるページフローの制御

ルールによるページフローの制御

ルール サービスを使用する利点の概要

ルール サービスは、コードで使用される単純な条件文よりも動的に扱うことができます。Web アプリケーションや他のアプリケーション コンポーネントを条件文 (if/then) を使用してハード コード化した場合、条件文を変更するには、コードを再コンパイルし、アプリケーションを再デプロイするしか方法はありません。これに対してルールは、Portal サーバを実行したまま変更し、ロードすることができます。つまり、管理者は、ドメイン エキスパートからビジネス ロジックを取得して、そのロジックを反映するルール式を作成し、サーバを停止せずにルールをアプリケーションにロードすることができます。


ルールの作成

この節では、ルール コントロールと RulesManager EJB を使用してパーソナライゼーションを開発する方法を説明します。この節で説明する手順は、以下のとおりです。

ルール セットの作成

ルール セットは、ルール サービスが作業メモリ内のオブジェクトの評価に使用する命令セットを、XML 形式で記述したものです。ルール セットは、基本的に、「作業メモリ内の~が以下の条件を満たしている場合、これを実行する」というように記述されます。

WebLogic Portal にはルール エディタがないので、ルール セットは手作業で作成します。ルール セットは、特定のスキーマに準拠している必要があります (ルール セットのスキーマは、<WL_Home>\common\p13n\lib ディレクトリの p13n_app.jar ファイルにあります)。ルールの言語として実際に使用するのは、ルール サービスの追加要件を満たすように拡張された WebLogic Portal の式パッケージです。使用できる式の詳細については、「WebLogic Portal JavaDoc」にある com.bea.p13n.expression.operator.* の各パッケージを参照してください。

ルール セットの XML ファイル (拡張子は .rls) は、以下の必須要素で構成されます。

コード リスト 10-2 は、「文字列 Make an Integer 10 が作業メモリにある場合、整数オブジェクト 10 を作業メモリに追加する」という単純なルール セットを示しています。

コード リスト 10-2 作業メモリにオブジェクトを追加するルール セット
<?xml version="1.0" encoding="UTF-8"?>
<!-- edited with XMLSPY v5 rel. 4 U (http://www.xmlspy.com) by Your Name (Your Company) -->
<rule-set xmlns="http://www.bea.com/servers/p13n/xsd/rules/core/2.1.1" xmlns:exp="http://www.bea.com/servers/p13n/xsd/expression/expressions/2.1.
1" xmlns:literal="http://www.bea.com/servers/p13n/xsd/expression/literal/1.0.
1" xmlns:string="http://www.bea.com/servers/p13n/xsd/expression/string/1.0.1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.bea.com/servers/p13n/xsd/rules/core/2.1.1
rules-core-2_1_1.xsd" is-complete="true">
<rule is-complete="true">
<name>Add Integer</name>
<description>Test Rule</description>
<conditions>
<exp:equal-to>
<exp:variable>
<exp:type-alias>java.lang.String</exp:type-alias>
</exp:variable>
<literal:string>Make an Integer 10</literal:string>
</exp:equal-to>
</conditions>
<actions>
<add-object>
<exp:type-alias>java.lang.Integer</exp:type-alias>
<exp:arguments>
<literal:string>10</literal:string>
</exp:arguments>
</add-object>
</actions>
</rule>
</rule-set>

スキーマを解読することや、スキーマのルールに基づいて有効な XML を手作業で作成することに慣れている場合以外は、XMLSpy などの XML エディタを使用してください (XMLSpy は WebLogic Platform の製品 CD からインストールできます)。XML エディタには、1 つのスキーマだけでなく、そのスキーマによってインポートされるすべてのスキーマが読み込まれ、XML ドキュメントの任意の位置に追加できる要素と属性が表示されます。使用できる要素と属性が表示されるため、有効な XML ルール セットを作成しやすくなります。

ヒント : ルール セットを作成する最も簡単な方法は、既存のルール セットを修正することです。dev2dev の Web サイト (http://www.beasys.co.jp/dev2dev/products/wlportal81/articles/portalrulesservice.html) には、いくつかのルール セットのサンプルが掲載されています。

XML 形式でルール セットを作成する前に、次のように自然言語でルールを書き出して、すべての条件とアクション、およびデータ型を理解してください。作業メモリには何を配置するか? オブジェクトが満たさなければならない条件は何か? 作業メモリ内のオブジェクトがそれらの条件を満たしている場合、何を (どのようなアクションを) 実行するか?

以下のガイドラインを使用して、XML エディタでルール セットを作成 (または既存のルール セットを修正) します。

  1. <WL_Home>\common\p13n\lib ディレクトリにある p13n_app.jar ファイルから、以下のスキーマをルート セットを作成するディレクトリに解凍します。
  2. lib/schema/expression*.xsd
    lib/schema/rules*.xsd

  3. XML エディタで新しいドキュメントまたは既存のドキュメントを開き、そのドキュメントに rules-core-2_1_1.xsd スキーマを関連付けます。このスキーマには、式のスキーマをはじめ、ルール セットの作成に役立つ他のスキーマのインポートも含まれています。
  4. 新規 XML ドキュメントの場合は、XML ヘッダが自動的に挿入されます。また、インポート用に指定されたすべてのスキーマが自動的にインポートされて、<rule-set><rule><name><conditions><actions> などの必須の基本要素が挿入されます。

  5. <conditions> および <rules> 要素を選択して、条件とルールを作成 (または修正) します。図 10-17 は、XMLSpy で作成されるルール セットを示しています。<exp:greater-than-or-equal-to> 要素を選択すると、子として追加できる要素が [Elements] セクションに一覧表示されます。[Attributes] セクションには、この要素に設定できる属性が表示されます。
  6. 図 10-17 XML エディタでのルールの作成


    XML エディタでのルールの作成

  7. ルール セットを作成したら、XML エディタの機能を使用して XML が整形式であるかどうかをチェックします。その後、スキーマに対するルール セットの妥当性を検査します (XMLSpy では、これらの機能はそれぞれ〔F7〕、〔F8〕を押すと実行できます)。無効なルール セットを修正する方法については、「無効なルール セットの修正」を参照してください。
  8. ルール セットを保存します (XMLSpy では、無効なルール セットを保存しようとすると、そのことを示すメッセージが表示されますが、保存することは可能です)。
  9. ポータル アプリケーションの META-INF/data ディレクトリ、またはその下のサブディレクトリにルール セットをコピーします。たとえば、META-INF/data/rulesets ディレクトリを作成して、そこにルール セットを保存します。

ルール内でのメソッドの使用

表 10-5 は、XML ルール セットでメソッドを使用して、ユーザ プロファイルのプロパティ値を取得し、ルール サービスで評価できるようにする方法を示しています。

表 10-5 XML ルールでのメソッドの使用法
条件
<exp:greater-than-or-equal-to>
<literal:integer>10</literal:integer>
<exp:instance-method>
<exp:variable>
<exp:type-alias>User</exp:type-alias>
</exp:variable>
<exp:name>getProperty</exp:name>
<exp:arguments>
<literal:string>CreditPropertySet</literal:string>
<literal:string>CreditScore</literal:string>
</exp:arguments>
    </exp:instance-method>
</exp:greater-than-or-equal-to>
条件がマップされるメソッド
以下は User タイプのオブジェクトを取得する。
ProfileWrapper pw = SessionHelper.getProfile(request);
Object value = pw.getProperty("CreditPropertySet", "CreditScore");

XML とメソッドの間でマッピングを行う場合は、以下の情報を参考にしてください。

無効なルール セットの修正

ルール セットの妥当性が立証されなかった場合、無効な領域が表示されます。無効なルール セットを修正する場合は、次の手順を実行します。

ルール セットのデプロイ

この節では、デプロイメント (Workshop for WebLogic) 環境、ステージング環境、またはプロダクション環境にルール セットをデプロイする方法について説明します。

この節では、次のトピックについて説明します。

Workshop for WebLogic でのルール セットのデプロイ

ルール セットを作成して、アプリケーションの META-INF/data ディレクトリ (または、その下の META-INF/data/rulesets などの作成したサブディレクトリ) に保存すると、サーバが稼動していれば、ルール セットは自動的にデプロイされます。サーバが稼動していない場合は、サーバを起動した時点で自動的にデプロイされます (META-INF/data ディレクトリには、ユーザ セグメント、コンテンツ セレクタ、キャンペーン、およびユーザが作成した他のアプリケーション メタデータも保存されています)。ルール セットは data ディレクトリにデプロイする必要があり、ルール セットのファイル名には、ルール サービスで使用する拡張子 .rls を付ける必要があります。

data ディレクトリのルール セットを修正すると、そのルール セットは、稼動中のサーバで自動的に更新されます。

ステージング環境またはプロダクション環境でのルール セットのデプロイ

デプロイ済みのアプリケーションに存在するルール セットに追加、修正、または削除を行う場合は、次の手順を実行します。

  1. 開発環境のルール セットを修正し、デプロイ済みアプリケーション内のルール セットを置き換えます。アプリケーションが圧縮された EAR ファイル内にある場合は、更新したルール セットを取り込むために EAR ファイルを再作成して、EAR ファイルをサーバに再配置する必要があります。サーバ上の EAR ファイルを置き換えるとアプリケーションを再デプロイメントする必要がありません。
  2. BEA Propagation Utility を使用してルール セットを更新します。手順については、『プロダクション業務ガイド』を参照してください。

作業メモリへのオブジェクトの追加

ルール セットは、作業メモリ内に評価するオブジェクトを持つ必要があります。たとえば、ルール セットに含まれる 1 つのルールに、「ユーザの信用度スコアが 10 以上である場合」という条件が設定されているとします。この条件は、信用度スコアの入力値が存在すること、または信用度スコアを取得する方法が指定されていることを意味します。作業メモリには、以下の 2 つのいずれかの方法で信用度スコアを挿入できます。

整数からの作業メモリへの信用度スコアの追加

コードに信用度スコアの値を追加する場合は、次の方法を使用します。

この後に、value 整数を評価するルールの条件を作成できます。

ユーザ プロファイルからの作業メモリへの信用度スコアの追加

より柔軟かつ動的な方法は、ユーザ プロファイルから信用度スコアを取得する方法です。まず、コードを使用してユーザ プロファイルを取得し、作業メモリに配置します。

ProfileWrapper pw = SessionHelper.getProfile(request);

Object [] inputObjects = { pw }; (evaluate*() メソッドへの必須の引数)

次に、ルール セットに条件を作成します。この条件には、特定のプロパティ セット (CreditPropertySet) から特定のプロパティ (CreditScore) を取得するメソッド (getProperty) を使用します。表 10-5 のコード例を参照してください。このコード例の条件は、取得した CreditScore が、<literal:integer> 値の 10 以上であるかどうかをチェックします。

注意 : User タイプは、実際には ProfileWrapper クラスのオブジェクトのエリアスになります。この UserProfileWrapper のマッピングは、他の既知のタイプのマッピングと共に、「タイプ マッピングの使用」に示す p13n_app.jar ファイルの parser-mapping-type.properties ファイルで定義されています。

タイプ マッピングの使用

以下のオブジェクト タイプのマッピングは、p13n_app.jar ファイルの parser-mapping-type.properties ファイルで定義されています。

<type-alias> タグのマッピングの使用

コード リスト 10-3 は、<type-alias> タグのマッピングを示しています。

コード リスト  10-3 <type-alias> タグのマッピング
User=com.bea.p13n.usermgmt.profile.ProfileWrapper
Classifier=com.bea.p13n.user.Classification
Capability=com.bea.p13n.entitlements.common.Capability
Role=com.bea.p13n.entitlements.common.Role
Context=com.bea.p13n.rules.internal.engine.Context
Email=com.bea.campaign.rules.MailActionDef
Placeholders=com.bea.campaign.rules.AddAdToPlaceholderActionDef
Discount=com.bea.commerce.ebusiness.campaign.AddUserDiscountActionDef
EndScenario=com.bea.campaign.rules.EndScenarioActionDef
CatalogQuery=com.beasys.commerce.ebusiness.catalog.rules.CatalogQueryWrapper
ContentQueryAdvice=com.bea.p13n.content.advislets.ContentQueryAdvice
ShoppingCartFacade=com.beasys.commerce.ebusiness.shoppingcart.ShoppingCartRulesFacade

コード リスト 10-2 のコード例および表 10-4 は、User タイプでの <type-alias> 要素を示しています。

<variable> タグのマッピング

コード リスト 10-4 は、<variable> タグのマッピングを示しています。

コード リスト  10-4 <variable> タグのマッピング
user=com.bea.p13n.usermgmt.profile.ProfileWrapper
request=com.bea.p13n.http.Request
session=com.bea.p13n.http.Session
event=com.bea.p13n.events.Event
randomNumber=java.lang.Number
classification=com.bea.p13n.user.Classification
date=com.bea.p13n.xml.schema.Date
time=com.bea.p13n.xml.schema.Time
timeInstant=com.bea.p13n.xml.schema.TimeInstant
role=com.bea.p13n.entitlements.common.Role
resource=java.lang.String
shoppingCart=com.beasys.commerce.ebusiness.shoppingcart.ShoppingCart

ルール サービスの呼び出しによるオブジェクトの評価

ルール セットを作成し、作業メモリにオブジェクトを配置したら、ルール サービスを呼び出して、作成したルールで作業メモリ内のオブジェクトを評価することができます。この節では、サンプルを示しながら、ページフローで Rules Executor コントロールを使用してルール サービスを呼び出す方法について説明します。

既存のルール セットの使用

ルール サービスの呼び出しによるオブジェクトの評価」の節を通して使用するサンプルでは、「ユーザ プロファイルからの作業メモリへの信用度スコアの追加」で使用した例と同様に、ユーザ プロファイルを読み込むことによってユーザを「GoldCardMembers」または「SilverCardMembers」に分類するルール セットが、/data/rulesets ディレクトリにすでに作成されていることを前提としています。この節のページフローのサンプルは、作業メモリに追加されるユーザ プロファイルを示しています。このサンプルにはユーザ プロファイルが必要となるため、既存のページフローには、ユーザ プロファイルのプロパティの取得および設定を可能にする Profile コントロールがすでに追加されているものとします。

また、このサンプルには、ページフローがどのユーザ プロファイルを取得するのかを識別できるように、認証用の User Login コントロールも使用されています。

ページ フローの作成およびページ フローへのポータル コントロールの追加については、Javadoc を参照してください。

ページフローへのコントロールの挿入

ページフロー (Workshop for WebLogic の .jpf ファイル) にコントロールを挿入すると、そのコントロールに定義されているすべてのアクションが使用可能になります。

Rules Executor コントロールには、次の 2 つのアクションが含まれます。

アクション ビューでページフローを開くと、コントロールの境界線を選択して挿入済みのコントロールを選択したり、そのコントロールのプロパティを設定したりすることができます。プロパティ エディタは、Java コードを記述せずに RulesManager EJB (ルール サービスへの直接的なインタフェース) に引数を渡すことのできる便利なツールです。

たとえば、表 10-6 は、図 10-16 に示す Rules Executor コントロールのプロパティが、RulesManager EJB のメソッドとコンストラクタの引数にどのようにマップされるかを示しています。

表 10-6 コントロールのプロパティにマップされるメソッドとコンストラクタの引数
Rules Executor コントロールのプロパティ
RulesManager EJB のメソッド (com.bea.p13n.rules.manager を参照)
rulesetUri
ruleName
filterResults
filterClassName
filterClassNames
evaluateRule(String ruleSetUri, String ruleName, Object[] inputObjects)
evaluateRule(String ruleSetUri, String ruleName, Object[] inputObjects, ObjectFilter filter)
evaluateRuleSet(String ruleSetUri, Object[] inputObjects)
evaluateRuleSet(String ruleSetUri, Object[] inputObjects, ObjectFilter filter)
filterRuleName
フィルタ コンストラクタ (com.bea.p13n.rules.manager.RuleResultClassFilter を参照)
RuleResultClassFilter(String ruleName, Class targetClass)
RuleResultClassFilter(String ruleName, Class[] targetClassArray)

RulesManager EJB には、Rules Executor コントロールに含まれるアクションと同じアクション (evaluateRule()evaluateRuleSet()) が含まれます。相違点は、Rules Executor コントロールのアクションの場合、evaluateRuleSet(Object[] inputObjects) など、引数を 1 つしか取らず、ルールおよびフィルタの引数をコントロールのプロパティを通じて指定する点です。

Rules Executor コントロールでは、filterResults プロパティを true に設定すると、filter 引数を持つ EJB メソッドが使用され、ユーザが入力したフィルタのプロパティがその引数に自動的に渡されます。

filterClassName プロパティと filterClassNames プロパティは、filter 引数の入力に使用される異なるオプションです (1 つのフィルタ タイプを指定するか、複数のフィルタ タイプを指定するかの違いです)。コントロールには、filterClassName または filterClassNames を設定してください。ただし、両方設定することはできません。

実行されたルール セットの特定のルールの結果をフィルタ処理するには、filterRuleName プロパティを使用します。このプロパティを使用すると、RuleResultClassFilter コンストラクタが呼び出されます。このコンストラクタは、単一クラスのフィルタ (filterClassName で入力) のプロパティ、または複数クラスのフィルタ (filterClassNames で入力) のプロパティのいずれかを使用するために、オーバーロードされることに注意してください。filterRuleName プロパティを使用すると、実行された特定のルールの結果だけでなく、特定のデータ型についてもフィルタ処理できます。

コントロールのプロパティの詳細は次のとおりです。

コントロールを使用する利点について

各プロパティにメソッドとコンストラクタがどのようにマップされるかを理解しておくと、Rules Executor コントロールを使用することの利点を理解するのに役立ちます。プロパティ値を指定することによって、次のような利点を得ることができます。

Rules Executor コントロールの詳細については、「コントロールの Javadoc」を参照してください。

ページフローにおけるコントロールを使用したユーザのパスの特定

ページフローに Rules Executor コントロールを追加してプロパティを設定し、コントロールの execute* アクションから使用するアクションを選択したら、他のすべての前提条件 (「既存のルール セットの使用」を参照) が準備されていることを確認する必要があります。その後、ルールの評価プロセスから返された分類に基づいてユーザに個別のページを表示するよう、ページフローに別のコードを追加することができます。

コード リスト 10-5 のサンプル ページフロー コードは、ルール サービスの実行結果に基づいてユーザに特定のページを表示する方法を示しています。同様のサンプルは、http://www.beasys.co.jp/dev2dev/products/wlportal81/articles/portalrulesservice.html にある dev2dev サイトの「Portal のルール サービス」(examples/pageFlows/classifyAndFlow サブディレクトリ内) にも掲載されています。

コード リスト 10-5 ルール サービスの結果に基づいて、ユーザに特定のページを表示するサンプル コード
public class Controller extends PageFlowController
{
/**
* @common:control
*/
private com.bea.p13n.controls.login.UserLoginControl userLoginControl;
/**
* @common:control
*/
private com.bea.p13n.controls.profile.ProfileControl myProfileControl;
// Rules Executor コントロールを追加する。
// プロパティ エディタでプロパティをコンフィグレーションする。
// これらはすべて、ページフローのアクション ビューで実行する。
/**
* @common:control
* @jc:rules-executor filterClassName="com.bea.p13n.user.Classification"
filterResults="true" rulesetUri="/rulesets/myruleset.rls"
*/
private com.bea.p13n.controls.rules.RulesExecutorControl
myRulesExecutorControl;
/**
* @jpf:action
* @jpf:forward name="default" path="default.jsp"
* @jpf:forward name="goldCard" path="goldCard.jsp"
* @jpf:forward name="silverCard" path="silverCard.jsp"
* @jpf:catch type="com.bea.p13n.controls.exceptions.P13nControlException" path="error.jsp"
* @jpf:forward name="error" path="error.jsp"
*/
protected Forward evaulateRuleSetAction(EvaluateRuleSetActionForm form)
throws P13nControlException
{
// 最初に、ルール サービスの作業メモリに配置するオブジェクトを
// 追加する空白のリストを表示する。
List wmObjects = new ArrayList();
ProfileWrapper pw = myProfileControl.getProfileFromRequest(this.getRequest());
if ( pw == null)
{
throw new P13nControlException("Undable to retrieve profile from
request. " + "Make sure PortalServletFilter is configured
in web.xml for an anonymous user, " + "or that a user
has logged in.");
}
// 以下に、ルールを実行する条件を指定する。
Integer value = new Integer(6);
myProfileControl.setProperty(pw, "FooPropertySet", "CreditScore", value);
        wmObjects.add(pw);
// ルール セット内のすべてのルールを評価する。(アクション ビューにある) ページフローのプロパティ エディタ
// でコントロールに関するパラメータが宣言されている。
Iterator iter = myRulesExecutorControl.evaluateRuleSet(wmObjects.toArray());
List results = new ArrayList();
// GoldCardMembers を検索するように指定する。
Classification goldCardMembers = new Classification("GoldCardMembers");
Classification silverCardMembers = new Classification("SilverCardMembers");
// 次に、ルールの評価結果に従って分類されたユーザに
// 特定のページを表示する。
Classification classification = (Classification)iter.next();
// 個別のページを表示するなどの
// アクションを指定できる。
if (classification.equals(goldCardMembers))
{
// ユーザに高価格の商品を表示する。
return new Forward("goldCard");
}
else if (classification.equals(silverCardMembers))
{
// ユーザに低価格の商品を表示する。
return new Forward("silverCard");
}
// 上記以外の場合は、デフォルトのページを表示する。 エラーが発生。
// ルールの条件を確認するか、コントロールのフィルタ処理をオフにして、
// 作業メモリ内の状況を確認する。
}
}
return new Forward("default");
}

ルール サービスが停止した後、作業メモリにある特定のタイプのオブジェクトだけを使用する場合は、作業メモリ内のオブジェクトをフィルタ処理できます。フィルタ処理は、Java のタイプを使って設定します。Rules Executor コントロールのフィルタ タイプは、プロパティ エディタで設定できます。

以下の内容の詳細については、それぞれの参照先を参照してください。

結果のフィルタ処理

ルール サービスの呼び出しによるオブジェクトの評価」で説明したように、ルール サービスを実行して作業メモリ内のオブジェクトを評価する場合、ルール サービスが停止したときに、特定タイプのオブジェクトだけを返すように作業メモリ内のオブジェクトをフィルタ処理できます。

オブジェクトは、次のいずれかのアクションの結果として作業メモリ内に存在します。

ルール サービスが停止した時点の作業メモリには、ユーザが最初に追加したオブジェクトを含み、いくつかのオブジェクトが残されている可能性があります。たとえば、指定したルールの評価が true の場合に、ルールによって新しい Classification オブジェクトのインスタンスが作業メモリに作成されることがあります。また、ルールのアクションによってユーザ プロファイルが更新されている可能性があるため、作業メモリからプロファイルを取得する必要があります。

ルール サービスの API は、ルールを実行すると、結果がフィルタ処理されない限り、作業メモリの内容全体に関するイテレータを返します。Classification オブジェクトのみを検索する場合は、Classification オブジェクトのみを返すフィルタを指定することができます。このフィルタは、「ページフローへのコントロールの挿入」で説明したように、単一のクラス名、複数のクラス名、または特定のルールに基づいて作成できます。

Rules Executor コントロールを実装すると、コントロールによってフィルタが自動的に作成されます。フィルタ処理を行うかどうかを指定して、フィルタ クラス名をコントロールのプロパティとして設定する必要があります。フィルタは、コントロールによって自動的に適用されます (フィルタ処理を指定した場合)。

RulesManager EJB によるフィルタ処理

RulesManager EJB を使用したフィルタ処理は、RulesManager EJB を使用してユーザ自身がフィルタを作成する必要があるため、ルール サービスによるフィルタ処理よりも手間がかかります。コード リスト 10-6 にフィルタの設計方法を示します。

コード リスト 10-6 RulesManager EJB によるフィルタ処理
String filterRuleName = null;
Class filterClass = com.bea.p13n.user.Classification.class;
ObjectFilter filter = new RuleResultClassFilter(filterRuleName, filterClass);
Class [] filterClasses = { java.lang.String.class, com.bea.p13n.usermgmt.profile.ProfileWrapper.class};
ObjectFilter filter = new RuleResultClassFilter(filterRuleName, filterClasses);

次の例に示すように、この後、フィルタを RulesManager EJB の一部として使用することができます。

public Iterator evaluateRule(String ruleSetUri, String ruleName, Object[] inputObjects, ObjectFilter filter)

結果をフィルタ処理した場合は、指定したクラス タイプの結果のみがイテレータに含まれます。コード リスト 10-7 のコード例は、SilverCardMembers の Classification オブジェクトを示しています。

コード リスト 10-7 シルバー カード メンバーを取得するサンプル コード
while (iter.hasNext())
{
Classification c = (Classification)iter.next();
if (c.equals(silverCardMembers))
{
// 何かアクションを実行する
}
}

アプリケーションでの結果の使用

ルール サービスでは、実行時に処理の判断を行います。ルールのフレームワークは、コンポーネントにロジック (if/then) をハードコードするよりも柔軟性があります。コードを修正せずにルールを修正できるからです。

ルールおよびルールの結果は、次のように利用できます。

ルール コントロールおよび RulesManager EJB のその他のコード例については、http://www.beasys.co.jp/dev2dev/products/wlportal81/articles/portalrulesservice.html にある dev2dev サイトの「Portal のルール サービス」を参照してください。


ルール コントロールの参照

ポータル アプリケーションのパーソナライゼーションを提供するにはルール コントロール要素を使用します。表 10-7 に、コントロール名およびルールを作成するために必要な使用可能な値を示します。

表 10-7 ルール エンジンのルール コントロール要素
ルール コントロールの名
説明
使用可能な値
literal
特定な値と固定の値を指定するのに使用される。
boolean, character, decimal, double, float, integer, long, string
multi-and
すべての提供されている条件式は true に評価される場合、true に評価される。
multi-or
いくつかの条件式は true に評価される場合、true に評価される。
not
条件式の論理値が無効になる。
not-equal-to
両方の条件式が等しくない場合、true に評価される。
または
いずれかの条件式が true に評価される場合、true に評価される。
メソッド
抽象型または複合型
static-method, instance-method, new-instance, contains, contains-all, abs, acos, add, asin, atan, atan2, ceil, cos, divide, exp. floor, ieee-remainder, log, maximum, minimum, multiply, pow, rint, round, sin, sqrt, subtract, tan, to-degrees, to-radians, char-at, compare-to-ignore-case, concat, ends-with, equals-ignore-case, length, like, replace, starts-with, substring, to-lower-case, to-upper-case, trim
static-method
メソッドに対して提供された任意の引数をを渡すと、type-alias によって指定された刑の作業メモリ内に呼び出します。
type-alias、 name、引数
instance-
method
メソッドに任意指定の引数をを渡して、オブジェクトのメソッドを type-alias で指定された変数の作業メモリ内に呼び出します。
変数、名、引数
new-instance
type-alias で指定された型のオブジェクトをインスタンス化する。引数は条件式として提供されており、各引数のタイプは引数のシグネチャ内で type-alias リストに指定される。
type-alias、 arguments-signature、 引数
contains
1 番目のコレクション オブジェクトに 2 番目のオブジェクトが含まれている場合、ブールを返す。
contains-all
1 番目のコレクション オブジェクトに 2 番目のコレクション オブジェクト全体が含まれている場合、ブールを返す。
abs
絶対値演算子であり、数値を受け入れ、数値を返す。
acos
弧余弦演算子であり、数値を受け入れ、数値を返す。
add
加算演算子であり、2 つの数値を受け入れ、合計を返す。
asin
弧正弦演算子であり、数値を受け入れ、数値を返す。
atan
弧接弧演算子であり、数値を受け入れ、数値を返す。
atan2
デカルト座標演算子であり、2 つの数値を受け入れ、数値を返す。
ceil
板演算子であり、数値を受け入れ、数値を返す。
cos
弧余弦演算子であり、数値を受け入れ、数値を返す。
divide
除算演算子であり、2 つの数値を受け入れ、数値を返す。
exp
指数演算子であり、数値を受け入れ、数値を返す。
floor
Floor 演算子であり、数値を受け入れ、数値を返す。
ieee-
remainder
IEEE 754 剰余演算子であり、2 つの数値を受け入れ、数値を返す。
log
自然対数演算子、数値を受け取って数値を返す。
maximum
最大演算子であり、2 つの数値を受け入れ、数値を返す。
minimum
最小演算子であり、2 つの数値を受け入れ、数値を返す。
multiply
乗算演算子であり、2 つの数値を受け入れ、数値を返す。
pow
累乗演算子であり、2 つの数値を受け入れ、数値を返す。
random-
number
乱数演算子であり、必要に応じて上限数と下限数を受け入れ、乱数を返す。
rint
次の整数に切り上げる演算子であり、数値を受け入れ、数値を返す。
round
四捨五入演算子であり、数値を受け入れ、数値を返す。
sin
正弦演算子であり、数値を受け入れ、数値を返す。
sqrt
平方根演算子であり、数値を受け入れ、数値を返す。
subtract
引算演算子であり、2 つの数値を受け入れ、数値を返す。
tan
接弧演算子、数値を受け取って、数値を返す。
to-degrees
ラジアンから度に変換する演算子であり、数値を受け入れ、数値を返す。
to-radians
度からラジアンに変換する演算子であり、数値を受け入れ、数値を返す。
char-at
文字列の指定された位置の文字を返す。文字列と数字を受け入れ、文字を返す。
compare-to-
ignore-case
文字列を比較する演算子であり、大文字と小文字を区別しない。2 つの文字列を受け入れ、整数を返す。
concat
文字列連結演算子であり、2 つの文字列を受け入れ、文字列を返す。
ends-with
1 番目の文字列は 2 番目の文字列で終了する場合、ブールを返す。
equals-ignore-case
1 番目の文字列は 2 番目の文字列と同じである場合、ブールを返す。大文字と小文字を区別しない。
length
文字列を受け入れ、文字列にある文字数を表す整数を返す。
like
1 番目の文字列には 2 番目の文字列が含まれている場合、ブールを返す。大文字と小文字を区別しない。
replace
文字列と 2 つの文字を受け入れ、1 番目の文字を 2 番目の文字で置き換えられる文字列を返す。
starts-with
1 番目の文字列は 2 番目の文字列で開始する場合、ブールを返す。
substring
文字列と 2 つの数値を受け入れ、指定された数値間の文字を文字列として返す。
to-lower-case
文字列を受け入れ、すべての文字を小文字に変換した文字列を返す。
to-upper-case
文字列を受け入れ、すべての文字を大文字に変換した文字列を返す。
trim
文字列を受け入れ、文字列の先頭および末尾にある空白文字をすべて削除した文字列を返す。
actions
条件に満たされる場合、実行される手順。0 以上の [アクション] タグのグループ。
アクション
action
条件に満たされる場合、実行される 1 つの手順。
アクション (ネスト済み)、メソッド (上記定義)、add-object 
add-object
作業メモリに type-alias で指定されたオブジェクトを追加する。引数は条件式として提供されており、各引数のタイプは引数のシグネチャ内で type-alias リストに指定される。これは、上記のインスタンスの追加と同じ機能の定義です。
type-alias、 arguments-signature、引数


  ページの先頭       前  次