理学部 情報科学科 指導教官 千葉 滋 助教授 学籍番号 03_03686 内河 綾 永続システムのための アスペクト指向言語 理学部 情報科学科 指導教官 千葉 滋 助教授 学籍番号 03_03686 内河 綾
典型的なWEBアプリケーション インターネット掲示板 プログラムに関する部分 : データベースに関する部分 Servlet, Struts, JSP ( これらのコンテナとしてtomcat ) データベースに関する部分 リレーショナルデータベース, 永続クラス name : varchar(100) content : text WEBブラウザ ActionServlet(コントローラ) Index01Action.java 処理を記述 req.setAttribute (“name”, “Taro”); 永続クラス(モデル) String name; String content; // getter & setter <!– index01.jsp --> <html> …${name} </html> 一貫性を 保つ必要が ある JSP(ビュー) WEBコンテナ
モジュール化が困難 拡張機能をモジュールとして追加したい e.g. メールアドレス欄を追加 オブジェクト指向では困難 既存のAOPでは不十分 Actionクラスなどあちこちの変更が必要 既存のAOPでは不十分 別途データベースに関する部分の編集が必要 post name : varchar(100) content : text address : varchar(200) Index01Action.java Index02Action.java Map に name, content 情報を入れる (表示部分で利用) address も入れる データベースに 保存するもの (name, content)を、 Map に入れる address も入れる String name; String content; String address; Post.java ・・・
提案: 永続システムのためのアスペクト指向言語 データベースにまたがる関心事もモジュール化可能 GluonJ と AspectualStore を拡張して実現 ウィーブ時にデータベーススキーマの変更を行う ユーザはデータベーススキーマを変更する必要なし Ant タスクによる実行時前の織り込みをサポート post (データ ベース) 既存の アスペクト 指向言語で モジュール化 できる範囲 Index01 Action Index02 Action 本来 モジュール化 したい部分 Post (永続 クラス)
アドレス欄を追加するアスペクト post @Glue public class PostGlue { 永続クラス name : varchar(100) content : text address : varchar(200) post 永続クラス @Glue public class PostGlue { @Refine @PersistClass static class Post extends Post{ @Type(length = 200, fixed = false) private String address; … // setter & getter } // Action の方も変更 Post クラスに Addressフィールドを 追加 自動的に データベースの 変更を行う Post.java データベースの型の指定方法は三通り アノテーションをつけない場合 Type アノテーションをつける場合 SqlType アノテーションをつける場合 private String name; private String content; private String address;
全体の処理の流れ 1.Aspect 記述 2. データベーススキーマを変更 3. Weave (GluonJ ) カラム追加情報 管理用テーブル Javac (コンパイル) <本システム> application Class file DB Javassist (追加フィールド の取り出し) JDBC (DB 変更) GluonJ (weave) 2. データベーススキーマを変更 カラムの追加情報は専用のテーブルを作り管理 Weave : カラムを追加 Unweave: カラムを削除 3. Weave (GluonJ ) 永続クラスに対しては SQL 発行処理を追加 Javassist
データベーススキーマの変更方法 ユーザの用途に応じて選択可能 既存のテーブルにカラムを追加 アンウィーブ時にはカラムを削除 テーブル追加に比べて実行速度が速いと考えられる 既存のテーブルとは違うテーブルを作り、カラムを追加 (実装中) アンウィーブ時にデータを残す SQL 文を変更する必要あり => カラム追加に比べて実行速度が遅いと考えられる
デモ インターネット掲示板 アドレス欄を追加するモジュールをAspectQのアスペクトとして実装 ウィーブ・アンウィーブで容易に抜き差し可能 自動的に DB にも反映
関連研究 既存のアスペクト指向言語 (GluonJ, AspectJ 等) XDoclet, hbm2ddl + 既存のアスペクト指向言語 データベースまでを含む関心事はモジュール化不可能 XDoclet, hbm2ddl + 既存のアスペクト指向言語 永続クラスから XML 、XML からデータベーススキーマを作成するツール ソースコードレベルで解析(コメントを利用) ウィーブ時にソースコードを変更する必要あり ウィーブ時にコメントもコピーする必要あり
まとめと今後の課題 永続システムに対応したアスペクト指向言語 今後の課題 データベーススキーマの自動変更(実行時前) データベースの型の指定方法は三通り アノテーションなし、Typeアノテーション、SqlTypeアノテーション データベーススキーマの変更方法 既存のテーブルにカラムを追加 既存のテーブルとは別テーブルを作成しカラムを追加 実行時前の織り込みをサポート 全体で2500行 今後の課題 既存のテーブルとは違うテーブルを作成する場合