第3章
この章では、特別な目的に使用する条件およびアクションのために独自のクラスを作成する方法について説明します。この節は、次のトピックで構成されています。
この章では、ルールベースのアプリケーションおよびexteNd Directorでのルールエディタの使用に精通していることを前提として説明を進めます。基礎的な情報については、を参照してください。
条件およびアクションは、ポートレットおよびその他のアプリケーションコンポーネントにより起動されるルールを作成する場合に使用するJavaクラスです。ルールエディタでは、事前に作成された条件およびアクションが利用できます。また、アプリケーションの特定の要件を満たすカスタム条件およびアクションを作成することもできます。
条件およびアクションは一般的に、ルールエディタで設定できるプロパティと共にJavaBeanとして実装されます。
いくつかの意思決定ポイントを含む条件またはアクションの設計
実装されるロジック ルールベースのロジックを設計する場合、条件およびアクションが互いに通信する方法、およびアプリケーションソースコードと通信する方法について検討します。重要な考察事項は、次のとおりです。
インストールされた条件またはアクションが要件を満たすか 開発を開始する前に、インストールされている条件およびアクションを理解しておく必要があります。条件を満たすものがあるか、インストールされたバージョンの1つを変更することが必要になります。詳細については、 and を参照してください。
ルールエディタにより表示されるユーザインタフェースの種類 デフォルトでは、ルールエディタはルールを作成するために使用する条件およびアクションと対話するインタフェースとして汎用プロパティパネルを生成します。条件またはアクションにプロパティがある場合、プロパティパネルには、チェックボックスやテキストボックスなどの、必要な値を選択したり、入力したりするためのコントロールが提供されます。また、条件およびクラスでカスタムのユーザインタフェースを指定することもできます。これらは、その後ルールエディタによってプロパティパネルを表示するために使用されます。詳細については、プロパティの定義を参照してください。
必要なサポートクラス 条件およびアクションは、次のようなサポートクラスに依存することがよくあります。
クラスのタイプ |
対象 |
---|---|
カスタムクラス |
exteNd Director API で指定されていないロジックの実装 |
BeanInfoクラス |
条件またはアクションJavaBeanの追加情報の指定
|
リソースバンドル |
条件およびアクションのプロパティパネルに表示されるスタティック文字列のローカライズ
|
ルールはランタイム値にアクセスする必要があるか ランタイムにダイナミックに設定できるセッションホワイトボード値にアクセスするプロパティを定義できます。詳細については、ランタイムプロパティの定義を参照してください。
条件およびアクションにはそれぞれ実装を定義する3つの方法があります。
これらのメソッドは、exteNd Directorの条件ウィザードおよびアクションウィザードにより生成されるテンプレートに含まれています。
テンプレートおよびコアメソッドの概要については、テンプレートメソッドについてを参照してください。
一般的に条件はルールエディタで入力されたプロパティ値を比較し、ブール値を返します。このロジックは、doCondition()メソッド内でコード化されます。
doCondition()メソッドは、EbiContextオブジェクトを含み、ランタイム値へのアクセスを可能にします。
この例は、インストールされた条件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アクセッサメソッドです。これらの値には、ルールエディタのプロパティパネルからアクセスできます。
詳細については、JavaBeanの定義を参照してください。
doCondition() このメソッドは、役立つ条件クラスです。この例では、プロパティ値はJava GregorianCalendarオブジェクトから取得される現在の時刻と比較されます。このコードでは、現在の日付内およびクロスオーバー時刻に対する2つの確認が行われ、それぞれの場合でブール値が返されます。
アクションは1つまたは複数の条件の戻り値に基づいてルールの結果を返します。アクションのロジックは、doAction()メソッドでコード化されます。
アクションは、SQLを通じたデータベースのアクセスから、ホワイトボード値の操作、HTTPおよびHTML値の戻し、操作の実行、およびオブジェクトへのユーザアクセスの制御まで、実質的にはどのようなアクティビティでも実行できます。条件と同様、アクションは一般的にルールエディタで設定可能です。
アクションはルールの結果を返すため、呼び出し側、一般的にはポートレットまたはJSPページにより結果が取り扱われる方法を理解する必要があります。次に、ルールを起動するポートレットにアクションからの値を返すために使用する一般的なHTTP応答メソッドの概要を示します。
次に、インストールされたアクションReturnAsHTMLBoldからのコードを表示します。ユーザにより入力されたテキストを太字で返します。
public void doAction( com.sssw.re.api.EbiContext context ) throws com.sssw.re.exception.EboActionException { context.setResponsePhrase( "<b>" + getValue().getValue( context ) + "</b>" );
テンプレートにより指定されるtoString()メソッドは、条件またはアクションが選択されたときにルールエディタに表示される条件またはアクションの記述を返します。一般的に、toString()はプロパティ値を含めるプロパティのgetメソッドを呼び出します。
次に、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")); // ...
ローカルメソッドであるgetHours()は、プロパティ値を保存するためにVectorを使用します。toString()メソッドはgetHours()を呼び出してルールエディタで選択された時間を表示します。
注記: この例では、toString()は条件クラスでインスタンス生成されるリソースバンドルに処理を指定します。これは、ローカリゼーションのサポートも提供します。詳細については、リソースバンドルの使用を参照してください。
ルールエディタでの結果は次のようになります。
条件およびアクションのプロパティおよびプロパティパネルを定義するための方法はいくつかあります。ルールサブシステムは、JavaBeanおよびJPanelなどのJava構成体をサポートし、特定のデータタイプおよびオブジェクトに対するデフォルトのコントロールおよびプロパティでランタイム値を使用するためのサポートも提供しています。インストールされた条件およびアクションで使用されるリソースバンドルおよびBeanInfoクラスの実装に従うこともできます。
この節では、各方法の説明および例を示します。
他のJavaBeanと同様、条件およびアクションはプロパティを持つことができます。プロパティを定義することによって、条件とアクションをルールエディタでカスタマイズすることを可能にし、さまざまなルールで使用できるようにします。
カスタム条件またはアクションにプロパティを追加する場合、次のJavaBean標準に従ってください。各プロパティに対して、次の項目を定義します。
ルールエディタは、プロパティのデータタイプに基づき、条件またはアクションのプロパティパネルを自動的に生成するためにこれらの構成体を使用できます。モデルの実装については、doCondition()の例を参照してください。
JDK BeanInfoクラスを使用して、表示プロパティを改善することもできます。BeanInfoクラスの作成を参照してください。
ルールサブシステムは、条件およびアクションのプロパティがランタイム値からダイナミックに設定されるように、2つの文字列テンプレートデータタイプを備えています。
これらのデータタイプを使用してプロパティを定義する場合、ルールエディタでは、ホワイトボードキーを参照することにより、これらのプロパティの値を指定できます。ルールが起動されると、プロパティはホワイトボードキーに関連付けられたリアルタイム値に設定されます。
ホワイトボードの使用に関する詳細については、を参照してください。
ダイナミックに設定する各プロパティに対して、タイプ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つのプロパティを定義します。
EboStringTemplateSingle コードは、各テンプレートプロパティに対して2つのテンプレートオブジェクトのインスタンスを生成します。最初のプロパティ(Key-template)は、データ表示を取得するために解決されます。2番目のプロパティ(Data)は、Resolveコントロールが選択されている場合のみ解決されます。
doAction() プロパティを取得し、次のメソッドを実装します。
メソッド |
説明 |
---|---|
getValue() |
Key_templateのキー値を解決するテンプレートメソッド |
setValue() |
ホワイトボードのKey-template値を設定するコンテキストメソッド |
ルールサブシステムは、自動的に汎用プロパティパネルを生成する一組のデータタイプをサポートします。サポートされた各データタイプに対して、ルールエディタはプロパティパネルで事前に選択されたGUIコントロールを表示します。必要な処理は、各プロパティに対してJavaBeanアクセッサメソッドを実装するだけです。
サポートされたデータタイプおよび関連付けられたコントロールのリストは次のとおりです。
汎用コントロールを使用する代わりに独自のプロパティパネルを作成する場合、getParameterPanel()メソッドを実装してカスタムユーザインタフェースを指定できます。ルールエディタでは、カスタムインタフェースをJPanelとして定義する必要があります。ルールエディタでは、getParameterPanel()により返されるその他のタイプのポートレットに基づいてカスタムプロパティパネルは作成されません。
getParameterPanel()メソッドを条件またはアクションに含める場合、リスナインタフェースを実装して、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")); // ...
次に、コードにより生成されたカスタムプロパティパネルを示します。
JComboBoxの実装 TOおよびFROM変数はintsとして定義されます。汎用パネルの使用により、各プロパティにテキストフィールドが作成されます。代わりに、getParameterPanel()はJPanelのインスタンスを生成し、JComboBoxコントロールのペアを実装し、ルールエディタに時間選択のドロップダウンリストを作成します。コードはコンボボックスの値を書き込むためにVectorを使用するgetHours()ローカルメソッドを定義します。
リソースバンドル コードはリソースバンドルcaResourceを使用して、コンボボックスのラベルをローカライズします。詳細については、リソースバンドルの使用を参照してください。
条件およびアクションに対してBeanInfoクラスを作成することによって、プロパティパネルの属性の表示を指定できます。たとえば、次の内容に対してBeanInfoクラスを使用できます。
注記: BeanInfoクラスの使用は、ローカリゼーションのリソースバンドルを実装するために望ましい方法です。リソースバンドルの詳細については、リソースバンドルの使用を参照してください。
JavaBeanと同様、BeanInfoクラスは関連付けられたgetメソッドおよびsetメソッドでメンバー変数としてプロパティを指定するために、関連付けられた条件またはアクションクラスを必要とします。
任意のJavaエディタでJavaクラスを作成します。クラスはEboBeanInfoを拡張し、次のコード要素を実装します。
BeanInfoを関連付けられた条件またはアクションクラスの名前に追加することによってBeanInfoクラスに名前を付けます。
たとえば、次のとおりです。クラス名がCheckConditionの場合、BeanInfoクラスの名前はCheckConditionBeanInfoとなります。
BeanInfoクラスの例については、BeanInfoクラスの例を参照してください。
「リソースバンドル」は、ローカリゼーションに使用されるJava JDKの標準機能です。リソースバンドルには、オブジェクト、文字列、数値、またはその他のデータを保存できます。リソースバンドルを作成するには、ListResourceBundleを拡張するJavaクラスまたはスタティック文字列を含むプロパティファイルを作成する必要があります。サポートする各ロケールに対して、個別のバージョンのリソースバンドルを指定します。
リソースバンドルは、条件、アクション、および関連付けられたBeanInfoクラスでローカリゼーションを実装するために使用できます。望ましい方法は次のとおりです。
指定した条件、アクション、またはBeanInfoクラスで、EboResourceBundle.getBundle()メソッドを呼び出すことにより、リソースバンドルを参照するResourceBundleオブジェクトを宣言します。このメソッドの最も単純なバージョンは、1個の引数で、リソースバンドルクラスの完全修飾名です。
たとえば、次のとおりです。リソースバンドルがパッケージの「ロケール」にあるMyBundle.classである場合、宣言は次のようになります。
static com.sssw.re.util.EboResourceBundle eoCABundle = com.sssw.re.util.EboResourceBundle.getBundle("locales.MyBundle")
ResourceBundleオブジェクトでgetメソッドを呼び出すことにより、リソースバンドルのデータにアクセスします。
たとえば、次のとおりです。リソースバンドルにローカライズされた文字列が含まれている場合、目的の文字列値に関連付けられたキーを渡すことによって、ResourceBundleオブジェクトでgetString()メソッドを呼び出します。
注記: リソースバンドルの作成に関する詳細については、Java標準APIマニュアルのResourceBundleクラス、ListResourceBundleクラス、およびPropertyResourceBundleクラスの参照マニュアルを参照してください。これらのクラスは、java.utilパッケージにあります。
次に、インストールされた条件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; } }
リソースバンドルの取得 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 ...