第3章

カスタム条件およびアクションの開発

この章では、特別な目的に使用する条件およびアクションのために独自のクラスを作成する方法について説明します。この節は、次のトピックで構成されています。

この章では、ルールベースのアプリケーションおよびexteNd Directorでのルールエディタの使用に精通していることを前提として説明を進めます。基礎的な情報については、を参照してください。

 
Top of page

カスタム条件およびアクションについて

条件およびアクションは、ポートレットおよびその他のアプリケーションコンポーネントにより起動されるルールを作成する場合に使用するJavaクラスです。ルールエディタでは、事前に作成された条件およびアクションが利用できます。また、アプリケーションの特定の要件を満たすカスタム条件およびアクションを作成することもできます。

条件およびアクションは一般的に、ルールエディタで設定できるプロパティと共にJavaBeanとして実装されます。

 
Top of page

条件またはアクションの設計

いくつかの意思決定ポイントを含む条件またはアクションの設計

実装されるロジック    ルールベースのロジックを設計する場合、条件およびアクションが互いに通信する方法、およびアプリケーションソースコードと通信する方法について検討します。重要な考察事項は、次のとおりです。

インストールされた条件またはアクションが要件を満たすか   開発を開始する前に、インストールされている条件およびアクションを理解しておく必要があります。条件を満たすものがあるか、インストールされたバージョンの1つを変更することが必要になります。詳細については、 and を参照してください。

ルールエディタにより表示されるユーザインタフェースの種類   デフォルトでは、ルールエディタはルールを作成するために使用する条件およびアクションと対話するインタフェースとして汎用プロパティパネルを生成します。条件またはアクションにプロパティがある場合、プロパティパネルには、チェックボックスやテキストボックスなどの、必要な値を選択したり、入力したりするためのコントロールが提供されます。また、条件およびクラスでカスタムのユーザインタフェースを指定することもできます。これらは、その後ルールエディタによってプロパティパネルを表示するために使用されます。詳細については、プロパティの定義を参照してください。

必要なサポートクラス   条件およびアクションは、次のようなサポートクラスに依存することがよくあります。

クラスのタイプ

対象

カスタムクラス

exteNd Director API で指定されていないロジックの実装

BeanInfoクラス

条件またはアクションJavaBeanの追加情報の指定

For more information    詳細については、 BeanInfoクラスの作成を参照してください。

リソースバンドル

条件およびアクションのプロパティパネルに表示されるスタティック文字列のローカライズ

For more information    詳細については、 リソースバンドルの使用を参照してください。

ルールはランタイム値にアクセスする必要があるか   ランタイムにダイナミックに設定できるセッションホワイトボード値にアクセスするプロパティを定義できます。詳細については、ランタイムプロパティの定義を参照してください。

 
Top of page

ロジックの定義

条件およびアクションにはそれぞれ実装を定義する3つの方法があります。

メソッド

使用場所

説明

doCondition()

条件

条件の要件を満たします。

この方法で、プロパティ値の比較または評価を行い、ブール値を返すコードを作成します。

doAction()

アクション

アクションの要件を満たします。

この方法では、関連付けられた条件がtrueまたはfalseを評価するかどうかに基づいたアクションを実行するコードを作成します。

この方法は一般的に、ビジネスルールの結果を返します。

toString()

条件およびアクションの両方

条件および現在の設定を記述する文字列を返します。

この文字列は、ルールエディタの条件またはアクションの説明として表示されます。

これらのメソッドは、exteNd Directorの条件ウィザードおよびアクションウィザードにより生成されるテンプレートに含まれています。

For more information    テンプレートおよびコアメソッドの概要については、テンプレートメソッドについてを参照してください。

 
Top of section

条件のロジックの定義

一般的に条件はルールエディタで入力されたプロパティ値を比較し、ブール値を返します。このロジックは、doCondition()メソッド内でコード化されます。

doCondition()メソッドは、EbiContextオブジェクトを含み、ランタイム値へのアクセスを可能にします。

doCondition()の例

この例は、インストールされた条件CheckTimeからのコードを示し、現在の時刻がルールエディタの条件で指定される時間範囲内にあるかどうかを確認します。

  // ...
  // JavaBean get/set accessor methods
  	 public int getFrom() {
  	 	 return from;
  	 }
  
  	 public void setFrom( int from ) {
  	 	 this.from = from;
  	 }
  
  	 public int getTo() {
  	 	 return to;
  	 
  	 public void setTo( int to ) {
      	 this.to = to;
  	 }
  // Check to see if the current time of day is within the specified
  // range.
  public boolean doCondition( com.sssw.re.api.EbiContext context ) throws com.sssw.re.exception.EboConditionException {
  	 	 int hour = new GregorianCalendar().get( Calendar.HOUR_OF_DAY );
  
      	 if ( from < to ) {
  	 	 	 // Daytime check
  	 	 	 if ( hour >= from ) {
  	 	 	 	 if ( hour <= to ) {
  	 	 	 	 	 return true;
  	 	 	 	 }
  	 	 	 }
  	 	 	 return false;
  	 	 }
  	 	 else {
  	 	 	 // Crossover check
  	 	 	 if ( hour >= to ) {
  	 	 	 	 if ( hour <= from ) {
  	 	 	 	 	 return false;
  	 	 	 	 }
  	 	 	 }
  	 	 	 return true;
  	 	 }
  
  	 }
  // ...

条件の例に関する注記

get/setメソッド   これらのメソッドは、この条件の指定時刻の開始 fromおよび指定時刻の終了to(この時刻まで含まれます)という2つのプロパティを定義するJavaBeanアクセッサメソッドです。これらの値には、ルールエディタのプロパティパネルからアクセスできます。

For more information    詳細については、JavaBeanの定義を参照してください。

doCondition()   このメソッドは、役立つ条件クラスです。この例では、プロパティ値はJava GregorianCalendarオブジェクトから取得される現在の時刻と比較されます。このコードでは、現在の日付内およびクロスオーバー時刻に対する2つの確認が行われ、それぞれの場合でブール値が返されます。

 
Top of section

アクションのロジックの定義

アクションは1つまたは複数の条件の戻り値に基づいてルールの結果を返します。アクションのロジックは、doAction()メソッドでコード化されます。

アクションは、SQLを通じたデータベースのアクセスから、ホワイトボード値の操作、HTTPおよびHTML値の戻し、操作の実行、およびオブジェクトへのユーザアクセスの制御まで、実質的にはどのようなアクティビティでも実行できます。条件と同様、アクションは一般的にルールエディタで設定可能です。

呼び出し側への値の戻し

アクションはルールの結果を返すため、呼び出し側、一般的にはポートレットまたはJSPページにより結果が取り扱われる方法を理解する必要があります。次に、ルールを起動するポートレットにアクションからの値を返すために使用する一般的なHTTP応答メソッドの概要を示します。

戻り値メソッド

説明

用途

EbiContext.setResponseStatus()

アクションが成功したか失敗したかを示すHTTPステータスコードを設定します。

doAction()メソッドから呼び出されます。

EbiContext.setResponsePhrase()

データをアクションから起動ポートレットに渡すために使用する応答句を設定します。

doAction()メソッドから呼び出されます。

EbiContext.setResponseType()

起動ポートレットがデータを処理する方法を示す応答句のタイプを設定します。

メソッドEbiContext.set ResponsePhrase()が呼び出されるたびに、doAction()メソッドから呼び出されます。

doAction()の例

次に、インストールされたアクションReturnAsHTMLBoldからのコードを表示します。ユーザにより入力されたテキストを太字で返します。

  public void doAction( com.sssw.re.api.EbiContext context ) throws
     com.sssw.re.exception.EboActionException {
  context.setResponsePhrase( "<b>" + getValue().getValue( context ) + 	 	 "</b>" );

 
Top of section

条件またはアクションルール記述子の定義

テンプレートにより指定されるtoString()メソッドは、条件またはアクションが選択されたときにルールエディタに表示される条件またはアクションの記述を返します。一般的に、toString()はプロパティ値を含めるプロパティのgetメソッドを呼び出します。

toString()の例

次に、toString()がインストールされた条件CheckTimeで実装される方法を示します。

  // Use resource bundle, \x93 caResource\x94  instantiated with Class
  // definition, for string processing.
  public String toString() {
  	 return caResource.getString("the hour is between <b>") +
  	 	 getHours().elementAt( from ) + caResource.getString("</b>
  	 	 and <b>") + getHours().elementAt( to );
  	 }
  // Implement a JPanel using getParameterPanel() using getHours() 
  // to get selected property values.
  
  private Vector getHours() {
  	 	 if ( hours == null ) {
  	 	 	 hours = new Vector();
  	 	 	 hours.addElement( caResource.getString("12 am"));
  	 	 	 hours.addElement( caResource.getString("1 am"));
  	 	 	 hours.addElement( caResource.getString("2 am"));
          // ...

toString()の例に関する注記

ローカルメソッドであるgetHours()は、プロパティ値を保存するためにVectorを使用します。toString()メソッドはgetHours()を呼び出してルールエディタで選択された時間を表示します。

注記:   この例では、toString()は条件クラスでインスタンス生成されるリソースバンドルに処理を指定します。これは、ローカリゼーションのサポートも提供します。詳細については、リソースバンドルの使用を参照してください。

ルールエディタでの結果は次のようになります。

CAtoStringexample

 
Top of page

プロパティの定義

条件およびアクションのプロパティおよびプロパティパネルを定義するための方法はいくつかあります。ルールサブシステムは、JavaBeanおよびJPanelなどのJava構成体をサポートし、特定のデータタイプおよびオブジェクトに対するデフォルトのコントロールおよびプロパティでランタイム値を使用するためのサポートも提供しています。インストールされた条件およびアクションで使用されるリソースバンドルおよびBeanInfoクラスの実装に従うこともできます。

この節では、各方法の説明および例を示します。

 
Top of section

JavaBeanの定義

他のJavaBeanと同様、条件およびアクションはプロパティを持つことができます。プロパティを定義することによって、条件とアクションをルールエディタでカスタマイズすることを可能にし、さまざまなルールで使用できるようにします。

カスタム条件またはアクションにプロパティを追加する場合、次のJavaBean標準に従ってください。各プロパティに対して、次の項目を定義します。

ルールエディタは、プロパティのデータタイプに基づき、条件またはアクションのプロパティパネルを自動的に生成するためにこれらの構成体を使用できます。モデルの実装については、doCondition()の例を参照してください。

JDK BeanInfoクラスを使用して、表示プロパティを改善することもできます。BeanInfoクラスの作成を参照してください。

 
Top of section

ランタイムプロパティの定義

ルールサブシステムは、条件およびアクションのプロパティがランタイム値からダイナミックに設定されるように、2つの文字列テンプレートデータタイプを備えています。

これらのデータタイプを使用してプロパティを定義する場合、ルールエディタでは、ホワイトボードキーを参照することにより、これらのプロパティの値を指定できます。ルールが起動されると、プロパティはホワイトボードキーに関連付けられたリアルタイム値に設定されます。

For more information    ホワイトボードの使用に関する詳細については、を参照してください。

!valueOf構成体の処理

ダイナミックに設定する各プロパティに対して、タイプEboStringTemplateSingleまたはEboStringTemplateMultiのメンバー変数を定義する必要があります。ルールエディタは、関連付けられたTextFieldまたはTextAreaを生成します。これらは、キャレット(^)記号が末尾に付けられた文字列でラベル付けされています。この記号は、リテラル文字列を入力することでスタティックに、または!valueOf構成体を使用することでダイナミックに設定できる文字列テンプレートとしてプロパティが定義されていることを示します。この構成体を使用して、ホワイトボードキーに関連付けられた値を指定します。構文は以下のとおりです。

  !valueOf.whiteboard key

userIDなど、特定のセッション値が自動的に指定されます。たとえば、次のとおりです。たとえば、ホワイトボードキーUserIDに関連付けられた値にプロパティを設定する場合、「!valueOf.UserID」と入力します。

valueOf!式の解決   ランタイム値を評価する必要がある条件またはアクションを作成するときは、値を取得するために次のいずれかのメソッドを使用します。

メソッド

所属クラス

用途

merge()

EbiContext

ホワイトボードキー名を指定することで1つまたは複数のホワイトボード値の文字列を取得します。

getValue()

EboStringTemplateSingle EboStringTemplateMulti

指定されたテンプレートに関連付けられたホワイトボードキーの文字列値を取得します。

文字列テンプレート値の例

次の例は、インストールされたアクションSaveToWhiteBoardからのコードを示します。このアクションは、指定されたホワイトボードキーのホワイトボードにデータを保存します。

  public boolean resolve;
  	 public com.sssw.re.core.EboStringTemplateSingle data = new
    com.sssw.re.core.EboStringTemplateSingle();
  	 public com.sssw.re.core.EboStringTemplateSingle template = new
    com.sssw.re.core.EboStringTemplateSingle();
  
  // Set the template value for the whiteboard key that will be used 
  // to store the data value.
   	 public void setKeyTemplate( EboStringTemplateSingle detailKey ) {
  	 	 this.template = detailKey;
  	 }
  // Return the template for the whiteboard key.
   	 public EboStringTemplateSingle getKeyTemplate() {
  	 	 return template;
  	 }
  
  // Return the template for the data.
   	 public EboStringTemplateSingle getData() {
  	 	 return data;
  	 }
  
  // Set the template value for the data to be saved to the 
  // whiteboard.
   	 public void setData( EboStringTemplateSingle data ) {
  	 	 this.data = data;
  	 }
  
  // Return boolean true if the data value is a templatized string 
  // that needs to be resolved, and false if the data value is the 
  // value to be saved.
  	 public boolean getResolve() {
  	 	 return resolve;
  	 }
  
  // Set the value that determines if the data value needs to be 
  // resolved.
   	 public void setResolve( boolean resolve ) {
  	 	 this.resolve = resolve;
  	 }
  
  // Save the data value, or resolved data value if resolved is
  // true, to the whiteboard in the specified whiteboard key.
  public void doAction( com.sssw.re.api.EbiContext context ) throws com.sssw.re.exception.EboActionException {
  	 	 String merged = getKeyTemplate().getValue( context );
  	 	 context.setValue( merged, ( getResolve() ? getData().getValue( context
       ) : getData().getTemplate() ) );
      }

文字列テンプレート例の注記

このアクションは、ルールエディタに表示される3つのプロパティを定義します。

CAStringTemplate

EboStringTemplateSingle   コードは、各テンプレートプロパティに対して2つのテンプレートオブジェクトのインスタンスを生成します。最初のプロパティ(Key-template)は、データ表示を取得するために解決されます。2番目のプロパティ(Data)は、Resolveコントロールが選択されている場合のみ解決されます。

doAction()   プロパティを取得し、次のメソッドを実装します。

メソッド

説明

getValue()

Key_templateのキー値を解決するテンプレートメソッド

setValue()

ホワイトボードのKey-template値を設定するコンテキストメソッド

  • Resolveがfalseの場合、Data値文字列をホワイトボードに設定します。

  • Resolveがtrueの場合、template.getValue()を使用してキー値を解決します。

 
Top of section

汎用プロパティパネルの使用

ルールサブシステムは、自動的に汎用プロパティパネルを生成する一組のデータタイプをサポートします。サポートされた各データタイプに対して、ルールエディタはプロパティパネルで事前に選択されたGUIコントロールを表示します。必要な処理は、各プロパティに対してJavaBeanアクセッサメソッドを実装するだけです。

サポートされたデータタイプおよび関連付けられたコントロールのリストは次のとおりです。

サポートされたデータタイプ

GUIコントロール

java.lang.String

char

int

long

double

float

TextField

boolean

Checkbox

com.sssw.re.core.EboStringTemplateSingle

TextField

com.sssw.re.core.EboStringTemplateMulti

TextArea

com.sssw.re.condtion.Compare

com.sssw.re.core.EboRule

DropDownListBox

 
Top of section

カスタムプロパティパネルの作成

汎用コントロールを使用する代わりに独自のプロパティパネルを作成する場合、getParameterPanel()メソッドを実装してカスタムユーザインタフェースを指定できます。ルールエディタでは、カスタムインタフェースをJPanelとして定義する必要があります。ルールエディタでは、getParameterPanel()により返されるその他のタイプのポートレットに基づいてカスタムプロパティパネルは作成されません。

getParameterPanel()メソッドを条件またはアクションに含める場合、リスナインタフェースを実装して、JPanelのコントロールをユーザアクションに対応させる必要があります。

カスタムJPanelの使用例

次に、インストールされた条件CheckTimeのプロパティパネルを定義するコードを示します。

  // ...
  // Return a custom ui component to be used for editing this 
  // condition.
   	 public java.awt.Component getParameterPanel() {
  	 	 JPanel p = new JPanel();
  	 	 p.setLayout( new BoxLayout( p, BoxLayout.X_AXIS ) );
  	 	 p.add( new JLabel( caResource.getString("between the hours
  	 	 	 of") ) );
  	 	 p.add( FROM = new JComboBox( getHours() ) );
  	 	 p.add( new JLabel( caResource.getString("and") ) );
  	 	 p.add( TO = new JComboBox( getHours() ) );
  	 	 FROM.setAlignmentY( JComponent.CENTER_ALIGNMENT );
  	 	 TO.setAlignmentY( JComponent.CENTER_ALIGNMENT );
  	 	 FROM.setSelectedIndex( from );
  	 	 TO.setSelectedIndex( to );
  	 	 FROM.addItemListener( this );
  	 	 TO.addItemListener( this );
  	 	 return p;
  	 }
  
  // Return a vector of hours for selection in the ui.
   	 private Vector getHours() {
  	 	 if ( hours == null ) {
  	 	 	 hours = new Vector();
  	 	 	 hours.addElement( caResource.getString("12 am"));
  	 	 	 hours.addElement( caResource.getString("1 am"));
  	 	 	 hours.addElement( caResource.getString("2 am"));
          // ...

カスタムJPanelの例に関する注記

次に、コードにより生成されたカスタムプロパティパネルを示します。

CAJPanelExample

JComboBoxの実装   TOおよびFROM変数はintsとして定義されます。汎用パネルの使用により、各プロパティにテキストフィールドが作成されます。代わりに、getParameterPanel()はJPanelのインスタンスを生成し、JComboBoxコントロールのペアを実装し、ルールエディタに時間選択のドロップダウンリストを作成します。コードはコンボボックスの値を書き込むためにVectorを使用するgetHours()ローカルメソッドを定義します。

リソースバンドル   コードはリソースバンドルcaResourceを使用して、コンボボックスのラベルをローカライズします。詳細については、リソースバンドルの使用を参照してください。

 
Top of section

BeanInfoクラスの作成

条件およびアクションに対してBeanInfoクラスを作成することによって、プロパティパネルの属性の表示を指定できます。たとえば、次の内容に対してBeanInfoクラスを使用できます。

注記:   BeanInfoクラスの使用は、ローカリゼーションのリソースバンドルを実装するために望ましい方法です。リソースバンドルの詳細については、リソースバンドルの使用を参照してください。

JavaBeanと同様、BeanInfoクラスは関連付けられたgetメソッドおよびsetメソッドでメンバー変数としてプロパティを指定するために、関連付けられた条件またはアクションクラスを必要とします。

Procedure BeanInfoクラスを作成する

  1. 任意のJavaエディタでJavaクラスを作成します。クラスはEboBeanInfoを拡張し、次のコード要素を実装します。

    コード要素

    説明

    imports

    条件:

    package com.sssw.re.condition.*

    アクション:

    package com.sssw.re.action.*

    条件およびアクション:

    com.sssw.re.core.*

    java.beans.*

    getClazz()メソッド

    BeanInfoクラスに関連付けられた条件またはアクションクラスを返します

    PropertyDescriptor[] pds

    条件またはアクションのプロパティパネルを生成するためにルールエディタに情報を提供します。

    アレイは、プロパティパネルに表示するプロパティの数と同じサイズでなければなりません。

    PropertyDescriptor pd

    各プロパティの記述子を定義します。

    各プロパティ記述子は、プロパティ記述子アレイに追加されます。

  2. BeanInfoを関連付けられた条件またはアクションクラスの名前に追加することによってBeanInfoクラスに名前を付けます。

    たとえば、次のとおりです。クラス名がCheckConditionの場合、BeanInfoクラスの名前はCheckConditionBeanInfoとなります。

For more information    BeanInfoクラスの例については、BeanInfoクラスの例を参照してください。

 
Top of section

リソースバンドルの使用

リソースバンドル」は、ローカリゼーションに使用されるJava JDKの標準機能です。リソースバンドルには、オブジェクト、文字列、数値、またはその他のデータを保存できます。リソースバンドルを作成するには、ListResourceBundleを拡張するJavaクラスまたはスタティック文字列を含むプロパティファイルを作成する必要があります。サポートする各ロケールに対して、個別のバージョンのリソースバンドルを指定します。

リソースバンドルは、条件、アクション、および関連付けられたBeanInfoクラスでローカリゼーションを実装するために使用できます。望ましい方法は次のとおりです。

  1. アプリケーションによりサポートされるすべてのロケールに対してリソースバンドルを作成します。

  2. 指定した条件、アクション、またはBeanInfoクラスで、EboResourceBundle.getBundle()メソッドを呼び出すことにより、リソースバンドルを参照するResourceBundleオブジェクトを宣言します。このメソッドの最も単純なバージョンは、1個の引数で、リソースバンドルクラスの完全修飾名です。

    たとえば、次のとおりです。リソースバンドルがパッケージの「ロケール」にあるMyBundle.classである場合、宣言は次のようになります。

      static com.sssw.re.util.EboResourceBundle eoCABundle = com.sssw.re.util.EboResourceBundle.getBundle("locales.MyBundle")
    
  3. ResourceBundleオブジェクトでgetメソッドを呼び出すことにより、リソースバンドルのデータにアクセスします。

    たとえば、次のとおりです。リソースバンドルにローカライズされた文字列が含まれている場合、目的の文字列値に関連付けられたキーを渡すことによって、ResourceBundleオブジェクトでgetString()メソッドを呼び出します。

注記:   リソースバンドルの作成に関する詳細については、Java標準APIマニュアルのResourceBundleクラス、ListResourceBundleクラス、およびPropertyResourceBundleクラスの参照マニュアルを参照してください。これらのクラスは、java.utilパッケージにあります。

BeanInfoクラスの例

次に、インストールされた条件CheckTimeのBeanInfoクラスを定義するコードを示します。

  package com.sssw.re.condition;
  import com.sssw.re.core.*;
  import java.beans.*;
  
  public class CheckTimeBeanInfo extends EboBeanInfo {
  
  	 // Resource Bundle definition
      static com.sssw.re.util.EboResourceBundle eoCABundle =
        com.sssw.re.util.EboResourceBundle.getBundle( EboConstant.CA_BUNDLE,
          getClass().getClassLoader() );
          
  	 public Class getClazz() {
  	 	 return com.sssw.re.condition.CheckTime.class;
  	 }
  
  	 public PropertyDescriptor[] getPropertyDescriptors() {
  	 	 PropertyDescriptor[] pds = new PropertyDescriptor[ 2 ];
  	 	 PropertyDescriptor pd;
  	 	 pd = super.getPropertyDescriptor( "From" );
  	 	 pd.setDisplayName( eoCABundle.getString( "From" ) );
  	 	 pds[ 0 ] = pd;
  	 	 pd = super.getPropertyDescriptor( "To" );
  	 	 pd.setDisplayName( eoCABundle.getString( "To" ) );
  	 	 pds[ 1 ] = pd;
  	 	 return pds;
  	 }
  
  }

BeanInfoClassの例に関する注記

リソースバンドルの取得   EboResourceBundle.getBundle()を使用して、CA_BUNDLEに保存されたインストール済みの条件およびアクションのリソースバンドルの名前、およびクラスローダを取得します。

プロパティ記述子の定義   CheckTime条件は2つのプロパティを定義するため、アレイ宣言に示されるとおり2つのプロパティ記述子が必要です。

プロパティの表示名の指定   プロパティ名を指定するためにsetDisplayName()メソッドを使用できます。ルールエディタは、プロパティパネルを生成する場合、プロパティに関連付けられたUIコントロールのラベルとしてこの表示名を使用します。setDisplayName()メソッドはプロパティ記述子で呼び出され、文字列引数を使用します。この例は、リソースバンドルを実装するための望ましい方法を示しています。ToおよびFromのキー値を使用して、ルールエディタでローカライズされた文字列が表示されるように、リソースバンドルに渡します。



Copyright © 2004 Novell, Inc. All rights reserved. Copyright © 1997, 1998, 1999, 2000, 2001, 2002, 2003 SilverStream Software, LLC. All rights reserved.  more ...