対話管理ガイド

     前  次    目次     
ここから内容

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

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

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

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

 


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

WebLogic Portal には、ポータル アプリケーションでユーザが行う操作をパーソナライズするためのツール セットが用意されています。各ユーザがブラウズするコンテンツ、受信する自動電子メール メッセージ、コマース アプリケーションで各ユーザに適用される割引のタイプなどを制御できます。

警告 : 割引アクションは、WebLogic Portal 10.0 では推奨されていないコマース API の一部です。この API は、WebLogic Portal とは別の製品として用意された AquaLogic Commerce Services に置き換えられています。

このようなパーソナライゼーションを実現するには、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 セッションまたはリクエストのプロパティ、イベントの特性、日付と時間の値および範囲、ショッピング カートとカタログ条件、無作為抽出を使用して定義できる。

注意 : ショッピング カート イベント、割引、およびカタログは、WebLogic Portal 10.0 では推奨されていないコマース API の一部です。この API は、WebLogic Portal とは別の製品として用意された AquaLogic Commerce Services に置き換えられています。

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

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

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

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

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

 


ルールの作成

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

ルール セットの作成

ルール セットは、ルール サービスが作業メモリ内のオブジェクトの評価に使用する命令セットを、XML 形式で記述したものです。ルール セットでは、作業メモリ内にあるものが特定の条件を満たしているかどうか判断し、アクションを実行します。

ルール セットを作成するには 2 つの方法があります。

Workshop for WebLogic でのルール セットの作成

Workshop for WebLogic を使用して、ルール、条件およびアクションを含む .rls ファイルを作成して管理することができます。

Workshop for WebLogic で ルール セットを作成するには、以下の手順を実行します。

  1. Workshop for WebLogic で [実行|サーバーで実行] を選択して、WebLogic Server を起動します。WebLogic Server をコンフィグレーションする手順については、『ポータル開発ガイド』を参照してください。
  2. ポータル パースペクティブ で、[パッケージ・エクスプローラー] ビューの <data>\src フォルダを右クリックし、[新規|ルール セット] を選択します。
  3. ルール セット用のフォルダを選択し、ファイル拡張子 .rls を使用して [ファイル名] フィールドでルール セットの名前を入力します。ルール セットはデータ ディレクトリ内の任意の場所に置くことができます。
  4. [終了] をクリックします。選択したフォルダでルール セットが表示されます。ルール セット エディタでルール セットを選択します。
  5. [プロパティ] タブを選択し、ルール セットの説明を入力します。
  6. [パレット] タブから、ルール セット エディタにルール アクションをドラッグします。各アクションの詳細については、「シナリオのルールへのアクションの追加」を参照してください。.
  7. [アクション] で、[すべて] リンクをクリックし、[いずれか] と [すべて] を切り替えてこのアクションをトリガする条件を決定します。[いずれか] を選択した場合、アクションをトリガするために 1 つの条件だけを true に設定する必要があります。ルールには複数のアクションを指定できます。
  8. 適用可能なその他のリンクをクリックして定義します。
  9. [パレット] タブの [選択可能な条件] セクションで、ルール セットを実行するための条件を選択して、アクションにドラッグします。条件のリンクをクリックしてその条件を定義し、アクションをトリガする条件を決定します条件の詳細については、「プロパティ セットの作成」の 表 4-1 を参照してください。ルール セットの例については、図 10-12 を参照してください。
  10. 図 10-12 訪問者が事前定義されたユーザ セグメントのメンバーであるという条件を使用したルールセット


    訪問者が事前定義されたユーザ セグメントのメンバーであるという条件を使用したルールセット

  11. [ファイル|保存] を選択して、ファイルを保存します。

手動でのルール セットの作成

手動でルール セットを作成するには、以下の手順に従います。ルール セットは、特定のスキーマに準拠している必要があります (ルール セットのスキーマは、<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> 要素を選択して、条件とルールを作成 (または修正) します。
  6. 図 10-13 は、XMLSpy で作成されるルール セットを示しています。<exp:greater-than-or-equal-to> 要素を選択すると、子として追加できる要素が [Elements] セクションに一覧表示されます。[Attributes] セクションには、この要素に設定できる属性が表示されます。

    図 10-13 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 を使用してルール セットを更新します。手順については、『プロダクション業務ガイド』を参照してください。

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

ルール セットは、作業メモリ内に評価するオブジェクトを持つ必要があります。たとえば、ルール セットに含まれるルールに、「ユーザの信用度スコアが 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> タグのマッピングを示しています。

警告 : コマース API は、WebLogic Portal 10.0 では推奨されていません。この API は、WebLogic Portal とは別の製品として用意された AquaLogic Commerce Services に置き換えられています。
コード リスト 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-11 に示す 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 のその他のコード例については、dev2dev サイトの「Portal のルール サービス」(http://www.beasys.co.jp/dev2dev/products/wlportal81/articles/portalrulesservice.html) を参照してください。

 


ルール コントロール リファレンス

ポータル アプリケーションのパーソナライゼーションを提供するには、ルール コントロール要素を使用します。表 10-7 に、ルールを作成する際に使用できるコントロールの名前と指定可能なすべての値を示します。

表 10-7 ルール エンジンのルール コントロール要素
ルール コントロール名
説明
指定可能な値
rule-set
すべてのルールを含むルート要素。
rule
rule
条件とアクションおよび説明 (省略可能) を使用したルールの定義。
name、description、conditions、actions
name
ルールの名前。
任意のテキスト
description
ルールを説明するテキスト (省略可能)。
任意のテキスト
conditions
作業メモリ内のオブジェクトを使用してルール サービスが評価する式。
variable、literal、branch、operator、method
variable
式で比較するオブジェクトのタイプを示します。
なし
type-alias
オブジェクトまたは変数の種類を指定する文字列。
変数の場合、値には任意のタイプ (java.lang.String など)、または以下に示す変数タイプのエリアスを指定できます。

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.
Roleresource=java.lang.String
shoppingCart=com.beasys.commerce.ebusiness.
shoppingcart.ShoppingCart

オブジェクトの場合、値には任意のタイプ (Java.lang.String など)、または以下に示すオブジェクト タイプのエリアスを指定できます。

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

literal
特定の不変値を指定する際に使用します。
boolean、character、decimal、double、float、integer、long、string
branch
ルール内の実行パスを制御します。
if
if
ルール内の実行パスを制御する式を評価します。
true または false に評価する他の任意の 2 つまたは 3 つの式
operator
式で行われる比較の種類を示します。
and、equal-to、greater-than、greater-than-or-equal-to、less-than、
less-than-or-equal-to、multi-and、multi-or、not、not-equal-to、or
and
true に評価するには、両方の式が true に評価される必要があります。
 
equal-to
2 つの式が等価であるときに true に評価します。
 
greater-than
最初の式が 2 番目の式より大きいときに true に評価します。
 
greater-than-
or-equal-to
最初の式が 2 番目の式以上のときに true に評価します。
 
less-than
最初の式が 2 番目の式より小さいときに true に評価します。
 
less-than-or-
equal-to
最初の式が 2 番目の式以下のときに true に評価します。
 
multi-and
提示されたすべての式が true に評価されたときに true に評価します。
 
multi-or
提示された式のいずれかが true に評価されたときに true に評価します。
 
not
1 つの式の論理値を否定します。
 
not-equal-to
2 つの式が等価でないときに true に評価します。
 
or
式のどちらか一方が true に評価されたときに true に評価します。
 
method
抽象複合型。
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、arguments
instance-
method
作業メモリ内にある、変数の type-alias で指定されたタイプのオブジェクトに対して名前付きメソッドを呼び出し、指定された引数をメソッドに渡します。
variable、name、arguments
new-instance
type-alias で指定されたタイプのオブジェクトをインスタンス化します。引数は式として提供されます。各引数のタイプは、arguments- シグネチャの type-alias リストに指定されます。
type-alias、arguments-signature、arguments
contains
最初の Collection オブジェクトに 2 番目のオブジェクトが含まれるかどうかを示すブール値を返します。
 
contains-all
最初の Collection オブジェクトに 2 番目の Collection オブジェクト全体が含まれるかどうかを示すブール値を返します。
 
abs
1 つの数値を受け入れ、1 つの数値を返す絶対値演算子。
 
acos
1 つの数値を受け入れ、1 つの数値を返す逆余弦演算子。
 
add
2 つの数値を受け入れ、その合計を返す加算演算子。
 
asin
1 つの数値を受け入れ、1 つの数値を返す逆正弦演算子。
 
atan
1 つの数値を受け入れ、1 つの数値を返す逆正接演算子。
 
atan2
2 つの数値を受け入れ、1 つの数値を返す、デカルト座標から極座標への変換演算子。
 
ceil
1 つの数値を受け入れ、1 つの数値を返す、正の無限大方向に丸める演算子。
 
cos
1 つの数値を受け入れ、1 つの数値を返す余弦演算子。
 
divide
2 つの数値を受け入れ、1 つの数値を返す除算演算子。
 
exp
1 つの数値を受け入れ、1 つの数値を返す指数演算子。
 
floor
1 つの数値を受け入れ、1 つの数値を返す、負の無限大方向に丸める演算子。
 
ieee-
remainder
2 つの数値を受け入れ、1 つの数値を返す IEEE 754 剰余演算子。
 
log
1 つの数値を受け入れ、1 つの数値を返す自然対数演算子。
 
maximum
2 つの数値を受け入れ、1 つの数値を返す最大演算子。
 
minimum
2 つの数値を受け入れ、1 つの数値を返す最小演算子。
 
multiply
2 つの数値を受け入れ、1 つの数値を返す乗算演算子。
 
pow
2 つの数値を受け入れ、1 つの数値を返す累乗演算子。
 
random-
number
必要に応じて下限と上限を受け入れ、乱数を返す乱数演算子。
 
rint
1 つの数値を受け入れ、1 つの数値を返す、次の整数に丸める演算子。
 
round
1 つの数値を受け入れ、1 つの数値を返す丸め演算子。
 
sin
1 つの数値を受け入れ、1 つの数値を返す正弦演算子。
 
sqrt
1 つの数値を受け入れ、1 つの数値を返す平方根演算子。
 
subtract
2 つの数値を受け入れ、1 つの数値を返す減算演算子。
 
tan
1 つの数値を受け入れ、1 つの数値を返す逆正接演算子。
 
to-degrees
1 つの数値を受け入れ、1 つの数値を返す、ラジアンから度への変換演算子。
 
to-radians
1 つの数値を受け入れ、1 つの数値を返す、度からラジアンへの変換演算子。
 
char-at
1 つの文字列と 1 つの数値を受け入れ、文字列内の指定された位置の文字を返します。
 
compare-to-
ignore-case
2 つの文字列を受け入れ、1 つの整数を返す文字列比較演算子。大文字と小文字は区別されません。
 
concat
2 つの文字列を受け入れ、1 つの文字列を返す文字列連結演算子。
 
ends-with
最初の文字列が 2 番目の文字列で終わるかどうかを示すブール値を返します。
 
equals-ignore-case
最初の文字列が 2 番目の文字列と同じかどうかを示すブール値を返します。大文字と小文字は区別されません。
 
length
文字列を受け入れ、その文字列に含まれる文字数を表す整数を返します。
 
like
2 番目の文字列が最初の文字列に含まれるかどうかを示すブール値を返します。大文字と小文字は区別されません。
 
replace
1 つの文字列と 2 つの文字を受け入れ、最初の文字を 2 番目の文字に置き換えた文字列を返します。
 
starts-with
最初の文字列が 2 番目の文字列で始まるかどうかを示すブール値を返します。
 
substring
1 つの文字列と 2 つの数値を受け入れ、その文字列内のその数値の範囲内にある文字から成る文字列を返します。
 
to-lower-case
文字列を受け入れ、その文字列を小文字に変換して返します。
 
to-upper-case
文字列を受け入れ、その文字列を大文字に変換して返します。
 
trim
文字列を受け入れ、先頭または末尾にあるすべての空白を削除してその文字列を返します。
 
actions
条件を満たしている場合に実行される複数の命令。ゼロ以上の action タグのグループ。
action
action
条件を満たしている場合に実行される 1 つの命令。
action (ネストされる)、method (上記で定義済み)、add-object
add-object
type-alias で指定されたタイプのオブジェクトを作業メモリに追加します。引数は式として提供されます。各引数のタイプは、arguments- シグネチャの type-alias リストに指定されます。これは、前述の add インスタンスと同じ関数定義です。
type-alias、arguments-signature、arguments


ページの先頭       前  次