|
ユーザ セグメント、キャンペーン、プレースホルダ、およびコンテンツ セレクタを使用するパーソナライゼーションは、JSP タグを使用して開発でき、Java コーディングの必要はほとんどありません。しかし、より柔軟性のあるパーソナライゼーションの開発が必要となる場合もあります。これは、ルール コントロールと RulesManager
EJB を使用するルール セットを作成してデプロイすることによって実現できます。
ルール サービスは、高度なパーソナライゼーション機能を作成するのに役立ちます。高度なパーソナライゼーション機能を使用すると、ページフローから各ユーザのパスを制御したり、実行時情報をコード内の条件付きロジックへの動的な入力として使用したりできます。高度なパーソナライゼーションを開発するには、XML とスキーマ (上級者向けの DTD) による作業経験があり、Java 開発について中級レベルの知識を持っていることが必要です。
WebLogic Portal には、ポータル アプリケーションでユーザが行う操作をパーソナライズするためのツール セットが用意されています。各ユーザがブラウズするコンテンツ、受信する自動電子メール メッセージ、コマース アプリケーションで各ユーザに適用される割引のタイプなどを制御できます。このようなパーソナライゼーションを実現するには、Workshop for WebLogic でユーザ セグメント、コンテンツ セレクタ、およびキャンペーンを作成します。これらのツールを用いたパーソナライゼーションの開発では JSP タグが利用できるため、Java を使用したコーディングはほとんど必要ありません。このタイプのパーソナライゼーションの開発後には、ポータル管理者が WebLogic Portal Administration Console を使用してパーソナライゼーションの動作を修正することができます。この場合、コーディングはまったく必要ありません。
しかし、より強力で柔軟性のあるパーソナライゼーションの開発が必要となる場合もあります。たとえば、パーソナライゼーションを使用してページフローから各ユーザのパスを制御したり、実行時情報を動的な入力としてコード内の条件付きロジックに使用するなどが考えられます。
ルール サービスには、次の 2 つのタイプのコンポーネントを使用してアクセスできます。
RulesManager
EJB に呼び出しを委託するルール コントロールは、ルール サービスとの基本的な対話手段となります。ただし、ページフローまたは Web サービス以外の場所でルール サービスを使用する場合は、コード内で RulesManager
EJB を直接使用して、ルール サービスにアクセスできます。
表 10-4 は、WebLogic Portal に用意されているパーソナライゼーション ツールの一覧です。この表では、ルールサービスに直接アクセスすることによって実現されるプログラム能力の向上をわかりやすく説明するために、ユーザ セグメント、キャンペーン、コンテンツ セレクタ、およびパーソナライゼーション用の JSP タグについて説明しています。
表 10-4 の入力オブジェクトとアクションの列は、ルール コントロールと RulesManager
EJB を使用することによって柔軟性と機能が強化されることを示しています。
ルール サービスは、作業メモリに配置されているオブジェクトを読み込み、それらを XML ファイルに定義されている一連のルールと比較して評価します (作業メモリは、ルール サービスでルールが処理される間、オブジェクトを一時的に格納する場所です)。メモリ内のオブジェクトが、ルール セットに定義されている条件 (複数のルールで構成することもできます) と一致すると、ルール セットに定義されているアクションが実行されます。たとえば、ユーザ プロファイルや、Web サービスの計算結果などから取得したユーザの信用度スコアを作業メモリに配置した場合、ルール セット内のルールとして、「ユーザの信用度スコアが 10 点以上であれば、そのユーザをゴールド カスタマとして分類する」というアクションを実行するように XML 形式で定義することができます。
このルール処理の結果は、さまざまな方法でアプリケーションに使用できます。たとえば、ページ フローを開発している場合は、「ゴールド カスタマ」だけを gold.jsp
ファイルに送信し、残りのすべてのカスタマを別の JSP ファイルに送信することができます。
true
」の場合にアクションを実行することができます。Rules Manager コントロールでは、ルール セットの情報を取得できます。注意 : | Rules Manager コントロールは、ルールの開発デバッグ ツールとして使用すると非常に便利です。 |
RulesManager
EJB は、ルール サービスへのインタフェースです。ルール コントロールは、呼び出しを RulesManager EJB に委託します。ページフローまたは Web サービス以外の領域でコードにルール サービスを使用する場合は、RulesManager
EJB を使用します。
ルール サービスは、前向き推論用に最適化されている Rete アルゴリズムに基づいています。ルールの評価プロセスは、以下の順序で実行されます。このプロセスでは、Rules Executor コントロールを例として使用しています。
all
)、および結果をフィルタ処理するかどうか (オプションで指定した場合) が識別されます。これらのパラメータはすべて、コントロールにコンフィグレーションできます。evaluate*()
メソッドに渡されます。com.bea.p13n.usermgmt.profile.ProfileWrapper
の結果だけを返すように指定できます。
図 10-16 は、Rules Executor コントロールをページフローに使用したルールの評価プロセスを基本的な図で表したものです。この図では、ルール サービス プロセスから返された結果を、ページフローからのユーザのパスを特定することに使用しています。また、この図では、分かりやすいように、コードの代わりに自然言語を使用しています (実際のページフローでのパラメータの設定とコントロールの呼び出しについては、「ページフローにおけるコントロールを使用したユーザのパスの特定」を参照)。
ルール サービスは、コードで使用される単純な条件文よりも動的に扱うことができます。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
) は、以下の必須要素で構成されます。
<rule>
を含めることができます。<rule>
には、少なくとも 1 つの <condition>
(if) と 1 つまたは複数の <action>
(then) で構成される個別の if/then 句が含まれます。ルール サービスは、これらの条件に対して作業メモリ内のオブジェクトを評価します。オブジェクトが条件を満たしていれば、関連するアクションが実行されます。
コード リスト 10-2 は、「文字列 Make an Integer 10 が作業メモリにある場合、整数オブジェクト 10 を作業メモリに追加する」という単純なルール セットを示しています。
<?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 エディタでルール セットを作成 (または既存のルール セットを修正) します。
\common\p13n\lib
ディレクトリにある p13n_app.jar
ファイルから、以下のスキーマをルート セットを作成するディレクトリに解凍します。
lib/schema/expression*.xsd
lib/schema/rules*.xsd
rules-core-2_1_1.xsd
スキーマを関連付けます。このスキーマには、式のスキーマをはじめ、ルール セットの作成に役立つ他のスキーマのインポートも含まれています。
新規 XML ドキュメントの場合は、XML ヘッダが自動的に挿入されます。また、インポート用に指定されたすべてのスキーマが自動的にインポートされて、<rule-set>
、<rule>
、<name>
、<conditions>
、<actions>
などの必須の基本要素が挿入されます。
<conditions>
および <rules>
要素を選択して、条件とルールを作成 (または修正) します。図 10-17 は、XMLSpy で作成されるルール セットを示しています。<exp:greater-than-or-equal-to>
要素を選択すると、子として追加できる要素が [Elements] セクションに一覧表示されます。[Attributes] セクションには、この要素に設定できる属性が表示されます。META-INF/data
ディレクトリ、またはその下のサブディレクトリにルール セットをコピーします。たとえば、META-INF/data/rulesets
ディレクトリを作成して、そこにルール セットを保存します。
表 10-5 は、XML ルール セットでメソッドを使用して、ユーザ プロファイルのプロパティ値を取得し、ルール サービスで評価できるようにする方法を示しています。
XML とメソッドの間でマッピングを行う場合は、以下の情報を参考にしてください。
<exp:type-alias>
は、メソッドが作用するオブジェクトのタイプを識別する。p13n_app.jar
の parser-mapping-type.properties
ファイルで定義されているオブジェクト タイプのマッピング リストについては、「タイプ マッピングの使用」を参照してください。<exp:instance-method>
はメソッドを指定し、<exp:name>
はメソッド名を指定する。注意 : | ルールからメソッドを呼び出すには、適切なクラスを呼び出しコードにインポートする必要があります。 |
<exp:argument>
には、メソッドへの String 引数を指定する 2 つの <literal:string>
要素が含まれる。<literal:integer>
は、ルール サービスが使用する値を識別する。作業メモリ内のオブジェクト (この例の場合はユーザ プロファイルの CreditScore
値) を評価することにより、ルールのアクションが実行されるかどうかが決まります。CreditScore
値が取得される。この例では、この値が 10 以上の場合、関連付けられたアクションが実行されます。
ルール セットの妥当性が立証されなかった場合、無効な領域が表示されます。無効なルール セットを修正する場合は、次の手順を実行します。
.rls
ファイルで参照されているすべてのスキーマがインポートされたことを確認する。これらのスキーマは、*.rls
ファイルの先頭に表示されます。これらのスキーマは、.rls
ファイルと同じディレクトリに配置されている必要があります。.rls
ファイルで定義されている XML セクションが、スキーマに準拠していることを確認する。XMLSpy でスキーマを開いて、.rls
がスキーマの定義に対して有効かどうかをチェックすることができます。XMLSpy では、スキーマをデザイン ビューに視覚的に表示することができます。.rls
は、テキスト ビューおよび拡張グリッド ビューに表示できます。注意 : | XML エディタで検証されたルール セットが、ルール サービスでも検証されるとは限りません。 |
この節では、デプロイメント (Workshop for WebLogic) 環境、ステージング環境、またはプロダクション環境にルール セットをデプロイする方法について説明します。
ルール セットを作成して、アプリケーションの META-INF/data
ディレクトリ (または、その下の META-INF/data/rulesets
などの作成したサブディレクトリ) に保存すると、サーバが稼動していれば、ルール セットは自動的にデプロイされます。サーバが稼動していない場合は、サーバを起動した時点で自動的にデプロイされます (META-INF/data
ディレクトリには、ユーザ セグメント、コンテンツ セレクタ、キャンペーン、およびユーザが作成した他のアプリケーション メタデータも保存されています)。ルール セットは data
ディレクトリにデプロイする必要があり、ルール セットのファイル名には、ルール サービスで使用する拡張子 .rls
を付ける必要があります。
data
ディレクトリのルール セットを修正すると、そのルール セットは、稼動中のサーバで自動的に更新されます。
デプロイ済みのアプリケーションに存在するルール セットに追加、修正、または削除を行う場合は、次の手順を実行します。
ルール セットは、作業メモリ内に評価するオブジェクトを持つ必要があります。たとえば、ルール セットに含まれる 1 つのルールに、「ユーザの信用度スコアが 10 以上である場合」という条件が設定されているとします。この条件は、信用度スコアの入力値が存在すること、または信用度スコアを取得する方法が指定されていることを意味します。作業メモリには、以下の 2 つのいずれかの方法で信用度スコアを挿入できます。
コードに信用度スコアの値を追加する場合は、次の方法を使用します。
この後に、value
整数を評価するルールの条件を作成できます。
より柔軟かつ動的な方法は、ユーザ プロファイルから信用度スコアを取得する方法です。まず、コードを使用してユーザ プロファイルを取得し、作業メモリに配置します。
ProfileWrapper pw = SessionHelper.getProfile(request);
Object [] inputObjects = { pw };
(evaluate*()
メソッドへの必須の引数)
次に、ルール セットに条件を作成します。この条件には、特定のプロパティ セット (CreditPropertySet
) から特定のプロパティ (CreditScore
) を取得するメソッド (getProperty)
を使用します。表 10-5 のコード例を参照してください。このコード例の条件は、取得した CreditScore
が、<literal:integer>
値の 10
以上であるかどうかをチェックします。
注意 : | User タイプは、実際には ProfileWrapper クラスのオブジェクトのエリアスになります。この User と ProfileWrapper のマッピングは、他の既知のタイプのマッピングと共に、「タイプ マッピングの使用」に示す p13n_app.jar ファイルの parser-mapping-type.properties ファイルで定義されています。 |
以下のオブジェクト タイプのマッピングは、p13n_app.jar
ファイルの parser-mapping-type.properties
ファイルで定義されています。
コード リスト 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>
要素を示しています。
コード リスト 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 のメソッドとコンストラクタの引数にどのようにマップされるかを示しています。
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
プロパティを使用すると、実行された特定のルールの結果だけでなく、特定のデータ型についてもフィルタ処理できます。
META-INF/data
ディレクトリを基準としています。たとえば、myruleset.rls
というルール セットを作成して data/rulesets
ディレクトリに保存した場合、URI は /rulesets/myruleset.rls
になります。ルール セットとルールを一覧するには、Rules Manager コントロールを使用します。null
です。false
に設定した場合、作業メモリに保持されているすべてのオブジェクトが返されます。デフォルトは、false
です。フィルタ処理の詳細については、「結果のフィルタ処理」を参照してください。java.lang.String
など) を入力します。空白のままにすると、結果はフィルタされません。クラス名は、このプロパティまたは filterClassNames のどちらかで指定します。両方使用することはできません。java.lang.String,java.lang.Integer
など)。空白のままにすると、結果はフィルタされません。クラス名は、このプロパティまたは filterClassName のどちらかで指定します。両方使用することはできません。
各プロパティにメソッドとコンストラクタがどのようにマップされるかを理解しておくと、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
サブディレクトリ内) にも掲載されています。
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());
// GoldCardMembers を検索するように指定する。
List results = new ArrayList();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 を使用してユーザ自身がフィルタを作成する必要があるため、ルール サービスによるフィルタ処理よりも手間がかかります。コード リスト 10-6 にフィルタの設計方法を示します。
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 オブジェクトを示しています。
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 に、コントロール名およびルールを作成するために必要な使用可能な値を示します。