はじめに
この記事では、システム設計ツール「JUDE」のAPIについて、概要と使い方を、サンプルプログラムを中心にして基本から紹介します。
皆さんは、作成した分析設計モデルをどこまで活用されているでしょうか? 単独で作成して頭の中の整理やコミュニケーションに使い、使い捨てる場合もあると思いますが、開発プロセスの前後の作業と関連し合っている場合も多いと思います。
![JUDEモデルの活用プロセス](http://cz-cdn.shoeisha.jp/static/images/article/3165/01.gif)
上図のように、何かの情報をもとにモデルを作成したり、モデルからドキュメントやソースを作成できたりします。せっかくモデリングツールを使ってモデルを書くのですから、プログラムを使って作業を効率化してしまいましょう。それを可能にするのが、プログラムでモデルにアクセスできるAPIです。
具体的な活用例
はじめにJUDEのAPIの具体的な活用例を示します。
- 既存システムのデータベース定義を読み込み、JUDEのERモデルを作成
- 設計モデルの規模や品質を分析するために、モデルデータのメトリクスを作成
- WebフレームワークRuby on Railsとモデルの連携
これらの例はほんの一部で、皆さんの状況ごとにいろいろな活用方法が考えられると思います。開発プロセスも扱っているモデルもツールもプロジェクトによってさまざまですから、やりたいこともさまざまでしょう。そんなわがままな要求にこたえられるのがAPIです。
さて、前置きはこのぐらいにして、さっそくAPIを使ってみましょう。
JUDEのAPIでは、モデル情報の参照と編集が可能です。まずは、モデル情報を参照する例を示します。
JUDEモデル情報の取得方法
サンプルプログラム1
1 import com.change_vision.jude.api.inf.exception.ProjectLockedException; 2 import com.change_vision.jude.api.inf.model.IModel; 3 import com.change_vision.jude.api.inf.model.INamedElement; 4 import com.change_vision.jude.api.inf.model.IPackage; 5 import com.change_vision.jude.api.inf.project.ProjectAccessor; 6 import com.change_vision.jude.api.inf.project.ProjectAccessorFactory; 7 8 /** 9 * APIでJUDEモデルのパッケージ情報を取得するサンプルコード. 10 * パッケージ名をコンソールに出力する。 11 */ 12 public class ReadingPackagesName { 13 14 public static void main(String[] args) { 15 try { 16 System.out.println("Opening project..."); 17 18 ProjectAccessor prjAccessor = ProjectAccessorFactory.getProjectAccessor(); 19 20 // プロジェクトを開く。 21 prjAccessor.open("../SampleModel.jude", true, false, true); 22 23 System.out.println("Printing the packages..."); 24 25 // 起点となるモデルを取得する。 26 IModel project = prjAccessor.getProject(); 27 28 // プロジェクトに含まれる全てのパッケージを取得する。 29 printPackageInfo(project); 30 31 // プロジェクトを閉じる 32 prjAccessor.close(); 33 34 System.out.println("Finished"); 35 36 } catch (ProjectLockedException e) { 37 e.printStackTrace(); 38 } catch (Throwable e) { 39 e.printStackTrace(); 40 } 41 } 42 43 private static void printPackageInfo(IPackage iPackage) { 44 // パッケージ名を表示 45 System.out.println("Package name: " + iPackage.getName()); 46 47 // サブパッケージを表示 48 INamedElement[] subPackages = iPackage.getOwnedElements(); 49 for (int i = 0; i < subPackages.length; i++) { 50 if (subPackages[i] instanceof IPackage) { 51 IPackage subPackage = (IPackage) subPackages[i]; 52 // パッケージを表示 53 printPackageInfo(subPackage); 54 } 55 } 56 } 57 }
![入力となるJUDEモデルの例1](http://cz-cdn.shoeisha.jp/static/images/article/3165/fig02.jpg)
![出力例1](http://cz-cdn.shoeisha.jp/static/images/article/3165/fig03.jpg)
サンプルプログラム1の内容
サンプルプログラム1は、JUDEモデルを読み込んで、その中にあるパッケージ名をコンソールに出力します。入力例と出力例を見てください。簡単のため、パッケージの入れ子関係などは無視してフラットに出力します。
基本手順
JUDEのAPIを使ってモデル情報を参照する基本手順は、次のようになっています。★の部分をカスタマイズすることで、目的の情報を抜き出して好みの出力を得るようにします。
- ProjectAccessorの取得
- .judeファイルのオープン
- モデルのルートとなるモデルの取得
- モデル情報をたどって目的のモデルを取得し、好みの出力をする(★)
- .judeファイルのクローズ
モデル情報の辿り方
JUDEモデルのすべてのモデル情報は、プロジェクトを表すモデル(プロジェクトモデル)の下にツリー状に存在します。その入れ子になった子要素は、getOwnedElements()
で取得できます。パッケージの配下には、クラスやパッケージが存在します。その中からパッケージ(IPackage)を抽出して(48行目から51行目までのソースコード)同様の処理(getOwnedElements()
)を再帰的に繰り返すことで、すべてのパッケージ(IPackage)およびパッケージ(IPackage)の直下にあるモデル要素を取得できます。
getメソッド
JUDE APIの各モデル要素には、いくつかのget
メソッドがあります。例えば、IPackageのgetName
メソッドでパッケージの名前を取得でき、getDefinition()
で定義を取得できます。
Projectのopenの引数
ProjectAccessor.open()
にたくさん引数が付いている点、気になった方もいると思います。これは、プロジェクトファイルのロックの扱いなどが関係しています。「APIを使ってみようとしたけどopenに失敗する」といったトラブルにあわないように、注意してください。
JUDEでプロジェクトファイルを開くと、プロジェクトファイルがロックされ、他のJUDEプログラムから編集できない状態になります。そのため、そのような場合に、ProjectAccessor.open(String projectName)
で開こうとするとProjectLockedExcetpionで失敗してしまいます。その場合は、サンプルソースコードのように引数を調整することで、読み込み専用モードでプロジェクトを開けます(21行目のソースコード)。詳しくは、API利用ガイドを参照してください。
これからサンプルプログラム1を少し拡張した例を紹介します。