第2章
この章では、アプリケーションでルールを使用する方法について説明します。この章は、次の節から構成されています。
第1章で説明したように、ルールとは、値を返す条件とアクションを結合したものです。exteNd Directorルールエディタでルールを定義し、次にルールにアクセスして、結果をexteNd Directorアプリケーションコードで処理します。
ルールの使用には、次の3段階の手順があります。
ルールエディタで、条件とアクションを選択してプロパティを設定し、ルールを作成します。たとえば、CheckDay条件を選択して、プロパティをWhen today is Thursdayに設定し、ReturnResponsePhraseアクションを選択して適切な句を入力できます。
アプリケーションコードの該当するポイントから、使用可能ないずれかのメソッドを使用してルールを起動します。例は次のとおりです。
fireRule(Thursdays)
アプリケーションでルールの結果を処理します。たとえば、ルールが「when today is Thursday」に対しては特定の応答句を返し、その他に対しては別の句を返す場合、アプリケーションにその結果を設定することになります。
次に、ルールを作成するためのコンポーネントを示します。
インストール済み(事前作成された)条件とアクションを選択することによって、exteNd Directorのルールエディタを使用してルールを作成します。
注記: ルールを作成する前に、ルールエディタについて精通しておく必要があります。詳細については、を参照してください。
ビジネス論理は、さまざまな方法で設定できます。ルール自体の中で設定できるものもあれば、アプリケーションでルールを起動する前にアプリケーション内で設定を行う必要があるものもあります。次に、インストールされた条件とアクションを使用して、値を設定して結果を作成する方法をいくつか示します。
方法 |
実装方法 |
---|---|
ホワイトボード値の取得、設定、および削除 |
|
クライアント上へのクッキーの保存 |
|
応答句の作成 |
|
応答ステータスの設定 |
これらおよびその他のインストールされた条件とアクションの詳細については、とを参照してください。
exteNd Directorセッションには、ビジネス論理に必要な値を保存できる「ホワイトボード」が含まれています。各ホワイトボード値に対して、値を取得する際に使用するキーを指定します。ホワイトボードには、ルールエディタのインストール済みの条件とアクションだけでなく、アプリケーションコードからもアクセスできます。ホワイトボード値には、ルールエディタの条件またはアクションのプロパティシートからアクセスします。
いくつかのプロパティでは、実際の値を入力するか、または該当する値が保持されているホワイトボードキーを指定できます。別のキーの名前が保持されているキーを指定することもできます。
ルールエディタでは、条件またはアクションのプロパティの名前の一部に脱字記号(^)が含まれる場合、特別なコード!valueOf
.
whiteboardkey
を使用できます。whiteboardkeyには、必要な値を持つキーの名前を指定します。このキーの値は、ルールによって特殊なコードに置換されます。
ホワイトボードキーを指定するには、次の形式を使用します。
!valueOf.keyname
keynameは、アプリケーションでルールを実行する際に、ホワイトボード上に存在するキーです。
注記: keynameでは、大文字と小文字が区別されます。
!valueOf式のホワイトボードキーのように使用できる複数の組み込み定数が用意されています。組み込み定数は、ログインしているユーザ、実行中のルール、および現在の日付と時刻に関する情報を提供します。
次の画面では、ReturnResponseWithDefaultアクションに、ユーザ宛のメッセージ用のDefaultプロパティが設定されています。このメッセージの中で、ホワイトボード上の値を参照できます。このサンプルテキストでは、システムのホワイトボード値userIDと、アプリケーションによって作成されたappnameと呼ばれるキーを使用しています。
The current user !valueOf.userID is authorized to get more data from the application !valueOf.appname.
ホワイトボード上の項目がプレーンテキストではなくプログラミングオブジェクトの場合、オブジェクトに関連付けられた任意の属性(インスタンス変数)にアクセスできます。次の形式を使用して、ホワイトボード上のオブジェクトの属性を参照できます。
!valueOf.whiteboardkey^attributename
たとえば、アプリケーションでホワイトボードにEbiUserオブジェクトを配置した場合、次のようにしてユーザの姓を取得できます。
!valueOf.myUser^lastName
コンテキストオブジェクトは、ホワイトボードに保存されている値にアクセスするための複数のメソッドを提供します。
詳細については、ホワイトボードにアクセスするためのコンテキストメソッドを参照してください。
「イレーサー」を使用して、指定された時刻、または指定された回数アクセスがあった後にホワイトボード値を削除することができます。イレーサーの名前は、削除するホワイトボードキーと同じ名前です。インストール済みアクションAddEraserとRemoveEraserを使用して、イレーサーを管理できます。また、com.sssw.fw.api.EbiWhiteboardクラスからイレーサーのメソッドにアクセスすることもできます。
条件およびアクションの^テンプレートフィールドでは、スコープパスの代替構文もサポートされています。スコープパスを使用することによって、リソースセットやContent Managementサブシステムのドキュメントなど、exteNd Directorアプリケーションのさまざまなタイプのデータにアクセスすることができます。
スコープパスは、次の形式を使用して指定できます。
${spath}
詳細については、『exteNd Directorアプリケーションの開発』のスコープパスおよびXPathの操作に関する節を参照してください。
ルールを起動すると、RuleサブシステムはDecisionノードの条件(ルールエディタの[時間]セクション)を評価します。trueの場合は、ノードのアクション([実行]セクション)を実行します。Ruleサブシステムは、trueに評価されるDecisionノードがない場合はデフォルトアクションを実行し、ある場合は[その他の場合に実行]セクションを実行します。続いて、アクションの結果がアプリケーションに返されます。
注記: EbiContextオブジェクトまたはEbiRuleManagerからルールを起動できます。ルールマネージャでは、ルールを起動したりアクセスしたりするための追加メソッドが提供されており、大量のルールを使用するアプリケーションでは実装をお勧めします。
ルールを起動するためのコンテキストおよびルールマネージャメソッドは次のとおりです。
メソッド |
所属クラス |
使用する場合 |
---|---|---|
fireRule() |
EbiContext EbiRuleManager |
ルールエディタでルールを定義して保存した場合。 |
fireTemporaryRule() |
EbiContext EbiRuleManager |
ルール定義をXML文字列として持っている場合。これによって、exteNd Directorのルールエディタで定義されているルールIDではなく、XMLルール定義全体を提供することによってルールを起動できます。
|
isTrue() |
EbiRuleManager |
exteNd Directorで定義されているルールで応答ステータスをtrueまたはfalseの値に設定する場合。isFalse()メソッドは指定されたルールを起動して、ルールがtrue値を返したかどうかを報告します。 |
isFalse() |
EbiRuleManager |
exteNd Directorで定義されているルールで応答ステータスをtrueまたはfalseの値に設定する場合。isFalse()メソッドは、指定されたルールを起動して、ルールがfalse値を返したかどうかを報告します。 |
通常、ルールはexteNd DirectorポートレットまたはJSPページから起動されます。まず、次のメソッドを使用して、ルールコンテキストオブジェクトのインスタンスを生成する必要があります。
public static EbiContext createEbiContext(HttpServletRequest request, HttpServletResponse response, ServletContext servletContext) throws EboFactoryException
EbiContextオブジェクトから要求オブジェクトと応答オブジェクトを取得し、別のファクトリメソッドを使用してインスタンスを生成することができます。
次のサンプルコードは、ポートレットのdoView()メソッドからルールを起動する方法を示します。ここで、myappはルールの所有者(オプション)で、access ruleはルールIDです。
public void doView( RenderRequest req, RenderResponse res ) \
try {
// get an EbiContext from the RenderRequest
com.sssw.fw.api.EbiContext context =
com.sssw.fw.factory.EboFactory.createEbiContext( req, res,
GenericPortlet.getPortletContext() );
// Get the rule context
reContext = com.sssw.re.factory.EboFactory.createEbiContext(
context );
// Fire the rule
reContext.fireRule("myapp.accessRule");
// handle the result...
// Catch excepions ...
ルールマネージャでは、毎回所有者を指定することなくルールを起動できます。特定の所有者に対してルールマネージャを呼び出したり、ルールIDを指定することによってルールを起動したりできます。
次のコードは、ポートレットにルールマネージャのインスタンスを生成します。
public void doView( RenderRequest req, RenderResponse res ) \
try {
{
// If a rule owner exicts
EbiRuleManager rm = com.sssw.re.factory.EboFactory.
createRuleManager( "myapp" );
/** For rules with no owner
EbiRuleManager rm =
com.sssw.re.factory.EboFactory.createRuleManager();
*/
// get an EbiContext from the RenderRequest
com.sssw.fw.api.EbiContext context =
com.sssw.fw.factory.EboFactory.createEbiContext( req, res,
GenericPortlet.getPortletContext() );
// Get the rule context
reContext = com.sssw.re.factory.EboFactory.createEbiContext(
context );
rm.fireRule(\x93 myRule\x81 E reContext);
// handle the result...
// Catch excepions ...
注記: ルールマネージャのインスタンスを生成するために使用した所有者に関係なく、次のように所有者を指定することで、コンテキストオブジェクトから起動する場合と同じように任意のルールを起動できます。
rm.fireRule("secondApp.contentRule", reContext);
JSPページまたはサーブレットから直接ルールマネージャを取得することもできます。この場合、HttpServletを継承するクラスを取得し、getServletContext()をコールする必要があります。次に、ルールマネージャを取得して、ポートレットから起動する場合と同じようにルールを起動します。
public class reTester extends HttpServlet { ServletContext m_servletContext = null; public void init( ServletConfig config ) throws ServletException { super.init( config ); // Initialize any instance variables... m_servletContext = config.getServletContext(); } // Create a rule manager and fire the rule EbiRuleManager rm = com.sssw.re.factory.EboFactory. createRuleManager(); com.sssw.re.api.EbiContext ctx = com.sssw.re.factory.EboFactory.createEbiContext( m_servletContext.getEbiRequest().getHttpServletRequest(), m_servletContext.getEbiResponse().getHttpServletResponse(), m_servletContext.getServletContext()); rm.fireRule(myRule, ctx);
通常、ルールはexteNd Directorルールエディタで定義し、exteNd Directorプロジェクトリソースセット内にある認識されている場所に保存されます。これによって、ユーザはルール名でルールを参照できるようになります。一時ルールは、直接参照可能なXML文字列です。ルールエディタでルールを定義し、EbiRuleManager.toXMLString()を使用してXMLをエクスポートすることによって、ルールのXMLを取得できます。
ルールコンテキストオブジェクトから一時ルールを起動する方法は次のとおりです。
string xmlrule =...; reContext.fireTemporarayRule(xmlrule);
ルールマネージャから一時ルールを起動する方法は次のとおりです。
rm.fireTemporaryRule(xmlrule, reContext);
この節では、HTTP応答値およびルールから返されたホワイトボード値を処理するために使用可能なメソッドについて説明し、いくつかのコード例を示します。
次の表は、HTTP応答値を処理するためルールEbiContextで使用可能なメソッドを示します。
アクセッサメソッド |
用途 |
---|---|
get/setResponsePhrase() |
HTTP応答句にアクセスします。応答句は、データをアクションとアプリケーションコードの間で受け渡しするために使用されます。 通常は、アクションでsetResponsePhrase()をコールして応答句を設定し、次にアプリケーションコードでgetResponsePhrase()をコールしてデータを取得します。アクションで応答句を設定する場合、setResponseType()メソッドをコールして応答タイプも設定する必要があります。 |
get/setResponseStatus() |
HTTP応答ステータスコードにアクセスします。応答ステータスコードは、コール元のオブジェクトに戻り値のステータスを通知します。たとえば、アクションReturn Trueはステータスコード200を返し、Return Falseは412を返します。HTTPステータスコードは、EbiResponseで定義されています。 通常は、アクションでsetResponseStatus()をコールしてステータスコードを設定し、アプリケーションコードでgetResponseStatus()をコールしてコードを取得します。 注記: ルールアクションがtrueまたはfalseを返す場合は、isTrue()またはisFalse()メソッドを使用してルールを起動します。詳細については、ルールを起動するメソッドを参照してください。 |
get/setResponseType() |
応答句に関連付けられた値のタイプにアクセスします。応答のタイプは、CONTENT、HTML、TEXTおよびURLとしてEbiResponseに定義されています。 |
次の表は、ホワイトボードからセッション値およびオブジェクト値を保存したり取得したりするためのいくつかのEbiContextメソッドを示します。
この節では、アプリケーションコード内のルールによって返される値を処理するコード例をいくつか示します。
次のコードは、所有者がsampleであるbonusという名前のルールを起動するポートレットを示します。
bonusが基づくルールは、「今日が平日の場合は「the bonus is $100,000」という値を表示し、その他の場合は「$1」を表示する」というものです。
このルールのアクションは、trueに対しては応答ステータスを200に設定し、falseに対しては412に設定して、trueまたはfalseを返します。次のコードは、これらの結果の処理方法を決定します。
public void doView( RenderRequest req, RenderResponse res ) \ try { //get the context com.sssw.fw.api.EbiContext context = com.sssw.fw.factory.EboFactory.createEbiContext(req, res, GenericPortlet.getPortletContext()); // Get the rule manager EbiRuleManager rm = com.sssw.re.factory.EboFactory.createRuleManager("sample" ); // Get the rule context com.sssw.re.api.EbiContext reContext = com.sssw.re.factory.EboFactory.createEbiContext(context); // nitialize bonus Double bonusAmount = null; // Fire rule to determine bonus. if ( rm.ruleExists( "bonus" ) ) { if (rm.isTrue( "bonus", reContext )) bonusAmount = new Double(100000.00); else bonusAmount = new Double(1.00); } else bonusAmount = new Double(0.00); } catch (Exception e) { // ..exception handling ... } }
前の例を利用して、trueまたはfalseではなくボーナス額をルールで返すとします。[実行]および[その他の場合に実行]のアクションの両方で、ReturnTrueとReturnFalseではなくReturnContentFromDataを使用します。[実行]では値bonus1をホワイトボードから取得し、[その他の場合に実行]ではbonus2を取得します。選択されたアクションは値を応答句として返し、この値はコンテキストオブジェクトから使用できます。
ルールを起動する前に、(たとえば、社内データベースから)値を取得し、EbiContext.setValue()をコールして、ホワイトボードキーbonus1とbonus2の値をこのユーザセッションに設定する必要があります。
String bonusString = "0"; Double bonusAmount = null; // Get a rule manager and context objects. EbiRuleManager rm = com.sssw.re.factory.EboFactory. createRuleManager(); com.sssw.fw.api.EbiContext context = com.sssw.fw.factory.EboFactory.createEbiContext(req, res, GenericPortlet.getPortletContext()); com.sssw.re.api.EbiContext reContext = com.sssw.re.factory.EboFactory.createEbiContext(context); // Fire rule to determine bonus. if ( rm.ruleExists( "bonus" ) ) { context.setValue("bonus1", ...); // retrieve value from db context.setValue("bonus2", ...); // retrieve value from db rm.fireRule( "bonus", reContext ); bonusString = context.getResponsePhrase(); bonusAmount = Double.valueOf(bonusString); }
ここでもボーナスの例を使用して、今度はボーナスの値がルールエディタで設定されるとします。[実行]および[その他の場合に実行]セクションの両方で、ボーナス額が指定されるインストール済みアクションReturn Responseを使用します。
String bonusString = "0"; Double bonusAmount = null; // Get a rule manager and context objects as shown // in previous example. // Fire rule to determine bonus. if ( rm.ruleExists( "bonus" ) ) { rm.fireRule( "bonus", reContext ); bonusString = context.getResponsePhrase(); bonusAmount = Double.valueOf(bonusString);
「パイプライン」は、1つのルール、または複数のルールのセットを既知のユーザまたはグループにバインドしたり、一連のルールを1つの単位として指定された順番で起動したりするためのメカニズムです。
パイプラインは、exteNd Directorのパイプラインエディタとバインドエディタを使用して設定します。
exteNd Directorでパイプラインを設定する詳細については、を参照してください。
パイプラインでは、ツールベースの保守とホット展開機能の利点を維持しながら、より高レベルの論理的なカプセル化と再利用性を提供することによって、ルールの機能を強化します。次に、利点の概要を示します。
パイプラインを作成するときに、1つまたは複数のバインダに関連付けることができます。バインダには次の3つのタイプがあります。
パイプラインの処理方法は次のとおりです。
パイプラインを作成した後、適切なバインドエデイタを使用して1つまたは複数のルールを選択し、起動する順番を指定します。次に、validate()メソッドを使用して、アプリケーションコード内のパイプラインを実行します。ルールの結果を処理する場合と同じ方法で、パイプラインの結果を処理します。
詳細については、ルールの結果の処理を参照してください。
パイプライン内でルールを起動することは、パイプラインの「検証」と呼ばれます。EbiContextオブジェクトでvalidate()メソッドを使用します。
まず、コンテキストオブジェクトからルールを起動の説明に従って、EbiContextを取得する必要があります。
次のコードは、指定したパイプラインを検証します。
ctx.validate("CheckAllAccessRestrictions");
次のコードは、EbiContextオブジェクトにパイプラインIDを設定して検証します。
ctx.setPipelineID("CheckAllAccessRestrictions"); ctx.validate();}
Copyright © 2004 Novell, Inc. All rights reserved. Copyright © 1997, 1998, 1999, 2000, 2001, 2002, 2003 SilverStream Software, LLC. All rights reserved. more ...