Oracle® Fusion Middleware Oracle Team Productivity Centerユーザーズ・ガイド 11gリリース2(11.1.2.3.0) B66155-03 |
|
![]() 前 |
この章では、Oracleチーム・プロダクティビティ・センターと外部データ・リポジトリ(バグ・データベース、機能追跡システム、およびチームで開発に使用するデータのその他のリポジトリなど)間のコネクタを開発する方法について説明します。また、Oracleチーム・プロダクティビティ・センター・コネクタを作成した後の使用方法についても説明します。これには、エラー処理、ヘルプの追加、配布用のコネクタのパッケージ化および国際化があります。
Oracleチーム・プロダクティビティ・センター・コネクタでは、サードパーティ・リポジトリをJDeveloperと統合するためのフレームワークが提供されます。標準の作業アイテム・インタフェースを使用して、サードパーティ・コネクタでそのバックエンド・リポジトリからデータをフェッチし、そのデータを標準書式で表示できます。宣言ユーザー・インタフェース・アプローチによって、コネクタ作成者は、大量のコードを作成することなく、多数の柔軟な方法でUIコントロールを自由にレイアウトできます。この結果、JDeveloperではデータとUI要素が実行時に結合され、JDeveloperユーザーがすでに理解している一貫性のある方法でリポジトリ・オブジェクトが表示されます。
この章には、次の項があります。
チーム・プロダクティビティ・センターに対する独自のコネクタの開発は、コネクタのアーキテクチャを理解することから開始します。Oracleチーム・プロダクティビティ・センター・コネクタのアーキテクチャは、3つの主要機能を提供するように編成されています。
コネクタによって処理される作業アイテム・リポジトリからのデータ・フェッチ
チーム・プロダクティビティ・センター・クライアント内でのランタイムUIコンポーネント・ツリーの生成
リポジトリ・データをUIコンポーネントに結合する作業アイテム・エディタでのUIコントロールとデータの表示
各作業アイテム・コネクタによってWorkitemConnector
インタフェースが実装され、このコネクタで使用されるリポジトリで添付ファイルがサポートされている場合は、オプションでWorkitemAttachment
インタフェースが実装されます。WorkitemConnector
インタフェースでは、エンド・ユーザーによるリポジトリへのログインとリポジトリからのログ・アウト、作業アイテムに対する基本的な作成、読取り、更新および削除(CRUD)操作、および問合せ結果の取得のためのメソッドが指定されます。バックエンド・リポジトリの機能に基づいて、コネクタ作成者は、バックエンド・リポジトリの機能を公開するために実装するWorkitemConnector
のメソッドを決定します。これらの選択したメソッドの実装時に、コネクタ作成者は、バックエンド・リポジトリから使用できる適切なAPI(またはWebサービス)を使用します。データは、APIを介して収集した後、コネクタ作成者が定義する作業アイテム・データ構造に変換する必要があります。
コネクタでリポジトリから作業アイテム・データが取得された後は、Oracleチーム・プロダクティビティ・センターの宣言UIフレームワークによって、コネクタ作成者が定義した作業アイテムUI定義が読み取られ、対応するUIコントロールにデータがバインドされます。Oracleプロダクティビティ・センターではメタデータドリブンUIフレームワークが提供され、このフレームワークで、コネクタ作成者は、事前定義のUIタグを使用して作業アイテムUIレイアウトのXMLファイルを開発できます。可能な場合、コネクタ作成者は、できるかぎりそのネイティブ・アプリケーションの動作を保持しながら、JDeveloperのルック・アンド・フィールに準拠するUIレイアウトを作成します。この方法によって、エンド・ユーザーは、JDeveloperでのUIのナビゲート時にも、ネイティブ・アプリケーションと同様に操作できます。
作業アイテム・データとそのUIコンポーネント・ツリーの両方が使用可能な場合は、JDeveloper内の特別なエディタであるWorkitemEditor
によって、データがUIコントロールにバインドされ、エディタ内に表示されます。
Oracleチーム・プロダクティビティ・センターでは、実行時に動的な作業アイテム・モデルとUIがサポートされます。特定のリポジトリの場合、作業アイテム・モデルまたはUI(あるいはその両方)は、一部の作業アイテム・インスタンス・フィールドの値または事前定義の条件によって決定されます。Oracleチーム・プロダクティビティ・センターでは、WorkitemConnector
インタフェースのメソッドを公開することによって、実行時に様々なUIレイアウトを柔軟に表示できます。
Oracleチーム・プロダクティビティ・センターには、タスク・リポジトリ・コネクタがデフォルトで用意されています。他のコネクタはすべて、JDeveloper更新センターから更新の確認ウィザードを使用してダウンロードする必要があります。
コネクタ拡張機能をダウンロードする手順は、次のとおりです。
「ヘルプ」→「更新の確認」の順に選択します。
更新の確認ウィザードで、「更新センターの検索」を選択します。
オープン・ソースとパートナ拡張機能センターが選択されていることを確認し、「次へ」をクリックします。
「更新」ページで、リストをスクロールし、ダウンロードするOracleチーム・プロダクティビティ・センター・コネクタを選択して、「次へ」をクリックします。
「終了」をクリックします。
これらの各コネクタのオンライン・ヘルプは、ダウンロードとインストールを完了すると使用できるようになります。また、独自のコネクタの開発時に、これらのコネクタの内容および構造をサンプルとして参照することもできます。
詳細は、Oracle Fusion Middleware Oracle JDeveloperユーザーズ・ガイドの「更新の確認」を使用した拡張機能のインストール方法に関する項を参照してください。
前述の情報を実際に適合する方法を理解するために、JIRAリポジトリを使用する次の例を考えてみます。
My P1 Issuesという問合せを表す作業アイテムをダブルクリックします。JDeveloperで問合せが開き、問合せ基準が表示され、問合せが実行されて結果がリストに表示されます。この後は、結果リストの特定の問題をダブルクリックできます。JDeveloperで新しい作業アイテム・エディタが開き、選択した問題の詳細が表示されます。次に、この例で表されるコール順を示します。
UIフレームワークで、My P1 Issuesに対する問合せ情報がTPCデータベースから取得されます。
UIフレームワークで、JIRAコネクタ・インスタンスが検索され、JIRAコネクタ上のメソッドgetQueryResults
がコールされ、問合せ基準が送信されます。
JIRAコネクタによって、JIRA作業アイテム・オブジェクト定義と一致する作業アイテム・オブジェクトのリストが返されます。
TPCフレームワークによって、作業アイテムのリストが問合せの結果リストに表示されます。
ユーザーが特定の作業アイテムをダブルクリックすると、UIフレームワークでJIRAコネクタ上のgetWorkitem()
メソッドがコールされ、問題IDが渡されます。
JIRAコネクタ・インスタンス内で、getWorkitem()
によって、JIRA SOAPインタフェースを使用して問題データが取得されます。
SOAPインタフェースからデータが返されると、getWorkitem()
によってJIRA作業アイテム・オブジェクトに変換されます。
UIフレームワークで作業アイテム・エディタが作成されます。
次に、getUIRegionName()
のコールおよびUIコンポーネント・ツリーの生成によって、作業アイテム・エディタに問題UIページがロードされます。
その後、作業アイテム・エディタによって、データがそのUIコントロールにバインドされます。
作業アイテム・エディタに、様々なレンダラを介して、問題データとそれらに関連付けられたUIコントロールが表示されます。
この例では、リポジトリ内に様々なタイプのオブジェクトを格納するためのXMLデータ・オブジェクトを定義します。このファイルの名前は、connector.xml
ファイルにmodelFileName
として指定する必要があります。このモデル・ファイルを作成し、プロジェクトの下のsrc/META-INF
フォルダ内に格納します。
workitem-object.xsd
内のタグを使用して、この定義ファイルに作業アイテム・データを記述できます。このファイルには、チーム・プロダクティビティ・センターに公開するフィールド、問合せ結果リストに表示するデフォルト列、およびそれらのデータを取得するために使用する値リストの定義とデータ・ソースを指定します。
workitem-object.xsd
は、ファイルalmcommon-api.jar
にあります。このファイルは、Oracleチーム・プロダクティビティ・センター・コネクタ・タグ・ガイドのtpctagdoc.zip
とともに、ディレクトリjdeveloper\jdev\extensions\oracle.teamproductivitycenter\doc
の下に配布されます。
例4-1は、作業アイテム定義ファイル(SampleDef.xml
)の例です。
例4-1 サンプルの作業定義ファイル
<?xml version="1.0" encoding="windows-1252"?> <RepositoryModel resName="res" resFile="/META-INF/res/modelresource.xml"> <WorkItem data-source="rpthead" id-def="TASKID" id-label="${res.TASK_ID}" label-def="TASKID" name="${res.TASK_NAME}" type="Task" subject-def="DESC" webURLHandler="oracle.sampleconnector.model.TaskWebReferenceImpl" supportSearchByID = "true" xmlns="http://www.oracle.com/alm" version="1.1.1.1"> <Fields> <Field name="TASKID" label="${res.TASK_ID}" type="number" readOnly="true"/> <Field name="DESC" label="${res.TASK_DESC}" required="true" maxLength="80" type="string"/> <Field name="OWNER" label="${res.TASK_OWNER}" defaultValue="" controlType="lov" type="string" lovDef="owner_lov"/> <Field name="STATUS" label="${res.TASK_STATUS}" type="number" required="true" controlType="choice" lovDef="statusLookUp"/> <Field name="DUEDATE" label="${res.TASK_DUEDATE}" type="date" readOnly="true"/> <Field name="URL" label="${res.TASK_URL}" maxLength="255" type="string"/> </Fields> <QueryListColumns> <FieldRef name="TASKID"/> <FieldRef name="DESC"/> <FieldRef name="OWNER"/> <FieldRef name="STATUS"/> </QueryListColumns> <WebResource> <URLDef name="URL" archorOn="label"/> <URLDef name="TASKID" archorOn="field"/> </WebResource> <LovDefs> <LovDef name="owner_lov" list-source="users"> <CriteriaMap> <Map listFieldRef="USERID" fieldRef="OWNER"/> </CriteriaMap> <FieldMap> <Map listFieldRef="USERNAME" fieldRef="OWNER"/> </FieldMap> <DisplayList> <FieldRef name="USERID"/> <FieldRef name="USERNAME"/> </DisplayList> </LovDef> <LovDef name="statusLookUp" list-source="status"> <FieldMap> <Map listFieldRef="SID" fieldRef="STATUS"/> </FieldMap> <DisplayList> <FieldRef name="SID"/> <FieldRef name="SDESC"/> </DisplayList> </LovDef> </LovDefs> <DataSources> <DataSource name="users" id-def="USERID"> <Field name="USERID" label="${res.USER_ID}" type="string"/> <Field name="USERNAME" label="${res.USER_NAME}" type="string"/> </DataSource> <DataSource name="priority" id-def="PID"> <Field name="PID" type="number"/> <Field name="PDESC" type="string"/> </DataSource> <DataSource name="status" id-def="SID"> <Field name="SID" type="number"/> <Field name="SDESC" type="string"/> </DataSource> </DataSources> </WorkItem> </RepositoryModel>
表4-1に、使用されているタグとその説明を示します。
表4-1 リポジトリ・データ構成タグ
構成タグ | 属性 | 説明 |
---|---|---|
RepositoryModel |
このコネクタに対して使用されるすべてのタイプの作業アイテムを囲みます。 |
|
resName |
リソース・バンドルの名前。これは、指定されている記号に基づいてランタイム・ラベルを識別するためのネームスペースとして使用されます。たとえば、 |
|
resFile |
コネクタのリソース・バンドル・ファイルのパス。 |
|
Workitem |
data-source |
バックエンド・リポジトリ・ソースを表します。データベース表を使用できます。 |
id-def |
作業アイテムを一意に識別するために使用するフィールド。ほとんどの場合、作業アイテムの |
|
subject-def |
作業アイテムのタグ付け時または作業アイテム間の関連の作成時にサブジェクト・フィールドとして使用されるフィールド。 |
|
Type |
作業アイテムのタイプまたはカテゴリ。異なるタイプの複数の作業アイテムをコネクタ・モデル定義ファイルに指定できるため、実行時には、作業アイテム用のURLエディタを作成するために作業アイテムのタイプが使用されます。タイプは、様々な作業アイテムのページでマウスを右クリックして表示されるメニュー項目など、特定のUI要素にも表示されます。 |
|
xmlns |
XMLネームスペース。 |
|
version |
モデル定義ファイルのバージョン。 |
|
Fields |
リポジトリ・オブジェクトに使用されるすべてのフィールドを囲みます。 |
|
Field |
name |
フィールドの名前。 |
label |
詳細UIや問合せUIなど、様々な作業アイテムのページのフィールドに使用される表示ラベル。 |
|
type |
フィールドのデータ型。有効な値は" |
|
required |
trueに設定すると、そのフィールドが必須フィールドであることを示すために、フィールド・ラベルの前に(*)が表示されます。デフォルトはfalseです。 |
|
controlType |
使用するUIコントロールの詳細は、第4.2.5項「チーム・プロダクティビティ・センターUIを使用してデータを宣言的に表示する方法」を参照してください。 |
|
lovDef |
|
|
readonly |
trueに設定すると、対応するコントロールがグレー表示され、フィールド値が読取り専用モードになります。デフォルトはfalseです。 |
|
queryable |
|
|
maxLength |
フィールドに入力できる最大文字数を設定します。 |
|
LovDefs |
リポジトリ・フィールドに使用されるすべての値リスト(LOV)定義を囲みます。 |
|
LovDef |
LOVの定義。 |
|
name |
LOVの名前。 |
|
list-source |
そのデータを取得するために使用するデータ・ソースの名前。「DataSource」を参照してください。 |
|
DataSources |
LOVで使用されるすべてのデータ・ソースを囲みます。 |
|
DataSource |
データ・ソースの定義。 |
|
name |
データ・ソースの名前。 |
|
id-def |
バックエンド・リポジトリ内のオブジェクト・タイプまたは表名。 |
|
QueryListColumns |
問合せ結果リストに表示するデフォルト列のリスト。 |
|
WebResource |
ハイパーリンクされるフィールドを説明するセクション。 |
|
URLDef |
|
|
name |
フィールド・リストからのフィールドの名前。 |
|
archorOn |
下線付きのハイパーリンクをラベル上に表示するか、実際の値上に表示するかを指定します。有効な値は" |
workitem.properties
ファイルは、チーム・プロダクティビティ・センターでリスナー(作業アイテムに関するイベントが発生したときに起動するjavaクラス)の保存に使用されるファイルです。このファイルを編集して、ユーザー入力に関してコネクタが依存する特定のリスナーを含めます。
コネクタ拡張機能を作成するときは、workitem.properties
ファイルがコネクタ・バンドルに含まれていることを確認してください。
チーム・プロダクティビティ・センター・コネクタは、JDeveloper拡張機能プロジェクトとして開始します。(XMLの)構成ファイルを使用して、コネクタ・インスタンスを作成するためのパラメータを保存して管理します。また、コネクタは、リポジトリによって使用されるデータをJDeveloperが解析できるように定義し、リポジトリからデータを取得し、JDeveloper内でデータを表示するためのチーム・プロダクティビティ・センターUIを使用します。後続の各項では、各タスクについてさらに詳細に説明し、WorkItemConnector
インタフェースを実装するためのサンプル・コードを示します。
チーム・プロダクティビティ・センター・コネクタは、JDeveloper拡張機能として作成されます。この結果、JDeveloperとの統合が可能であり、コネクタ開発の完了後には、JDeveloperの「更新の確認」機能を使用して、コネクタをパッケージ化および配布するためのフレームワークも提供されます。これによって、コネクタを開発チームに配布するための既知のメカニズムが提供されます。
次の手順は、Oracleチーム・プロダクティビティ・センター・コネクタの作成プロセスの概要を示しています。ここに示されている多くの手順の詳細は、Oracle® Fusion Middleware Oracle JDeveloperユーザーズ・ガイドに記載されています。
Oracleチーム・プロダクティビティ・センター・コネクタを作成する手順は、次のとおりです。
コネクタを作成するためのJDeveloper拡張機能プロジェクトを作成します。「ファイル」→「新規」→「すべての機能」→「クライアント層」→「拡張機能の開発」の順に選択します。
コネクタ構成XMLファイルを作成します。チーム・プロダクティビティ・センター・インストーラで使用されるコネクタ構成パラメータを提供する必要があります。パラメータはシード・データとして処理され、チーム・プロダクティビティ・センター・データベースに格納されます。これらは、コネクタのインスタンスを作成する際、実行時に使用されます。
詳細は、第4.2.2項「Oracleチーム・プロダクティビティ・センター・コネクタ構成ファイルの作成方法」を参照してください。
Oracleチーム・プロダクティビティ・センターに公開するオブジェクト・タイプを決定します。たとえば、MSプロジェクト・サーバー・コネクタの作成者が、タスク、プロジェクトおよびリソース・データを表示するように決定すると、3つのオブジェクト・タイプが存在することになります。
リポジトリ・オブジェクト定義XMLファイルを作成します。このファイルでは、各オブジェクト・タイプのフィールド詳細、デフォルト・ラベル、使用するデフォルトUIコントロール・タイプ、必須かどうかなどが提供されます。
詳細は、第4.1.7項「チーム・プロダクティビティ・センターのリポジトリ・データの定義方法」を参照してください。
特定のリスナーを使用している場合は、workitem.propertiesファイルに追加して、ファイルがコネクタ・バンドルに含まれていることを確認します。
詳細は、第4.1.8項「コネクタへのリスナーの追加方法」を参照してください。
コネクタUIレイアウトXMLファイルを作成します。これによって、チーム・プロダクティビティ・センター宣言UIフレームワークで提供されるUIタグを使用して、UIをレイアウトできます。
WorkItemConnector
および(オプションで)WorkItemAttachment
インタフェース・メソッドを実装するクラスを作成します。このクラスでは、バックエンド・リポジトリから使用できる適切なAPIを使用して、接続の確立、リポジトリ・データの送受信、チーム・プロダクティビティ・センターで使用される作業アイテム書式へのデータの変換が実行されます。
状況依存ヘルプ・ファイルを提供します。ヘルプ・ファイルは、ユーザーが作業アイテム詳細UIをフォーカスしている状態で[F1]を押すと、JDeveloperヘルプ・センターによってロードされます。
詳細は、第4.4.1項「チーム・プロダクティビティ・センター・コネクタへのヘルプの追加方法」を参照してください。
複数言語サポート用のリソース・バンドル・ファイルを提供します。
詳細は、第4.5.4項「コネクタ・バンドル・ファイルの生成方法」を参照してください。
コネクタをデプロイメント用の適切なZIP形式にパッケージ化します。
後続の各項では、各タスクについてさらに詳細に説明し、WorkItemConnector
インタフェースを実装するためのサンプル・コードを示します。
コネクタ構成XMLファイルには、ランタイム・コネクタ・インスタンスの作成時に使用されるパラメータが含まれています。パラメータは、チーム・レベルまたはサーバー・レベルで設定できます。この構成ファイルは、インストール時に、Oracleチーム・プロダクティビティ・センター・インストーラによって読み込まれ、シード・データがチーム・プロダクティビティ・センター・データベース表に移入されます。
connector.xmlファイルは、コネクタのパラメータを追加できるように作成する必要があり、これらのパラメータには、チーム・リーダーまたは管理者が値を定義できます。
connector.xmlファイルを作成する手順は、次のとおりです。
アプリケーション・ナビゲータで拡張機能プロジェクトを右クリックします。
「新規」→「XML」→「XMLドキュメント」の順に選択します。
このファイルにconnector.xmlという名前を付け、プロジェクトの下のsrc/META-INFフォルダ内に保存します。
この構成ファイルでは、almcommon-api.jar
ファイルにあるconnector.xsdファイルに定義されたタグが使用されます。このJARファイルは、JDeveloperインストール・フォルダ\jdeveloper\jdev\extensions\oracle.teamproductivitycenter\lib
にあります。
例4-2は、構成ファイルの例を示しています。
例4-2 構成ファイル・サンプル・コード
<?xml version="1.0" encoding="UTF-8"?> <ConnectorDefinition xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.oracle.com/alm connector.xsd" xmlns="http://www.oracle.com/alm"> <configuration id="Sample" className="oracle.sampleconnector.model.SampleConnectorService" repositoryType="Work Item" uiFileName="/META-INF/SampleUI.xml" modelFileName="/META-INF/SampleDef.xml" version="1.0"> <parameter> <name>SampleParam1</name> <defaultValue>Default value 1</defaultValue> <label> <locale>US</locale> <value>Sample Param 1</value> </label> <description>This is the sample admin param one</description> <accessLevel>ALM-Admin</accessLevel> </parameter> <parameter> <name>SampleParam2</name> <defaultValue>Default value 2</defaultValue> <label> <locale>US</locale> <value>Sample Param 2</value> </label> <description>This is the sample admin param two</description> <accessLevel>ALM-Admin</accessLevel> </parameter> <parameter> <name>SampleTeamParam</name> <defaultValue>Sample Team Param</defaultValue> <label> <locale>US</locale> <value>Sample Team Param</value> </label> <description>This is a sample team parameter</description> <accessLevel>Team-Admin</accessLevel> </parameter> </configuration> </ConnectorDefinition>
表4-2に、使用されているタグとその説明を示します。
表4-2 connector.xmlで使用されているタグ
構成タグ | 属性 | 説明 |
---|---|---|
configuration |
id |
コネクタの名前 |
className |
実行時にコネクタ・インスタンスを作成する際にロードするコネクタ・クラス。 |
|
uiFileName |
コネクタUI定義を含む、コネクタjarファイル内のファイルへのパス。 |
|
modelFileName |
コネクタ・モデル定義を含む、コネクタjarファイル内のファイルへのパス。 |
|
version |
現在のコネクタのバージョン。新規/アップグレードのコネクタ・パッケージでは、新規バージョンを使用する必要があります。 |
|
parameter |
各構成可能パラメータを指定します。 |
|
name |
パラメータ名。 |
|
label |
チーム管理UI(または管理UI)で使用する表示テキスト。 |
|
locale |
ローカライズ・サポート。 |
|
value |
指定したロケールの値。 |
|
description |
このパラメータの内容の簡単な説明。これは、管理UIに表示されます。 |
|
accessLevel |
ALM-Admin: TPC管理者のみが、管理UI→「リポジトリ」タブでこのパラメータを構成できることを示します。 Team-Admin: チーム管理者のみが、管理UI→「チーム」→「リポジトリ」タブでこのパラメータを構成できることを示します。 |
チーム・プロダクティビティ・センターに対するコネクタの開発者は、作業アイテムのUIコントロールの動作をカスタマイズすることによって、コネクタ固有の機能を提供できます。
チーム・プロダクティビティ・センターには、すべてのメタデータ・リソースを登録するためのコネクタ・レベルの構成ファイルtpc-config.xml
が用意されています。このファイルは、src/META-INF/
の下のコネクタ・ソース・コード・ディレクトリに格納する必要があります。
構成ファイルでサポートされるタグおよび属性の詳細は、Oracle Fusion Middleware Oracle Team Productivity Center Connectorsタグ・リファレンスを参照してください。
カスタム・マネージドBeanを作成する手順は、次のとおりです。
チーム・プロダクティビティ・センターに対するコネクタを作成する場合は、次の手順に示すように、値バインディング・サポート用にカスタマイズしたマネージドBeanを作成できます。
例4-3に示すように、ファイルtpc-config.xml
にマネージドBeanエンティティを登録します。
例4-4に示すように、LabelBean
を実装します。
作業アイテム定義メタデータ・ファイル(たとえば、作業アイテム・フィールド用)、またはUIメタデータ・ファイルのUIコントロールに対するラベル属性のいずれかで、マネージドBeanを使用します。
label="${labelBean.label}"
カスタマイズしたUIリスナーを作成する手順は、次のとおりです。
また、カスタマイズしたUIリスナーを作成し、作業アイテムUIメタデータのコントロールに登録するには、次の手順を実行します。
例4-5に示すように、tpc-config.xml
にリスナーを登録します。
OpenTaskListener
クラスを実装します。
例4-6 クラスOpenTaskListenerの実装
package oracle.alm.sample.view; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.List; import oracle.alm.connector.data.WorkItem; import oracle.alm.view.application.ViewManager; import oracle.alm.view.context.AlmELContext; import oracle.alm.view.model.AlmDataTableModel; import oracle.alm.view.uicomponents.AlmComponent; import oracle.alm.view.uicomponents.AlmContextMenuComponent; import oracle.alm.view.uicomponents.AlmTableComponent; import oracle.alm.view.uicomponents.RenderingContext; public class OpenTaskListener implements ActionListener, AlmScope { public OpenTaskListener(RenderingContext rcontext, AlmComponent component) { super(); _rcontext = rcontext; _component = component; } public void actionPerformed(ActionEvent e) { if (_component instanceof AlmContextMenuComponent) { AlmComponent parent = _component.getParent(); if (parent instanceof AlmTableComponent) { AlmTableComponent tableComp = (AlmTableComponent) parent; List<Integer> rows = tableComp.getSelectedRows(); if (rows != null) { ViewManager vmanger = ViewManager.getInstance(); for (int row: rows) { AlmELContext elcontext = vmanger.getELContext(_rcontext); AlmDataTableModel dataModel = tableComp.getValue(elcontext); Object selectedValue = dataModel.getSelectedItem(row); if (selectedValue instanceof WorkItem) { String wiType = _rcontext.getCurrentWorkItemType(); String reposName = _rcontext.getCurrentReposName(); String reposId = _rcontext.getCurrentReposId(); vmanger.OpenWorkItemInEditor(((WorkItem) selectedValue), wiType, reposName, reposId); } } } } } } public void setRenderingContext(RenderingContext rc){_rcontext = rc}; public RenderingContext getRenderingContext(){return _rcontext}; public void setSourceComponent(AlmComponent component) {_component = component}; public AlmComponent getSourceComponent() {return _component}; private RenderingContext _rcontext; private AlmComponent _component;}
カスタマイズしたリスナーを作業アイテムUIメタデータで使用します。
例4-7 カスタマイズしたリスナーの作業アイテム内での使用
<?xml version="1.0" encoding="windows-1252" ?> <regions resFile="/META-INF/res/uiresources.xml"> <region id="Default" helpTopicId="f1_connector_sample_htm"> <formLayout columns="1" blockSize="10" fieldWidth="400"> <inputText label="#{workitemmodel.labels.TASKID}" value="#{workitemmodel.values.TASKID}" readOnly="true"/> <inputText label="#{workitemmodel.labels.DESC}" value="#{workitemmodel.values.DESC}"/> <listOfValues label="#{workitemmodel.labels.OWNER}" value="#{workitemmodel.values.OWNER}" source="OWNER" pprTargets="statusID"/> <comboBox label="#{workitemmodel.labels.STATUS}" value="#{workitemmodel.values.STATUS}" valueSet="#{workitemmodel.listItems.STATUS}" readOnly="true" id="statusID"/> <inputDate label="#{workitemmodel.labels.DUEDATE}" value="#{workitemmodel.values.DUEDATE}"/> <inputText label="#{workitemmodel.labels.URL}" value="#{workitemmodel.values.URL}"/> </formLayout> <panelLayout> <action text="Open Task" actionListener="${opentask}"/> </panelLayout> </region> </regions>
ポップアップ・メニュー・アクションをカスタマイズする手順は、次のとおりです。
ユーザーが問合せ結果表でマウスの右ボタンをクリックしたときに表示される、カスタマイズ・メニュー項目を追加できます。この手順は次のとおりです。
リスナーをtpc-config.xml
に登録し、メニュー項目の詳細を指定します。
SaveTaskListener
クラスを実装します。
例4-9 クラスSaveTaskListenerの実装
package oracle.alm.sample.model; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.List; import javax.swing.JOptionPane; import oracle.alm.connector.data.WorkItem; import oracle.alm.view.application.ViewManager; import oracle.alm.view.context.AlmELContext; import oracle.alm.view.model.AlmDataTableModel; import oracle.alm.view.uicomponents.AlmComponent; import oracle.alm.view.uicomponents.AlmContextMenuComponent; import oracle.alm.view.uicomponents.AlmTableComponent; import oracle.alm.view.uicomponents.RenderingContext; public class SaveTaskListener implements ActionListener, AlmScope { public SaveTaskListener(RenderingContext rcontext, AlmComponent component) { super(); if (component instanceof AlmContextMenuComponent) _almComponent = (AlmContextMenuComponent) component; _renderingContext = rcontext; } public void actionPerformed(ActionEvent e) { ViewManager vmgr = ViewManager.getInstance(); //First get the corresponding AlmTableComponent AlmComponent parent = _almComponent.getParent(); if (parent instanceof AlmTableComponent) { AlmTableComponent tableComp = (AlmTableComponent) parent; //Then call public API on tableComp to get selected rows List&l;Integer> rows = tableComp.getSelectedRows(); if (rows != null) { int row = rows.size(); String cs = ""; if (row == 1) { //show the ID and subject of the selected item //Then get the selected value object throw the tableComp's UI model. ViewManager vmanger = ViewManager.getInstance(); AlmELContext elcontext = vmanger.getELContext(_renderingContext); AlmDataTableModel dataModel = tableComp.getValue(elcontext); Object selectedValue = dataModel.getSelectedItem(row); if (selectedValue instanceof WorkItem) { cs = "Save Task listener: work item "; WorkItem wi = (WorkItem)selectedValue; cs += wi.getRowKey() + " with subject \'"; cs += wi.getSubject() + "\' has been selected."; } } else if (row > 1) { //show the number of rows selected cs = "Save Task listener: " + Integer.toString(row) + " rows selected"; } JOptionPane.showMessageDialog(vmgr.getIDEMain(), cs); } } } public void setRenderingContext(RenderingContext rc){_ renderingContext = rc}; public RenderingContext getRenderingContext(){return _ renderingContext }; public void setSourceComponent(AlmComponent component) {_almComponent = component}; public AlmComponent getSourceComponent() {return _almComponent }; AlmContextMenuComponent _almComponent; RenderingContext _renderingContext; }
JDeveloperが背後で実行されているファイアウォールを介したデータのフェッチのために、コネクタでHTTPプロトコルを使用する必要がある場合は、次の特別な変更が必要です。
JDeveloperで、「ツール」→「プリファレンス」の順に選択します。
「プリファレンス」ダイアログで、「Webブラウザとプロキシ」ノードを開きます。
「プロキシの使用」チェック・ボックスを選択し、「ホスト名」、「ポート」および「例外」の値を入力します。
コネクタ作成者は、HttpClient
に対するプロキシ構成を、データをフェッチする必要があるコネクタ・コード内(例: getQueryResult()
API内)に設定する必要があります。
例4-10 コネクタ・コード内のプロキシ構成の設定
HttpClient httpclient = new HttpClient(); String proxyHost = System.getProperty("http.proxyHost"); String proxyPort = System.getProperty("http.proxyPort"); Boolean useProxy = null; if (proxyHost != null && !proxyHost.isEmpty()&& proxyPort != null && !proxyPort.isEmpty()) { String proxyExceptions = System.getProperty("http.nonProxyHosts"); useProxy = (proxyExceptions == null); if (!useProxy) { String host = ""; try { URL url = new URL(getServerURL()); host = url.getHost(); useProxy = true; } catch (Exception e) { e.printStackTrace(); } proxyExceptions = proxyExceptions.replace("*", ".*"); useProxy = (Pattern.matches(proxyExceptions, host) == false); } } if (useProxy != null && useProxy.equals(Boolean.TRUE)) httpclient.getHostConfiguration().setProxy(proxyHost, Integer.parseInt(proxyPort));
Oracleチーム・プロダクティビティ・センターには、すべてのコネクタに対する宣言UIをサポートするフレームワークが用意されています。コネクタ作成者は、workitem-ui.xsd
に定義されているUIタグを使用して、作業アイテムUIをレイアウトできます。入力テキスト、ラジオ・ボタン、コンボ・ボックス、チェック・ボックス、選択リスト、値リスト(LOV)などの基本的なUI要素はすべてサポートされています。
この手順では、リポジトリ・オブジェクトをユーザーに示すために、UI定義を格納するXMLデータ・オブジェクトを定義します。このファイルの名前は、connector.xmlファイルにuiFileName
として指定する必要があります。このUIファイルを作成し、プロジェクトの下のsrc/META-INF
フォルダ内に格納します。
workitem-ui.xsd
は、ファイルalmcommon-api.jar
にあります。
事前定義のcontrolType
のデフォルトをモデル定義で使用すると、モデルからコントロール・タグを自動的に取得するformLayout
コンポーネントを使用するのみで、UIを簡単にレイアウトできます。この項では、これを実行できる方法の例をいくつか示します。
例4-11 作業アイテムUIページを表示するための簡単な方法
<?xml version="1.0" encoding="windows-1252" ?> <regions resFile="/META-INF/res/uiresources.xml"> <region name="Easy" helpTopicId="f1_connector_sample_htm"> <formLayout value="${workitemmodel}" columns="1" blockSize="10"/> </region> </regions>
表4-3 前述の例で使用されているUIタグ
UIタグ | 属性 | 説明 |
---|---|---|
Regions |
使用されているすべてのUIリージョンのカプセル化。 |
|
resFile |
複数言語サポート用に使用するリソース・バンドル・ファイルを指定します。 |
|
Region |
その名前属性で識別される1ページのレイアウト。 |
|
helpTopicId |
(コネクタjarファイル内から)使用するヘルプ・ファイル名をJDeveloperに通知します。 |
|
formLayout |
value |
値は" |
columns |
フォームをレイアウトする列数を設定します。 |
|
blockSize |
各blockSize行の後に、行セパレータが追加されることを示します。 |
|
rowToSpan |
モデルのどの行がページの行全体にわたって表示されるかを示します。"1, 3, 5"の場合、1番目、3番目および5番目の行がページの行全体にわたって表示されます。 |
明示的なレイアウトを使用してUIページを表示する手順は、次のとおりです。
この例は、例4-11と同じUIを示していますが、かわりに明示的なレイアウトを使用しています。これは、同じデータ・モデルの複数のUIビューがある場合に必要です。たとえば、オブジェクトの新規インスタンスの作成時にはフィールドのサブセットのみが表示されるようにするが、保存後はすぐに、すべてのフィールドが表示されるようにする場合があります。
例4-12 UIページの明示的なレイアウト
<?xml version="1.0" encoding="windows-1252" ?> <regions resFile="/META-INF/res/uiresources.xml"> <region name="Default" helpTopicId="f1_connector_sample_htm"> <formLayout columns="1" blockSize="10" > <inputText label="#{workitemmodel.labels.TASKID}" value="#{workitemmodel.values.TASKID}" readOnly="true"/> <inputText label="#{workitemmodel.labels.DESC}" value="#{workitemmodel.values.DESC}"/> <listOfValues label="#{workitemmodel.labels.OWNER}" value="#{workitemmodel.values.OWNER}" srcAttr="OWNER" lovDef="#{workitemmodel.lovDefs.OWNER}"/> <comboxBox label="#{workitemmodel.labels.STATUS}" value="#{workitemmodel.values.STATUS}" valueSet="#{workitemmodel.listItems.STATUS}"/> <inputDate label="#{workitemmodel.labels.DUEDATE}" value="#{workitemmodel.values.DUEDATE}"/> <inputText label="#{workitemmodel.labels.URL}" value="#{workitemmodel.values.URL}"/> </formLayout> </region> </regions>
表4-4 コントロール・タイプ
UIタグ | 属性 | 説明 |
---|---|---|
inputText |
label |
UIに表示するフィールド・ラベル。 |
value |
ランタイム・フィールド値。 |
|
required |
必須かどうかを示します。 |
|
readOnly |
データを編集できるかどうかを示します。 |
|
inputDate |
label |
UIに表示するフィールド・ラベル。 |
value |
ランタイム・フィールド値。 |
|
required |
必須かどうかを示します。 |
|
readOnly |
データを編集できるかどうかを示します。 |
|
comboBox |
label |
UIに表示するフィールド・ラベル。 |
value |
ランタイム・フィールド値。 |
|
required |
必須かどうかを示します。 |
|
readOnly |
データを編集できるかどうかを示します。 |
|
checkBox |
label |
UIに表示するフィールド・ラベル。 |
value |
ランタイム・フィールド値。 |
|
required |
必須かどうかを示します。 |
|
readOnly |
データを編集できるかどうかを示します。 |
|
radio |
label |
UIに表示するフィールド・ラベル。 |
value |
ランタイム・フィールド値。 |
|
required |
必須かどうかを示します。 |
|
readOnly |
データを編集できるかどうかを示します。 |
|
valueSet |
値リストの取得場所を定義します。 |
|
listOfValues |
label |
UIに表示するフィールド・ラベル。 |
value |
ランタイム・フィールド値。 |
|
required |
必須かどうかを示します。 |
|
readOnly |
データを編集できるかどうかを示します。 |
|
srcAttr |
使用するソース・フィールドを定義します。 |
|
lovDef |
ソース・フィールドのlovDefを定義します。 |
|
textEditor |
label |
UIに表示するフィールド・ラベル。 |
value |
ランタイム・フィールド値。 |
|
required |
必須かどうかを示します。 |
|
readOnly |
データを編集できるかどうかを示します。 |
|
rows |
表示する行数。 |
|
required |
必須かどうかを示します。 |
|
list |
label |
UIに表示するフィールド・ラベル。 |
value |
ランタイム・フィールド値。 |
|
valueSet |
値リストの取得場所を定義します。 |
パネルを使用してより複雑なUIをレイアウトする手順は、次のとおりです。
より複雑なUIレイアウトの場合は、パネルを使用してコントロールをレイアウトすることもできます。パネルには、水平方向または垂直方向にするプロパティがあります。パネルはネストすることもできます。
例4-13 パネルを使用したコントロール・レイアウト
<?xml version="1.0" encoding="windows-1252" ?> <regions resFile="/META-INF/res/uiresources.xml"> <region name="Default" helpTopicId="f1_connector_sample_htm"> <panelLayout layout=”horizontal”> <formLayout columns="1" blockSize="10" > <inputText label="#{workitemmodel.labels.TASKID}" value="#{workitemmodel.values.TASKID}" readOnly="true"/> <inputText label="#{workitemmodel.labels.DESC}" value="#{workitemmodel.values.DESC}"/> <listOfValues label="#{workitemmodel.labels.OWNER}" value="#{workitemmodel.values.OWNER}" srcAttr="OWNER" lovDef="#{workitemmodel.lovDefs.OWNER}"/> <comboxBox label="#{workitemmodel.labels.STATUS}" value="#{workitemmodel.values.STATUS}" valueSet="#{workitemmodel.listItems.STATUS}"/> <inputDate label="#{workitemmodel.labels.DUEDATE}" value="#{workitemmodel.values.DUEDATE}"/> <inputText label="#{workitemmodel.labels.URL}" value="#{workitemmodel.values.URL}"/> </formLayout> <textEditor value="#{workitemmodel.values.BIGDESC}"/> </region> </regions>
様々な作業アイテム・タイプに対するモデルおよびUIレイアウトを定義した後、次のステップは、WorkItemConnector
インタフェース上のメソッド、およびWorkItemAttachment
インタフェース上のメソッド(コネクタで添付ファイルがサポートされている場合)の実装です。このトピックでは、これらのメソッドの詳細を説明します。
これらのメソッドを実装するには、チーム・プロダクティビティ・センターのJARファイルの場所をプロジェクトに追加して、WorkItemConnector
およびWorkItemAttachment
インタフェースの適切なクラスを取得できるようにする必要があります。
チーム・プロダクティビティ・センターのJARファイルの場所をプロジェクトに追加する手順は、次のとおりです。
拡張機能プロジェクトをダブルクリックして、「プロジェクト・プロパティ」→「ライブラリとクラスパス」の順に選択します。
右側で、「JAR/ディレクトリの追加」を選択します。
JDeveloperをインストールした場所にナビゲートします。JDev/Extensions/oracle.teamproductivitycenter/lib
フォルダの下で、almcommon-ip.jar
ファイルを検索して含めます。
JARが追加されたので、WorkitemConnector
に対するインタフェースを実装できます。
インタフェースを実装する手順は、次のとおりです。
「ファイル」→「新規」の順に選択します。
「一般」→「Java」→「Javaクラス」の順に選択します。
Javaクラスの作成ウィザードで、クラスおよびパッケージ名を入力します。
「オプション属性」セクションで、プラス記号をクリックして、インタフェースを実装します。
「クラスおよびパッケージ・ブラウザ」で、「階層」タブを選択し、クラスoracle/alm/connector/WorkItemConnector
を検索します。WorkItemAttachment
インタフェースを実装する予定の場合は、[CTRL]
キーを使用してそのインタフェースも選択します。
「OK」をクリックします。
この結果、実装する必要があるすべてのメソッドが含まれたスケルトン・ファイルが提供されます。
表4-6 メソッドの要約
API | 説明 | |
---|---|---|
void |
init(Map sessionContext) |
クライアント側のコネクタ・インスタンスを初期化し、その対応するリポジトリに対して、コネクタの物理的な接続パラメータを作成します。 |
void |
login(Map sessionContext, String userID, String password) |
クライアント側のコネクタ・インスタンスとバックエンド・リポジトリ間のユーザー接続を確立します。 |
void |
logout(Map sessionContext) |
ユーザーをバックエンド・リポジトリから切断します。データ・ハッシュ構造を使用して状態を保存できます。 |
Void |
setWorkItemDefs(Map sesion, Map<String, WorkItemDef> wiDefs) |
フレームワークによって、コネクタ・モデル定義に定義されている作業アイテム・タイプに対するランタイム・データ構造が構築されます。 |
List<WorkItem> |
getQueryResult(Map sessionContext, String wiType, QueryInfo query) |
QueryInfoで定義される問合せ基準を満たす問合せ結果セットを取得します。 |
WorkItem |
getWorkItem(Map sessionContext, String wiType, WorkItem workItem) |
特定の作業アイテムを、そのタイプと一意の識別子によって取得します。 |
void |
updateWorkItem(Map sessionContext, String wiType, WorkItem workItem) |
既存の作業アイテムを、そのタイプと一意の識別子によって更新します。 |
void |
createWorkItem(Map sessionContext, String wiType, WorkItem workItem) |
指定したタイプの新規作業アイテムをそのバックエンド・リポジトリに作成します。 |
deleteWorkItem(Map sessionContext, String wiType, WorkItem workItem) |
作業アイテムをそのバックエンド・リポジトリから削除します。 |
|
List<Row> |
getLOVQueryResult(Map sessionContext, QueryInfo query, String fieldName) |
事前定義のLOV(値リスト)に対する値セットを取得します。 |
boolean |
IsAttachmentSupported (Map sessionContext, WorkItem wi) |
指定した作業アイテムに対して添付ファイルがサポートされているかどうかを判断します。yesの場合は、作業アイテム・モデルで |
String |
getUIRegionName(Map sessionContext, String wiType, WorkItem wi) |
コネクタUI XMLで定義されているリージョン名を取得します。 |
boolean |
hasDynamicUI(Map session) |
コネクタで動的UIがサポートされている場合は、trueを返します。 |
String |
getDynamicUI(Map session, String currentUI) |
新規作業アイテムUI定義のXML文字列を取得します。 |
boolean |
hasDynamicModel(Map session) |
コネクタで動的モデルがサポートされている場合は、trueを返します。 |
String |
getDynamicModel (Map session, String currentModel) |
新規作業アイテム・モデル定義のXML文字列を取得します。 |
特定のシナリオでは、既存のレイアウトにおけるなんらかのカスタム・アクションに基づいて、作業アイテム詳細ページを新しいレイアウトにリフレッシュする必要があります。たとえば、ユーザーによるコンボ・ボックスからの新しい値の選択、日時ピッカーからの日付変更、ページ内のボタンの単純なクリックなどがあります。
タスクがその詳細エディタに表示されるとき、そのベースUIには「Status」コンビネーション・ボックスがあります。
ステータスの値が「New」から「In-Progress」に変わると、ユーザーがステータスの進行状況に関する情報を提供できるリッチ・テキスト・コントロールを含む新規レイアウトが表示されます。
ユーザーが作業アイテムの編集を終了し、「Submit」をクリックすると、成功または失敗メッセージを含んだ確認ページが表示されます。
更新したタスク詳細ページを表示するには、「Return to Home」をクリックします。
機能を実装する手順は、次のとおりです。
動的なUI変更をトリガーするためのアクション・ソースとして使用するUIコントロール、およびUI相互作用を制御するリスナーを決定します。
作業アイテムUIレイアウト・メタデータ・ファイルに、新規UIリージョンを定義します。
対応するリスナーをマネージドBeanで実装します。
様々な条件に基づいて様々なUIリージョンを返すためのAPI getUIRegionName()
を実装します。
マネージドBeanをコネクタのtpc-config.xml
ファイルに登録します。
EL式を介して、UIメタデータでBeanを使用します。
後続の各項では、サンプル・コネクタを使用してさらに詳細に説明します。
サンプル・コネクタでは、アクション・ソースとしてステータス・フィールドに対するコンビネーション・ボックス・コントロールを使用します。また、コンボ・ボックス・コントロール上でPopupMenuListener
を使用して、選択の変更をリスニングし、UIの動的更新作業を実行します。また、「Submit」ボタンを使用して、タスク詳細ページと確認ページ・レイアウト間をナビゲートします。
構成の詳細は、SampleDef.xml
ファイルにあります。次の例では、ステータス・コンビネーション・ボックスと送信アクションが、それぞれ対応する属性名と値のペアでどのように定義されているかに注意してください。
例4-14 UIコントロールおよびリスナー属性の選択
<?xml version="1.0" encoding="windows-1252" ?> <region id="Homepage"> <formLayout columns="1" blockSize="10" fieldWidth="400" labelWidth="60"> <inputText label="#{workitemmodel.labels.PARENT_TASKID}" value="#{workitemmodel.values.PARENT_TASKID}" readOnly="true"/> <inputText label="#{workitemmodel.labels.TASKID}" value="#{workitemmodel.values.TASKID}" readOnly="true"/> <inputText label="#{workitemmodel.labels.DESC}" value="#{workitemmodel.values.DESC}"/> <listOfValues label="#{workitemmodel.labels.OWNER}" value="#{workitemmodel.values.OWNER}" source="OWNER" pprTargets="statusID"/> <comboBox label="#{workitemmodel.labels.STATUS}" value="#{workitemmodel.values.STATUS}" id="statusID" valueSet="#{workitemmodel.listItems.STATUS}" readOnly="true" popupMenuListener="#{mainBean.statusListener}"/> <inputDate label="#{workitemmodel.labels.DUEDATE}" value="#{workitemmodel.values.DUEDATE}"/> <inputText label="#{workitemmodel.labels.URL}" value="#{workitemmodel.values.URL}"/> <panelLayout> <action text="Submit" actionCommand="gotoc actionListener="${dynamicBean.actionListener}"/>onfirmpage" </panelLayout> </formLayout> <separator/> </region>
デフォルトのHomePage
リージョンに加え、このコードでは、リージョンDemo(ステータスが「in-progress」に変わると表示)とリージョンconfirmation(ユーザーが「Submit」をクリックすると表示)の2つの新規リージョンが作成されます。
例4-15 新規リージョンの定義
<region id="Demo" helpTopicId="f1_connector_sample_htm"> <formLayout columns="1" blockSize="10" fieldWidth="400" labelWidth="60"> <inputText label="#{workitemmodel.labels.PARENT_TASKID}" value="#{workitemmodel.values.PARENT_TASKID}" readOnly="true"/> <inputText label="#{workitemmodel.labels.TASKID}" value="#{workitemmodel.values.TASKID}" readOnly="true"/> <inputText label="#{workitemmodel.labels.DESC}" value="#{workitemmodel.values.DESC}"/> <listOfValues label="#{workitemmodel.labels.OWNER}" pprTargets="statusID" value="#{workitemmodel.values.OWNER}" source="OWNER"/> <comboBox label="#{workitemmodel.labels.STATUS}" value="#{workitemmodel.values.STATUS}" popupMenuListener="#{mainBean.statusListener}" valueSet="#{workitemmodel.listItems.STATUS}" readOnly="true" id="statusID"/> <inputDate label="#{workitemmodel.labels.DUEDATE}" value="#{workitemmodel.values.DUEDATE}"/> <inputText label="#{workitemmodel.labels.URL}" value="#{workitemmodel.values.URL}"/> <textEditor label="#{workitemmodel.labels.STATUS_REPORT}" value="#{workitemmodel.values.STATUS_REPORT}" contentType="html"/> <panelLayout> <action text="Submit" actionCommand="gotoconfirmpage" actionListener="${dynamicBean.actionListener}"/> </panelLayout> </formLayout> </region> <region id="confirmation"> <panelLayout layout="vertical"> <inputText value="Task has been updated successfully." readOnly="true"/> <action text="Return to Home" actionCommand="gotohomepage" actionListener="${dynamicBean.actionListener}"/> </panelLayout> </region>
ステータス・コンボ・ボックスのリスナー・オブジェクト(popupMenuListener
)は、HomePageBean.java
に次のように実装されます。
例4-16 マネージドBeanでのリスナーの実装
public PopupMenuListener getStatusListener() { if (statusListener == null) { statusListener = new PopupMenuListener() { public void popupMenuWillBecomeInvisible(PopupMenuEvent e) { JComboBox src = (JComboBox) e.getSource(); Object[] selected = (Object[])src.getSelectedItem(); if(selected == null) return; String value = (String)selected[1]; if (value != null && value.contains("Progress")) { _rcontext.getConnectorParams().put("navigatorpage", "D"); } else _rcontext.getConnectorParams().put("navigatorpage", "H"); //we just need to refresh the current page; ViewManager vm = ViewManager.getInstance(); if(vm != null) vm.refreshWorkItemDetailUI(_rcontext); } public void popupMenuCanceled(PopupMenuEvent e) { } public void popupMenuWillBecomeVisible(PopupMenuEvent e) { } }; } return statusListener; }
「Submit」ボタンのリスナー・オブジェクト(actionListener
)は、DynamicRegionBean
に次のように実装されます。
例4-17 「Submit」ボタンのリスナーの実装
public ActionListener getActionListener() { if (actionListener == null) { actionListener = new ActionListener() { public void actionPerformed(ActionEvent event) { String command = event.getActionCommand(); ViewManager vm = ViewManager.getInstance(); if (command != null && command.equals("gotohomepage")) { _rcontext.getConnectorParams().put("navigatorpage", "H"); } else if (command != null && command.equals("gotowelcomepage")) { _rcontext.getConnectorParams().put("navigatorpage", "W"); } else if (command != null && command.equals("gotodemopage")) { _rcontext.getConnectorParams().put("navigatorpage", "D"); } vm.refreshWorkItemDetailUI(_rcontext); } }; }
すべてのマネージドBeanでAlmScope
インタフェースを実装する必要があります。Oracleチーム・プロダクティビティ・センターでは、AlmScope
を使用して、マネージドBeanを使用するUIコントロールに対するrenderingContext
と対応するAlmComponent
が同期化されます。
コネクタのマネージドBeanレイヤーからの情報を渡して、他のコネクタ・クラスで使用できるようにする方法は2通りあります。
RenderingContext
を使用する方法
パラメータ名と値のペアをコネクタ・セッション・レベルで含めることができます。前述の例で示したコードを確認する方法は、次のとおりです。
この情報は、次に示すように、他のコネクタ・クラス内で取得できます。
現在の作業アイテム・オブジェクトを使用する方法
ViewManager
クラスを使用して、現在の作業アイテム・オブジェクトにアクセスできます。
例4-20 ViewManagerクラスを使用した作業アイテムへのアクセス
public WorkItem getCurrentWorkItem(RenderingContext rcontext);
マネージドBeanクラス内で、作業アイテムの発行値を変更できます。次に、他のコネクタ・クラスでそれを使用して、異なるフィールド値に基づいてロジックを処理できます。
ViewManager
APIを使用して、作業アイテム詳細ページをリフレッシュします。
例4-21 作業アイテム詳細ページのリフレッシュ
public void refreshWorkItemDetailUI(RenderingContext rcontext);
このAPIによって、getUIRegionName()
へのコールがトリガーされ、コネクタ・パラメータまたは作業アイテムのフィールド値に基づいて新規リージョン名が返されます。たとえば、サンプル・コネクタでは、パラメータを使用して新規リージョン名が返されます。
例4-22 パラメータを使用して新規リージョン名を返す方法
public String getUIRegionName(Map session, String wiType, WorkItem workItem) throws ALMException { String region = ""; Map params = (Map) session.get(WorkItemConnector.SESSION_PARAMS_KEY); if (params != null) { Object val = params.get("navigatorpage"); if (val == null || val.equals("H")) region = "Homepage"; else if (val != null && val.equals("W")) region = "Confirmation"; else if (val != null && val.equals("D")) region = "Demo"; } return region; }
次のように、マネージドBean DynamicRegionBean
を、ファイルtpc-config.xml
に名前UIBean
で登録します。
例4-23 tpc-config.xmlへのBeanクラスの登録
<?xml version="1.0" encoding="windows-1252" ?> <!-- TPC Configuration file --> <tpc-config version="11.1.1.1.0" xmlns="http://fusion.oracle.com/tpc"> <managed-bean> <name>mainBean</name> <impl-class>oracle.sampleconnector.view.mbean.HomePageBean</impl-class> <lifecycle>page</lifecycle> </managed-bean> <managed-bean> <name>dynamicBean</name> <impl-class>oracle.sampleconnector.view.mbean.DynamicRegionBean</impl-class> <lifecycle>page</lifecycle> </managed-bean> <managed-bean> <name>compBean</name> <impl-class>oracle.sampleconnector.view.mbean.ComponentBean</impl-class> <lifecycle>page</lifecycle> </managed-bean> </tpc-config>
作業アイテム詳細ページで、コネクタ作成者は、クリックしたときにチーム・プロダクティビティ・センター固有の新しいエディタを開くリンクを作成できます。たとえば、Bugzillaのバグには、依存先フィールドがあり、別のバグのバグ番号を保持できます。Bugzillaのコネクタ作成者は、ラベルにリンクを作成できます。クリックすると、そのバグの詳細を示す新規エディタがJDeveloper内に開きます。
チーム・プロダクティビティ・センターでは、リソース・プロトコルとしてalm
が使用され、これらのURL書式がサポートされます。
作業アイテム
alm:/reposName/workitemType/workitemId.wid
チーム問合せ
alm:/reposName/workitemType/Team Queries/queryName.wiq
ユーザー問合せ
alm:/reposName/workitemType/My Queries/queryName.wiq
一般ページ
alm:/path/filename.tpcx?repository=reposName&…..
一般ページの場合は、コネクタ作成者が次の処理を実行する必要があることに注意してください。
UIページのファイルを、コネクタ・ソース・コード・ツリーの/META-INF/pages
フォルダの下に直接格納します。これは、/META-INF/pages
がTPCフレームワークでデフォルトのDOC_HOME
として設定されているためです。
repository=reposName
をパラメータとしてURLに添付します。
たとえば、サンプル・コネクタで使用されるURLはalm:/component/component.tpcx?repository=SampleConnector&component=inputDate
であるため、/META-INF/pages/component
フォルダの下にcomponent.xml
ファイルが存在する必要があります。
新規エディタを開く手順は、次のとおりです。
これらのURLを使用して、チーム・プロダクティビティ・センター固有のエディタを開く異なる2つの方法があります。
ViewManager
でOpenTPCPageInEditor ()
APIを使用します。
例4-24 OpenTPCPageInEditor() APIの使用
ViewManager vm = ViewManager.getInstance(); vm.OpenTPCPageInEditor("/component/component.tpcx? repository=SampleConnector&component=inputDate");
同様に、次のコードで特定の作業アイテム・エディタを開きます。
WebResource
タグを使用します。
例としてサンプル・コネクタを使用すると、その値の部分がリンクであるフィールド「Parent ID」があります。クリックすると、親タスクに対する作業アイテム・エディタが開きます。これを実行するには、次の手順を実行します。
WebResource
タグを使用して、URLを生成できるフィールドをコネクタ定義ファイルに定義します。
例4-26
<RepositoryModel resName="res" resFile="/META-INF/res/modelresource.xml"> <WorkItem type="Task" webURLHandler="oracle.sampleconnector.SampleConnectorService"> <Fields> <Field name="PARENT_TASKID" label="${res.PARENT_TASK_ID}" type="number" readOnly="true"/> <Field name="TASKID" label="${res.TASK_ID}" type="number" readOnly="true"/> <Field name="DESC" label="${res.TASK_DESC}" required="true" maxLength="80" type="string"/> …… <Fields/> <WebResource> <URLDef name="PARENT_TASKID" archorOn="label"/> …… </WebResource> …… <WorkItem/> <RepositoryModel/>
属性archorOn
の有効な値は、"label"および"value"です。属性値が"label"の場合は、フィールド・ラベルがハイパーリンクになります。それ以外の場合は、値がハイパーリンクとして機能します。
WorkItemFieldFeature
インタフェースにgetURL()
APIを実装します。
クラスSampleConnectorService
によって、このインタフェースにメソッドが実装されます。getURL()
メソッドによって、親タスク・フィールドのURLが作成されます。
例4-27
public URL getURL(Map session, String attrName, Object attrValue, WorkItem wi) { String urlString = ""; if (attrName.equalsIgnoreCase("PARENT_TASKID")) { Integer taskid = (Integer) attrValue; String reposName = (String)session.get("repositoryName"); String wiType = (String)session.get("wiType"); if(reposName != null && wiType != null) urlString = "alm:/" + reposName + "/" + wiType + "/" + taskid + ".wid"; } try { return new URL(urlString); } catch (MalformedURLException e) { System.out.println(e); } return null; }
コネクタ定義ファイルで、作業アイテム・セクションを検索し、属性webURLHandler
の値としてクラス名を含めます。最初の箇条書きのサンプル・コードを参照してください。
anchorOn
の値を"label"に設定している場合は、対応する作業アイテム・フィールドのUIメタデータをinputText
、inputDate
、ListOfValues
などの入力フィールドに設定する必要があります。
anchorOn
の値を"value"に設定している場合は、対応する作業アイテム・フィールドのUIメタデータを読取り専用のinputText
に設定する必要があります。
コネクタを開発した後は、実行時にデバッガ内でそのコネクタを実行できる必要があります。この機能は、プロジェクトにすでに組み込まれています。
JDeveloperデバッガ内でコネクタを実行する手順は、次のとおりです。
作成/デプロイしたプロジェクトを右クリックし、「拡張機能のデバッグ」を選択します。
この結果、JDeveloperの別のコピーが起動され、そこからチーム・プロダクティビティ・センターを開いて、コネクタが定義されているOracleチーム・プロダクティビティ・センター・サーバーに接続できます。次に、Javaコードにブレークポイントを設定して、変数に対する監視ウィンドウを使用しながらコードをステップ実行し、標準のデバッグ・ユーティリティを使用できます。
Oracleチーム・プロダクティビティ・センターで使用するためのコネクタを開発した後には、実行するタスクが多数あります。重要なタスクの1つは、コネクタの使用時に発生するエラーの処理です。Oracleチーム・プロダクティビティ・センターには、クライアントにエラーおよびメッセージを伝播する方法が2通りあります。ここでは、これらについて説明します。
開発したコネクタを使用するチーム・メンバーを支援するために、そのコネクタに関するヘルプ・ファイルを組み込むことができます。ヘルプは、JDeveloperのオンライン・ヘルプ・ブラウザまたは外部ヘルプ・ビューアに表示できます。
また、他のチーム・メンバーがダウンロードできるように、Oracleチーム・プロダクティビティ・センター・コネクタをパッケージ化する必要があります。これには、JARファイルおよびバンドル・ファイルへのコネクタの圧縮が含まれます。さらに、コネクタ用に作成したヘルプ・ファイルをJARファイルに組み込む必要があります。
Oracleチーム・プロダクティビティ・センターには、チーム・プロダクティビティ・センター・クライアントにエラーおよびメッセージを伝播する方法が2通りあります。
インタフェース・メソッドで使用されるALMException
の使用
ALMMessageFactory
へのキューイングに使用されるALMMessage
の使用
コネクタ内で何か重大な事象が発生した場合は、すべてのインタフェース・メソッドでALMException
がスローされます。ALMException
のランタイム・インスタンスを使用して、適切な警告またはメッセージを配置できます。これは、クライアント・フレームワークによって、エンド・ユーザーに表示されます。
また、パッケージoracle.alm.common.messageで提供されているクラスを使用して、エラー・メッセージをクライアントに伝播することもできます。このパッケージには2つのクラスが定義されています。
AlmMessageFactory
はメッセージ登録用のクラスで、チーム・プロダクティビティ・センターを介してアクセスします。このクラスおよびAlmMessage
を使用して、クライアントに報告するすべてのメッセージを、UIフレームワークを介してログに記録します。
AlmMessageFactory
は、シングルトンとして実装されます。AlmMessageFactory
を取得するには、次をコールします。
AlmMessageFactory msgFactory = AlmMessageFactory.getInstance()
メッセージを追加するには、messageID
および関連するメッセージ文字列を渡すことによって、AlmMessageFactory.addMessage()
をコールします。
Oracleチーム・プロダクティビティ・センター・コネクタには、状況依存ヘルプなどのカスタム・ヘルプ・ファイルを追加できます。この結果、ユーザーは、コネクタの設定操作のヘルプに必要な情報にアクセスできます。
コネクタ固有のヘルプ・ページをコネクタのユーザーに表示する方法は2通りあります。最初の方法は、これらのヘルプ・ページをJDeveloperヘルプ・センター内に表示することです。2番目の方法は、これらのページをクライアントのデスクトップ上の独自フレームまたはWebブラウザに表示することです。
拡張ヘルプは、チーム・プロダクティビティ・センター・コネクタなどのJDeveloper拡張機能に対するヘルプの作成者が、ヘルプ拡張機能の開発に関するトピック内で使用できます。
コネクタ固有のヘルプを作成し、ユーザーが参照するJDeveloperヘルプ・センター内に表示できます。JDeveloperヘルプをJDeveloperヘルプ拡張機能として実装した場合、ユーザーは、コネクタでダイアログを表示している間に[F1]キーを押すことによって、このヘルプにアクセスできます。
チーム・プロダクティビティ・センター・コネクタに対するヘルプを組み込む手順は、次のとおりです。
JDeveloperで表示される各ページに対するF1ヘルプ・ファイルをHTML形式で提供します。これらは、フォルダ/Help
のパッケージ化されたコネクタJARファイル内に格納する必要があります。
これらのヘルプ・ファイルのみを含む新しいJDeveloper拡張機能を作成します。
コネクタのヘルプIDをコネクタUI定義XMLファイルに追加します。
コネクタに対するヘルプは、ユーザーのデフォルトのWebブラウザまたはPDFビューアなどの外部ビューアに表示できます。
コネクタのヘルプを外部ビューアで表示する手順は、次のとおりです。
表示される各ページに対するF1ヘルプ・ファイルをHTML形式で提供します。これらは、/Help
というフォルダのパッケージ化されたコネクタJARファイル内に格納する必要があります。
これらのヘルプ・ファイルのみを含む新しいJDeveloper拡張機能を作成します。
作業アイテム詳細UIに「Help」ボタンを追加します。これを実行するには、コネクタUI定義XMLファイルにツールバーを追加し、このツールバー上に1つのヘルプ・ボタンを追加します。
リスナー・オブジェクト・クラスを実装します。
Oracleチーム・プロダクティビティ・センター・コネクタの準備の最終フェーズは、JDeveloper拡張機能としてインストールするために、コネクタをJARファイルにパッケージ化することです。この結果、チーム・プロダクティビティ・センター・サーバーにコネクタをインストールでき、このコネクタが適用されるリポジトリにチーム・メンバーが接続できるようになります。
コネクタをサーバーにインストールして、拡張機能としてJDeveloperにインストールできるようにするには、正しくパッケージ化する必要があります。パッケージ化には、3つの部分があります。
コネクタとそれに必要なファイルをすべて含むJARファイル。
ヘルプ・ファイルとそれに必要なファイルを含む個別のJARファイル。
前述の2つのJARファイルと、これをJDeveloperで拡張機能としてインストールできる方法を説明するためのbundle.xml
ファイルを含むZIP形式のバンドル。
プロジェクト内にデプロイメント・プロファイルを作成すると、これらのファイルをすべて生成できます。
デプロイメント・プロファイルを作成する前に、プロジェクトを正常に作成していること、およびすべての出力ファイルが正しいディレクトリに作成されていることを確認してください。
コネクタJARファイルには、コネクタ専用の拡張機能に組み込まれる、コネクタのすべてのコンポーネントが含まれます。
コネクタJARファイルを生成する手順は、次のとおりです。
アプリケーション・ナビゲータでプロジェクトをダブルクリックし、「プロジェクト・プロパティ」→「デプロイメント」の順に選択します。
「新規」をクリックします。
アーカイブ・タイプとして「JARファイル」を選択し、JARファイルの名前を入力します。通常、これはConnector<your connector name>.JAR
です。
「JARデプロイメント・プロファイルのプロパティの編集」ダイアログで、「フィルタ」を選択します。META-INFディレクトリ内のすべてのファイル(この後すぐに定義されるBundle.xml
を除く)およびパッケージ・ディレクトリ内のすべてのファイルを選択します。
「OK」をクリックします。
コネクタJARデプロイメントをテストするには、プロジェクトを右クリックし、「デプロイ」→「<your deploy profile>」→「JARファイルへ」の順に選択します。
ヘルプJARファイルには、コネクタ拡張機能にヘルプを組み込むために必要なすべてのものが含まれます。JDeveloper拡張機能ツールには、コネクタのヘルプJARファイルを生成するための統合プロセスが用意されています。
コネクタのヘルプJARファイルを生成する手順は、次のとおりです。
アプリケーション・ナビゲータでプロジェクトをダブルクリックし、「プロジェクト・プロパティ」→「デプロイメント」の順に選択します。
「新規」をクリックします。
アーカイブ・タイプとして「JARファイル」を選択し、ヘルプJARファイルの名前を入力します。通常、これはConnector<your connector name>Help.JAR
です。
「JARデプロイメント・プロファイルのプロパティの編集」ダイアログで、「フィルタ」を選択します。すべてのヘルプ関連ファイルまたはそれらが格納されているディレクトリを選択します。他のすべてのファイルの選択を解除します。
「OK」をクリックします。
コネクタJARデプロイメントをテストするには、プロジェクトを右クリックし、「デプロイ」→「<your help deploy profile>」→「JARファイルへ」の順に選択します。
コネクタJARファイルが作成されると、バンドル・ファイルを生成することによってそれをデプロイする準備ができます。これは、コネクタ拡張機能のインストールに使用できるZIPファイルです。
コネクタ・バンドル・ファイルを生成する手順は、次のとおりです。
プロジェクトをダブルクリックし、「プロジェクト・プロパティ」→「デプロイメント」の順に選択します。
「新規」をクリックします。
アーカイブ・タイプとして「JARファイル」を選択します。
manifestを含めるの選択を解除します。
バンドルZIPファイルの名前を入力します。
これは通常、「デプロイ」フォルダと同じレベルにある「バンドル」フォルダ内にあり、Connector<your connector name>Bundle.ZIP
という名前になります。必ず、.JARではなく.ZIPという名前にしてください。
「JARデプロイメント・プロファイルのプロパティの編集」ダイアログで、「プロジェクトの出力」ノードを展開し、「フィルタ」を選択します。
このファイル・グループの名前を「JAR Output」に変更します。「アーカイブのターゲット・ディレクトリ」をoracle.teamproductivitycenter/connectors/<your connector name>
に変更します。末尾に.JARを指定しないでください。これは、このファイルの解凍先となるZIPファイル内のパスです。
注意: インストーラでは大/小文字が区別されるため、ファイル・パスの大/小文字が正しいことを確認してください。 |
「JAR Output」ファイル・グループの下の「コントリビュータ」ノードに移動します。「追加」をクリックし、コネクタJARファイルおよびヘルプJARファイルが生成される場所を追加します。
「JAR Output」ファイル・グループの下の「フィルタ」ノードに移動します。すでに生成したコネクタJARファイルおよびコネクタのヘルプJARファイルを選択します。
「ファイル・グループ」ノードを選択し、「新規」をクリックします。「Bundle Output」という新しいファイル・グループを作成します。
「Bundle Output」ファイル・グループの下の「フィルタ」に移動し、bundle.xmlファイルを除いてすべての選択を解除します。「アーカイブのターゲット・ディレクトリ」編集ボックスが空白であることを確認してください。
「プロファイルの依存性」ノードに移動し、依存性としてコネクタおよびヘルプのデプロイ・プロファイルを追加します。
「OK」をクリックします。
コネクタ・バンドルZIPデプロイメントをテストするには、プロジェクトを右クリックし、「デプロイ」→「<your bundle profile>」→「JARファイルへ」の順に選択します。この結果、コネクタJAR、ヘルプJARおよびbundle.xml
ファイルを含む新しいZIPファイルが作成されます。
bundle.xmlファイルには、拡張機能の内容およびその依存性の内容が記述されます。また、バージョン情報および作成者に関する情報も格納されます。
例4-31 コネクタ・バンドル・ファイルbundle.xml
<update-bundle version="1.0" xmlns="http://xmlns.oracle.com/jdeveloper/updatebundle" xmlns:u="http://xmlns.oracle.com/jdeveloper/update"> <u:update id="oracle.teamproductivitycenter.sampleconnector"> <u:name>Oracle Sample Connector</u:name> <u:version>1.0</u:version> <u:author>Oracle Corporation</u:author> <u:author-url>http://www.oracle.com</u:author-url> <u:description> Sample connector for Oracle Team Productivity Center </u:description> <u:requirements> <u:requires-extension id="oracle.jdeveloper" minVersion="11.1.1.1.00" maxVersion="11.1.1.1.99" /> <u:requires-extension id="oracle.teamproductivitycenter" minVersion="11.1.1.1.00" maxVersion="11.1.1.1.99" /> </u:requirements> </u:update> </update-bundle>
すべてのチーム・プロダクティビティ・センター・コネクタには、JDeveloperとチーム・プロダクティビティ・センター両方に対する依存性があります。これらは必ず含まれている必要があります。
Oracleチーム・プロダクティビティ・センターでは、実行中のJDeveloperロケール基づいた、コネクタによる適切なUIの表示がサポートされています。作業アイテムUIおよびモデル定義XMLファイルに表示されるように、ローカライズ文字列の格納にリソース・ファイルを使用できます。たとえば、JDeveloperがJPNロケールで実行されている場合、ユーザーは同じロケールでコネクタ詳細ページを表示できます。これをサポートするために、言語固有のリソース・バンドル・ファイルを作成できます。例4-32は、modelresource.xml
の例です。
例4-32 国際化ファイルmodelresource.xml
<?xml version="1.0" encoding="ISO8859-1" ?> <resources xmlns="http://xmlns.oracle.com/bali/rts/tpc" package="company.bugzilla.res"> <resource key="MSG_SAVEBUG_TITLE">BugDB: Save A Bug</resource> <resource key="MSG_NEWBUG_TITLE">BugDB: Create A Bug</resource> <resource key="MSG_BUGAPI_ERROR">Bug API Error: </resource> <resource key="DESCRIPTION">Description</resource> <resource key="BUG_NAME">Bug </resource> <resource key="BUG_NO">Bug Number</resource> <resource key="BUG_BASEBUG_NO">Base Bug No</resource> <resource key="BUG_STATUS">Status</resource> <resource key="BUG_SUBJECT">Subject</resource> <resource key="BUG_PRODUCT">Product</resource> <resource key="BUG_PRIORITY">Severity</resource> <resource key="BUG_COMPONENT">Component</resource> <resource key="BUG_SUBCOMPONENT">Sub Component</resource> <resource key="BUG_ASSIGNEE">Assigned</resource> </resources>
次は、ファイルuiresource.xml
の例です。
例4-33 国際化ファイルuiresource.xml
<?xml version="1.0" encoding="ISO8859-1" ?> <resources xmlns="http://xmlns.oracle.com/bali/rts/tpc" package="company.bugzilla.res"> <resource key="COMMMENTS">Comments</resource> <resource key="ADD_COMMENTS">Add Comments</resource> <resource key="UPDATE_COMMENTS">Update Comments</resource> </resources>
JDeveloperが日本語で実行されている場合は、フレームワークによってmodelresource_jp.xml
およびuiresource_jp.xml
というリソース・バンドル・ファイルが検索され、日本語のラベルが検出されて表示されます。これらのファイルを作成し、中央の場所に格納できます。これらのリソース・バンドル・ファイルを、フォルダMETA_INF\res
の下のコネクタjarファイルに格納します。