MB)AndroMDAを使用して、Struts、Spring、Hibernateのソースを自動生成するMDA開発プロセスの実践例を紹介します。モデリングから実行までを本稿では説明します。Group)によって定義されたソフトウェア開発のためのフレームワークです。ソフトウェア開発プロセスはモデルが重要であり、モデルを起点として開発プロセスを駆動するという考え方です。MDAにのっとった開発ではモデルからソースコードを自動生成しますので、開発工数の削減、品質の向上など、さまざまなメリットが期待されます。世の中の多くの開発者は、MDAはまだ現実的ではないと認識しているようです。その一方で、MDAに対応した実装も着々と進められています。そのうちの1つがオープンソースのプロダクトであるAndroMDA(アンドロメダ)です。AndroMDAはBSDライセンスの元でソースが公開され、開発が進められています。AndroMDAは、HibernateやSpringなど他のオープンソースプロジェクトの最新版の開発成果を積極的に取り入れ、開発スピードも速いため、注目のプロダクトと言えるでしょう。本稿では、AndroMDAを活用したMDA開発の実践例を紹介します。対象読者JavaでWebアプリケーションを開発した事がある方を対象とします。必要な環境サンプルは以下の環境で動作確認を行っています。Model:プラットフォーム依存モデル)という2つのモデル概念を定義しています。ここでの「プラットフォーム」とは、OS、ミドルウェア、プログラミング言語、データベースなどの事をいいます。「Windows・Linux」などのOS、「Java・VB.Net・C#」などのプログラミング言語、「Tomcat・JBoss」などのコンテナなどの事です。PIMはプラットフォームに依存しない抽象度の高いモデルです。PSMはプラットフォームに依存したモデルの事をいいます。MDAではまずPIMが変換定義に従ってPSMに変換されます。その後PSMは変換定義に従い、プログラムソースコード・SQL文・設定ファイルなどの実装コードに変換されます。モデルの概念がPIMとPSMとに分かれる事により、モデル作成時に分業が可能となります。業務には詳しいがシステムについてはさほど詳しくない人が、PIMのモデリングを担当し、業務にはさほど詳しくないが、システムには詳しい人がPSM・実装面を担当するという事が可能となります。PIMとPSMとに分かれる事によって、モデルの保守性という面でもメリットが生まれます。システムの実装技術は移り変わりが早いので、システムに新しいプラットフォームを採用する場合、プラットフォームに依存しているPSMは再作成する必要が出てきます。PIMは業務が変化しない限りプラットフォーム変更の影響を受けることはありません。MDAのメリットMDAフレームワークがソフトウェア開発にもたらす主なメリットとして、以下の事項があげられます。Interchange)ファイルを入力として、実行可能アプリケーションを自動生成する為のツールです。XMIとは、UMLなどで定義されたモデルをXMLで表現するための仕様です。モデルをXMI形式にする事によって、異なるツール間でモデルを交換する事が可能となります。XMIはOMGで仕様が策定されています。AndroMDA自体はモデリング機能を提供しませんので、XMIを出力する他のモデリングツールの使用が前提となります。カートリッジAndroMDAは「カートリッジ」と呼ばれる変換のためのプラグインを用意しています。Struts)」カートリッジ、「Hibernate」カートリッジ、「Spring」カートリッジなどのJava言語に対応したカートリッジが標準で添付されています。カートリッジをカスタマイズしたり、独自に開発したりする事も可能です。UMLプロファイルAndroMDAはUMLを拡張するための「UMLプロファイル」を提供しています。「UMLプロファイル」とはUMLを拡張して特別な使用方法を定義できるメカニズムです。「UMLプロファイル」は、ステレオタイプ群、関連制約群、タグ付き値群などによって定義されます。「UMLプロファイル」の例としては「Java」プロファイル、「EJB」プロファイルなどがあげられます。AndroMDAも「presentation」プロファイル、「persistence」プロファイル、「service」プロファイル、「webservice」プロファイル、「datatype」プロファイルなどを提供しています。これらのプロファイルもXMI形式で提供されています。新規登録(create)、読み込み(read)、更新(update)、削除(Delete)というデータの基本操作の頭文字をとって「CRUD(Create,Read,Update,Delete)」と呼ばれる事があります。システムのデータに対し「CRUD」の操作を行うアプリケーションは「マスターメンテナンスアプリケーション」などと呼ばれます。Entities」というマスターメンテナンスアプリケーションを自動生成する機能を提供しています。Entities」の機能を使用してアプリケーションを自動生成するサンプルを紹介します。するアプリケーションを作成します。本稿のサンプルでは、商品とカテゴリは多対多の関連を持ちます。1つの商品は複数カテゴリに所属する事ができ、1つのカテゴリには複数の商品が所属するというモデルです。以下に、AndroMDAの使用に必要なソフトウェアと環境変数を示します。Start」を参照して下さい。M1がリリース版です。RC1をダウンロードしてください(上記のリンク参照)。インストールと環境変数設定インストール方法maven、JBoss、AndroMDAは任意のフォルダに解凍するだけです。アプリケーションをインストールしたルートフォルダ名を、「XXXX_HOME」という名前の環境変数として設定します。Settings\ユーザ名」)に、「build.properties」ファイルを以下の内容で作成します。http://www.ibiblio.org/mavenmavenは実行時に、「build.properties」ファイルに設定されたURLにアクセスし、必要なライブラリを動的にダウンロードします。mavenのAndroMDAプラグインをダウンロードmavenにはAndroMDAプラグインが提供されています。Settings\ユーザ名\.maven」)に、AndroMDAで使用するJARファイルがダウンロードされます。-Dversion=3.1-RC1-SNAPSHOTmavenは基本的に以下の書式で実行します。<プラグイン名>:<ゴール名>以下の表に、コマンドで指定するオプションの意味を簡単に説明します。「plugin」プラグインの「download」ゴールを実行する(=プラグインのダウンロードを行う)。ダウンロードするプラグインのグループを指定。「andromda」グループが対象。「maven-andromdapp-plugin」プラグインをダウンロード。プラグインのバージョンを指定。対象バージョンは3.1-RC1-SNAPSHOT。リリース正式版の場合「3.0」、マイルストーン1の場合「3.1-M1」を指定。以下の手順によりAndroMDAのプロジェクトを作成します。andromdapp:generate画面上のプロンプトに質問が表示されますので、プロジェクトの各種パラメータを入力します。プロジェクト作成者の氏名(任意の値)。プロジェクト名(任意の値)。XMIファイル名、EARファイル名などに使用されます。任意の値で可能ですが、スペースは入れないで下さい。プロジェクトのバージョン(任意の値)。ソース自動生成時にJavaのパッケージ名で使用される。パッケージング方式を指定。トランザクション、永続性を実現するカートリッジを指定。Entitiesの機能を使用するにはspringを指定する必要があります。Hibernate3の使用の際、jBpmワークフローエンジンを使用するか否か。(jBpmとはビジネスプロセスの実行状態をトラッキングしたり、実行情報をストアしたりするためのワークフロー管理エンジンです。JBossグループで開発が進められています)。Webアプリケーション形式にするか。ビジネスサービスをWebサービスとするか。以上でプロジェクトが作成され、モデリングを開始する準備ができました。モデリング前節まででプロジェクトが作成され、XMIファイルのテンプレートが作成されています。次にモデリングツール(MagicDraw)でXMIファイルを開き、モデルを作成します。AndroMDAでは、モデリングツールとしてMagicDrawとPoseidonを推奨しています。Edition(機能限定版)がフリーでダウンロードできます。XMIファイルを開くMagicDrawのメニューバーで[ファイル]→[プロジェクトを開く]と選択すると、[開く]ダイアログボックスが表示されます。ここでプロジェクトを作成したフォルダ(「mda\src\uml」フォルダ)の「ItemCategoryModel.xmi」ファイルを選択します。Settings\ユーザー名\.maven\repository\andromda\xml.zips\」フォルダに存在する「andromda-profile-3.1-RC1-SNAPSHOT.xml.zip」ファイルを選択します。クラス図の作成アプリケーションのモデルをクラス図上に作成します。モデルパッケージ階層の作成モデルパッケージを以下の手順で作成します。包含ツリーで、ツリーの一番上の[Data]モデルを右クリックして[新規エレメント]→[モデル]を選択し、「ItemCategory」と入力します。[ItemCategory]を右クリックし、[新規エレメント]→[モデルパッケージ]を選択します。「to/msn/wings/codezine/item」と「to/msn/wings/codezine/category」のモデルパッケージ階層を順に作成します。[item]と[category]のようにモデルごとにパッケージを分けなければならないというルールはありませんが、各モデルクラスに対して複数のクラスが自動生成されますので、わかりやすくするため本稿ではパッケージを分けました。クラスの作成モデルパッケージ階層上にクラスを作成します。クラスの作成[item]モデルパッケージの下に[Item]クラス、[category]モデルパッケージの下に[Category]クラスをそれぞれ作成します。包含ツリー上で[新規エレメント]→[モデルクラス]で作成します。各クラスへ属性を追加します。各クラスの属性はモデル定義上publicに設定する必要があります。本稿のサンプルでは、属性は以下の表のものを定義しました。商品を一意に識別するコード。