Chiba Shigeru Group

Chiba Shigeru Group
Preplaned Dynamic Weaving
西澤 無我、千葉 滋
(東京工業大学)
PPL 2006, Ootsu, Shiga
1
Chiba Shigeru Group
Dynamic Weaving の必要性
 Dynamic Weaving
 アプリケーションの動作中にアスペクトを適用し
(weave)、そのアプリケーションの振る舞いを変更
 Weave / unweave
 例: mission-critical な web applications
 変化していく要求に dynamic weaving の必要性
 QoS の向上
 ダウンタイムの削減
PPL 2006, Ootsu, Shiga
2
Chiba Shigeru Group
手軽さに欠ける既存の Dynamic Weaving
 既存の Java 用 Dynamic Weaving
 プログラム実行中の各実行点に、フックを挿入
 JPDA の利用
JPDA を利用してアプリケーションを
実行しなければならない
 JVM 拡張
拡張 JVM 上でしか利用不可
 もっと手軽に dynamic weaving を実現したい
PPL 2006, Ootsu, Shiga
3
Chiba Shigeru Group
例: Mock Object を利用した Unit Test
 一定の値を返すために、Mock object を使用
テスト対象
アプリケーションの呼出
テストプログラム
アプリケーション
void testBehaviorOfService() {
Service s = new Service();
s.init();
s.start();
……
s.stop();
}
例: 一定の dbName を返すように、
conf.getDbName() を mock に差し替えたい
PPL 2006, Ootsu, Shiga
class Service {
Configure conf;
void start() { … }
void init() {
……
String dbName =
conf.getDbName();
…conf.getMockDbName();
…
}}
4
Chiba Shigeru Group
動的に Mock Object を切り替えたい
 テスト毎に、使われる mock object を交換
 Mock object の差し替えにはアスペクトを利用
void testBehaviorOfService1() {
Service s = new Service();
s.init();
s.start();
……
s.stop();
}
void testBehaviorOfService2() {
s.init();
s.start();
テストプログラム
……
s.stop();
}
testBehaviorOfService1() では、
conf.getMockDbName1();
testBehaviorOfService2() では、
conf.getMockDbName2();
アプリケーション
テストに既存の dynamic weaving を利用?
PPL 2006, Ootsu, Shiga
5
Chiba Shigeru Group
Preplaned Dynamic Weaving
 アプリケーション実行時に、アスペクトを
動的に適用 (dynamic weaving)
 ただし、適用されるアスペクトは、
 実行前に予想できているもののみ
 アプリケーション実行時に渡す
 Load-time weaving
PPL 2006, Ootsu, Shiga
6
Chiba Shigeru Group
実行時前に予測可能なアスペクト
 Dynamic weaving されるアスペクトの多くは、
アプリケーション開発時に予測可能
 例: Mock object に差し替えるアスペクト
 Unit testing に必要なアスペクトの多くは、
テスト開発時に予測 (開発) することが可能
 Preplaned dynamic weaving で十分?
 アプリケーション開発時に、予測できなかったアスペ
クトのみ、既存の dynamic weaving で適用
PPL 2006, Ootsu, Shiga
7
Chiba Shigeru Group
Refine (Inter-type 宣言)
 クラスの定義を動的に拡張
 Inter-type 宣言に相当
 例: Mock object に差し替えるアスペクト
 Configure クラスの getDbName() を、
このアスペクトが適用されているときのみ拡張
@Aspect
class MockConfigure {
@Refine(“Configure”)
String getDbName() {
return “mysql”;
}
}
PPL 2006, Ootsu, Shiga
8
Chiba Shigeru Group
Pointcut と Advice
 指定された実行点 (join point) で、
動的に宣言された処理 (advice) を呼び出す
 例: ログ処理
 getDbName() の呼び出しの直前で showLog()
が呼び出される
@Aspect
class Logger {
@BeforeAdvice(“showLog”)
Pointcut p = new Pointcut().withincode(“Service.init()”)
.AND.call(“getDbName()”);
void showLog() { … Logging … }
}
PPL 2006, Ootsu, Shiga
9
Chiba Shigeru Group
Refine の実装
 Load-time に wrapper method を自動生成
@Aspect
class MockConfigure {
@Refine(“Configure”)
String getDbName() {
return “mysql”;
}
}
class Configure {
String getDbName() {
if (Weaver.isAttached(“MockConfigure”) {
return MockConfigure_getDbName();
} else {
return org_getDbName();
}
}
String org_getDbName() {
// 元の getDbName() の中身
}
String MockConfigure_getDbName() {
// Advice
}
}
PPL 2006, Ootsu, Shiga
10
Chiba Shigeru Group
Declare Parents の実装
 アスペクト内で、指定されたクラスの
superclass, interfaces を追加可能
 アスペクト毎に、拡張された元クラスを作成
 もともと superclass をもつクラスを拡張する場合
declare parents: B extends C;
Class A
Class A
Class C
Class B
Class B
Class B’
PPL 2006, Ootsu, Shiga
11
Chiba Shigeru Group
まとめ
 Preplaned dynamic weaving の提案
 動的にアスペクトを適用可能
 アスペクトは load-time weaving
 実行前に予測可能なアスペクトのみ
 今後の課題
 実装の完成
 本手法のアプリケーションを増やす
PPL 2006, Ootsu, Shiga
12