graduation project

64
指導教員: 塚本 享治 教授 2009 年度 卒 業 論 文 分散アプリケーション 生成支援ツールの開発 メディア学部 XML フロンティア-セマンティックドキュメンテーション 学籍番号 M0106242 プラティプナタラン ジャトゥポン 2010年3月

Upload: reason2alive

Post on 14-Jun-2015

134 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Graduation Project

指導教員: 塚本 享治 教授

2009 年度 卒 業 論 文

分散アプリケーション

生成支援ツールの開発

メディア学部 XML フロンティア-セマンティックドキュメンテーション

学籍番号 M0106242

プラティプナタラン ジャトゥポン

2010年3月

Page 2: Graduation Project

i

2009 年度 卒 業 論 文 概 要

論文題目

分散アプリケーション 生成支援ツールの開発

メディア学部

学籍番号: M0106242 氏

名 プラティプナタラン

ジャトゥポン 指導教員 塚本 享治 教授

キーワード コード生成、EJB3.0、 分散アプリケーション、分散データベース、分散トラ

ンザクション ネットワークを介した連携やリソースの分散するために分散アプリケーションは開発工程

が複雑になる。そのような状況を克服するために JavaEE や J2EE のような開発環境が発

展してきたが、それでも開発されるべき分散アプリケーションの数はますます増加するに

もかかわらず、開発環境が不備であるために開発が難しいことは改善せず、現状では管理

が困難であることを否めない。 そこで本研究では設計の工程で部品間の相互関係を記述する ER 図を用いて、JavaEE 環境

に則した分散アプリケーションの基盤を生成することを目指した。設計の段階で描いた ER図からデータアクセス層のエンティティ Bean とビジネスロジック層のセッションを生成

し、プレゼンテーション層のウェブアプリケーションを連携させた分散アプリケーション

の開発を支援するツールを作成した。さらに実装したアプリケーションはどういうふうに

処理を行うかを監視するため、グラフィックユーザインタフェース(GUI)を用いて表示する

ツールも開発した。 このツールの有効ドを確かめるため、分散アプリケーションの例として、書籍販売アプリ

ケーションをオブジェクト指向開発で開発する実験を行った。これにより実際に本研究の

生成方法を用いた場合どのように開発するべきなのかを検討した。その結果、本研究の生

成物は実際に組み合わせて動作してみたところ、分散アプリケーションが開発できること

がわかった。さらに、実装したアプリケーションを監視する GUI ツールを用いてサーバで

起こった処理を明らかにすることもできた。

Page 3: Graduation Project

ii

目次 第 1 章 はじめに…………………………………………………………………………….. 1 第 2 章 研究の背景と目的………………………………………………………………….. 2 2.1 研究の背景……………………………………………………………………………. 2 2.2 分散アプリケーションに関連する技術……………………………………………. 3 2.3 研究の目的……………………………………………………………………………. 4 第 3 章 開発ツールのアーキテクチャ…………………………………………………….. 5 3.1 開発ツールの利用方法………………………………………………………………... 5 3.2 開発ツールの構成 ……………………………………………………………………. 8 第 4 章 分散アプリケーション生成ツールの開発 ……………………………………… 9 4.1 ツールの処理手順……………………………………………………………………. 9

4.1.1 エンティティ Bean クラスの生成…………………………………………….. 9 4.1.2 セッション Bean クラスの生成……………………………………………….. 12

4.2 生成されたソースコード……………………………………………………………. 19 4.2.1 エンティティ Bean およびセッション Bean ……………………………….. 19 4.2.2 手動でソースコードを編集する部分.………………………………………… 21 第 5 章 分散アプリケーション処理の参照 GUI ツールの開発………………………… 23 5.1 GUI ツールの画面…………………………………………………………………… 23

5.1.1 データベーステーブルの表示…………………………………………………… 24 5.1.2 ログ出力画面……………………………………………………………………… 24 5.1.3 データベースに接続し、テーブルの出力画面の操作………………………... 26

5.2 分散トランザクション境界の可視化………………………………………………. 27 第 6 章 分散アプリケーションの開発実験……………………………………………….. 30 6.1 開発・実験および対象となるシステム……………………………………………. 30 6.2 実験手順および評価…………………………………………………………………. 33 第 7 章 考察と今後の課題…………………………………………………………………… 40 7.1 考察……………………………………………………………………………………. 40 7.2 今後の課題……………………………………………………………………………. 41 第 8 章 おわりに…………………………………………………………………………….. 43 謝辞 参考文献 付録 A:エンティティ Bean クラスの変換処理 付録 B:トランザクション属性の処理 付録 C:生成されたソースコードと行数

Page 4: Graduation Project

- 1 -

第1章 はじめに

近頃、パソコンの低下により家庭用のパソコンが普及している。それにより、一般の人々

がノート PC を持ち、ウェブサイトを閲覧することが日常生活によく目にする光景である。

ウェブシステムもそのような影響を受け、大量のアクセスに対し信頼性・便利性などを保

つための技術が必要になる。エンタープライズ・アプリケーション[2]はコンピュータネッ

トワークにおいて、日常生活のあらゆる機能をシステム化するもので、大量の同時アクセ

スをサポートするため、データベースを分散してパフォーマンスを向上する分散データベ

ース・アプリケーションが用いられる。しかし、分散アプリケーションはネットワークに

介して連携・リソース分散するため、開発工程が非常に複雑化し、全体の管理が困難にな

り、欠陥が生じてしまうこともある。そのような状況の中で、J2EE や JavaEE[1]などと

いうエンタープライズ・アプリケーション開発環境が発展してきた。これらの開発環境は

開発支援機能を提供しているが、システム全体の設定やコーディングにはまだ補わなけれ

ばならない部分が多く存在している。 そこで、本研究ではモデル図からアプリケーションの大部分のソースコードを生成する

支援ツールを開発し、さらに実装の段階でどういうことが起きるかを明白にするため、グ

ラフィックユーザインタフェース(GUI)[5]で表示するツールの開発も合わせて行おうと考

えた。モデル図では相互関係やデータ型が明確に記述されるので、そのようなデータをつ

きとめて抽出すればソースコードは間違いなく簡単に生成できる。しかし、分散環境のた

めのアプリケーションなら、別途の処理を付加する部分がありモデル図だけではそういう

処理が記述できない場合が多い。それにツールを実行するアプリケーションを開発し必要

な処理を付け加えることを考えた。一方、生成された分散アプリケーションを実装したと

き背後の処理がどのように起きているかはわからない。これには処理するために GUI のツ

ールの開発を試みたい。 本論文は以下のような構成になっている。第 2 章では研究の背景、現状の分散アプリケ

ーションの開発工程と研究の目的および従来の技術について述べ、第 3 章は開発ツールの

アーキテクチャについてツールの構成や既存している技術との比較を述べる。第 4 章では

分散アプリケーションの生成支援ツールの利用イメージ・構成・処理の手順、第 5 章は前

章のツールで生成され、実装するアプリケーションの処理を参照する GUI ツールの利用方

法と構成について述べる。第 6 章は開発実験および実験の対象となるシステムの構成およ

び実験の手順と評価について語る。最後に第 7 章では考察を行い、本研究で不十分な部分

と今後の課題を述べる。

Page 5: Graduation Project

- 2 -

第2章 研究の背景と目的

2.1 研究の背景

複数のデータベースをネットワークに接続し、個々のコンピュータだけではなし得な

かった効率、使いやすさを追求する分散データベースが利用されている。利用者は分散デ

ータベースの仕組みを有効利用するために、さまざまな分散アプリケーションを使う。分

散アプリケーションは、処理実体が複数個分散して存在するアプリケーションであり、処

理実体間でデータをお互いにやり取りしながら処理を連携し、ひとつの目的を達成する。

ところが、分散アプリケーションの開発にあたっては、開発環境の不備のために開発に苦

労することが多く、現状では管理が困難であることを否めない。そのような問題点をあげ

てみると以下のものがある。 ・コーディング 分散アプリケーションにおける通信アプリケーションインタフェースは業界標準のプリ

ミティブなものの提供のみである。これはネットワークを利用できる階層だけに過ぎない。

そのため、利用法や制限などによりコーディングには経験と注意深さが必要になる。特に

分散アプリケーションのコーディングは、通常のアプリケーションに比べて処理の同期、

データの授受などの操作が困難である。従来の開発環境ではこれらの注意を環境側で備え

ずに、開発者自らが意識的に行う。 ・テスト/デバッグ 分散アプリケーションは複数の処理実体がネットワーク上に分散するので、テストおよ

びデバッグ作業が極端に難しい。また、処理実体の通信のタイミングも問題になり、適当

なテスト/デバッグ環境が現状では存在しない。 ・運用 正常動作の保障のため、分散アプリケーションの各処理実体の動作を監視する実体を常

駐させる必要がある。運用管理として各処理実体がもつ情報に矛盾がないように注意すべ

きである。 これらの点を解決しない限り開発を効率化することはできない。これらのような問題

点に対処する方法としては、コーディングを軽減化するソースコード生成技術があり、テ

スト/デバッグとしては処理実体のモニター監視を行うという方法がある。しかし、前者の

ソースコード生成技術のアイディア自体は実は昔から存在するものの、なぜかこれまで大

きく普及していなかった分野である。そのような状況において特徴的なソースコード生成

Page 6: Graduation Project

- 3 -

支援ツールとそれを監視する GUI ツールを開発する必要がある。 2.2 分散アプリケーションに関連する技術

(1)ソースコード生成技術

ソースコード生成技術(Source Code Generation Technology)とはシステムや理論の背

後にある存在に関する仮定モデルを使ってソースコードを生成する技術である。ソースコ

ードを生成するにはテンプレートエンジンや統合開発環境(IDE)などのプログラミング

ツールを使って行われる。前章で述べたようにソースコードを自動生成するという考え方

は古く、Fortran や COBOL が盛り上がる時代から現在に至るまで、さまざまな技術や製

品が市場に投入されてきた。方式に着目すると 2 つに大別することができる。一つは対象

範囲を限定し定型的なソースコードを生成する方法であり、設計書を読み込み、必要とな

るすべてのソースコードを生成する方法である。ちなみに本研究は前者の方法でコードの

一部を生成することを目指す。

本研究のソースコード生成支援ツールは、現在広く注目を集めているモデル駆動開発

(MDD)[5]やそれに用いる開発ツールとの関連性が深い。既存の開発技術、モデル駆動アー

キテクチャ(MDA、Model Driven Architecture)[5]のツールなどがあり、本研究のツール

で完成した機能の相違点や類似点を検討し研究を行う。

(2)デバッグ技術

最も古く、そして最もよく用いられるデバッグ手法は print 文を使う方法である。プロ

グラムコードに print 文を挿入することで、どの部分が実行されたのか、レジスタや変数

の実際の値はいくつなのかといった情報を表示する方法である。print 文は、ログをとる

処理(ロギング)の一例である。ロギングとは、外部で処理をトレースするために、プロ

セッサを使用して重要な情報をパイプに 書き出す処理のことである。システムの構成要素

に関する情報が プログラマにとって理解できれば、ログは非常に貴重な情報である。

ログを解析し、後処理用のデータベースを生成する際にはロギングツールを使用するこ

ともある。その場合、デバッグ作業の効率化を図るために、ロギング関数を 慎重に選択し

なければならない。例えば、ログメッセージの頭には「警告」、「エラー」、「デバッグ」な

どのキーワードを付加し、メッセージの発生元とその 重要度を明確にする必要がある。メ

ンテナンスが容易になるよう、ロギング出力をいくつかのファイルにグループ分けし、可

能ならばタイムスタンプ情報を付加 するとよい。

Page 7: Graduation Project

- 4 -

もう 1 つよく用いられるデバッグツールにデバッグモニター(リモートデバッガ)があ

る。デバッグモニターは、ターゲットとなる機器/回路の CPU メモリーに格納されたコー

ドに対して使用する。その際にはホスト上でデバッガを利用し、専用ポートを介してコマ

ンドを送信したり、結果を受信したりしてデバッグモニターと通信を行う。

2.3 研究の目的

前章で述べたようにエンタープライズ・アプリケーションは大量の同時アクセスに対応

するリソース分散を行い、処理実体を部品化し分散環境で実装するために開発の複雑さを

否めない要因が多く存在している。システムを構成する要素の相互関係を正確に作るには

手間がかかる。そこで本研究ではモデル図を用い、エンタープライズ・アプリケーション

のためのソースコードの大部分を生成し、分散アプリケーションを実装するツールの開発

を目指す。さらに実装した分散アプリケーションの処理を監視するため分散データベース

の中身やアプリケーション間の処理を参照する GUI ツールを作成する。ソースコード生成

ツールを使い、モデル図からエンティティ Bean と DAO を生成し、最後に開発者がロジ

ックの部分と GUI ツール連携の部分を補って完成させることを目指す。

Page 8: Graduation Project

- 5 -

第3章 開発ツールのアーキテクチャ

3.1 開発ツールの利用方法

(1) 分散アプリケーション生成ツール

本研究は分析・設計の段階で JUDEProfessional[4]というシステム設計支援ツールを用

い、ER 図を描画する。JUDE は UML、ER、DFD、CRUD、業務フロー、マインマップ

を行えるシステム設計支援ツールであり、XMI 出力もサポートしている。XMI はモデル

やメタモデルをツール間で交換できるようにするための仕様で、モデル駆動型開発(MDA、

MDD)を実現する上で、重要な要素である。 JUDEProfessionalにおいてモデルからから情報を取り出す方法には以下の 2つがある。

① JudeAPI で取り出す 直接 API により、値を取り出すことができ、API に精通していれば、使いやすいと思われ

る。しかし、各 API がどのような機能を持っているかがわかりづらく、直接値を取り出す

という部分では図の構造を軽視する傾向になる。 ② XMI 出力して取り出す XMI 出力して取り出す方法は、位置情報などの不要な情報などが大量に付加されているの

で、取り扱いが少々複雑である。しかし、XMI は XML 形式であり、XSLT で変換できる

ため、図の構造を維持したまま順を追って、変換していくことが可能である。 本研究では②の方法を使う。その理由は、図の構造を重要視するとともに必要な情報をソ

ースしやすい形に変換するまでの処理フローが段階を経ることにより、必要な情報が正し

い構造として、変換できるかをみることができるからである。実際に JUDE により出力さ

れた XMI の構造を下記の図に示す。

Page 9: Graduation Project

- 6 -

図 3.1 XMI の構造

この構造に記述されている情報を抽出し、ツールによる変換を実行することで、

分散アプリケーションで利用できるソースコードが生成される。以下の図 3.2 は

ツールの処理手順である。

XSLT①:XMI 簡略化を行うスタイルシート

XSLT②:コードに変換しやすい構造に整形するス

タイルシート

XSLT③:エンティティ Bean 生成スタイルシート

XSLT④:XML②のファイルをさらに簡略化する

スタイルシート

XSLT⑤:クラス情報とメソッド情報を生成するスタイ

ルシート

ユーザ入力:画面から入力されたトランザクション属性

を読み込み、メソッドに付加する。

XSLT⑥:セッション Bean 生成スタイルシート

図 3.2 ソースコード生成の処理手順

このツールを利用するにはウェブアプリケーションを用いて、JUDE で作成された

ER 図

XSLT① XMI 出力してウェブアプリ

ケーションにアップロードする

XSLT② XSLT③

XMI XML① XML② エンティティ

Bean XSLT④

XSLT⑤

ユーザ入力 DAO

(セッション Bean) XML③ XML④

XSLT⑥

ウェブアプリケーション

Page 10: Graduation Project

- 7 -

ER 図を XMI 出力し、アップロードする。アップロードされた XMI ファイルはまず、

エンティティ Bean を生成する。そして、DAO を生成する段階に移す途中で、ユーザ

の入力画面を割り込み、DAO で EJB のトランザクション属性を選択しメソッドに付

加する処理を実行する。詳しい処理フローは第 4 章で述べる。

(2) 分散アプリケーションの処理の参照 GUI ツールの開発

分散アプリケーションを実装した後、どのように処理を遂行し、どういう状態に

なっているのかは人間にとって非常に分かりづらい。そのため、中身の処理を参照し、

実際に動作しているサーバとクライアント間でやりとりされているデータやデバッグ

情報を可視化できればリソースを調整したり効率的にアプリケーションを開発したり

することができるであろう。 そこで、本研究では実装された分散アプリケーションを監視するための GUI ツー

ルを開発することにした。このツールをまず分散アプリケーションの背景で起こって

いる現象やデータベースの中身を参照する基本機能を実装する。GUI ツールの動作時、

ビジネスロジック層での処理を記述しているデバッグファイルを読み込み画面に出力

する。それに、データベースの方へも接続を行い、エンティティのコンテンツなどを

参照し、トランザクションが行われた後、データは挿入されているか(コミット)、失

敗しているか(ロールバッグ)を画面で確認できる。

図 3.3 GUI ツールの利用イメージ

DB DB DB DB

利用者

サーバ

クライアント

開発者

GUI 画面

Page 11: Graduation Project

- 8 -

開発ツールはクライアントとサーバの通信に起こっている現象を記録しているロ

グファイルを読み込み、画面に出力する。また、データベースへ接続し、中身を参照

する機能を付加する。その構成は次節で述べる。 3.2 開発ツールの構成

ツールの利用方法としては次のようなものを想定する。まず、開発の設計図を

JUDE から出力し、ウェブアプリケーションにアップロードする。ウェブアプリケー

ションで生成されたソースコードに開発者がマネージド Bean のクラスとプレゼンテ

ーション層の開発に手を加えることでアプリケーションを実装する。それに生成され

た XML ファイルを変換することにより、GUI 画面にテーブルを描画する。イメージ

としては下記の図である。

図 3.4 開発ツールの構成

①ER 図の設計・XMI 出力

②ウェブアプリケーションで

ソースコードを生成する 開発者

③生成されたソースコードのダウンロード

と編集

サーバ

④アプリケーション実装後、GUI 実行

⑤アプリケーション接続・監視

DB DB

DB DB データベース

⑥データベース接続・監視

Page 12: Graduation Project

- 9 -

第4章 分散アプリケーション生成ツールの開発

4.1 ツールの処理手順

ウェブアプリケーションを通してツールを操作しようと考えた。そこで、JUDE で

作成した ER 図を XMI 形式のファイルを出力させアップロードすることで、アプリケ

ーションがツールを実行し、ソースコードを生成してくれる。ただし、エンティティ

Bean は一連の処理で作成することができる一方、セッション Bean は前章で述べた

ように ER 図ではトランザクション属性が記述されないという問題点があり、生成処

理を別の手順でトランザクション属性を追加する必要がある。すべての手順は以下の

ようなものとなる。

図 4.1 ソースコード生成ツールの処理手順

4.1.1 エンティティ Bean クラスの生成

この処理は ER 図の構造をもとにエンティティ情報の中にあるデータ型やリレー

ション情報といったものを取り出し、エンティティ Bean のソースコードを生成する。

JUDE で作成した ER 図は XMI 出力すると、位置情報など不必要な情報が大量に付

け加えられている。そのため、XMI ファイルの取り扱いが困難で処理が複雑である。

しかし、XMI ファイルは XML 形式であり、XSL スタイルシートで変換できる。その

Page 13: Graduation Project

- 10 -

大量の情報を切り捨てるために、ER 図からエンティティ Bean クラスの生成は 3 段

階に分けて 3 つのスタイルシートを実行する。ここからは図 4.2 の書籍と出版社の関

係を表す ER 図を XMI 形式に出力し、スタイルシートによって変換していく処理の手

順を述べる。

図 4.2 書籍と出版社の ER 図

(1) 第 1 変換

第1変換ではER図から出力されたXMIの必要な情報だけを取り出す処理である。

上記の図 4.2 で出力した XMI は以下の図 4.3 のようなものである。

図 4.3 XMI ファイルの構造

図 4.3 から抜き出した情報はエンティティ情報・リレーション情報・継承情報の 3

つである。詳細の処理は付録 C:エンティティクラスの変換処理に揚げる。

以下の図 4.4 は第 1 変換で出力された結果である。ER 図に記述された属性情報が

Page 14: Graduation Project

- 11 -

エンティティ情報のタグで囲まれている構造で、リレーション情報は別途のノードに

記述されている。

図 4.4 第 1 変換の結果

(2) 第 2 変換

第 2 変換ではリレーション情報からリレーションを保持する変数を生成し、エンテ

ィティ情報の中に含める。処理手順としては、まずエンティティ要素に必要な情報を

付加し、属性情報を生成する。生成された属性情報にデータ型や外部キーなどの情報

を持たせる。最後に継承情報を抽出し、属性情報の中に含める。

図 4.5 第 2 変換の結果

Page 15: Graduation Project

- 12 -

上記の図 4.5 が第 2 変換の結果である。属性情報要素の中に、アノテーション要素

を含んでいるものは第 1 変換の結果から取り出したリレーション情報で作成される。

(3) 第 3 変換

第 3 変換では実際にエンティティ Bean のクラスを作成する。エンティティ Bean

に必要なライブラリを import 文の先頭に宣言する。そのあと主キー属性や方向の指

定などの部分を第 2 変換の結果から読み取り処理を記述する。

4.1.2 セッション Bean クラスの生成

EJB3.0 では、データアクセスオブジェクト(DAO)をセッション Bean として取り

扱うことができるので、ここで生成するセッション Bean は DAO の生成である。以

下ではまとめてセッション Bean と呼ぶ。処理の流れとしては上記のエンティティ

Bean 生成処理の第 2 変換の結果を用いて、DAO で用いる有意義なコンテンツだけを

抽出し、その後はウェブアプリケーションの画面でトランザクション属性を編集した

り追加したりすることができる。詳しい処理を以下に説明する。 (1) 簡略化変換

① 簡略化 図4.6の結果にスタイルシートを用いてXMI形式のファイルの簡潔化を行う。その後、

結果のファイルを用いてインタフェースとセッション Bean を生成する。

i)エンティティ情報 エンティティ情報はエンティティの順番を取り除き、name 属性だけを残しておくも

のである。

ii)属性情報 属性情報はデータ型および属性名を残し、それ以外の情報を取り除くものである。

Page 16: Graduation Project

- 13 -

図 4.6 簡略化前のファイル

図 4.7 簡略化後のファイル

エンティティ情報の name 属性を抽出し、属性情報の name 属性と datatype 属性を

抽出し結果ファイル生成した。これらを用いて次の変換を行う。

② クラス情報 ここで<Class></Class>タグを作成し、デフォルトで<method></method>タグを

3 つ用意してある。それぞれの name 属性が create, find, list という値を持つ。これ

は DAO でよく扱う処理の挿入、検索、リスト検索という意味を持っている。さらに、

create, find, list に transaction-type という属性を持たせ、デフォルト値は順番に

REQUIRED, NEVER, NEVER を指定する。メソッドの内容を変換する処理の手順は

以下のようになる。

i) クラス情報 エンティティ情報の name 属性を<Class></Class>タグの name 属性に指定す

る。

Page 17: Graduation Project

- 14 -

ii)メソッド情報 メソッド情報は 3 つそれぞれあり、name 属性に独立の名前を持ち、処理も異

なる。以下の項でその処理と記述形式を説明する。 a) create create メソッドはデータベースに対しデータを挿入するメソッドである。属性情報

に記述されたデータ型とデータ名を抽出し処理の手順を記述する。処理の内容は各デ

ータを宣言し、インスタンス化されたものをエンティティマネージャーにより永続化

する。

b) find find メソッドはデータベースに対し主キーを用いデータベースの該当する情報を

一列だけ抽出する。主キーはユーザから入力されるものと予想されるので、ここは常

に pkey という整数型のデータを取得し、処理を行うようにする。

c) list listメソッドはデータベースに対し情報をリスト型ですべての列抽出しエンティテ

ィ Bean に代入しリターンする。ここでの処理は EJB クエリ文を実行し、リスト化し

たエンティティ Bean に格納する。

変換した結果は以下の図 4.5 のようになる。

Page 18: Graduation Project

- 15 -

図 4.8 生成されたクラス情報の結果

③ インタフェース生成 インタフェースはセッション Bean を呼び出すための Java クラスファイルのこと

である。生成処理で記述するのは以下のものである。 i)import 文 呼び出しのアノテーションとエンティティ Bean のクラスのパッケージおよびセッシ

ョン Bean のリストのデータ型に対応するための import 文を用意し、インタフェース

クラスにすべて同じものを記述する。 i i)アノテーション

実装環境外に EAR デプロイメントがある場合は@Remote アノテーションを使用

する。本ツールの場合は分散環境で実装し、継承されるため、デフォルトに@Localを指定する。

i i i)メソッド

インタフェースのメソッドはすべてセッションBeanにインプリメントされるため、

クラス情報のメソッドに合わせ指定する。

図 4.9 生成されたインタフェース

Page 19: Graduation Project

- 16 -

④ セッション Bean の生成 前述べたようにセッション Bean は DAO の機能を持たせることができる。ここ

で生成処理の手順を説明する。

i)import 文 インタフェースとエンティティBeanのクラスのパッケージに対応するための import文を用意し、インタフェースクラスをインプリメントさせる。それに、データベース

をアクセスするために EntityManager や Query の import 文も先頭に宣言する。 i i)アノテーション

セッション Bean は主に 2 種類に分かれている。ステートフルセッション Bean と

ステートレスセッション Bean である。本ツールのソースコードマネージド Bean に

継承されるのですべてステートレスセッション Bean を生成する。

i i i)メソッド 各メソッドはデータベースにアクセスする処理を記述する。その各メソッドにトラン

ザクション属性をクラス情報変換結果から抽出し指定する。 (2) ウェブアプリケーションで編集実行

この処理は簡略化変換の結果をウェブアプリケーションの画面において編集する

もので、Java プログラムを実行してセッション Bean のトランザクション属性を自由

に選択できる。この画面はサーブレット経由で Java プログラムを実行しスタイルシ

ートの実行結果を読み込み、デフォルトで設定された値を画面に表示させる。画面は

以下の(3)で説明をするが、この説ではウェブアプリケーションの実行処理について述

べる。 EJB3.0 はトランザクション属性をメソッドの先頭に宣言すると、メソッドの処理

が実行され、データベースにアクセスするたびにトランザクションの処理が実行され

る。トランザクション属性はエンタプライズ Bean 全体、Bean 個別のメソッドごと、

またはその両方に対して指定できるが、本研究ではメソッド単位で指定することを前

提にする。トランザクション属性の種類は以下の 6 つである

Page 20: Graduation Project

- 17 -

表 4.1 EJB トランザクションの属性と機能の説明

属性 説明

NOTSUPPORTED メソッドを呼び出すと、コンテナは既存のトランザクションを停止する

SUPPORTS メソッドを呼び出すと、コンテナは、属性があればトランザクションに

含める

REQUIRED このメソッドはトランザクション内で呼び出す必要がある。現行のトラ

ンザクションがなく、メソッドで コンテナマネージドトランザクション

を使用している場合、コンテナは新しいトランザクションを開始する。

REQUIRED_NEW このメソッドを呼び出すと、コンテナは常に新しいトランザクションを

開始する。メソッドが終了してログ ファイルに警告メッセージが書き込

まれるまで、コンテナは既存のトランザクションを停止。

MANDATORY このメソッドはトランザクション内で呼び出す必要がある。現在トラン

ザクションがない場合は、コンテナから例外が返される。

NEVER このメソッドはトランザクション内で呼び出してはならない。このメソ

ッドをトランザクション内で呼び出すと、コンテナから例外が返される。

(3) トランザクション属性を選択する画面

この画面で各クラスの各メソッドのトランザクション属性を編集することができる。

編集しないで、そのままソースコード生成を実行することもできる。画面は以下の図

4.7 のようになる。

Page 21: Graduation Project

- 18 -

図 4.10 トランザクションの属性を選択・変更する画面

上記の表 4.1 で、トランザクション属性の使いわけを想定し、画面の各メソッドに

指定し、ボタンを押すと XML ファイルのメソッド情報の transaction-type 属性が変

更される。

図 4.11 画面操作でノードを変更した XML ファイルのイメージ

選択して、画面実行

トランザクション属性を

選択して、変更する

デフォルト値 変更後の値

Page 22: Graduation Project

- 19 -

4.2 生成されたソースコード

最終的に generate ボタンを押すとソースコードのすべてが生成され、ファイル

に圧縮する。その圧縮ファイルをダウンロードし、解凍するとソースコードおよび、

各段の変換に使う XML ファイルが入っている。しかし、エンティティ Bean とセッ

ション Bean のソースコードには分散環境で実装するために、@PersistenceContextアノテーションやコメントアウトが記述された部分などを編集する必要がある。ここ

で細かくソースコードをみていく。 4.2.1 エンティティ Bean およびセッション Bean

(1) エンティティ Bean

エンティティ Bean には双方向・単方向というエンティティの関連性が記述されて

いる。エンティティ Bean のソースコードに関連性が単方向処理の場合に、以下の図

4.17 の部分のコメントアウトを外す必要がある。

図 4.12 コメントアウトされた部分

サンプル ER 図の中で出版社と書籍の関連性は単方向であれば、図で指定された

部分のコメントを外す。そうでない場合は、そのコメントごと削除してもかまわない。

Page 23: Graduation Project

- 20 -

(2) セッション Bean

セッション Bean の場合は、トランザクション属性アノテーションの部分がすべて

コメントアウトされている。必要のないところにトランザクションの処理を実行して

もデータベースへのアクセスに負担がかかるだけなので必要なところだけコメントを

外し、コンパイラーを実行する。それにソースコードファイルの下部にこのようなメ

ソッドを追加する。

このメソッドは生成されたステートフルセッション Bean に対し、Bean のライフ

サイクルを破棄し、初期化する機能を持っている。ソースコード全体としては、下記

の図 4.18 になるが、このソースコードを見ると各メソッドの上に以下のアノテーショ

ンがコメントアウトされている。

コメントを外すことで、このメソッドにアクセスするたびにトランザクションの処

理が実行されるということである。

Page 24: Graduation Project

- 21 -

図 4.10 トランザクション属性の指定する部分

4.2.2 手動でソースコードを編集する部分

前節 4.1 で本ツールを用いた開発では、すべてのアクションメソッドを持つマネー

ジド Bean がひとつだけ生成されるようになっているため、ほぼすべてがマネージド

Bean ひとつに記述されている。プレゼンテーション層のアプリケーションにあまり

影響はないが、システムが大規模で複雑になることでマネージド Bean の部品化が必

要となる。そこで、生成物を継承したクラスを作り、そこに固有の処理を記述するこ

とにした。自分の作成したものと本ツールが生成したものの区別が明確になり、生成

したクラスのテストしなおす必要がなくなる。継承の対象は以下の 2 つである。

(1) マネージド Bean

マネージド Bean はセッション Bean(DAO)を継承したクラスである。ビジネスロジッ

ク層の部品を呼び出すだけの処理を記する。いわゆる、アクションメソッドを記述し、

ビジネスロジック層の処理をまとめるクラスである。 (2) データアクセスオブジェクト(DAO)

DAO は EJB3.0 でセッション Bean として実装する。セッション Bean はインタフェ

ースをインプリメントするルールなので、インタフェース側も継承する必要がある。

Page 25: Graduation Project

- 22 -

インタフェースでは@Remote アノテーションと@Local アノテーションがあり、実装

には@Stateless アノテーションと@Stateful アノテーションがそれぞれ必要であるが、

継承で用いるクラスではどちらかを記述すれば実装できる。

Page 26: Graduation Project

- 23 -

第5章 分散アプリケーション処理の参照 GUI ツールの開発

本ツールは分散データベースを外部からアクセスし中身を参照することと、分散ア

プリケーションにまたがる処理を可視化することを目的とする。ツールの実行は分散

アプリケーションを実装後に行う。

ただし、ツールは分散アプリケーションに直接接続することが考えられるため、別

のアプリケーションを作成しサーバに配備する必要はない。本ツールのデバッガプロ

グラムを EJB3.0 のマネージド Bean として分散アプリケーションのビジネスロジッ

ク層とともに実装することで、GUI 出力画面でサーバの処理を参照することができる。 5.1 GUI ツールの画面

開発ツールの画面を図 5.1 に示す。使用目的により 4 つの部分にわかれ、以下のよ

うになる。

図 5.1 開発 GUI ツールの画面

① 描画画面

① ②

Page 27: Graduation Project

- 24 -

② サーバの出力画面の操作 ③ テーブルの出力画面の操作 ④ 描画画面の操作ボタンおよびツールの終了ボタン

5.1.1 データベーステーブルの表示 (①)

図 5.2 変換した XML を読み取って描画する画面

ER 図で変換された XML ファイルを読み取ってデータベースで作られたテーブル

をこの画面で描きだす。上記の場合は、第 4 章で使った例の変換結果を読み込み、出

力させてみた。 5.1.2 サーバに接続し、ログの出力画面の操作 (②)

図 5.1 の(②)の部分には、IP アドレスを指定する空欄とボタンを配備した。その空

欄に IP アドレスを入力し、ボタンを押すと図 5.4 のような GUI 画面が実行される。

それに IP アドレスの入力欄は 4 つまで入力できる。それは本研究の分散アプリケー

ションの分散環境では 4 台のサーバから構成されているためである。

Page 28: Graduation Project

- 25 -

図 5.3 サーバの IP アドレスを指定するパネル

図 5.4 サーバのログを出力する画面

この画面はプロトコル通信を使って指定されたサーバのログ記録を画面に出力

する。ログの記録はサーバディレクトリの場所に保存されているため、それを読

み出すプログラムを設置し、通信によって書き換えられたときにこの画面に文字

を出力する。

Page 29: Graduation Project

- 26 -

5.1.3 データベースに接続し、テーブルの出力画面の操作(③)

図 5.5 データベースの情報指定、接続するパネル

入力欄の説明

IP:データベースサーバの IP アドレスの入力空欄 Port:データベースサーバが使用しているポート番号の入力空欄 データベース名:データベースサーバで立ち上がっているデータベース名の入力

空欄 ユーザ/パスワード:データベースサーバにアクセスするユーザ名とパスワードの

入力空欄 ドライバー:データベースのドライバーを指定 接続ボタン:データベースに接続を行う。 切断ボタン:データベースサーバのアクセスを切断する。

図 5.6 データベースの中身を取り出して表を出力する画面

Page 30: Graduation Project

- 27 -

図 5.6 の画面はデータベースから取り出したデータを表に表示させる。その表のデ

ータを整理するためには、データベースサーバにすべてのエンティティデータをまと

め、別途のテーブルを作成し、データベースに保存する。第 4 章で使用した ER 図の

図 4.2 の例でテーブルを作る場合、以下のような表 5.1 になる。

図 4.2 第 4 章で例題とした ER 図

表 5.1 データベースにエンティティ情報を保存する TABLES エンティティ

TAB_ID TABLE_NAME COL COL_NAME 1 Publisher 2 PUB_ID(Integer),

P_Name(String) 2 Book 6 BOOK_ID(Integer),

Title(String), ISBN(String), Price(Integer), Author(String),

PUB_ID(Integer) 表 5.1 はサーバが使用しているデータベースに入っているテーブル名を登録する

テーブルである。 5.2 分散トランザクション境界の可視化

この画面はパネル②にサーバの IP アドレスを入力しアクセスする。接続している

状態において各サーバ実行されているメソッドを画面に表示させる。表示されている

内容は IP アドレスとメソッド名が対象となる。開始メソッドと呼び出す対象のメソ

ッドの間に線を引いてつなげる。

ツールの実装はビジネスロジック層のアプリケーションとして分散アプリケーショ

Page 31: Graduation Project

- 28 -

ンの処理をかき集め、起こっている現象を GUI の画面に送信する。送信対象のデータ

はサーバ IP、開始メソッド名と呼び出し対象となるメソッド名である。

それぞれのメソッド名をノード化し、灰色の円を画面に出力する。呼び出し対象と

なるメソッドに対し、どのメソッドを実行しているかを IP アドレスの下側にメソッ

ド名の文字列で表示する。

実行時の状況を以下の図 5.7 に示す。

図 5.7 実行されているメソッドを表示

この画面に出力させたのは書籍注文の処理である。最初のノードは 163.215.69.49

のサーバからカートに入れてある書籍情報を 163.215.69.50 のサーバにあるノードを

呼び出し転送する。注文を受け取るメソッドは同サーバにある注文記録のデータベー

スのテーブルにデータを挿入する。

この場合データベースが更新されるため、トランザクションの処理を実行する必要

があるので、そのトランザクションを開始するメソッドと実行対象のメソッドに楕円

を囲んで境界線を引く。

163.215.69.49

addBook()

163.215.69.50

addOrder()

163.215.69.50

addSale ()

サーバ IP とそのサーバで実行

されているメソッド

メソッド代理の円

IP アドレス入力

Page 32: Graduation Project

- 29 -

図 5.8 トランザクションの呼び出しメソッドと対象メソッドの境界線

前に示したように GUI ツールの対象となるメソッドはビジネスロジック層に実装

しているマネージド Bean に参照する。分散アプリケーション実装時にマネージド

Bean や DAO と同時にコンパイルし同時に実行させる。GUI は別の場所で実行し、

後に処理を参照することもできる。なお、この GUI ツールを実行しても、しなくとも

分散アプリケーションは正常動作をすることを前提にする。

開発者がこの画面を参照し「10 秒スリーブ」ボタンを押すとトランザクションの

途中に 10 秒を待つという処理を差しはさんで、トランザクションを一時停止するこ

とができる。また、起こった現象が見たくなければ、「画面クリアボタン」を押し、描

画画面からすべてのノードを消すことができる。

168.215.69.49

addBook()

168.215.69.50

addOrder()

168.215.69.50

addSale ()

トランザクションが発

生している境界線

Page 33: Graduation Project

- 30 -

第6章 分散アプリケーションの開発実験

開発したツールを用いて例として書籍販売システム・アプリケーションの分析・設

計・開発を行う。ビジネスロジック層のアプリケーションは第 4 章のソースコード生

成支援ツールを利用して生成する。そののち、生成物を組み合わせ、分散環境で実装

する。 6.1 開発・実験および対象となるシステム

以下の図 6.1 は書籍販売システムの全体図である。

図 6.1 全体図の構成

データアクセス層 プレゼンテーション層 ビジネスロジック層

マネージド Bean

DAO(セッション Bean)

163.215.69.48

163.215.69.49

163.215.69.50

163.215.69.51

Page 34: Graduation Project

- 31 -

図 6.2 開発実験用の画面遷移の全体図

Page 35: Graduation Project

- 32 -

図 6.3 開発実験データの ER 図

図 6.4 分散環境でエンティティを分けた ER 図

この全体の構成により、書籍販売システムの開発実験を行う。

Page 36: Graduation Project

- 33 -

6.2 実験手順および評価

6.2.1 ソースコード生成およびデータベース・アプリケーションの開発実験

(1) 実験手順

① 図 6.3 の ER 図からエンティティ Bean およびセッション Bean を生成する。 ② マネージド Bean を編集しアプリケーションと固有の処理を追加する。 ③ サーバを立てウェブアプリケーションと組み合わせ実装し動作の実験を行う。

図 7.1 実験開発した書籍販売システムの全体図

(2) 実験結果

表 6.1 生成されたファイルと書き足した行数

ファイル ファイル数 総行数 エンティティ Bean 10 882 行 DAO(セッション Bean) 20 770 行 マネージド Bean 8 340 行 合計 2,142 行

マネージド Bean

DAO

エンティティ Bean

画面

Page 37: Graduation Project

- 34 -

表 6.2 書き足したファイルと行数 ファイル 行数

DAOを継承したManagedBean.java(補) 198 行 CartBean.java(新) 103 行 CustomerManagerBean.java(補) 28 行 BookManagerBean.java(補) 60 行 SaleManagerBean.java(補) 28 行

合計 417 行 新:新規作成ファイル

補:生成されたファイルへの書き足し

ManagedBean.java には例題で用いられた各処理をすべてアクションメソッドの中

に記述したことで、書き足しが多い。また、トランザクション属性の書き足した部分

や DAO の継承の宣言により書き足した量が多くなる原因の一つである。

CartBean.java は買い物かごの役割を持ち、選択した商品の情報を格納するクラスな

ので、新規作成で書き足した行数が多い。 CustomerManagerBean.java と

BookManagerBean.java と SaleManagerBean.java はエンティティマネージャーが

管理するデータベースに関する操作を記述するクラスで、新規オブジェクトの作成

(create)、主キーによる検索(find)、全データ取得(list)が第 4 章で述べたとおり、もと

もと生成時に用意されているものである。しかし、プレゼンテーション層のアプリケ

ーションの処理を実行する際に追加する必要がある部分を以下に述べる。 CustomerManagerBean.java ログインの認証における顧客検索処理とユーザ登録における挿入処理を追加した。 BookManagerBean.java ISBN 番号による検索処理を追加し、注文を受ける際に倉庫に残る書籍の数を減らす

処理を追加した。 SaleManagerBean.java 注文を受ける際、明細書に担当者店員の名前を記述するために店員の検索処理を追

加した。

実際にアプリケーションを実装し、動作を確認してみたところ、すべての処理が正

常に動作した。

Page 38: Graduation Project

- 35 -

6.2.2 ソースコード生成および分散アプリケーションの開発実験

(1) 実験手順

① 図 6.4 の ER 図からエンティティ Bean およびセッション Bean を生成する。 ② マネージド Bean を編集しアプリケーションと固有の処理を追加する。 ③ 分散環境を用意しウェブアプリケーションと組み合わせ実装し動作の実験を行う。 i) 分散アプリケーション間のデータ送受信の実験 ii) 2 フェーズコミットの実験 (2) 実験結果

表 6.3 生成されたファイルと書き足した行数

ファイル ファイル数 総行数 エンティティ Bean 10 974 行 DAO(セッション Bean) 20 890 行 マネージド Bean 12 410 行 合計 2,274 行

画面

マネージド Bean

DAO

エンティティ Bean

Page 39: Graduation Project

- 36 -

表 6.4 書き足したファイルと行数 ファイル 行数

DAOを継承したManagedBean.java(補) 249 行 TCartBean.java(新) 103 行 TCustomerManagerBean.java(補) 31 行 TBookManagerBean.java(補) 63 行 TSaleManagerBean.java(補) 28 行

合計 474 行 新:新規作成ファイル

補:生成されたファイルへの書き足し

ManagedBean.java には実験 6.2.1 のようにアクションメソッドの中に記述した。

それに他のサーバを接続し、データのやりとりを処理するためのメソッドを追加する

ところなどが含まれるので、書き足した量が多くなる原因である。CartBean.java は

買い物かごの役割を持ち、選択した商品の情報を格納するクラスなので、新規作成で

書き足した行数が多い。 CustomerManagerBean.java ログインの認証における顧客検索処理とユーザ登録における挿入処理を追加した。 BookManagerBean.java ISBN 番号による検索処理を追加し、注文を受ける際に倉庫に残る書籍の数を減らす

処理を追加した。 SaleManagerBean.java 注文を受ける際、明細書に担当者店員の名前を記述するために店員の検索処理を追

加した。

実際にアプリケーションを実装し、動作を確認してみたところ、すべての処理が正常

に動作した。また、分散環境で実装したアプリケーションのデータ送受信やトランザ

クション処理を以下の 6.2.3GUI ツールで確認する。

Page 40: Graduation Project

- 37 -

6.2.3 GUI ツールとの連携でデータベースおよびトランザクション境界の参照実験

(1) 実験手順

① 実験 6.2.2 のアプリケーションに本ツールの連携処理を追加する。 ② トランザクション処理を起こすようにアプリケーションを実行させる。 ③ GUI ツールを実行し、その背景で起こった現象を監視する。 i) 2 フェーズコミットのコミットとロールバッグの参照をする。 (2) 実験結果

① 実験 1:コミット境界の参照

書籍を選択し買い物かごにいれ注文する。

図 6.1 実行されたメソッドの可視化

この図 6.1で表示されているノードはプレゼンテーション層の画面で選択した書籍

を注文し注文表を作成するまでの処理である。注文を確認し、買い物完了後、以下の

図で示すように、データベースを更新しトランザクションが発生したので、トランザ

クションを開始するメソッドと呼び出す対象のメソッドの周りに境界線を引く。

168.215.69.49

addBook()

168.215.69.50

addOrder() 買い物かごに入れる

注文を決める

Page 41: Graduation Project

- 38 -

図 6.2 トランザクション処理の呼び出しメソッドと対象メソッドの境界

実行したツールをこの図 6.2のように楕円でトランザクション処理を発生したメソ

ッドのノードから呼び出した対象のメソッドのノードまで境界線を楕円で囲んだ。こ

のように実際にトランザクションはどのサーバでどの処理に実行されたかを可視化で

きる。

一方でトランザクション処理にロールバッグが実行された場合、画面は下記の図 6.

3 のようになる。

買い物かごに入れる

168.215.69.49

addBook()

168.215.69.50

addOrder()

168.215.69.50

addSale()

注文を決める

注文伝票をデータベースに登録

Page 42: Graduation Project

- 39 -

図 6.3 トランザクション境界の表示とロールバッグの通知

この図 6.3でトランザクション処理が失敗した場合、メッセージを画面に通知し、

データベースにアクセスしているメソッドを書きだす。

トランザクション失敗:ロールバッグ

メソッド:addSale()

168.215.69.49

addBook()

168.215.69.50

addOrder()

168.215.69.50

addSale()

Page 43: Graduation Project

- 40 -

第 7 章 考察と今後の課題

7.1 考察

(1) アプリケーション生成支援ツール ① 分散環境でないアプリケーション ・エンティティ Bean 生成されたエンティティ Bean は手を加えることなく使用することができた。マネー

ジド Bean をステートフルセッション Bean として実装することで、プレゼンテーシ

ョン層のアプリケーションから直接エンティティ Bean を使うことができる。 ・DAO(セッション Bean) 生成された DAO はプレゼンテーション層のアプリケーションの処理の必要に応じ、

書き足した部分がある。それにマネージド Bean を利用しないでプレゼンテーション

層から処理を直接呼び出されることはできない。それは生成された部分が限られた機

能しか持っていないため、処理が不明確になりアプリケーションの正常動作は保障で

きない。 ・マネージド Bean マネージド Bean に直接すべてのビジネスロジックを書き加えることは一般的に使用

していない方法である。だから、DAO の継承を用いて拡張する方法で独自に開発し

た部分が明確になり安全である。いわゆる、ビジネスロジック層でマネージド Beanを部品化することで、マネージド Bean がアクションを受け取る部分であり、実際の

処理メソッドを呼び出してアクションを遂行する部分である。このような方法により

内部の処理が簡単に記述でき、明確となる。 ② 分散環境のアプリケーション

・エンティティ Bean エンティティ Bean は分散環境でない場合と同じく手を加えることなく生成し使用す

ることができた。

・DAO(セッション Bean) 書き足した部分が単体サーバより多くなるが、マネージド Bean に継承された分、処

Page 44: Graduation Project

- 41 -

理の複雑化が重大な問題ではなくなる。また、トランザクションの処理について、マ

ネージド Bean がすべてを呼び出すことによりデータベースの信頼性が保証できる。

・マネージド Bean 分散環境の各サーバにお互いデータをやり取りするために用いた。プレゼンテーシ

ョン層から呼び出したアクションメソッドをマネージド Bean 経由で処理する。分散

トランザクションを実行し、2 フェーズコミットを遂行するのがこのマネージド Beanである。

分散アプリケーション開発方法の観点からいえば本ツールは部分的に利用するべきだ

と分かった。通常の開発方法の中で本ツールを利用し、負担を減らすのが実用的であ

る。 (2) 分散アプリケーション処理の参照 GUI ツール

GUI ツールを使うことで、分散アプリケーションの各サーバの背後で実行されている

メソッドが可視化できた。データベースに接続し、データの確認などを画面に表示さ

せることもできた。それらの画面に表示されている状態などを参照しながらサーバを

効率的に調整することもできた。このツールはアプリケーション実装後に起動し利用

するのが実用的である。 7.2 今後の課題

(1) ソースコード生成支援ツール

今回、ソースコード生成支援ツールを利用したことでエンティティ Bean と DAO を

生成することはできたが、それはビジネスロジック層とデータアクセス層のソースコ

ードだけであった。ビジネスロジック層のマネージド Bean も完璧とは言えない。ア

クションメソッドを書き足した量からみると改善の余地がある。 また、プレゼンテーション層のオブジェクト指向開発に触れていない部分が多くあり、

開発者自身がその部分のコーディングを行わなければならない。これは実際の開発手

法に比べてまだ足りない部分である。 (2) 分散アプリケーション処理の参照 GUI ツール

Page 45: Graduation Project

- 42 -

GUI ツールを用いてサーバの状況を参照することは可能である。しかし、その処理の

途中で、パフォーマンスが落ちる場合もある。また、データベースのテーブルを参照

するパネルはデータを抽出し、テーブルで表示することは完全にできる。しかし、そ

のテーブルからデータを更新・削除するといった処理を遂行することはできない。そ

のため単に中身のデータを見ていることに過ぎないので、今後そのような機能を追加

する必要がある。

Page 46: Graduation Project

- 43 -

第 8 章 おわりに

ER 図からエンティティ Bean とセッション Bean を生成するツールを開発し、利用

実験を行った。そのツールのオブジェクト指向開発方法の中でどのように用いるかを

明らかにした。ただし、分散アプリケーション全体を生成するのではなく、ビジネス

ロジック層とデータアクセス層の大部分を生成するのが前提となっている。

エンティティ Bean とセッション Bean は自動生成することができ、ビジネスロジ

ック層の開発に開発者が加えることで動作する分散アプリケーションを開発すること

ができた。開発者の役目はビジネスロジック層を部品化することやマネージド Beanと DAO を拡張に継承を用いることである。開発支援ツールを含め、そのような方法

を用いることで、実際の開発においても効率的な方法だと考えられる。 しかし、ビジネスロジック層の開発は開発者自身で行わなければならない。この問

題は今後の残された課題である。 また、データベース参照の GUI ツールについては、目的とした必要最低限の処理機

能をすべて実現できた。しかし、データベースパネルに関するところはデータ参照の

他にデータの更新や削除という追加機能があればもっと便利に利用価値があるに違い

ない。 各ツールには改善点が多くあるが、実験で分散アプリケーションが開発できたとい

う結果を得たことで意義であったといえる。

Page 47: Graduation Project

- 44 -

謝辞

本研究の卒業論文は東京工科大学メディア学部メディア学科に在籍中の研究成果を

まとめたものです。本論文を完成するにあたり、厳しくも優しいご指導をくださった

塚本享治教授のおかげです。本論文の細部にわたりご指導を戴いたことに感謝の気持

ちをこめて心よりお礼を申し上げます。

また、日本に留学している 5 年間タイ王国大使館学生部の学生監督官の皆さまに大

変お世話になりました。日本で純情な生活を送るために様々なアドバイスをしていた

だきました。ここに感謝の意を表します。

最後にアドバイスを下さった大学院生・卒業研究をともに頑張ってきた研究室の皆

さん・いつも励ましの言葉で応援してくれた家族に心から感謝いたします。

Page 48: Graduation Project

- 45 -

参考文献

[1] 斉藤賢哉、”マスタラング JavaEE5”、翔泳社、2007 [2] Jim Arlow/Ila Neustadt、Enterprise Patterns and MDA:Building Better Software with Archetype Patterns and UML、Addison-Wesley Object Technology Series、2004 [3] Tom Rowlett、The Object-Oriented Development Process、Prentice Hall、2000 [4] 細谷泰夫、JUDE で学ぶシステムデザイン、翔泳社、2008 [5] Anders Mattsson/Members、Linking Model-Driven Development and Software Architecture:A Case Study、IEEE Transactions on software engineering vol. 35, No.1 January/Febuary、2009 [6] 森望美、モデル図からのエンタープライズ・アプリケーション生成、東京工科大

学メディア学部卒業論文、2009.3 [7] 松信嘉範、Java データアクセス実践講座、翔泳社、2008 [8] Ed Roman/Rima Patel Sriganesh/Gerald Brose、Mastering Enterprise JavaBeans 3rd Edition、The Middleware Company、2006 [9] OMG information in Japanese、http://www.otij.org/omg/ [10] Floyd Marinescu、EJB Design Patterns、The Middleware Company、2002 [11] Javid Jamae/Peter Johnson、JBoss in Action、Manning、2009 [12] Matthew Robinson/Pavel Vorobiev、Swing Second Edition、Manning、2003 [13] Benjamin G. Sullins/Mark B. Whipple、EJB Cookbook、Manning、2003 [14] 中川信行、Java 逆引きクイックレファレンス、毎日コミュニケーションズ、2007 [15] 西村めぐみ、図解でわかる Linux 環境設定のすべて、日本実業出版社、2004 [16] 一戸英男、図解でわかる Linux サーバ構築・設定のすべて、日本実業出版社、

2005 [17] Michael Sikora、EJB3 Developer Guide、Packt、2008 [18] 吉原洋平、J2EE プログラマのための EJB パーフェクトガイド、技術評論社、

2003 [19] 山田和夫、EJB3.0 プログラミング、ソフトバンククリエーティブ、2006

Page 49: Graduation Project

- 46 -

付録 A : エンティティ Bean クラスの変換処理

図 1 書籍と出版社の ER 図

(1) 第 1 変換

第 1 変換では必要な情報だけを XMI ファイルから抜き出すスタイルシートを実行す

る。これから XMI ファイルの構造から抽出するエンティティ情報としては以下の図 2と図 3 のようになっている。

図 2 エンティティ情報の構造

エンティティ情報

属性情報

Page 50: Graduation Project

- 47 -

①エンティティ情報 スタイルシートは図 2 の<JUDE:EREntity></JUDE:EREntity>のタグに対して属性

name を<Entity></Entity>の name 属性として取り出す。そして、次の処理は属性情

報の構造の中の属性 name を取り出す。<JUDE:ERAttribute></JUDE:ERAttribute>タグの中の構造は以下の図 4.4 である。

図 3 属性情報の構造

i) 属性情報の中の name 属性を<Attribute></Attribute>の name 属性として抽出す

る。 ii)データ型を<Attribute></Attribute>の data-type 属性として抽出する。 iii)主キーと外部キーの情報を<Attribute></Attribute>の primarykey 属性として抽

出する。

属性情報

制約情報

データ型情報

Page 51: Graduation Project

- 48 -

図 3 のようにエンティティ情報の下部に制約情報のリストがある。属性情報に制約情

報への参照 ID が含まれている。主キー (PRIMARYKEY) または外部キー

(FOREIGNKEY)という制約情報の ID を持っている場合には主キーであると判断し、

primarykey 属性を”true”とする。そうでない場合には、primarykey 属性を空とする。 iiii)上記の(ウ)と逆に外部キーの場合には<Attribute></Attribute>の foreignOwner属性を持たせる。 制約情報 ID によって外部キーだと判断される場合は foreignOwner 属性を”true”とする。そうでない場合は foreignOwner 属性を空とする。 ②リレーション情報

図 4 リレーション情報の構造(左:簡略化、右:中身の一部拡大)

上記の図 4 のようにひとつの関連性はリレーション情報の中で各端から見た関連

性が含まれている。それぞれの抽出は以下の処理となる i)<relationshipEnd></relationshipEnd>の position 属性として片側から見た関連

性の出現の順番の数字を持たせる。 ii)方向情報を<relationshipEnd></relationshipEnd>の direction 属性として持た

せる。

リレーション情報 片側の情報

相手の多重度

Page 52: Graduation Project

- 49 -

iii)相手のエンティティ情報を<association></association>タグのコンテンツとし

て抽出する。

a) <association></association>の multi 属性として、相手エンティティの多重だ

を抽出する。 多重度を見分けるパターンとしては XMI の多重度情報である upper 属性と lower

属性の値で区別する。それを示すのは以下の表 4.1 となる。

表 1 XMI に出現する多重度を表す属性値のパターン

多重度 ER 図 Multiplicity の属性値 ONE lower=0 upper=1

MANY lower=0 upper=-1 ONE lower=1 upper=1

主体エンティティの多重度を用意してから相手エンティティが主体となるもう片方の

リレーション情報に移動し、相手エンティティの多重度を判断する。 ③ 継承情報

継承情報が存在する場合は継承情報をも抽出する。継承関係には子エンティティと

親エンティティが含まれている。その構造から子エンティティ、親エンティティそれ

ぞれへの参照 ID をたどりついて、エンティティ名を取得する。

以下の図が第 1 変換の結果である。

aaa aaa

aaa

x

aaa

Page 53: Graduation Project

- 50 -

図 5 第 1 変換の結果(右下:元の ER 図)

(2) 第 2 変換

第 2 変換で行う処理は図 4.6 の結果から<relationship></relationship>タグのリレ

ーション情報を保持する変数を生成し<Entity></Entity>タグのエンティティ情報自

体に含める。詳細な処理は以下に示す。

① エンティティ要素に必要な情報の追加 (ア )エンティティ間の関連性を ManyToMany の主側に区別させるために、

<Entity></Entity>タグの position 属性としてエンティティの出現の順番を持たせる (イ)複合キーの判断を行うために、id_count 属性として主キーの数を持たせる。 ② 属性情報の生成 i) 通常の属性において変数として必要な情報を整える a)<Attribute></Attribute>タグの type 属性として変数の種類を持たせる。 第 1変換で抽出した属性に関連性を持たない場合は”normal”という変数を持たせる。 b) <Attribute></Attribute>タグに<Annotation></Annotation>を用意する。 ・主キーの場合、@Id @GeneratedValue(strategy = GenerationType.AUTO)が記

述される。 ・データ型が Date の属性の場合、@Temporal(value=TemporalType.DATE)が記述

される。

Page 54: Graduation Project

- 51 -

・それ以外のものはアノテーションが作成されない。 ii) 関連性を保持する変数の作成

図 6 第 1 変換で生成されたリレーション情報の部分

リレーションは相手エンティティをデータ型とする変数で保持される。この変数は第

1 変換で抽出された<relationship></relationship>のリレーション情報から作成でき

る。XML の構成の変換は以下の手順で示す。 a)処理中のエンティティ名が owner に記述された情報を探りに移動し<Attribute></ Attribute >タグを作成する。 b)用意された<association></association>のコンテンツを<Attribute></ Attribute >の name 属性として持たせる。 c)データ型を示す data-type 属性を作成する。データ型は多重度によって以下のよう

に 2 種類に区別する。 ・One の場合は、エンティティ名を datatype 属性として持たせる。 ・Many の場合は、List<エンティティ名>を datatype 属性として持たせる。 d) type 属性に関連性を示すために、”relationField”という値を持たせる。 e)アノテーションの作成をする。アノテーション構成の作成は 3 つに分けて以下に述

べる。

Page 55: Graduation Project

- 52 -

図 4.8 作成アノテーション構成部分

1.) リレーションの組み合わせを作成する。自分の多重度を組み合わせてアノテ

ーションを作成する。カレントディレクトリでは<owner>が持っているエンティティ

名の多重度を参照し作成する。

図 4.9 リレーションアノテーションの変換イメージ

2.)ターゲットエンティティを作成するには相手エンティティの変数を targetEntityとして指定する。 3.)fetch 属性は LAZY と EAGER の 2 種類に分けられて、エンティティをデータベー

スからどのようにデータベースを取得するかを指定する。 ・自分の多重度が One の場合 LAZY と指定し、目的のエンティティのみ取得し、

関連エンティティは取得しない。 ・自分の多重度が Many の場合、EAGER と指定し、目的エンティティと関連のあ

るエンティティをすべて一度に取得する f) 外部キータグ(Foreignkey)を作成する。相手が ManyToOne や OneToOne の場合は

両エンティティを結び付ける外部キーを記述するアノテーションの@JoinColumn が

必要となるため外部キーを探しタグを作成する。検索方法は以下の図 4.10 に示す。

1.)リレーションの組み合わせ 2.)ターゲットエンティティ 3.)fetch 属性

カレント

ディレクトリ @ManyToOne

相手の多重度

自分の多重度

Page 56: Graduation Project

- 53 -

図 4.10 外部キーの探索イメージ

上記の図 4.10 で表す画像は第 1 変換で生成した結果のエンティティ情報にある

foreignOwner 属性にリレーション情報の owner の変数を調べる。そして、

foreignOwner 属性をマッピングし外部キーとして抽出する。

①継承情報の抽出 継承関係がある場合は、第 1 変換で抽出した継承関係情報をもとにエンティティに

対して親子の情報を付加する。

a)inheritance 属性に親子の情報を持たせる。 親の場合は”parent”を持たせる。子の場合は”child”を持たせ、parent 属性に親の

エンティティを持たせる。

マッピング

属性を調べて外部キーをマッピングする

Page 57: Graduation Project

- 54 -

図 4.11 第 2 変換の結果

(3) 第 3 変換

第 3 変換ではエンティティ Bean クラスのソースコードに変換する。

① import 文の出力

エンティティ Bean クラスに共通して利用する Javaライブラリをファイルの先頭

に import 文として記述しておく。アノテーションの場合、はひとつ以上登場したら、

出力する。

② 変数 通常の属性とリレーションを保持する属性を用意する。ER 図において(FK)がつい

ている属性は外部キーであり変数を用意する必要がないので、出力しない。それ以外

のものは datatype 属性の変数を抽出して変数を宣言する。

a) Getter・Setter とアノテーション Getter・Setter にアノテーションを付けて出力していく。アノテーションの付け方に

ついては以下に述べる。 b) 主キー属性 アノテーション@Id @GeneratedValue(strategy = GenerationType.AUTO)をつける。

GeneratedValueの値は図から情報を得ることができないためAUTOで統一している。 c) データ型が Date の属性 アノテーション@Temporal(value=TemporalType.DATE)をつける。

エンティティ

エンティティ リレーション変数

Page 58: Graduation Project

- 55 -

d) リレーションを保持する属性 リレーションのアノテーションは双方向である前提でつける。主側と従側で記述す

るアノテーションが異なる。基本的に外部キーを持つ法のアノテーションが主側であ

る。 1. ManyToOne, OneToOne 主側に@JoinColumn をつける。アノテーション全体は以下のように記述する。

@JoinColumn(name="PUB_ID, referencedColumnName="PUB_ID")

一方従側に mappedBy 属性をつける。

@OneToMany(targetEntity=Book.class, fetch=FetchType.LAZY, mappedBy="publisher")

もとは@OneToMany(targetEntity=Book.class,fetch=FetchType.LAZY)の部分まで

しか記述されていないので、外部キーを持つかどうか判断し mappedBy 属性を追加す

る。ただし、単方向では従側のこのフィールドが不要なのでコメントアウトを入れて

おき、不要な場合は手動で削除することにする。

2. ManyToMany 双方向の ManyToMany の場合は主側はどちらでもよいため、出現の順番の数が小さ

い方を主側として生成する。リレーションアノテーションとともにアノテーション

@JoinTable をつける。アノテーション@JoinTable の記述は以下のものである。

@JoinTable(name = "PUBLISHER_BOOK", joinColumns = @JoinColumn( name="PUB_ID", referencedColumnName="PUB_ID"), inverseJoinColumns = @JoinColumn( name="BOOK_ID", referencedColumnName="BOOK_ID") )

Page 59: Graduation Project

- 56 -

ただし、単方向の場合このフィールドが不要なのでコメントアウトを入れておき、

不要な場合は手動で削除することにする。

Page 60: Graduation Project

- 57 -

付録 B : トランザクション属性の処理

トランザクションは第 4 章の表 4.1 に記述した 6 つの属性で範囲を定義する。これ

らはセッション Bean のクラスかメソッドに設定する。 ・NOTSUPPORTED

呼び出し側がトランザクション内にある場合は、トランザクションを中断する。そ

して、トランザクションを開始せずに対象メソッドを実行した後中断したトランザク

ションを再開する。呼び出し側がトランザクション内にない場合は、新しくトランザ

クションを開始せずにメソッドを実行する。

図1 NOTSUPPORTED

・SUPPORTS 呼び出し側がトランザクション内にある場合は、対象メソッドを実行する呼び出し

側がトランザクション内にない場合は、新たにトランザクションを開始し、対象メソ

ッドのトランザクションコンテキストを実行する。

図 2 SUPPORTS

・REQUIRED 対象メソッドは、トランザクション内で実行しなければならない。しかし、新しく

トランザクションを開始する必要はない。呼び出し側がトランザクション内にある場

Page 61: Graduation Project

- 58 -

合、メソッドはそのトランザクション内で実行する。呼び出し側がトランザクション

内にない場合は、新しくトランザクションを開始したのち、メソッドを実行する。こ

の属性はデフォルトである。

図 3 REQUIRED

・REQUIRED_NEW 対象メソッドは新しくトランザクションを開始しなければならない。呼び出し側が

トランザクション内にある場合は、トランザクションを中断する。新しいトランザク

ションをコミットまたはロールバッグしたのち、中断したトランザクションを再開す

る。

図 4 REQUIRED_NEW

・MANDATORY 対象メソッドは、呼び出し側のトランザクション内で実行する。呼び出し側がトラ

ンザクション内になければ、例外が発生する。

図 5 MANDATORY

Page 62: Graduation Project

- 59 -

・NEVER 対象メソッドは、トランザクションコンテキスト内で実行してはならない。呼び出

し側がトランザクション内の場合、例外が発生する。呼び出し側がトランザクション

内でない場合、対象メソッドは新しくトランザクションを開始せず実行する。

図 6 NEVER

Page 63: Graduation Project

- 60 -

付録 C:生成されたソースコードと行数

ファイル類 ファイル名 行数 エンティティ Bean TBook.java 125 行

TCategory.java 78 行 TPublisher.java 80 行 TEmployee.java 120 行 TEmp_Add.java 75 行 TClassified.java 85 行 TCustomer.java 119 行 TCust_Add.java 69 行 TOrder.java 78 行 TSale.java 145 行

セッション Bean インタ

フェース TBookManager.java 14 行(+2 行) TCategoryManager.java 14 行 TPublisherManager.java 14 行 TEmployeeManager.java 14 行 TEmp_AddManager.java 14 行 TClassifiedManager.java 14 行 TCustomerManager.java 14 行(+1 行) TCust_AddManager.java 14 行 TOrderManager.java 14 行 TSaleManager.java 14 行(+2 行)

セッション Bean(DAO) TBookManagerBean.java 65 行(+63 行) TCategoryManagerBean.java 62 行 TPublisherManagerBean.java 56 行 TEmployeeManagerBean.java 59 行 TEmp_AddManagerBean.java 53 行 TClassifiedManagerBean.java 53 行 TCustomerManagerBean.java 69 行(+31 行) TCust_AddManagerBean.java 56 行 OrderManagerBean.java 73 行 TSaleManagerBean.java 83 行(+28 行)

マネージド Bean インタ

フェース TBookService.java 10 行(+6 行) TEmployeeService.java 10 行(+5 行) TCustomerService.java 10 行(+9 行)

Page 64: Graduation Project

- 61 -

TSaleService.java 10 行(+14 行) マネージド Bean TBookServiceBean.java 23 行(+27 行)

TEmployeeServiceBean.java 23 行(+28 行) TCustomerServiceBean.java 23 行(+16 行) TSaleManagerBean.java 23 行(+30 行)

(+n 行):書き足した行数