Change as Aspects : A Case Study

タイトルの意味は、変更をアスペクトで表そう、みたいな。


AspectJ の魅力的だけど、ちょっと使いどころが難しいそーな機能に、既存のライブラリ(or jar)に対するアスペクトの適用がある。そのような時にでのアスペクトが何をするかということの一つは、ライブラリを外部から変更すること。


一つのリアルなケーススタディとして、QDox に対するアスペクトの適用を紹介。QDox は、ホームページの説明によれば:

QDox is a high speed, small footprint parser for extracting class/interface/method definitions from source files complete with JavaDoc @tags. It is designed to be used by active code generators or documentation tools.


ここで QDox への変更として紹介するのは、JavaDocBuilder クラスの addSourceTree(File) への動作の変更。


僕の要求と合わなかったのは、addSourceTree メソッドはパースに失敗すると、ParseException をスローすること。ParseException は、実行時例外。できれば、僕の要望では、パースが失敗したときは、その失敗したソースを無視してParseException をスローして欲しくなかった。


ので、アスペクトでその動作を変更できるかどうかに挑戦。具体的なソースは次のような感じ(もうすこしうまく書く必要があるかもしれないけど):


public aspect JavaDocBuilderExtension {
JavaSource around() : call(JavaSource JavaDocBuilder.addSource(File) ) {
try {
return proceed();

} catch(ParseException e) {
return null;
}
}
}
見てのとおり、ParseException をキャッチして無視しているだけ。


リソース:

System Integration Using AOP
Robert Hirschfeld, Kasper Osterbye, Matthias Wagner
In Proceedings of the Third GI-SIG 2.1.9 Workshop on Aspect-Oriented Software Development 2003

DL: http://citeseer.ist.psu.edu/hirschfeld03system.html

Robert Hirschfeld and David H. Lorenz.
Non-Invasive On-Demand Changes: Applying Change-Sets as Aspects. Technical Report NU-CCIS-03-08, College of Computer and Information Science, Northeastern University, March 2003. (2003)

DL: http://www.ccs.neu.edu/home/lorenz/papers/reports/NU-CCIS-03-08.html