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
© Copyright 2024 ExpyDoc