Shoeisha Technology Media

CodeZine(コードジン)

特集ページ一覧

AndroMDAでMDAの世界を体験する(コード生成編)

AndroMDAでStruts、Spring、Hibernateのソースを自動生成する

  • LINEで送る
  • このエントリーをはてなブックマークに追加

AndroMDAを使用して、Struts、Spring、Hibernateのソースを自動生成するMDA開発プロセスの実践例を紹介します。モデリングから実行までを本稿では説明します。

はじめに

 MDA(Model Driven Architecture:モデル駆動型アーキテクチャ)とは、OMG(Object Management Group)によって定義されたソフトウェア開発のためのフレームワークです。ソフトウェア開発プロセスはモデルが重要であり、モデルを起点として開発プロセスを駆動するという考え方です。MDAにのっとった開発ではモデルからソースコードを自動生成しますので、開発工数の削減、品質の向上など、さまざまなメリットが期待されます。

 しかし、世の中の多くの開発者は、MDAはまだ現実的ではないと認識しているようです。その一方で、MDAに対応した実装も着々と進められています。そのうちの1つがオープンソースのプロダクトであるAndroMDA(アンドロメダ)です。AndroMDAはBSDライセンスの元でソースが公開され、開発が進められています。AndroMDAは、HibernateSpringなど他のオープンソースプロジェクトの最新版の開発成果を積極的に取り入れ、開発スピードも速いため、注目のプロダクトと言えるでしょう。本稿では、AndroMDAを活用したMDA開発の実践例を紹介します。

対象読者

 JavaでWebアプリケーションを開発した事がある方を対象とします。

必要な環境

 サンプルは以下の環境で動作確認を行っています。

MDAの概要

 MDAはPIM(Platform Independent Model:プラットフォーム独立モデル)とPSM(Platform Specific Model:プラットフォーム依存モデル)という2つのモデル概念を定義しています。ここでの「プラットフォーム」とは、OS、ミドルウェア、プログラミング言語、データベースなどの事をいいます。例えば、「Windows・Linux」などのOS、「Java・VB.Net・C#」などのプログラミング言語、「TomcatJBoss」などのコンテナなどの事です。PIMはプラットフォームに依存しない抽象度の高いモデルです。

 一方、PSMはプラットフォームに依存したモデルの事をいいます。MDAではまずPIMが変換定義に従ってPSMに変換されます。その後PSMは変換定義に従い、プログラムソースコード・SQL文・設定ファイルなどの実装コードに変換されます。

 モデルの概念がPIMとPSMとに分かれる事により、モデル作成時に分業が可能となります。例えば、業務には詳しいがシステムについてはさほど詳しくない人が、PIMのモデリングを担当し、業務にはさほど詳しくないが、システムには詳しい人がPSM・実装面を担当するという事が可能となります。

 またPIMとPSMとに分かれる事によって、モデルの保守性という面でもメリットが生まれます。システムの実装技術は移り変わりが早いので、システムに新しいプラットフォームを採用する場合、プラットフォームに依存しているPSMは再作成する必要が出てきます。しかし、PIMは業務が変化しない限りプラットフォーム変更の影響を受けることはありません。

MDAのメリット

 MDAフレームワークがソフトウェア開発にもたらす主なメリットとして、以下の事項があげられます。

  • ソースコード自動生成による品質の向上
  • ソースコード自動生成による生産性の向上
  • ドキュメントと実装の一貫性(トレーサビリティ)が確保されることによる保守性の向上

AndroMDAの機能

 AndroMDAはモデリングツールが出力したXMI(XML Metadata Interchange)ファイルを入力として、実行可能アプリケーションを自動生成する為のツールです。XMIとは、UMLなどで定義されたモデルをXMLで表現するための仕様です。モデルをXMI形式にする事によって、異なるツール間でモデルを交換する事が可能となります。XMIはOMGで仕様が策定されています。AndroMDA自体はモデリング機能を提供しませんので、XMIを出力する他のモデリングツールの使用が前提となります。

カートリッジ

 AndroMDAは「カートリッジ」と呼ばれる変換のためのプラグインを用意しています。「Java」カートリッジ、「bpm4Struts(Business Process Management For Struts)」カートリッジ、「Hibernate」カートリッジ、「Spring」カートリッジなどのJava言語に対応したカートリッジが標準で添付されています。カートリッジをカスタマイズしたり、独自に開発したりする事も可能です。

UMLプロファイル

 AndroMDAはUMLを拡張するための「UMLプロファイル」を提供しています。「UMLプロファイル」とはUMLを拡張して特別な使用方法を定義できるメカニズムです。「UMLプロファイル」は、ステレオタイプ群、関連制約群、タグ付き値群などによって定義されます。「UMLプロファイル」の例としては「Java」プロファイル、「EJB」プロファイルなどがあげられます。AndroMDAも「presentation」プロファイル、「persistence」プロファイル、「service」プロファイル、「webservice」プロファイル、「datatype」プロファイルなどを提供しています。これらのプロファイルもXMI形式で提供されています。

AndroMDAによるマスターメンテナンスアプリケーションの自動生成

 新規登録(create)、読み込み(read)、更新(update)、削除(Delete)というデータの基本操作の頭文字をとって「CRUD(Create,Read,Update,Delete)」と呼ばれる事があります。そして、システムのデータに対し「CRUD」の操作を行うアプリケーションは「マスターメンテナンスアプリケーション」などと呼ばれます。AndroMDAは「Manageable Entities」というマスターメンテナンスアプリケーションを自動生成する機能を提供しています。本稿では、この「Manageable Entities」の機能を使用してアプリケーションを自動生成するサンプルを紹介します。

サンプルの概要

 本稿のサンプルでは、商品とカテゴリという2つのエンティティデータをWeb画面から新規登録・参照・更新・削除するアプリケーションを作成します。本稿のサンプルでは、商品とカテゴリは多対多の関連を持ちます。1つの商品は複数カテゴリに所属する事ができ、1つのカテゴリには複数の商品が所属するというモデルです。

AndroMDAのインストール・環境設定

 以下に、AndroMDAの使用に必要なソフトウェアと環境変数を示します。詳細はAndroMDAホームページの「Getting Start」を参照して下さい。

必要なソフトウェア

AndroMDA 3.1の補足
 2005/7/19時点でAndroMDA 3.1 M1がリリース版です。しかし、RC1から多対多の関連がサポートされたので[Continuous Builds]から3.1 RC1をダウンロードしてください(上記のリンク参照)。

インストールと環境変数設定

インストール方法

 maven、JBoss、AndroMDAは任意のフォルダに解凍するだけです。JDKはインストーラに従ってインストールして下さい。

環境変数設定

 各アプリケーションをインストールしたルートフォルダ名を、「XXXX_HOME」という名前の環境変数として設定します。

  • MAVEN_HOME
  • JAVA_HOME
  • JBOSS_HOME

AndroMDAのプロジェクト作成方法

「build.properties」作成

 ユーザーのホームフォルダ(「C:\Documents and Settings\ユーザ名」)に、「build.properties」ファイルを以下の内容で作成します。

「build.properties」
maven.repo.remote=http://team.andromda.org/maven,
http://www.ibiblio.org/maven

 mavenは実行時に、「build.properties」ファイルに設定されたURLにアクセスし、必要なライブラリを動的にダウンロードします。

mavenのAndroMDAプラグインをダウンロード

 mavenにはAndroMDAプラグインが提供されています。以下のコマンドを実行することにより、ユーザーのホームフォルダ直下の「.maven」フォルダ(「C:\Documents and Settings\ユーザ名\.maven」)に、AndroMDAで使用するJARファイルがダウンロードされます。

maven plugin:download -DgroupId=andromda
-DartifactId=maven-andromdapp-plugin -Dversion=3.1-RC1-SNAPSHOT

 mavenは基本的に以下の書式で実行します。

maven <プラグイン名>:<ゴール名>

 以下の表に、コマンドで指定するオプションの意味を簡単に説明します。

mavenのオプションの意味
オプション説明
plugin:download「plugin」プラグインの「download」ゴールを実行する(=プラグインのダウンロードを行う)。
-DgroupId=andromdaダウンロードするプラグインのグループを指定。「andromda」グループが対象。
-DartifactId=maven-andromdapp-plugin「maven-andromdapp-plugin」プラグインをダウンロード。
-Dversion=3.1-RC1-SNAPSHOTプラグインのバージョンを指定。対象バージョンは3.1-RC1-SNAPSHOT。リリース正式版の場合「3.0」、マイルストーン1の場合「3.1-M1」を指定。

プロジェクトの作成

 以下の手順によりAndroMDAのプロジェクトを作成します。

  1. プロジェクトを作成するディレクトリに移動
  2. cd C:\java\andromda\andromda-bin-3.1-RC1-SNAPSHOT\projects
    
  3. mavenのandromdappプラグインの「generate」ゴールを実行
  4. maven andromdapp:generate
    
    画面上のプロンプトに質問が表示されますので、プロジェクトの各種パラメータを入力します。
    AndroMDAプロジェクト作成時のパラメータ
    プロンプトメッセージ本稿の入力値説明
    Please enter your first and last name (i.e. Chad Brandon)Haruo Satoプロジェクト作成者の氏名(任意の値)。
    Please enter the name of your J2EE project (i.e. Animal Quiz)Item Categoryプロジェクト名(任意の値)。
    Please enter the id for your J2EE project (i.e. animalquiz)itemcategoryプロジェクトID。XMIファイル名、EARファイル名などに使用されます。任意の値で可能ですが、スペースは入れないで下さい。
    Please enter a version for your project (i.e. 1.0-SNAPSHOT)1.0プロジェクトのバージョン(任意の値)。
    Please enter the base package name for your J2EE project (i.e. org.andromda.samples)to.msn.wings.
    codezine
    ソース自動生成時にJavaのパッケージ名で使用される。
    Would you like an EAR or standalone WARearパッケージング方式を指定。
    Please enter the type of transactional/persistence cartridge to use (enter 'hibernate', 'ejb', or 'spring')springトランザクション、永続性を実現するカートリッジを指定。Manageable Entitiesの機能を使用するにはspringを指定する必要があります。
    Would you like to use the jBpm workflow engine, it uses Hibernate3 (enter 'yes' or 'no')yesHibernate3の使用の際、jBpmワークフローエンジンを使用するか否か。(jBpmとはビジネスプロセスの実行状態をトラッキングしたり、実行情報をストアしたりするためのワークフロー管理エンジンです。JBossグループで開発が進められています)。
    Would you like a web application?yesWebアプリケーション形式にするか。
    Would you like to be able to expose your services as web services?noビジネスサービスをWebサービスとするか。

 以上でプロジェクトが作成され、モデリングを開始する準備ができました。

モデリング

 前節まででプロジェクトが作成され、XMIファイルのテンプレートが作成されています。次にモデリングツール(MagicDraw)でXMIファイルを開き、モデルを作成します。AndroMDAでは、モデリングツールとしてMagicDrawPoseidonを推奨しています。本稿ではモデリングツールとしてMagicDraw 9.5を使用します。MagicDrawはCommunity Edition(機能限定版)がフリーでダウンロードできます。

XMIファイルを開く

 MagicDrawのメニューバーで[ファイル]→[プロジェクトを開く]と選択すると、[開く]ダイアログボックスが表示されます。ここでプロジェクトを作成したフォルダ(「mda\src\uml」フォルダ)の「ItemCategoryModel.xmi」ファイルを選択します。「andromda-profile-3.1-RC1-SNAPSHOT.xml.zip」ファイルが存在しないという警告が表示されますので、「C:\Documents and Settings\ユーザー名\.maven\repository\andromda\xml.zips\」フォルダに存在する「andromda-profile-3.1-RC1-SNAPSHOT.xml.zip」ファイルを選択します。

クラス図の作成

 アプリケーションのモデルをクラス図上に作成します。

モデルパッケージ階層の作成

 モデルパッケージを以下の手順で作成します。

  1. 包含ツリーで、ツリーの一番上の[Data]モデルを右クリックして[新規エレメント]→[モデル]を選択し、「ItemCategory」と入力します。
  2. [ItemCategory]を右クリックし、[新規エレメント]→[モデルパッケージ]を選択します。そして、「to/msn/wings/codezine/item」と「to/msn/wings/codezine/category」のモデルパッケージ階層を順に作成します。[item]と[category]のようにモデルごとにパッケージを分けなければならないというルールはありませんが、各モデルクラスに対して複数のクラスが自動生成されますので、わかりやすくするため本稿ではパッケージを分けました。

クラスの作成

 モデルパッケージ階層上にクラスを作成します。

  1. クラスの作成
  2. [item]モデルパッケージの下に[Item]クラス、[category]モデルパッケージの下に[Category]クラスをそれぞれ作成します。包含ツリー上で[新規エレメント]→[モデルクラス]で作成します。
  3. クラスへの属性追加
  4. 各クラスへ属性を追加します。なお、各クラスの属性はモデル定義上publicに設定する必要があります。本稿のサンプルでは、属性は以下の表のものを定義しました。
    Itemクラスへの属性
    属性名説明
    itemcode商品コード。商品を一意に識別するコード。
    name商品名。
    Categoryクラスへの属性
    属性名説明
    categorycodeStringカテゴリコード。カテゴリを一意に識別するコード。
    nameStringカテゴリ名。
  5. クラスへのステレオタイプ付加
  6. [Item]クラスと[Category]クラスに、[Manageable]と[Entity]のステレオタイプを付加します。「ステレオタイプ」とは、UMLの標準構成要素にユーザーが独自に性質を付加できるメカニズムのことです。例えばクラス図上のクラスに≪utility≫とステレオタイプを付加することで、そのクラスに「ユーティリティクラス」であるという性質を付加する事ができます。ここでの「Manageable」と「Entity」はAndroMDAが提供するプロファイルで用意されているステレオタイプです。
    包含ツリー上でクラスをダブルクリックし、[モデルクラス仕様]ダイアログボックスを開きます。[ステレオタイプ]タブで[全てのアイテム]リストから[Manageable]と[Entity]を選択し、[選択されたアイテム]リストに移動します。AndroMDAは、このステレオタイプの設定により、クラスの特性を認識します。「Manageable」ステレオタイプによりクラスを「CRUD」の対象とみなし、「Entity」ステレオタイプによってクラスをHibernateのO/Rマッピングの対象とみなします。
  7. クラス属性へのステレオタイプ付加
  8. アプリケーションの仕様上、[Item]クラスの[itemcode]属性と、[Category]クラスの[categorycode]属性はシステム内で一意である必要があります。各属性に[Unique]ステレオタイプを付加します。Itemクラスの設定を例にします。包含ツリー上で[Item]クラスの[categorycode]をダブルクリックすると、[属性仕様]ダイアログボックスが開きますので、[ステレオタイプ]タブを選択します。[すべてのアイテム]リスト上の[Unique]を選択されたアイテムに移動します。[Category]クラスの[categorycode]属性も同様に設定します。

クラス図の作成

  1. クラス図の新規作成
  2. 包含ツリー上で「Data/ItemCategory/to/msn/wings/codezine」を右クリックし、[新規の図]→[クラス図]を選択します。名前は、ここでは「Manageable Entities」とします。名前は任意の名前で構いません。
  3. クラスの図への追加
  4. [Item]クラスと[Category]クラスを、クラス図上へドラッグ&ドロップします。
  5. 関連の追加
  6. クラス図の左横にあるツールバー上の[関連]を選択し、[Item]と[Category]の間に関連を設定します。
  7. 関連仕様(多重度)の設定
  8. クラス図上の関連をダブルクリックし、[関連仕様]ダイアログボックスで関連終端Aの多重度と関連終端Bの多重度に、それぞれ「0..*」を設定します。
  9. 関連端仕様の設定
  10. 関連端の可視性を「public」に設定します。[包含ツリー]上で[category]モデルパッケージの[関係]→[関連]→[A<>]、[B<>]を開きます。[A<>]をダブルクリックすると[関連端仕様]ダイアログボックスが開きますので、[一般]タブを選択し、[可視性]の設定を[public]に設定して下さい。[B<>]にも同様の設定をします。
    包含ツリー上で関連を選択
    包含ツリー上で関連を選択
    関連端仕様ダイアログ
    関連端仕様ダイアログ

 以上でモデリングは完了です。モデリングした内容はXMIファイルに保存されます。

リソース自動生成(AndroMDA実行)

 プロジェクトのルートディレクトリでmavenを実行します。

maven

 「build successful」と表示されたら成功です。XMIファイルをもとに各種リソース(Javaソースコード、各種設定ファイル、SQLファイル)が自動生成されます。

JBOSSの設定・起動

 本稿のサンプルでは、JBossに標準で添付しているHSQLDBを使用しますので、テーブルを作成するためにJBossを起動します。

HSQLDBのデータソース設定

 JBossではデフォルトで添付のHSQLDBが使用できる状態になっていませんので、「%JBOSS_HOME%/server/deploy/hsqldb-ds.xml」ファイルの以下の箇所を編集します。

  1. connection-url設定
  2. 以下の記述がコメントアウトされているので、有効にします。
    「hsqldb-ds.xml」
    <connection-url>jdbc:hsqldb:hsql://localhost:1701
    </connection-url>
    
    また同時に、以下の記述を削除して下さい。
    「hsqldb-ds.xml」
    <connection-url>jdbc:hsqldb:${jboss.server.data.dir}
    ${/}hypersonic${/}localDB</connection-url>
    
  3. mbean設定
  4. 以下の記述がコメントになっているので有効にします。
    「hsqldb-ds.xml」
    <mbean code="org.jboss.jdbc.HypersonicDatabase" 
       name="jboss:service=Hypersonic">
       <attribute name="Port">1701</attribute>
       <attribute name="Silent">true</attribute>
       <attribute name="Database">default</attribute>
       <attribute name="Trace">false</attribute>
       <attribute name="No_system_exit">true</attribute>
    </mbean>
    
    上記は、JBossのMBean(管理Bean)の設定です。この設定により、このMBeanと関連づけられたサービスがJBossの管理コンソール上で参照可能となります。JBossの管理コンソールは「http://localhost:8080/jmx-console/」のURLでブラウザからアクセスできます。上記の設定では「org.jboss.jdbc.HypersonicDatabase」のインスタンスを「Hypersonic」(jboss:service=Hypersonic指定により)というサービス名のMBean(管理Bean)で管理することを意味します。そのほかにattribute要素でデータベースのポート番号、DB名、デバッグ出力設定などを定義しています。

JBoss起動

 テーブル作成前にJBossを起動します。

%JBOSS_HOME%/bin/run.bat

DBのテーブル作成

 プロジェクトのルートディレクトリで、以下のコマンドを実行します。

maven create-schema

 自動生成されたSQLファイル(プロジェクトルート「/core/targe/schema-create.sql」)が実行され、JBoss上のHSQLDBにテーブルが作成されます。

EARファイルのデプロイ

maven deploy

 「$JBOSS_HOME/server/default/deploy」フォルダに「itemcategory-app-1.0.ear」ファイルがコピーされ、JBoss上にデプロイされます。デプロイが成功した場合、JBossのコンソール上にデプロイ完了のメッセージが表示されます。

サンプルアプリケーション実行

 では、サンプルアプリケーションを実行してみましょう。

  1. ブラウザで「http://localhost:8080/itemcategory/」にアクセスすると、本稿のサンプルのトップ画面(Item画面)が表示されます。
  2. トップ画面(Item画面)
    トップ画面(Item画面)
  3. 商品の追加
  4. ここでは2件商品を追加します。商品コードは「i-0001」「i-0002」とします。追加された商品は入力フォームの下の一覧に表示されます。商品とカテゴリの関連付けはまだされていませんので、「Categories」の列は空で表示されています。
    商品の追加
    商品の追加
  5. カテゴリの追加
  6. 「Item」画面で[Select other entity:]セレクトボックスの[Category*]を選択すると、「Category」画面に移動します。カテゴリコードは「c-0001」「c-0002」とします。ここでは「Items」リストでは何も選択せず「create」ボタンを押下します。押下後、新規に作成されたカテゴリが入力フォーム下のカテゴリ一覧に表示されます。ここでは商品とカテゴリは関連付けられていませんので、一覧の「Items」フィールドは空で表示されます。
    カテゴリの追加
    カテゴリの追加
  7. 商品とカテゴリの関連付け
  8. 「Category」画面で一覧の[c-0001]の行のラジオボタンをチェックすると、入力フォームに値がコピーされます。[Items]リストで[i-0001]を選択し[Update]ボタンを押下します。カテゴリ一覧のCategorycode[c-0001]の[Items]フィールドには[i-0001]が表示されます。
    商品とカテゴリの関連付け
    商品とカテゴリの関連付け

まとめ

 本稿では、AndroMDAを使用して「多対多」のモデルのデータを管理(新規登録・読み込み・更新・削除)するアプリケーションを自動生成し、その実行までを確認しました。仕様レベルのモデルを定義し、設計モデルそして実装に変換・マッピングするという作業は、ある一定のルールに従って行う事が可能です。この考え方がMDAの基本部分です。MDAを可能な部分からでもシステム開発に適用し、実践することによって大きなメリットを得られるでしょう。

 アプリケーションが実行できた所で、開発者としては自動生成されたアプリケーションの内部構造が気になる所です。「AndroMDAでMDAの世界を体験する(コード分析編)」では、本稿で自動生成されたアプリケーションのコードを解析します。

参考資料

  1. AndroMDA
  2. 『独習オブジェクト指向開発』 古川正寿 著、翔泳社、2004年10月
  3. 『MDAのエッセンス』 Stephen J. Mellor・Kendall Scott・Axel Uhl・Dirk Weise 著、株式会社テクノロジックアート 訳、二上貴夫・長瀬嘉秀 監訳、翔泳社、2004年12月
  4. 『MDA導入ガイド』 Anneke Kleppe・Jos Warmer・Wim Bast 著、株式会社テクノロジックアート 訳、長瀬嘉秀 監修、インプレス、2003年12月


  • LINEで送る
  • このエントリーをはてなブックマークに追加

著者プロフィール

  • WINGSプロジェクト 佐藤 治夫 (株式会社ビープラウド)(サトウ ハルオ)

    <WINGSプロジェクトについて> 有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。2018年11月時点での登録メンバは55名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂...

  • 山田 祥寛(ヤマダ ヨシヒロ)

    静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for ASP/ASP.NET。執筆コミュニティ「WINGSプロジェクト」代表。 主な著書に「入門シリーズ(サーバサイドAjax/XMLD...

バックナンバー

連載:AndroMDAでMDAの世界を体験する
All contents copyright © 2005-2018 Shoeisha Co., Ltd. All rights reserved. ver.1.5