ODA を始動すると、関連する ODA クラス (ODKAgentBase2 から拡張したクラス) が ODA ランタイムによってインスタンス化され、表 28 に示すクラス・メソッドが呼び出されます。
初期化タスク | ODKAgentBase2 メソッド | 詳細情報の参照先 | |
---|---|---|---|
1. | 構成プロパティーを取得します (開くデータ・ソースを記述する構成プロパティーも含めて)。 | getAgentProperties() | 構成プロパティーの取得 |
2. | ODA メタデータを初期化し、ODA に関する情報 (特にそれがサポートするコンテンツ) をビジネス・オブジェクト・ウィザードが取得できるようにします。 | getMetaData() | ODA メタデータの初期化 |
3. | データ・ソースへの接続を開くなどの必要な開始ステップを実行するために ODA を初期化します。 | init() | ODA 開始の初期化 |
以降のセクションでは、表 28 に示すステップをそれぞれ説明します。
ODA の初期化を開始する際に、ビジネス・オブジェクト・ウィザードは ODA クラスの getAgentProperties() メソッドを呼び出します。
getAgentProperties() メソッドは、低レベルの ODA 基底クラス (ODKAgentBase) に含まれています。このクラスは、ODA 基底クラスの ODKAgentBase2 からユーザーの ODA クラスへと順に継承されます。
getAgentProperties() メソッドは、次のタスクを実行します。
getAgentProperties() は、ビジネス・オブジェクト・ウィザードが最初に 呼び出す ODA メソッドであるため、ODKUtility オブジェクトをインスタンス化するのに適した場所となります。ODKUtility オブジェクトは、ODA コードに対して次のものへのアクセスを提供します。
ODKUtility オブジェクトへのアクセスを取得するには、getODKUtility() メソッドを使用します。
このメソッドは ODKUtility クラス内に定義されており、ODKUtility オブジェクトへのハンドルを戻します。
odkUtil = ODKUtility.getODKUtility()
ODKUtility オブジェクトへのハンドルを ODA クラス全体に対してグローバルであると宣言すると、このクラス内のすべての メソッドが、ユーティリティー・メソッドにアクセスできるようになります。
final ODKUtility m_utility = ODKUtility.getODKUtility();
ODA 構成プロパティーの取得で説明したように、ビジネス・オブジェクト・ウィザードは getAgentProperties() が戻す構成プロパティー配列を使用して、「エージェントの構成」ダイアログ・ボックス (ステップ 2) を初期化します。
このダイアログ・ボックスでは ODA 構成プロパティーがすべて表示され、ユーザーは値を入力または変更することができます。構成プロパティー配列は、AgentProperty オブジェクトの配列です。AgentProperty クラスは、構成プロパティーが次の機能を持つためのサポートを提供します。
getAgentProperties() の目的は、ODA 構成プロパティーを記述する AgentProperty オブジェクトの配列をビジネス・オブジェクト・ウィザードに送ることです。
getAgentProperties() で構成プロパティー配列を初期化するには、次のステップを実行します。
getAgentProperties() メソッドの実装では、ビジネス・オブジェクト・ウィザードがユーザーに対して表示する各構成プロパティーごとに、エージェント・プロパティー・オブジェクトをインスタンス化する必要があります。エージェント・プロパティー・オブジェクトをインスタンス化するときは、そのメンバー変数 (表 49 を参照) の一部またはすべてを初期化します。
図 55 は、getAgentProperties() メソッド (サンプル Roman Army ODA の ArmyAgent2 クラスで定義) の実装を示しています。
public AgentProperties[] getAgentProperties() throws com.crossworlds.ODK.ODKException { AgentProperty general = new AgentProperty("Army general", AgentProperty.TYPE_STRING, true, false, false, "A general is a soldier at least 45 years old", true, ODKConstant.SINGLE_CARD, m_generals.toArray(), null);
AgentProperty recAdop = new AgentProperty("Allow adoption", AgentProperty.TYPE_BOOLEAN, true, false, false, "Select ¥"yes¥" if adopted children can be business objects", true, ODKConstant.SINGLE_CARD, new Object[]{"true", "false"}, null);
AgentProperty minAge = new AgentProperty("Minimum age for drafting", AgentProperty.TYPE_INTEGER, true, false, false, "Drafted soldiers will be generable nodes", false, ODKConstant.SINGLE_CARD, null, new Object[] {"15"});
AgentProperty maxAge = new AgentProperty("Maximum age for drafting", AgentProperty.TYPE_INTEGER, true, false, false, "Drafted soldiers will be generable nodes", false, ODKConstant.SINGLE_CARD, null, new Object[] {"55"});
AgentProperty minAdo = new AgentProperty("Minimum age for adopting", AgentProperty.TYPE_INTEGER, true, false, true, "Drafted soldiers will be generable nodes", false, ODKConstant.SINGLE_CARD, null, new Object[] {"" + m_minAdoptionAge});
AgentProperty[] props = new AgentProperty[] {general, minAge, maxAge, recAdop, minAdo});
return props; }
図 55 では、サンプル Roman Army ODA の ODA 構成プロパティーが 5 つ初期化されています。実際に定義するプロパティーは、ODA がアクセスするデータ・ソースによって異なります。
構成プロパティーの値を指定すると、ビジネス・オブジェクト・ウィザードはそれらのプロパティーを ODA ランタイム・メモリー内に保管します。 ODA は、ODKUtility クラス内の getAgentProperty() などのメソッドを通じて、これらのプロパティーにアクセスします。詳しくは、ODA 構成プロパティーの取得を参照してください。
ビジネス・オブジェクト・ウィザードは、ODA の getAgentProperties() メソッドを呼び出した後に getMetaData() メソッドを呼び出し、ODA メタデータを初期化します。
getMetaData() メソッドは ODA 基底クラス (ODKAgentBase2) に定義されており、ユーザーの ODA クラスによって継承されます。
このメソッドは、ODA のメタデータを含む AgentMetaData オブジェクトを、サポートされる生成済みコンテンツとともに戻します。
ODA のメタデータを取得する必要がある場合、AgentMetaData オブジェクトは、表 29 の情報を ODA ランタイムに提供します。
表 29. AgentMetaData オブジェクトのコンテンツ
メンバー変数 | 説明 |
---|---|
agentVersion | |
ODA の検索パターンを指定するための情報。この検索パターンを指定すると、表示されるデータ・ソースのツリー・ノードの数を削減できます。
| |
supportedContent |
ODA メタデータを初期化するには getMetaData() メソッドを実装する必要がありますが、そのためには次のステップを実行する必要があります。
いずれかの形式の AgentMetaData() コンストラクターを使用します。どちらの形式の場合でも、this 参照を ODA オブジェクト (ODA クラスのインスタンス) に渡す必要があります。コンストラクターは、ODA が実装している 1 つまたは複数のコンテンツ生成インターフェースについての情報を取得するために ODA オブジェクトを照会します。次にこの情報を使用して、サポートされる各コンテンツ・タイプに対して ODA がサポートするコンテンツ・プロトコルで、supportedContent メンバー変数を初期化します。ODA のサポートされるコンテンツについては、ODA で生成されるコンテンツの決定を参照してください。
必要な場合は、ODA バージョンを引き数としてコンストラクターに渡し、agentVersion メンバー変数を初期化することもできます。
ODA で検索パターン機能をサポートするには、AgentMetaData オブジェクトをインスタンス化した後に、searchableNodes メンバー変数と searchPatternDesc メンバー変数を明示的に初期化する必要があります。詳しくは、検索パターン機能の実装を参照してください。
図 56 は、getMetaData() メソッド (サンプル Roman Army ODA の ArmyAgent2 クラスで定義) の実装を示しています。
public AgentMetaData getMetaData(){ odkUtil.trace(TRACELEVEL1, XRD_TRACE, "Entering getMetaData()..."); AgentMetaData amdObj = new AgentMetaData(this, "Sample ODA v1.0.0");
//Initialize search-pattern feature for tree nodes amd.searchableNodes = true; amd.searchPatternDesc = "Enter the first letter to search by. For example, " + "¥"A¥", ¥"k¥", "¥Z¥". Only names that start with this letter will be " + "returned."
return amd; }
図 56 の getMetaData() メソッドは、(IGeneratesBoDefs インターフェースを実装する) ArmyAgent3 クラスによって継承されます。そのため、このコード・フラグメントの AgentMetaData() コンストラクターの呼び出しにより、ODA のコンテンツ・タイプおよびそれに関連するコンテンツ・プロトコルが初期化されます。 ArmyAgent3 内で getMetaData() が開始されると、ODA のコンテンツ・タイプが ContentType.BusinessObject に初期化され、そのコンテンツ・プロトコルが「要求時」に初期化されます。詳しくは、ODA で生成されるコンテンツの決定を参照してください。
この getMetaData() メソッドは、searchableNodes メンバー変数と searchPatternDesc メンバー変数を初期化することにより、検索パターン機能のサポートも提供します。searchPatternDesc 変数には「検索パターンの入力」ダイアログ・ボックスに表示されるテキストが含まれています (図 46 を参照)。
ビジネス・オブジェクト・ウィザードは、ODA の getMetaData() メソッドを呼び出した後に init() メソッドを呼び出し、ODA 開始の初期化を始めます。
init() メソッドは、低レベルの ODA 基底クラス (ODKAgentBase) に含まれています。このクラスは、ODA 基底クラスの ODKAgentBase2 からユーザーの ODA クラスへと順に継承されます。
このメソッドは、ODA の初期化ステップを実行します。
init() メソッドの主要なタスクを次に示します。
init() メソッドは、ODA の初期化を完了するために必要な、ユーザーが初期化した各構成プロパティーを取得できます。ODA は、構成プロパティーを getAgentProperties() メソッドで初期化します。ユーザーは必要に応じて、ビジネス・オブジェクト・ウィザードの「エージェントの構成」ダイアログ・ボックスでこれらのプロパティーを更新できます。構成プロパティーが更新されると、ビジネス・オブジェクト・ウィザードはそれを ODA ランタイム・メモリーに書き込みます。
ODK API は、ODA 構成プロパティーの値を ODA ランタイム・メモリーから取得するためのメソッドを提供します (表 30 を参照)。
表 30. ODA 構成プロパティーの値を取得するためのメソッド
ODK ライブラリー・メソッド | 説明 |
---|---|
getAgentProperty()
| 指定した ODA 構成プロパティーの値を取得します。 |
getAllAgentProperties()
| すべて の ODA 構成プロパティーを Java Hashtable オブジェクトとして取得します。 |
表 30 のメソッドはすべて、ODKUtility クラス内で定義されています。したがって、構成プロパティーにアクセスする前に、このクラスの singleton オブジェクトへのハンドルを取得する必要があります。詳しくは、ODKUtility オブジェクトへのハンドルの取得を参照してください。
図 57 は、init() メソッド (サンプル Roman Army ODA の ArmyAgent3 クラスで定義) の実装を示しています。
public void init() throws com.crossworlds.ODK.ODKException { Hashtable h = m_utility.getAllAgentProperties();
// Obtain values of ODA configuration properties AgentProperty property = (AgentProperty) h.get("Army general"); m_general = property.allValues[0].toString();
property = (AgentProperty) h.get("Minimum age for drafting"); m_minAge = Integer.parseInt(property.allValues[0].toString());
property = (AgentProperty) h.get("Maximum age for drafting"); m_maxAge = Integer.parseInt(property.allValues[0].toString());
property = (AgentProperty) h.get("Allow adoption"); m_allowAdoption = new Boolean( property.allValues[0].toString()).booleanValue();
// Clear the generated-content structure m_generatedBOs.clear(); }
図 57 で init() メソッドは、次のものを使用して構成プロパティーの値を取得しています。
この init() メソッドに含まれている構成プロパティーはすべて、単一カーディナリティー・プロパティーです。したがって、allValues メンバー変数に含まれる値は 1 つのみです。複数カーディナリティー・プロパティーの使用例については、ビジネス・プロパティー配列の作成を参照してください。この init() メソッドは、ODA の生成済みコンテンツ構造体 (m_generatedBOs と呼ばれるベクトル) も初期化します。
このベクトルは、生成済みのビジネス・オブジェクト定義を保持します。
通常 init() 初期化メソッドの主要なタスクは、データ・ソースへの接続を確立することです。 ODA はデータ・ソースを検索し、ビジネス・オブジェクト定義への変換が可能なオブジェクトを「検出」します。接続を確立するために、init() メソッドは次のタスクを実行することができます。
getAgentProperty() メソッドを使用すると、ODA 構成プロパティーの値を取得できます。詳しくは、ODA 構成プロパティーの取得を参照してください。
init() メソッドが正常に実行されるのは、ODA が正常に接続を開き、さらに ODA がデータ・ソース内のデータを処理する準備を整えた場合です。ODA が接続を開くことができない 場合、init() メソッドは、失敗の原因を示すために ODKException 例外をスローする必要があります。
getVersion() メソッドは、ODA ランタイムのバージョンを戻します。
このメソッドは、低レベルの ODA 基底クラス (ODKAgentBase) に含まれています。このクラスは、ODA 基底クラスの ODKAgentBase2 からユーザーの ODA クラスへと順に継承されます。
これは、次の 2 つの状況で呼び出されます。