...

Rational Software Architect V7 で UML から ...

by user

on
Category: Documents
41

views

Report

Comments

Transcript

Rational Software Architect V7 で UML から ...
Rational Software Architect V7 で UML から Java 5 への変換機能を
拡張する
レベル: 中級
Jim Conallen ([email protected]), Senior Software Engineer, IBM
2007 年 9 月 18 日
IBM® Rational® Software Architect は、ソフトウェア・システムのアーキテクトと設計者向けのツ
ールです。統一モデリング言語 (UML) によるモデリング機能に、コード・エディター、コンパイラー
、デバッガーなどの開発ツールを組み合わせたものです。この 2 つのフェーズを関連付けるため
に、Rational Software Architect には、クラス、インターフェース、および列挙型の UML モデル
を Java™ 5 のソース・コードに変換する、UML から Java 5 への変換機能が搭載されています
。 この変換機能の性能は十分に対応可能なものとなっていますが、カスタム要素や命名規則な
どの機能拡張を行いたい、または作成したドメイン固有言語 (DSL) 拡張がサポートされるように
したいと考えるユーザーもいると思います。この記事では、単純な例を使用して、この変換機能の
拡張を作成する方法の基本要素を紹介します。
Rational Software Architect の Java 5 変換機能について
IBM Rational Software Architect には、事前定義された複数の変換機能が搭載されており、その
うちいくつかは UML モデルをソース・コードに変換するものです。V7 では、Java 5 機能を含む
変換機能が新たに搭載されました。先行製品と同様、この変換機能は拡張が可能です。この記事
では、この機能の中核要素を示す単純な例を使用して、これを作成するために必要な手順につい
て、順を追って説明します。
Rational Software Architect の 大 半 の 機 能 と 同 様 に 、 変 換 機 能 の 拡 張 を 行 う に は 、 通 常
の Eclipse 拡張メカニズムを使用し、プラグインを作成して特定の拡張ポイントを実装します。こ
の記事では、一般的なプラグインの開発については解説しません。その代わりに、変換拡張を作
成してテストするために必要十分なプラグイン開発スキルのみに焦点を当てます。
図 1. 変換機能の全体構造
変換機能を起動するとまず、変換機能が起動された時点で選択されていた UML モデル、パッケ
ージ、クラス、インターフェース、または列挙型要素で始まるようになっています。変換機能は、選
択された要素 (または、要素が選択されていない場合にはモデル全体) に対して、およびそれに
含まれるすべての要素に対して作動します。これにより、変換拡張の作成者は、変換機能全体に
手を加えてこれを改良する多くの機会を得られます。拡張のターゲットとなるのは、変換機能全体
の一部分のみです。全ターゲットのリストは、付録に含まれています (「ダウンロード」を参照してく
ださい)。
この単純な例では、変換機能が UML クラス要素を Java ソース・ファイルに変換する準備がで
きた時に毎回起動される、単純なクラス・レベルの拡張を定義してみます。この拡張は、クラスに
対し定義されたキーワードを探し、それらのキーワードを使用してソース・コード内のクラスに関連
付けられた新規 Javadoc タグを追加する、という単純な動作を行ないます。
以下の手順に従います。
1.
変換拡張用の新規プラグイン・プロジェクトを作成します。このプロジェクトは他の拡張と結合
させることもできますが、今回は例を単純にするために、ゼロから新規プロジェクトを作成して
みます。
2.
必要なプラグインの依存関係のセットを追加します。これらのプラグインにより、これから実装
する拡張ポイントが定義され、作成後の拡張を起動するために必要となる API が提供され
ます。
3.
プラグイン・ディスクリプターで拡張ポイントを定義し、拡張対象の変換機能と、実装対象とな
るポイントを特定します。
4.
指定された要素タイプを変換機能が検地するごとに毎回起動させる、クラス・ルールの Java
実装を提供します。
5.
ランタイム・ワークベンチを起動し、UML から Java 5 への変換機能を実行することにより、
変換機能をテストします。
ステップ 1. 新規プラグイン・プロジェクトを作成して構成する
変換拡張を作成するには、まず以下のように新規プラグイン・プロジェクトを作成します。
1.
メニューから「File」、「New」、「Project」の順に選択し、プロジェクト・タイプのリストから「
Plug-in Project」を選択して、「Next」をクリックします。
2.
「New Plug-In Project」ウィザードの最初のページで、有効なプロジェクト名を入力します
。Eclipse プラグインの命名規則では、図 2 の例のように URI ドメインを使用することとされ
ています。
図 2. 「New Plug-in Project」ウィザード
3.
2 ページ目 (図 3) で、「Plug-in Name」フィールドをデフォルト設定から変更します。残りのフ
ィールドはデフォルト設定のままで問題ありません。
図 3. 「New Plug-in Project」ウィザードの「Properties」ページ
最終ページで、プラグイン・テンプレートを選択する必要はありません。テンプレートは、あくまで新
規の完全な変換機能のためのものであり、変換拡張用のテンプレートはないからです。
図 4. 「New Plug-in Project」ウィザードの最終ページ
4.
テンプレート・オプションのチェック・マークを外し、「Finish」ボタンをクリックします (図 4)。
図 4. 「New Plug-in Project」ウィザードの最終ページ。ウィザードが終了すると、新規プラグイン・
プロジェクトが作成され、プロジェクト・ディスクリプターの「Overview」ページが開きます (図 5)。
図 5. 新規プロジェクトの構造
ステップ 2. 必要なプラグインの依存関係を追加する
次のステップでは、いくつかのプラグインを依存関係として追加します。これらのプラグインには、
実装のための拡張ポイント定義と、拡張の実装に使用される API が含まれています。
1.
「Dependencies」タブ (このエディターの下部) に切り替え、以下のプラグインを依存関係とし
て追加します。
2.
•
com.ibm.xtools.modeler
•
com.ibm.xtools.transform.core
•
com.ibm.xtools.transform.uml2.java5
•
org.eclipse.jdt.core
プラグインが追加されたことを確認します。図 6 のようなリストが表示されます。
図 6. 依存関係にあるプラグイン
ステップ 3. 拡張を定義して実装する
次のステップでは、1 つ以上の拡張ポイントに実装を提供することを宣言します。
「Extensions」タブに切り替え、「Add」ボタンをクリックして新規拡張を追加します。すると、図 7 に
あ る よ う な ダ イ ア ロ グ ・ ボ ッ ク ス が 表 示 さ れ ま す 。 拡 張 ポ イ ン ト 「
com.ibm.xtools.transform.core.transformationExtensions」を入力します。この拡張ポイントが見つ
かったら、これを選択し、「Finish」をクリックします。
図 7. 新規拡張のダイアログ
1.
拡張ポイントの定義には、さらに情報が必要です。これらの値は、「Extension」タブ・ページの
ユーザー・インターフェースを通じて入力できます。ただし、ほとんどの人は、plugin.xml ファイ
ルの未加工 XML を直接編集する方が簡単と感じるようです。このファイルは、拡張が初め
て定義された時に作成されます (それまでは必要ではないため、「New Project」ウィザードで
は作成されていません)。
2.
「plugin.xml」タブに切り替えると、編集可能な XML ソース・ファイルが表示されます。
3.
この例では、リスト 1 の内容を拡張ポイントに追加します。
リスト 1. 拡張の宣言
拡張要素の本文は、拡張ポイント・プロバイダーによって定義されます。この場合は
、Rational Software Architect Core Transformation コンポーネントが拡張ポイント・プロバイダー
となります。この拡張では、TransformationExtension 子要素が想定されます (拡張する変換機能
の各タイプに 1 つずつ)。これらの要素の 1 つ 1 つによって、これから拡張する変換機能が定
義されます。
4.
こ
の
単
純
な
例
で
は
、
targetTransformation
を
com.ibm.xtools.transform.uml2.java5.internal.UML2JavaTransform という ID で指定します。
5.
ID のための適切な値 (バージョン番号、名前、使用可能化のためのブール値) を指定しま
す。
各変換拡張は、ルール・インターフェース実装用のクラスを指定するルール定義を、子要素として
位置づけます。このクラスは、変換を拡張する動作のほとんどの部分を担います。単一のクラス
は変換の複数部分 (例: クラス、プロパティー、およびオペレーションなど) を拡張することが可能
であるため、クラスは別個の要素として定義されます。
全ルールの定義後、これらルールは、ExtendTransform 要素により、変換を拡張する該当部分に
適用されるようになります。この要素とは、ルールが変換を拡張する部分を定義するものです。こ
のためには、新規クラスが変換される時に毎回拡張を改良する必要があり、ま
た targetTransform の値を com.ibm.xtools.transform.uml2.java5.internal.ClassTransform に設定
する必要があります。この記事のページからダウンロードできる付録に、ターゲット変換 ID (「参考
文献」を参照) の全リストが含まれています。
複数のルールが変換の特定の部分を拡張できる場合には、それらのルールはここ
で ExtendTransform 要素の子要素として集約されます。この例が示すとおり、プロジェクトで定義
されているルールは 1 つのみです。
注:
RuleDefinition 要素のルールの ID は、AddRule 要素のものと一致する必要があります。
ステップ 4. クラス・ルールの Java 実装を提供する
ファイルの編集が終わったら、これを保存します。すると、plugin.xml ファイルのラインの隣にある
、実装クラスを指定する左マージンに、小さなエラー・アイコンが表示されます。これは、プロジェク
ト内にクラスが見つからないことを示しています。
1.
アイコンをダブルクリックして、「Create a new class」へのプロンプトを選択します。 「
New Class」ウィザードが起動され、これを使用してクラス・ファイルを作成します。また、「File」
メニューから「New」を選択して、クラスを手動で作成することも可能です。Eclipse 内で Java
クラスを作成するいずれの方法を選択した場合でも、指定されたパッケージ内にクラスを 1
つ作成し、適切な名前を付けます。
2.
実装をできる限り簡単にするために、Rational Software Architect の変換フレームワーク・ク
ラス com.ibm.xtools.transform.uml2.imple.internal.java5.ClassRule を拡張します。このクラス
を上位クラスとすることで、指定変更するメソッドは以下の 3 つのみとなります。
•
canAccept
•
createTarget
•
isSourceConsumed
これらのメソッドはそれぞれ、ソース・オブジェクトとターゲット・オブジェクトへのアクセスを得るた
めに照会できる変換コンテキスト・オブジェクトを受け入れます。この情報を使用して、特定のクラ
スを処理するか
(canAccept) 、 あ る い は こ の ク ラ ス 以 後 の 処 理 を 停 止 す る か
(isSourceConsumed) を 決 定 で き ま す 。 こ の 拡 張 が コ ン テ キ ス ト を 受 け 入 れ る 場 合 に は 、
createTarget() メソッドを使用して、実際の変換拡張を行います。
3.
この単純な変換拡張では、isSourceConsumed メソッドで False を返して、以後の処理を継
続すること、および拡張はこの特定の要素のすべての変換動作が完了したことを意味するも
のではないことを示します。
4.
少なくとも 1 つのキーワードが定義されている場合には、特定クラスの受け入れが可能であ
ることを示します。キーワードがない場合には、何もする必要がないため、関心がないことを
示します。引数としてパスされる変換コンテキストを通じて、ソース UML クラスにアクセスで
きます。先ほど拡張ポイントにおいて、「Class transforms」のみに関心があると指定したため
、コンテキスト上の getSource() メソッドからは、UML クラスへの参照が返されます。
5.
ソース・オブジェクトを UML クラスに入力し、次にそこからキーワード・リストを取得します。リ
ストが空の場合には、False を返します。
キーワードがある場合には、createTarget() メソッドが呼び出されることになります。これが、この
例で作成者が変換を拡張することが見込まれる部分です。
リスト 2. Java ルール・クラスの実装
createTarget() メソッドを実装する際に開発者が通常最初に行う作業は、変換のこの部分のソー
ス・オブジェクトとターゲット・オブジェクトにアクセスすることです。この例では、変換が UML クラ
ス を 処 理 す る 際 に こ の 拡 張 が 起 動 さ れ る よ う 定 義 し た た め
、Abstract Syntax Tree (AST) TypeDeclaration オブジェクトにターゲット・オブジェクトを安全に入
力することができます。Eclipse Java Developer Tools (JDT) プロジェクトには、Java ソース・コード
を操作するためのすべての API が用意されています。AST は、Eclipse 向けにソース・コードの
構文解析を行うオブジェクト・モデルです。このメソッドが起動されると、変換フレームワークにより
、新規の TypeDeclaration オブジェクトが作成されます。なお、既存の Java ソース・コードがあ
る場合、これをターゲット・オブジェクト内で利用することはできません。新規に生成されたコードと
既存コードの結合は、すべてのモデル要素が変換された後に行われます。
AST の詳細について解説することは、この記事の対象外です。ここでは、拡張が生成されたソー
ス・コードに新規要素を追加する必要がある場合には、AST オブジェクトに対してメソッドを呼び
出すことによってその追加が行われる、ということだけを述べておきます。この単純な例では、クラ
ス定義の Javadoc コメントに新規の Javadoc タグを追加するだけです。Javadoc は、AST の
オブジェクト・タイプで、TypeDeclaration オブジェクトから取得されます。
6.
Javadoc オブジェクトから、この Javadoc を構成しているタグのリストを取得します。生成さ
れたソース・コードからタグを追加 (または削除) することができます。
7.
どのタグを追加するかを決定するために、変換コンテキストからソース・オブジェクトにアクセ
スして、これを UML クラスにキャストします。このオブジェクトから、キーワードのリストを取
得します (canAccept() メソッドを実装した際と同様の方法で)。
8.
このリストを使用して、これらのキーワードに対して作業を繰り返し、各キーワードについて新
規 TagElement を作成します。
9.
タグの名前を、キーワードの値に設定します (頭に @ マークを付けます)。
10. 最後に、Javadocs クラスのタグ・リストに新規タグを追加します。
メソッドから、ターゲット・オブジェクトが返されます。返されるのは通常、ターゲットとしてパスされ
たものと同じオブジェクトです。ここまでの作業で、変換拡張の作成と実装が完了しました。
ステップ 5. 拡張をテストする
拡張の定義と実装が完了したので、次はテストを行います。テストは、新規ランタイム・ワークベン
チを開く新規デバッグ構成を作成することにより行います。
1.
この構成を作成するには、メインメニューから「Run」、「Debug」の順に選択します。
2.
ダイアログで、新規の Eclipse アプリケーション構成を作成し、適切な名前を付けます。
ヒント:
ワークスペースの場所は変更することができます。通常は、誤って既存のワークスペースに影響
を及ぼすことを避けるため、新規の場所を選択することが推奨されます。
3.
その他の部分はデフォルト設定のままとします (図 8)。
図 8. 新規デバッグ構成
4.
構成の編集が終わったら、「Debug」をクリックして Eclipse の新規インスタンスを起動します
。この新規インスタンスには、先ほど作成した変換拡張がプラグインとしてインストールされて
います。
5.
拡張をテストするには、Eclipse シェルの新規インスタンス内に新規 Java プロジェクトを作
成し、そのプロジェクト内に UML モデルを作成する必要があります。
6.
UML モデル内に、テスト・パッケージとクラスを作成し、いくつかの属性またはオペレーション
を格納します。すると、図 9 のようなワークスペースが作成されます。
図 9. ランタイム・ワークベンチ内のテスト・プロジェクト
次に、クラスにキーワードを追加する必要があります。作成した拡張は、キーワードが定義されて
いるクラスに対してのみ動作するからです。
7.
クラスを選択し、「Properties」ビュー内の「Stereotypes」サブタブを選択します。
8.
「Keywords」フィールドにテキストを入力します (図 10)。
図 10. キーワード・プロパティーの設定
テスト・プロジェクトとモデルを設定したら、次は、UML から Java 5 への変換の主要パラメーター
を定義する新規変換構成を作成する必要があります。
9.
メインメニューから「File」、「New」の順に選択します。
10. 「Transformations」カテゴリーで、「Transformation Configuration」を選択し、「Next」をクリック
します (図 11)。
図 11. 新規変換構成の作成
11. Rational Software Architect には多数の変換タイプが用意されています。この例では、先ほ
ど作成した拡張が対象としている、UML から Java 5 への変換 (図 12) を選択します。
12. 適切な名前を付けます。この名前は、Java プロジェクト内の構成のファイル名として使用さ
れます。
図 12. 変換の選択
13. 変換構成内で最初に指定する必要があるのは、ソース・モデルとターゲット・プロジェクトです
。
•
必ず UML モデルを選択するようにしてください。実際の .emx file ではなく、「Models」
仮想フォルダー内に表示される UML モデルの方です。
•
ターゲットは、Java プロジェクト自体を選択することにより選択してください (図 13)。
図 13. 変換のソースとターゲットの設定
14. オプションで、次の構成セットアップ・ページ (図 14) で、ゲット・メソッドとセット・メソッドの自
動生成をオフにすることができます。また、その後のページでその他のオプションを試すこと
ができます。この単純なテスト例では、デフォルト設定のままで「Finish」をクリックして問題あ
りません。
図 14. 変換構成のオプション
構成の作成が完了したので、構成を起動できるようになりました。このプロジェクトが存在する間
は、この構成を再度作成する必要はありません。
15. 変換と、これについて作成した拡張を起動するには、ダイアグラムでクラスを選択し、ポップア
ッ プ ・ メ ニ ュ ー を 起 動 し て 、 「 Transform 」 、 「 My UML to Java5 Transform Test.tc 」 、
「UML to Java V5.0 」の順に選択します (図 15)。
図 15. 変換の起動
変換の結果は図 16 のようになります。追加したキーワードの値と一致する Javadoc タグが、ク
ラスの Javadocs に含まれていることがわかります。
図 16. 生成されたコードの結果
結論
この記事で紹介した、UML から Java 5 への変換の拡張の単純な例は、あくまで拡張作成の基
本メカニズムを示すことを意図したものです。現実に作成される拡張は、モデル内の情報を使用し
て、生成されたコードにより高度な変更を加えたり、さらにはソース・コードに付随作成物を追加す
るなどして、よりインテリジェントなものになるケースが多いと思われます。この記事がお伝えする
重要なポイントは、既存の作業成果をすべて活用して、出力に小さな変更または改良を加えるだ
けで済むようにしたい場合には、既存の変換機能の拡張を作成することが大いに役立つ、という
ことです。コードを生成する共通の変換機能を 1 つと、他の作成物 (デプロイメント記述子や付
随ファイルなど) を持つことによっても、多数の変換を実行する必要がなく 1 つの変換のみを実
行すれば済むため、開発プロセスが簡素化されます。
ダウンロード
説明
ファイル名
サイズ ダウンロード形式
変換ターゲットのリスト
UML_to_Java5_transformation_targets.pdf
32 KB
添付ファイルを
ご参照ください
Fly UP