(57)【要約】【課題】  アスペクトの影響範囲を容易に確認することができるアスペクト解析方法及び装置を提供すること。【解決手段】  クラス情報解析手段により前記複数のクラスのそれぞれに含まれるメソッドの呼び出し関係を解析する第１のステップと、アスペクト解析手段により前記メソッドに織り込まれるアスペクトの呼び出し関係を解析する第２のステップと、シーケンス図作成手段によりクラス相互間におけるメソッドとアスペクトの呼び出し関係を示すシーケンス図を作成し、表示する第３のステップとを備える。【選択図】      図１１
2008071007.tif 000002
【特許請求の範囲】
【請求項１】
開発対象または開発済みのプログラムを構成する複数のクラスに織り込まれるアスペクトを解析する方法であって、
クラス情報解析手段により前記複数のクラスのそれぞれに含まれるメソッドの呼び出し関係を解析する第１のステップと、アスペクト解析手段により前記メソッドに織り込まれるアスペクトの呼び出し関係を解析する第２のステップと、シーケンス図作成手段によりクラス相互間におけるメソッドとアスペクトの呼び出し関係を示すシーケンス図を作成し、表示する第３のステップとを備えることを特徴とするアスペクト解析方法。
【請求項２】
前記第３のステップにおいて、１つのメソッドに織り込まれる複数のアスペクトを実行順に重ね表示することを特徴とする請求項１に記載のアスペクト解析方法。
【請求項３】
前記第３のステップにおいて、表示された複数のアスペクトの１つを選択する操作に対して他のアスペクトとの呼び出し関係を詳細表示することを特徴とする請求項２に記載のアスペクト解析方法。
【請求項４】
開発対象または開発済みのプログラムを構成する複数のクラスに織り込まれるアスペクトを解析する装置であって、
前記複数のクラスのそれぞれに含まれるメソッドの呼び出し関係を解析するクラス情報解析手段と、前記メソッドに織り込まれたアスペクトの呼び出し関係を解析するアスペクト解析手段と、前記クラス情報解析手段及びアスペクト解析手段の解析結果に基づきクラス相互間におけるメソッドとアスペクトの呼び出し関係を示すシーケンス図を作成し、表示するシーケンス図作成手段とを備えることを特徴とするアスペクト解析装置。
【請求項５】
前記シーケンス図作成手段は、１つのメソッドに織り込まれる複数のアスペクトを実行順に重ね表示することを特徴とする請求項４に記載のアスペクト解析装置。
【請求項６】
前記シーケンス図作成手段は、表示された複数のアスペクトの１つを選択する操作に対して他のアスペクトとの呼び出し関係を詳細表示することを特徴とする請求項４に記載のアスペクト解析方法。
【請求項７】
開発対象または開発済みのプログラムを構成する複数のクラスに織り込まれるアスペクトを解析するコンピュータプログラムであって、
前記複数のクラスのそれぞれに含まれるメソッドの呼び出し関係を解析するステップと、前記メソッドに織り込まれるアスペクトの呼び出し関係を解析するステップと、前記クラス情報解析手段及びアスペクト解析手段の解析結果に基づきクラス相互間におけるメソッドとアスペクトの呼び出し関係を示すシーケンス図を作成し、表示するステップとをコンピュータに実行させることを特徴とするコンピュータプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、開発対象または開発済みのプログラムを構成する複数のクラスに織り込まれるアスペクトを解析する方法および装置並びにコンピュータ・プログラムに関する。
【背景技術】
【０００２】
現在、アプリケーション開発において新しい概念である、アスペクト指向プログラミングが注目されている。
アスペクト指向とは、プログラムの構成要素となる各モジュール間で共通に使われる機能を切り出し、それを後から自動的にプログラムに織り込んでいくものである。アスペクトの例として、ログやトランザクション管理などがあげられる。また、アスペクト指向は、オブジェクト指向と相反する概念ではないため、この２つを組み合わせて利用することが可能である。
ここで、ログを例に用いてアスペクト指向プログラミングについて説明する。
ログを出力する際、従来においては、ログコンポーネントを呼び出すコードをプログラム中から呼び出すことによって、ログを出力してきた。このような場合、開発者が自分が担当しているモジュールにログコンポーネントを呼び出すコードを記述することが一般的であるが、個々の開発者のスキルによってログ出力の度合いが異なるため、システム全体で均質な情報量のログを出力することは難しかった。
アスペクト指向プログラミングを用いることにより、ログを出力する機能をアスペクトとして切り出し、これをシステム全体のプログラムに対して自動的に織り込むことができるため、システム全体を通して均質な情報量のログを出力するようにすることが可能となる。
このようにアスペクト指向プログラミングを用いることにより、モジュール間で横断的に使用する機能を切り出して、設定によって後から埋め込むことが可能となる。
【０００３】
アスペクトは、そのアスペクトが行う処理を記述したアドバイスと、そのアドバイスをどこに埋め込むかを指定するポイントカットから構成されている。
アドバイスには、埋め込む先の処理の前に実行されるbeforeアドバイス、後に実行されるafterアドバイス、その処理の前後を包み込むように実行されるaroundアドバイスの3種類がある。
また、メソッドに対するアドバイスとフィールドアクセスに対するアドバイスがある。
ポイントカットでは、あるクラスのどのメソッドを呼び出したか、どのフィールドにアクセスしたか、あるクラスをインスタンス化したかなどをポイントとして切り出して指定することができる。
ポイントカットは、クラス名やメソッド名などを直接指定する以外にも、ワイルドカード(*)を用いることによって一度に複数のポイントを指定することもできる。
アスペクト指向プログラミングを実現するために、アスペクトをどのように定義するかを規定し、アドバイスをプログラムに織り込むことが必要となる。このような機能を実現する環境をアスペクト指向環境と呼ぶ。
【０００４】
現在、オブジェクト指向言語であるJava（登録商標）と組み合わせて使えるアスペクト指向環境がいくつか利用可能である。ここでは、そのひとつであるAspectJのアスペクト表記方法を用いるものとする。
AspectJでは、アスペクトの定義を以下のような形式で表記する。
package sample;
public aspect Debug {
pointcut callHello(): execution(* sample.Hello.sayHello(..));
Object around() : callHello() {
Object t = thisJoinPoint.getTarget();
System.out.println("target is " + t.getClass().getName());
Object result = proceed();
System.out.println("returning " + result);
return result;
}
}
【０００５】
アスペクトの定義は、pointcut句によるポイントカットの指定とアドバイスの実装から構成される。
pointcut句では、メソッドに対しては、execution宣言により実行のポイントを指定したり、within宣言によってあるパッケージに含まれるクラスのすべてのメソッドというような指定をしたりすることができる。それぞれの宣言の引数には、メソッドのシグネチャを指定する。
メソッドのシグネチャは、「<戻り値> <クラス名>.<メソッド名>(引数)」で構成される。ここには、*(ワイルドカード)を用いることもでき、say*のように指定することにより、sayHello、sayGoodbyのようにsayで始まる文字列にマッチさせることもできる。
メソッドの引数は、受け付ける引数の型を記述する以外にも「..」を指定することにより任意の引数を指定することもできる。
また、pointcut句では、フィールドに対しては、get宣言により読み込みアクセス、set宣言により書き込みアクセスのポイントを指定できる。それぞれの宣言の引数には、フィールド名を指定する。
フィールド名は、「<クラス名>.<フィールド名>」で構成される。ここにもメソッドと同様にワイルドカードを指定することができる。
【０００６】
AspectJの開発環境として、AJDTというツールがある。これを用いることにより、あるアスペクトがどのJavaクラスに適用されるかといった情報を表示することができる。また、アスペクトがどのようにクラスに適用されたかをシステム全体を通して見ることができるビューアも用意されている。
なお、本発明に関連する公知技術文献としては下記の特許文献１がある。
【０００７】
【特許文献１】特開２００５-２５８９４４号
【発明の開示】
【発明が解決しようとする課題】
【０００８】
アスペクト指向プログラミングでは、プログラム中に散在する共通の処理を抜き出して、アスペクトとしてまとめる。そのため、アスペクトは、プログラム本体と切り離されて定義されることが普通である。そのため、プログラム本体とアスペクトの関連を把握するのはあまり簡単ではない。
また、アスペクトをプログラムのどの箇所に設定するかは、特別な設定式を用いる。この設定式には、ワイルドカードなどを用いてプログラム中の複数のポイントにアスペクトを設定することが可能であり、これを用いることによって効率よくアスペクトの設定を行うことができる。
しかし、これを用いた場合、そのアスペクトが、プログラム開発者自身の想定している箇所に正しく設定されているかを確認することはなかなか難しい。換言すれば、アスペクトがどのメソッドに設定され、その影響範囲がどのようになっているかを容易に把握できないという問題がある。
【０００９】
本発明の目的は、アスペクト指向プログラミングを用いたアプリケーション開発において、アスペクトの影響範囲を容易に確認することができるアスペクト解析方法及び装置並びにコンピュータプログラムを提供することである。
【課題を解決するための手段】
【００１０】
上記目的を達成するために、本発明に係るアスペクト解析方法は、開発対象または開発済みのプログラムを構成する複数のクラスに織り込まれるアスペクトを解析する方法であって、
クラス情報解析手段により前記複数のクラスのそれぞれに含まれるメソッドの呼び出し関係を解析する第１のステップと、アスペクト解析手段により前記メソッドに織り込まれるアスペクトの呼び出し関係を解析する第２のステップと、シーケンス図作成手段によりクラス相互間におけるメソッドとアスペクトの呼び出し関係を示すシーケンス図を作成し、表示する第３のステップとを備えることを特徴とする。
また、前記第３のステップにおいて、１つのメソッドに織り込まれる複数のアスペクトを実行順に重ね表示することを特徴とする。
また、前記第３のステップにおいて、表示された複数のアスペクトの１つを選択する操作に対して他のアスペクトとの呼び出し関係を詳細表示することを特徴とする。
【００１１】
本発明に係るアスペクト解析装置は、開発対象または開発済みのプログラムを構成する複数のクラスに織り込まれるアスペクトを解析する装置であって、
前記複数のクラスのそれぞれに含まれるメソッドの呼び出し関係を解析するクラス情報解析手段と、前記メソッドに織り込まれるアスペクトの呼び出し関係を解析するアスペクト解析手段と、前記クラス情報解析手段及びアスペクト解析手段の解析結果に基づきクラス相互間におけるメソッドとアスペクトの呼び出し関係を示すシーケンス図を作成し、表示するシーケンス図作成手段とを備えることを特徴とする。
また、前記シーケンス図作成手段は、１つのメソッドに織り込まれた複数のアスペクトを実行順に重ね表示することを特徴とする。
また、前記シーケンス図作成手段は、表示された複数のアスペクトの１つを選択する操作に対して他のアスペクトとの呼び出し関係を詳細表示することを特徴とする。
【００１２】
本発明に係るアスペクト解析用のコンピュータプログラムは、開発対象または開発済みのプログラムを構成する複数のクラスに織り込まれるアスペクトを解析するコンピュータプログラムであって、
前記複数のクラスのそれぞれに含まれるメソッドの呼び出し関係を解析するステップと、前記メソッドに織り込まれるアスペクトの呼び出し関係を解析するステップと、前記クラス情報解析手段及びアスペクト解析手段の解析結果に基づきクラス相互間におけるメソッドとアスペクトの呼び出し関係を示すシーケンス図を作成し、表示するステップとをコンピュータに実行させることを特徴とする。
【発明の効果】
【００１３】
本発明によれば、次のような効果がある。
（１）クラスのそれぞれに含まれるメソッドの呼び出し関係と、各メソッドに織り込まれるアスペクトの呼び出し関係をシーケンス図によって視覚的に表示することにより、どのアスペクトがどのメソッドに設定されているかを視覚的に確認することができる。
（２）シーケンス図上で、メソッドの呼び出しの流れとアスペクトの実行の流れを同時に表示することによって、どのような順序でアスペクトおよびメソッドが呼び出されるかを把握することができる。
【発明を実施するための最良の形態】
【００１４】
以下、本発明を適用したアスペクト解析装置の一実施の形態について図面を参照して詳細に説明する。
図１は、本発明のアスペクト解析装置を実現するコンピュータのハードウェア構成例を示したブロック図である。
図１に示すコンピュータ（１０１）は、中央演算装置（CPU）（１０２）とメインメモリ（１０３）を持ち、マザーボード（１０４）により接続されている。また、マザーボード（１０４）に接続された磁気ディスク装置（１０５）とグラフィックカード（１０６）を持ち、グラフィックカード（１０６）は外部のディスプレイ装置（１０７）と接続されている。
入力装置として、マウス（１０８）とキーボード（１０９）を持ち、これらはマザーボード（１０４）に接続されている。
【００１５】
図２は、図１のハードウェア構成においてアスペクトの織り込み位置を解析する構成を機能的に示したシステム構成図であり、本発明のアスペクト解析装置（２０１）は、クラス情報解析部（２０２）、クラス蓄積部（２０３）、アスペクト解析部（２０４）、アスペクト蓄積部（２０５）、ユーザインターフェース管理部（２０６）で構成される。
ユーザインターフェース管理部（２０６）は、ディスプレイ装置（２０７）と入力装置（２０８）と接続されている。
クラス情報解析部（２０２）は、クラス蓄積部（２０３）およびユーザインターフェース管理部（２０６）と接続されている。
アスペクト解析部（２０４）は、アスペクト蓄積部（２０５）とユーザインターフェース管理部（２０６）と接続されている。
クラス蓄積部（２０３）、アスペクト蓄積部（２０２）は、磁気ディスク装置（１０５）上で実現される。入力装置（２０８）は、図１のマウス、およびキーボードとなる。
【００１６】
図３は、クラスのメソッド情報のデータフォーマットである。
１つのメソッド情報は、ID（３０１）、クラス名（３０２）、メソッド名（３０３）、引数（３０４）、戻り値（３０５）で構成されている。クラスにあるメソッド１つに対して１つのエントリが対応する。同じ名前のメソッドでも引数の型が異なれば別のエントリとなる。
【００１７】
図４は、メソッドの呼び出し関係情報のデータフォーマットである。
１つのフィールド情報は、呼び出し元ID（４０１）、シーケンス番号（４０２）、呼び出し先ID（４０３）で構成されている。
呼び出し元ID、呼び出し先IDは、図３のクラスのメソッド情報のデータフォーマットのIDフィールドの値が入る。
シーケンス番号は、メソッドが呼び出された順番に付けられる番号であり、小さな番号ほど先に呼び出されたことを示す。
【００１８】
図５は、アスペクト情報のデータフォーマットである。
１つのアスペクト情報はID（５０１）、名前（５０２）で構成されている。
名前はそのアスペクトを特定できる任意の文字列となる。
【００１９】
図６は、アドバイス情報のデータフォーマットである。
１つのアドバイス情報は、ID（６０１）、アスペクト（６０２）、名前（６０３）、ターゲット（６０４）、タイプ（６０５）、実装（６０６）で構成されている。
アスペクト（６０２）は、このアドバイスが関連するアスペクトのIDが入る。
名前（６０３）はそのアドバイスを認識できる任意の文字列となる。
ターゲット（６０４）はメソッドもしくはフィールドであるが、今回はメソッドのみを扱うものとする。
タイプ（６０５）はaround、before、afterのいずれかである。
実装（６０６）は、そのアドバイスのプログラムコードとなる。
【００２０】
図７は、ポイントカット情報のデータフォーマットである。
１つのポイントカット情報は、ID（７０１）、アスペクト（７０２）、名前（７０３）、ポイントカット表記（７０４）で構成されている。
アスペクト（７０２）には、このポイントカットが関連するアスペクトのIDが入る。
名前（７０３）はそのポイントカットを特定できる任意の文字列となる。
ポイントカット表記（７０４）はどのメソッドに対応するアスペクトを織り込むかを指定するもので、アスペクト実行環境であるAspectJの文法に従う。
【００２１】
図８は、メソッドの呼び出し関係と、メソッドに関連付けられたアスペクトを表現するデータ構造を木構造で示した図である。
あるメソッドを始点としてそのメソッドが呼び出すメソッドを木構造で表していく（８０１）。メソッドの呼び出し木の各ノードで保持されるデータは、どのメソッドに対応するかを表すメソッド情報（８０３）、そのメソッドに関連付けられたアスペクトリスト（８０４）、そのメソッドが呼び出すメソッドリスト（８０５）で構成される。
アスペクトリスト（８０４）および呼び出すメソッドリスト（８０５）は、順番は保持されるリストとなる。
【００２２】
図９は、クラス情報解析部（２０２）で扱うクラスのデータ構造である。
クラス名領域（９０１）は、クラスの解析中に現在解析中のクラスの名前を保持する。現在のメソッド領域（９０２）には現在解析中のメソッド情報が保持される。メソッド配列（９０３）およびメソッド呼び出し配列（９０４）には、クラスを読み込んで解析した結果を保持する。
【００２３】
図１０は、アスペクト解析部（２０４）で扱うアスペクトのデータ構造である。
アスペクト情報領域（１００１）には現在解析中のアスペクト情報が保持される。
アスペクト配列（１００２）、アドバイス配列（１００３）、ポイントカット配列（１００４）には、アスペクトを読み込んで解析した結果を保持する。
【００２４】
図１１は、本実施形態のアスペクト解析装置での解析結果の表示例を示す図である。
本装置の表示画面は、UMLのシーケンス図を用いている。
UMLのシーケンス図は、クラスに対応するクラス名を表示した箱(１１０２)と、そこから伸びる線（ライフライン）（１１０３）と、そのクラスからのメソッド呼び出しを表す矢印で構成される。
呼び出し元のクラス（１１０１）から呼び出し先のクラス（１１０２）へはメソッド呼び出しを表す矢印線（Ｓ１）で結ばれ、その矢印線の下に呼び出すメソッドの名前が記述される。
呼び出されるクラスのライフライン（１１０３）上に配置される長四角（１１０４）はそのメソッドの実行を表し、そこから伸びる矢印線（Ｓ２）はそのメソッドから他のクラスのメソッドを呼び出すことを表す。また、そのメソッドの実行が終わった時点で、呼び出し元のクラスへと矢印線が引かれる（Ｓ４）。
【００２５】
本実施形態では、標準的なシーケンス図にアスペクトの表示を加えたものである。
アスペクトは、メソッドの矢印線（Ｓ１）と呼び出し先のクラスのライフライン（１１０３）の間に表示される。
複数のアスペクトがメソッドに適用される場合は、重ねて表示される。アスペクトは、メソッド呼び出し時は図の左から右に、メソッド終了時は右から左に実行されるものとする。また、アスペクトが織り込むアドバイスがbeforeアドバイスの場合はメソッドの上部に（１１０５）、afterアドバイスの場合はメソッドの下部に（１１０７）、aroundアドバイスの場合はメソッドの横に（１１０６）描画する。
ここでは、それぞれ分類しやすいようにbeforeアドバイスを横線で、afterアドバイスを縦線で、aroundアドバイスを斜め線で塗りつぶしている。この際、アスペクトは簡略化された状態で表示される。
【００２６】
ここで、図１１に示すClassAからClassBのgetNameメソッドを呼び出すシナリオを考える。
ClassBのgetNameメソッドには、１つのbeforeアドバイス、１つのaroundアドバイス、２つのafterアドバイスが設定されている。
getNameメソッドが呼び出された際、メソッドの呼び出し時にはbeforeアドバイスとaroundアドバイスが呼び出されるため、ここでは１つのbeforeアドバイスと１つのaroundアドバイスが呼び出される。
この図では、メソッド呼び出し時は左から右の順番にアドバイスを呼び出すことを表すので、ここでは、aroundアドバイス１つが先に呼び出され、その後beforeアドバイスが呼び出されることとなる。これらのアドバイスが実行された後、メソッドの本体が実行されることとなる。ここで、他のクラスを呼び出すなどの処理を行い、それが終了すると、呼び出し元のクラスに制御を移すが、その前に設定されたアドバイスが実行される。
メソッド終了時には、aroundアドバイスとafterアドバイスが呼び出されるため、ここでは１つのaroundアドバイスと２つのafterアドバイスが呼び出される。
この図では、メソッド終了時は右から左の順番にアドバイスを呼び出すことを表すので、ここではaroundアドバイスを１つ呼び出した後でafterアドバイスを２つ呼び出すこととなる。
これらのアドバイスの実行が終了した後、呼び出し元のクラスに制御が戻ってくる。
【００２７】
図１２は、簡略表示されたアドバイスを展開して表示した例である。
図１１に示された簡略表示されたアドバイスを１つ選択し、入力装置２０８を構成するマウス操作によってダブルクリックすると、そのアドバイスを含むアスペクトが展開されて表示され、クラスと同様に名前とライフラインが表示される（１２０１）。そして、そのアドバイスを呼び出すクラス・アドバイスからとそのアドバイスが呼び出すクラス・アドバイスに向かって矢印線で結ばれる（Ｓ２、Ｓ５）。
この際、メソッド呼び出し時にこのアドバイスよりも前に呼び出されるアドバイスとメソッド終了時にこのアドバイスよりも後に呼び出されるアドバイスはこのアスペクトの左側に、メソッド呼び出し時にこのアドバイスよりも後に呼び出されるアドバイスとメソッド終了時にこのアドバイスよりも先に呼び出されるアドバイスは対応するメソッドの左側に簡略表示された状態で表示される。
【００２８】
このようにメソッドとアドバイスの関係をグラフィカルに表示することによって、そのアドバイスを含むアスペクトが正しく設定されているかを視覚的に把握することが可能になる。
例えば、あるアスペクトを作成し、シーケンス図を表示させて、そのアスペクトに含まれるアドバイスが意図しているように設定されているか確認することができるようになる。その際、予想しないアドバイスが組み込まれていた時は、そのアドバイスを展開しダブルクリックすることにより、そのアドバイスを含むアスペクトをすぐに確認し、どの設定が間違っているかを発見することができる。
【００２９】
以下、以上のように構成されたアスペクト解析装置の処理について詳細に説明する。
最初に本実施形態の装置において必要なデータを準備する。
図１３は、本実施形態の装置が起動時に行う準備作業を示すフローチャートである。
最初に、クラス蓄積部（２０３）に蓄積してある全てのクラスを１つずつ読み込む（ステップ１３０１）。次にクラス情報解析部（２０３）にて、読み込んだクラスを解析し、その情報を図３に示すクラスのメソッド情報として作成する（ステップ１３０２）。
次に、再度、クラス蓄積部（２０３）からクラスを一つずつ読み直し（１３０３）、クラス情報解析部（２０２）にて、読み込んだクラスを解析し、図４に示すメソッドの呼び出し関係情報を作成する（ステップ１３０４）。
ここで、再度クラスを読み込んでいるのは、ステップ１３０１および１３０２でメソッド情報を作成した後でなければメソッド間の関連付けが行えないからである。
【００３０】
次に、アスペクト蓄積部（２０５）にあるアスペクトを１つずつ読み込む（ステップ１３０５）。そして、アスペクト解析部（２０５）にて、読み込んだアスペクトを解析し、その情報を図５に示すアスペクト情報、図６に示すアドバイス情報、図７に示すポイントカット情報として作成する（ステップ１３０６）。
【００３１】
各ステップの処理の詳細を以下で説明する。
図１４は、図１３のフローチャートにおけるメソッドの解析処理の詳細を示すフローチャートである。
この処理は、Java（登録商標）の文法に従って構文解析を進めるものとする。
はじめに、クラス宣言を見つけ、そこからクラス名を取得し（ステップ１４０１）、クラス名領域に格納する（ステップ１４０２）。
次に、プログラムのコードブロックごとに処理を進める（ステップ１４０３）。
取り出したコードブロックを解析し（ステップ１４０４）、そこにメソッド宣言がないかを調べ（ステップ１４０５）、存在した場合は、そのメソッド名、引数、戻り値を取得し、ID番号を振り、クラス名を含めてメソッド情報を作成し（ステップ１４０６）、メソッド配列に格納する（ステップ１４０７）。
【００３２】
図１５は、図１３におけるフローチャートのメソッド呼び出し関係の解析処理の詳細を示すフローチャートである。
この処理は、Javaの文法に従って構文解析を進めるものとする。
まず、クラスファイルのコードブロックを１つずつ取り出し（ステップ１５０１）、コードを解析する（ステップ１５０２）。
次に、そのブロックにメソッド宣言がないかを調べ（ステップ１５０３）、存在した場合は、メソッド配列に格納されたメソッド情報を取得し、現在のメソッド領域に格納する（ステップ１５０４）。
【００３３】
次に、メソッドのボディの各行を取り出し（ステップ１５０５）、解析する（ステップ１５０６）。その中にある他のメソッドの呼び出しが存在した場合は（ステップ１５０７）、これに対応するメソッド情報をメソッド配列から引き当て、現在のメソッド領域に格納されているメソッド情報のIDを呼び出し元IDとし、ここで検索したメソッド情報のIDを呼び出し先IDとし、シーケンス番号とともにメソッド呼び出し関係情報を作成し（ステップ１５０８）、メソッド呼び出し配列に格納する（ステップ１５０９）。
【００３４】
図１６は、図１３のフローチャートにおけるアスペクトの解析処理の詳細を示すフローチャートである。
ここでは、AspectJの文法に従い、構文解析するものとする。
まず、アスペクトのプログラムコードを読み込んだら、はじめにアスペクト宣言を検索し、アスペクト名を取得する（ステップ１６０１）。ここで、IDを生成し、アスペクト情報を作成し、アスペクト情報配列に格納する（ステップ１６０２）。そのアスペクト情報をアスペクト情報領域に保持する。
次に、すべてのコードブロックを取り出し（ステップ１６０３）、解析する（ステップ１６０４）。そこにアドバイス宣言が存在した場合は（ステップ１６０５）、その名前、タイプ、ターゲット、実装を抽出し、IDを生成し、アスペクト情報領域に格納されているアスペクト情報のIDとともにアドバイス情報を作成し（ステップ１６０６）、アドバイス情報配列に格納する（ステップ１６０７）。そこにポイントカット宣言が存在した場合は（ステップ１６０８）、その名前、ポイントカット表記を抽出し、IDを生成し、アスペクト情報領域に格納されているアスペクト情報のIDとともにポイントカット情報を作成し（ステップ１６０９）、ポイントカット情報配列に格納する（ステップ１６１０）。
【００３５】
図１７は、クラス図上であるメソッドが選択されてシーケンス図を表示する場合など、特定のメソッドが検索され、そのメソッドから始まる一連の処理のシーケンス図を表示する際の処理のフローチャートである。
最初に、選択したメソッドを特定し、メソッド配列から対応するメソッド情報を取得する（ステップ１７０１）。
次に、そのメソッドから呼び出されるメソッドの呼び出し木を生成する（ステップ１７０２）。その木が作成できたら、それを元にシーケンス図を描画する（ステップ１７０３）。
【００３６】
図１８は、図１７で用いるメソッドの呼び出し木を作成する処理のフローチャートである。
最初に、始点となるメソッドのメソッド情報を現在のメソッド領域に格納する（ステップ１８０１）。
次に、ポイントカット配列に格納されているすべてのアスペクト情報１つ１つに対して、以下の処理を実行する（ステップ１８０２）。
取り出したアスペクト情報に対応するポイントカット情報のポイントカット表記の値を元に現在のメソッド領域にあるメソッドとこのポイントカットのマッチングを図る（ステップ１８０３）。もし、マッチした場合は（ステップ１８０４）、それに対応するアスペクト情報を取得し（ステップ１８０５）、ノードのアスペクトリストに追加する（ステップ１８０６）。
次に、現在のメソッド領域のIDフィールドの値をキーにメソッド呼び出し配列の呼び出し元IDに検索をかける（ステップ１８０７）。検索によって取得したデータをシーケンス番号をキーにソートして（ステップ１８０８）、呼び出しリストを作成し、そのノードの呼び出しメソッドリストに格納する（ステップ１８０９）。
ここで作成したノードの呼び出しリストの全ての要素に対して（ステップ１８１０）、以上の処理を再帰的に繰り返す（ステップ１８１１）。
【００３７】
図１９及び図２０は、シーケンス図を表示する際の処理を表すフローチャートである。
この処理は、図８で表すメソッド呼び出し木のルートノードから処理を進めるものとする。
まず、ノードに対応するメソッドのクラスがすでに描画済みか判定する（ステップ１９０１）。
描画されていなかったときは、クラス名を書いた四角の箱を描画する（ステップ１９０２）。ルートノードを描画する際は、画面の左上に書かれるが、それ以外のノードでは、既に書かれたクラスの右隣に一定間隔を置いて描画するものとする。その四角い箱から下に向かって直線（ライフライン）を描画する（ステップ１９０３）。そのライフライン上にメソッドの実行を表す縦長の四角い箱を描画する（ステップ１９０４）。ここからはこのノードに対応するアスペクトを描画する処理に移るが、この図において複数のアスペクトがある場合は、図の上で左から右に実行されることとなる。しかし、描画は右から重ねて書いていくため、アスペクトリストにあるアスペクトを逆順にソートする（ステップ１９０５）。
【００３８】
次に、ソートしたアスペクトリストの個々の要素に対して以下の処理を実行する（ステップ１９０６）。
まず、そのアスペクトのアドバイスがbeforeアドバイスかどうかを判定し（ステップ１９０７）、そうであった場合は、メソッドの左上部に丸い四角を描画する（ステップ１９０８）。既に他のアドバイスが書かれているときは、そのアドバイスの半分の幅分右にずらして描画する。beforeアドバイスでなかったときは、それがaroundアドバイスであるかを判定し（ステップ１９０９）、そうであった場合は、メソッドの左横にメソッドの長さと同様の長さで丸い四角を描画する（ステップ１９１０）。
既に他のアドバイスが書かれているときは、そのアドバイスの半分の幅分右にずらして描画する。
【００３９】
aroundアドバイスでなかったときは、afterアドバイスであると考えられるため、メソッドの左下部に丸い四角を描画する（ステップ１９１１）。
既に他のアドバイスが書かれているときは、そのアドバイスの半分の幅分右にずらして描画する。
このノードがルートノードであるかを判定し（ステップ１９１２）、そうでない場合は、呼び出し元のメソッドから描画中のメソッド上部への矢印を描画し（ステップ１９１３）、描画中のメソッド下部から呼び出し元のメソッドへの矢印を描画する（ステップ１９１４）。これでこのノードの描画が終わったので、このノードの呼び出しメソッドの全ての要素に対して（ステップ１９１５）、再帰的にこの処理を実行していく（ステップ１９１６）。
【００４０】
図２１及び図２２は、このシーケンス図の特定のアスペクトを選択し、ダブルクリックしたときの処理のフローチャートである。
このフローは、図１９及び図２０で表した処理の中で、選択されたアスペクトが含まれるノードに対してのみ実行されるものである。つまり、選択されたアスペクトを含むノードに対する処理は、図１９及び図２０で表したフローを置き換えるものとなる。
はじめに、選択されたアスペクトを含むノードのアスペクトリストを選択されたアスペクトの前後で分割し、アスペクトリスト（前）とアスペクトリスト（後）とする（ステップ２００１）。どちらのリストにも、選択されたアスペクトは含まれない。そして、このノードに対応するクラスが既に描画されているか判定し（ステップ２００２）、もし描かれていない場合は、アスペクトを描画するためのスペースを空けるために、クラス１つ分のスペースを右側に開ける（ステップ２００３）。そして、その右側にクラス名を表記した四角い箱（ステップ２００４）、ライフライン（ステップ２００５）、メソッドの実行を示す四角を描画する（ステップ２００６）。
【００４１】
もし、既にクラスが描画されているときは、そのクラスを右側に１つ分ずらし、そのクラスのみを再描画する（ステップ２０１０）。そして、先ほど分割したアスペクトリスト（後）を逆順にソートして（ステップ２００７）、その要素の全てに対して（ステップ２００８）、アスペクトを描画する（ステップ２００９）。
アスペクトを描画する処理は、図１９のステップ１９０７〜１９１１と同様である。
次に、先ほど空けたスペースにアスペクト名を表記した丸四角（ステップ２０１１）、ライフライン（ステップ２０１２）、そこで実行されるアドバイスを示す丸四角を描画する（ステップ２０１３）。このアドバイスがbeforeアドバイスである場合は対象のメソッドの半分の縦幅で上側に、afterアドバイスである場合は対象のメソッドの半分の縦幅で下側に、aroundアドバイスである場合は対象のメソッドと同じ縦幅で描画するものとする。そして、先ほど分割したアスペクトリスト（前）を逆順にソートして（ステップ２０１４）、その要素の全てに対して（ステップ２０１５）、アスペクトを描画する（ステップ２０１６）。アスペクトを描画する処理は、図１９の１９０７〜１９１１と同様である。
【００４２】
次に、呼び出し元のメソッドから描画中のアドバイス上部への矢印を描画し（ステップ２０１７）、描画中のアドバイス下部から呼び出し元のメソッドへの矢印を描画する（ステップ２０１８）。
次に、描画中のアドバイス上部から描画中のメソッド上部への矢印を描画し（ステップ２０１９）、描画中のメソッド下部から描画中のアドバイス下部への矢印を描画する（ステップ２０２０）。これでこのノードの描画が終わったので、このノードの呼び出しメソッドの全ての要素に対して（ステップ２０２１）、再帰的に通常のノードに対する処理を実行していく（ステップ２０２２）。
【００４３】
以上のように本実施形態のアスペクト解析装置においては、開発対象または開発済みのプログラムを構成する複数のクラスにおけるメソッドの呼び出し関係を解析し、さらに各メソッドに織り込まれるアスペクトの呼び出し関係を解析し、クラス相互間におけるメソッドとアスペクトの呼び出し関係を示すシーケンス図を作成し、表示するように構成したため、プログラム中のアスペクトの織り込み位置、呼び出し関係を容易に把握し、アスペクトの影響範囲を容易に確認することができる。そして、想定外の位置に織り込まれるようになっていた場合には必要な対策を容易に講じることが可能になる。
また、開発済みのプログラムを解析対象とした場合、バージョンアップ等の改良要求に対し、改良対象となるアスペクト及び呼び出し関係を容易に把握し、改良要求に迅速に対応することが可能になる。
【図面の簡単な説明】
【００４４】
【図１】本発明の実施に用いるコンピュータ装置のハードウェア構成図である。
【図２】本発明の実施の形態の一例を示すシステム構成図である。
【図３】クラスのメソッド情報のデータフォーマットを表す図である。
【図４】メソッド呼び出し情報のデータフォーマットを表す図である。
【図５】アスペクト情報のデータフォーマットを表す図である。
【図６】アドバイス情報のデータフォーマットを表す図である。
【図７】ポイントカット情報のデータフォーマットを表す図である。
【図８】メソッド呼び出し関連木のデータ構造を表す図である。
【図９】クラス解析部の構成図を表す図である。
【図１０】アスペクト解析部の構成図を表す図である。
【図１１】アスペクトの呼び出し関係を示すシーケンス図の一例を示す図である。
【図１２】アスペクトの呼び出し関係を示すシーケンス図の他の例を示す図である。
【図１３】装置起動時の処理を示すフローチャートである。
【図１４】メソッド情報配列の作成処理のフローチャートである。
【図１５】メソッド呼び出し配列の作成処理のフローチャートである。
【図１６】アドバイス関連情報の作成処理のフローチャートである。
【図１７】シーケンス図表示処理の概要を示すフローチャートである。
【図１８】メソッド呼び出し木作成処理のフローチャートである。
【図１９】シーケンス図描画処理のフローチャートである。
【図２０】図１９の続きを示すフローチャートである。
【図２１】シーケンス図アスペクト展開時描画処理のフローチャートである。
【図２２】図２１の続きを示すフローチャートである。
【符号の説明】
【００４５】
１０１コンピュータ
１０２  ＣＰＵ
１０３  メインメモリ
１０５  磁気ディスク装置
２０１  アスペクト解析装置
２０２  クラス情報解析部
２０３  クラス蓄積部
２０４  アスペクト解析部
２０５  アスペクト蓄積部
２０６  ユーザインターフェース管理部
【図１】
2008071007.tif 000003
【図２】
2008071007.tif 000004
【図３】
2008071007.tif 000005
【図４】
2008071007.tif 000006
【図５】
2008071007.tif 000007
【図６】
2008071007.tif 000008
【図７】
2008071007.tif 000009
【図８】
2008071007.tif 000010
【図９】
2008071007.tif 000011
【図１０】
2008071007.tif 000012
【図１１】
2008071007.tif 000013
【図１２】
2008071007.tif 000014
【図１３】
2008071007.tif 000015
【図１４】
2008071007.tif 000016
【図１５】
2008071007.tif 000017
【図１６】
2008071007.tif 000018
【図１７】
2008071007.tif 000019
【図１８】
2008071007.tif 000020
【図１９】
2008071007.tif 000021
【図２０】
2008071007.tif 000022
【図２１】
2008071007.tif 000023
【図２２】
2008071007.tif 000024