第2章

ルールの使用方法

この章では、アプリケーションでルールを使用する方法について説明します。この章は、次の節から構成されています。

 
Top of page

ルールの動作方法

第1章で説明したように、ルールとは、値を返す条件とアクションを結合したものです。exteNd Directorルールエディタでルールを定義し、次にルールにアクセスして、結果をexteNd Directorアプリケーションコードで処理します。

 
Top of section

基本手順

ルールの使用には、次の3段階の手順があります。

  1. ルールエディタで、条件とアクションを選択してプロパティを設定し、ルールを作成します。たとえば、CheckDay条件を選択して、プロパティをWhen today is Thursdayに設定し、ReturnResponsePhraseアクションを選択して適切な句を入力できます。

  2. アプリケーションコードの該当するポイントから、使用可能ないずれかのメソッドを使用してルールを起動します。例は次のとおりです。

      fireRule(Thursdays)
    
  3. アプリケーションでルールの結果を処理します。たとえば、ルールが「when today is Thursday」に対しては特定の応答句を返し、その他に対しては別の句を返す場合、アプリケーションにその結果を設定することになります。

 
Top of section

ルールアプリケーションコンポーネント

次に、ルールを作成するためのコンポーネントを示します。

コンポーネント

説明

EbiContext

EbiContextは、ホワイトボードへのアクセスを提供し、ルールの起動、パイプラインの検証、およびルールの結果の処理を行うメソッドを持ちます。

EbiRuleManager

EbiRuleManagerは、ルールを起動したり、ルールの所有者に関連付けられているルールにアクセスしたりするための代替メソッドを提供します。ルールエディタで定義されている所有者は、アプリケーションまたは他の条件に従ってルールを整理できます。

ルール

ルールは、ルールエディタで設定する一連の条件とアクションを定義します。ルール定義はXML記述子として保存され、ルールを実行してその結果の値をコール側に返すためにRuleサブシステムによって使用されます。

条件とアクション

条件とアクションは、ルールエディタを使用して設定できるプロパティを持つJavaクラス(通常はJavaBeans)です。これらのプロパティに、ホワイトボードからアクセスされるセッション値およびオブジェクト値を含めることができます。

ホワイトボード

ホワイトボードは、セッション値および指定したオブジェクトを保存できる領域です。ホワイトボードは、EbiContext (コンテキストオブジェクト)からアクセスされます。

 
Top of page

条件およびアクションを使用した操作

インストール済み(事前作成された)条件とアクションを選択することによって、exteNd Directorのルールエディタを使用してルールを作成します。

注記:   ルールを作成する前に、ルールエディタについて精通しておく必要があります。詳細については、を参照してください。

ビジネス論理は、さまざまな方法で設定できます。ルール自体の中で設定できるものもあれば、アプリケーションでルールを起動する前にアプリケーション内で設定を行う必要があるものもあります。次に、インストールされた条件とアクションを使用して、値を設定して結果を作成する方法をいくつか示します。

方法

実装方法

ホワイトボード値の取得、設定、および削除

  • 複数のSave To Whiteboard条件またはアクションのいずれかを使用します。ホワイトボード上のデータは、!valueOf テンプレートを介して他の条件やアクションで使用できるようになります。

  • ホワイトボードキーが存在するかどうかを確認します(Check Whiteboard条件)。存在しない場合には、Save To Whiteboardを使用して作成します。

クライアント上へのクッキーの保存

  • Check For Cookie条件を使用して、クッキーが存在するかどうかを確認します。

  • Save Cookies To Whiteboardアクションを使用して、ホワイトボードキーとしてクッキーを使用できるようにします。

  • Set Cookie Valueアクションを使用して、アプリケーションまたはルールで必要なクッキーを作成します。

応答句の作成

  • 応答句にデータを挿入するには、複数のReturn ResponseアクションとReturn HTMLアクションを使用します。

  • [Append]チェックボックス(アクションプロパティシートで使用可能な場合)をオンにして、複数のアクションからの応答を追加的に作成します。

応答ステータスの設定

  • Return Trueアクション、Return Falseアクション、またはSet Response Statusアクションを使用します。

For more information    これらおよびその他のインストールされた条件とアクションの詳細については、を参照してください。

 
Top of section

ホワイトボード値の使用

exteNd Directorセッションには、ビジネス論理に必要な値を保存できる「ホワイトボード」が含まれています。各ホワイトボード値に対して、値を取得する際に使用するキーを指定します。ホワイトボードには、ルールエディタのインストール済みの条件とアクションだけでなく、アプリケーションコードからもアクセスできます。ホワイトボード値には、ルールエディタの条件またはアクションのプロパティシートからアクセスします。

!valueOfテンプレートの使用

いくつかのプロパティでは、実際の値を入力するか、または該当する値が保持されているホワイトボードキーを指定できます。別のキーの名前が保持されているキーを指定することもできます。

ルールエディタでは、条件またはアクションのプロパティの名前の一部に脱字記号(^)が含まれる場合、特別なコード!valueOf.whiteboardkeyを使用できます。whiteboardkeyには、必要な値を持つキーの名前を指定します。このキーの値は、ルールによって特殊なコードに置換されます。

ホワイトボードキーを指定するには、次の形式を使用します。

  !valueOf.keyname

keynameは、アプリケーションでルールを実行する際に、ホワイトボード上に存在するキーです。

注記:   keynameでは、大文字と小文字が区別されます。

組み込みホワイトボード値の使用

!valueOf式のホワイトボードキーのように使用できる複数の組み込み定数が用意されています。組み込み定数は、ログインしているユーザ、実行中のルール、および現在の日付と時刻に関する情報を提供します。

定数

説明

userID

アプリケーションにログインしているユーザのID。ユーザがログインしていない場合、userIDはanonymousになります。ユーザのセッションがタイムアウトすると、userIDはanonymousに戻ります。

today

現在の日付を示します。値は、ユーザのロケールに適した日付形式を使用して文字列として返されます。

now

数字で示される現在の時刻で、文字列として返されます。時刻の値は、現在の時刻とUTC (協定世界時)での1970年1月1日深夜の差(ミリ秒単位)です。

response

コンテキストオブジェクトの応答句に保存されるテキスト。多くのルールアクションでは、値を応答句に割り当てます。

ruleID

現在実行中のルールのID。

ruleDesc

現在実行中のルールの説明。

uri

現在ブラウザに設定されているコンテンツへの参照。

!valueOfの例

次の画面では、ReturnResponseWithDefaultアクションに、ユーザ宛のメッセージ用のDefaultプロパティが設定されています。このメッセージの中で、ホワイトボード上の値を参照できます。このサンプルテキストでは、システムのホワイトボード値userIDと、アプリケーションによって作成されたappnameと呼ばれるキーを使用しています。

  The current user !valueOf.userID is authorized to get more data from the application !valueOf.appname.

reValueOf

ホワイトボードからオブジェクト属性へのアクセス

ホワイトボード上の項目がプレーンテキストではなくプログラミングオブジェクトの場合、オブジェクトに関連付けられた任意の属性(インスタンス変数)にアクセスできます。次の形式を使用して、ホワイトボード上のオブジェクトの属性を参照できます。

  !valueOf.whiteboardkey^attributename

たとえば、アプリケーションでホワイトボードにEbiUserオブジェクトを配置した場合、次のようにしてユーザの姓を取得できます。

  !valueOf.myUser^lastName

ホワイトボード値へのアクセス

コンテキストオブジェクトは、ホワイトボードに保存されている値にアクセスするための複数のメソッドを提供します。

For more information    詳細については、ホワイトボードにアクセスするためのコンテキストメソッドを参照してください。

ホワイトボードからの値の削除

イレーサー」を使用して、指定された時刻、または指定された回数アクセスがあった後にホワイトボード値を削除することができます。イレーサーの名前は、削除するホワイトボードキーと同じ名前です。インストール済みアクションAddEraserとRemoveEraserを使用して、イレーサーを管理できます。また、com.sssw.fw.api.EbiWhiteboardクラスからイレーサーのメソッドにアクセスすることもできます。

 
Top of section

スコープパスへのアクセス

条件およびアクションの^テンプレートフィールドでは、スコープパスの代替構文もサポートされています。スコープパスを使用することによって、リソースセットやContent Managementサブシステムのドキュメントなど、exteNd Directorアプリケーションのさまざまなタイプのデータにアクセスすることができます。

スコープパスは、次の形式を使用して指定できます。

  ${spath}

For more information    詳細については、『exteNd Directorアプリケーションの開発』のスコープパスおよびXPathの操作に関する節を参照してください。

 
Top of page

ルールのアクセスおよび起動

ルールを起動すると、RuleサブシステムはDecisionノードの条件(ルールエディタの[時間]セクション)を評価します。trueの場合は、ノードのアクション([実行]セクション)を実行します。Ruleサブシステムは、trueに評価されるDecisionノードがない場合はデフォルトアクションを実行し、ある場合は[その他の場合に実行]セクションを実行します。続いて、アクションの結果がアプリケーションに返されます。

注記:   EbiContextオブジェクトまたはEbiRuleManagerからルールを起動できます。ルールマネージャでは、ルールを起動したりアクセスしたりするための追加メソッドが提供されており、大量のルールを使用するアプリケーションでは実装をお勧めします。

 
Top of section

ルールを起動するメソッド

ルールを起動するためのコンテキストおよびルールマネージャメソッドは次のとおりです。

メソッド

所属クラス

使用する場合

fireRule()

EbiContext

EbiRuleManager

ルールエディタでルールを定義して保存した場合。

fireTemporaryRule()

EbiContext

EbiRuleManager

ルール定義をXML文字列として持っている場合。これによって、exteNd Directorのルールエディタで定義されているルールIDではなく、XMLルール定義全体を提供することによってルールを起動できます。

For more information    一時ルールの起動を参照してください。

isTrue()

EbiRuleManager

exteNd Directorで定義されているルールで応答ステータスをtrueまたはfalseの値に設定する場合。isFalse()メソッドは指定されたルールを起動して、ルールがtrue値を返したかどうかを報告します。

isFalse()

EbiRuleManager

exteNd Directorで定義されているルールで応答ステータスをtrueまたはfalseの値に設定する場合。isFalse()メソッドは、指定されたルールを起動して、ルールがfalse値を返したかどうかを報告します。

 
Top of section

コンテキストオブジェクトからルールを起動

通常、ルールは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 ...

 
Top of section

ルールマネージャからのルールの起動

ルールマネージャでは、毎回所有者を指定することなくルールを起動できます。特定の所有者に対してルールマネージャを呼び出したり、ルール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);

 
Top of section

JSPページからのルールの起動

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);

 
Top of section

一時ルールの起動

通常、ルールはexteNd Directorルールエディタで定義し、exteNd Directorプロジェクトリソースセット内にある認識されている場所に保存されます。これによって、ユーザはルール名でルールを参照できるようになります。一時ルールは、直接参照可能なXML文字列です。ルールエディタでルールを定義し、EbiRuleManager.toXMLString()を使用してXMLをエクスポートすることによって、ルールのXMLを取得できます。

ルールコンテキストオブジェクトから一時ルールを起動する方法は次のとおりです。

  string xmlrule =...;
  reContext.fireTemporarayRule(xmlrule);

ルールマネージャから一時ルールを起動する方法は次のとおりです。

  rm.fireTemporaryRule(xmlrule, reContext);

 
Top of page

ルールの結果の処理

この節では、HTTP応答値およびルールから返されたホワイトボード値を処理するために使用可能なメソッドについて説明し、いくつかのコード例を示します。

 
Top of section

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に定義されています。

 
Top of section

ホワイトボードにアクセスするためのコンテキストメソッド

次の表は、ホワイトボードからセッション値およびオブジェクト値を保存したり取得したりするためのいくつかのEbiContextメソッドを示します。

メソッド

説明

get/setValue()

指定されたホワイトボードキーに関連付けられたオブジェクトを取得します。セッション中保持する必要のある値については、これらのメソッドを使用します。

get/setTemporaryValue()

指定されたホワイトボードキーに関連付けられたオブジェクトを取得します。開始要求以降に保持する必要のない値については、これらのメソッドを使用します。

get/setValueNames()

セッションで定義されているホワイトボードキーの配列を取得します。

hasValue()

指定されたキーの値がホワイトボード上にあるかどうかを確認します。

merge()

!valueOf式を含むテキストを処理します。merge()メソッドは、渡されたテンプレート内で!valueOf式を検索し、これに関連付けられているキー名を取得して、ホワイトボードからそのキーの値を取得します。

removeValue()

指定されたキーに関連付けられている値をホワイトボードから削除します。

removeValues()

ホワイトボードからすべての値およびそのキーを削除します。

 
Top of section

戻り値を処理する例

この節では、アプリケーションコード内のルールによって返される値を処理するコード例をいくつか示します。

ブール値を返すルールの例

次のコードは、所有者が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);

 
Top of page

パイプラインの使用

パイプライン」は、1つのルール、または複数のルールのセットを既知のユーザまたはグループにバインドしたり、一連のルールを1つの単位として指定された順番で起動したりするためのメカニズムです。

パイプラインは、exteNd Directorのパイプラインエディタとバインドエディタを使用して設定します。

For more information    exteNd Directorでパイプラインを設定する詳細については、を参照してください。

 
Top of section

パイプラインの利点

パイプラインでは、ツールベースの保守とホット展開機能の利点を維持しながら、より高レベルの論理的なカプセル化と再利用性を提供することによって、ルールの機能を強化します。次に、利点の概要を示します。

パイプラインの利点

詳細

複雑な論理の整理および維持が容易

パイプラインは、1つまたは複数の最上位の条件に依存する複雑な論理が含まれるアプリケーションに対して特に役立ちます。これは、特にユーザおよびグループのバインドに関係があります。

たとえば、企業のWebサイトが主としてユーザまたは組織グループによって運営されているとします。この場合、特定の条件下で処理を停止するルールや、別の条件下で他のルールを起動するアクションが含まれるルールを使用できます。特に論理を頻繁にアップデートする必要がある場合、このような論理は単一のパイプラインで維持する方がはるかに簡単です。

論理とプレゼンテーションの分離の強化

パイプラインを検証する場合、アプリケーションはどのルールが起動されるかを認識する必要はなく、どのような値が返されるかを認識するだけで済みます。

たとえば、ケースステートメント内のルールの起動を回避して、このようなより高レベルの論理をパイプラインで処理することができます。つまり、プレゼンテーションの処理に使用できるポートレットやJSPページから、より多くのビジネス論理を切り離すことができます。

ルール再利用性の強化

パイプラインは、ルールと同様に再利用できます。パイプラインに組み込むことができる論理を共有する複数のアプリケーションを使用することができます。

 
Top of section

パイプラインの動作方法

パイプラインを作成するときに、1つまたは複数のバインダに関連付けることができます。バインダには次の3つのタイプがあります。

バインダのタイプ

使用する場合

ユーザ

指定されたユーザに関連付けられているルールを起動します。ルールは、このユーザがアプリケーションセッションに存在する場合にのみ起動されます。

グループ

指定されたグループに関連付けられているルールを起動します。ルールは、このグループのメンバがアプリケーションセッションに存在する場合にのみ起動されます。

パイプライン

指定されたパイプラインに関連付けられているルールを起動します。

パイプラインの処理方法は次のとおりです。

rePipeline

パイプラインを作成した後、適切なバインドエデイタを使用して1つまたは複数のルールを選択し、起動する順番を指定します。次に、validate()メソッドを使用して、アプリケーションコード内のパイプラインを実行します。ルールの結果を処理する場合と同じ方法で、パイプラインの結果を処理します。

For more information    詳細については、ルールの結果の処理を参照してください。

 
Top of section

パイプラインの検証

パイプライン内でルールを起動することは、パイプラインの「検証」と呼ばれます。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 ...