Strutsフレームワークにおけるメタモデルを 用いた追跡可能性実現手法の提案 大平直宏†,松下誠†,岡野浩三†,楠本真二†, 井上克郎†,山下裕介‡,我妻智之‡ † 大阪大学大学院情報科学研究科 ‡ (株)NTTデータ 2005/11/29 第150回ソフトウェア工学研究会(SIGSE-150-5) Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 研究の背景 Webアプリケーションフレームワーク ex.)Struts,JSF 画面遷移の管理といった典型的な処理をフレームワークが実装 ソフトウェアの品質向上,開発・保守効率の向上 問題点 フレームワークの意図する仕様に従った成果物の作成が必要 修正や削除が加わった場合にも 明示的な仕様が定められていない成果物の存在 実装成果物にはフレームワークの仕様があるが,設計成果物にはない 成果物間の依存関係(トレース情報)を保存・管理する枠組み が存在しない 設計・実装成果物間の一貫性が保たれない 2005/11/29 第150回ソフトウェア工学研究会(SIGSE-150-5) Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 2 研究の目的 Strutsフレームワークにおける画面遷移の設計~実装を対象 追跡可能性を実現する 設計・実装間で,互いに関連のある要素の依存関係を追跡可能 (変更影響を追跡可能である) 一貫性管理を実現する 設計・実装間で,お互いが表現する内容に矛盾がない (設計情報が正しく実装に伝わっている) org.example.LogonForm スタート画面 ログイン画面 /Logon welcom.jsp logon.jsp LogonForm success /Logoff /SubmitLogon org.example.LogoffAction 画面遷移図 認証済み画面 mainMenu.jsp failure success struts-config.xml org.example.LogonAction 設計 実装 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 3 提案手法の概要 成果物とその依存関係(トレース情報)をMOFメタモデルのもとで統一的に管理 1. 個々の成果物に対してMOFメタモデルを定義 成果物単体の正しさを保証 2. 成果物間のトレース情報に対してMOFメタモデルを定義 成果物間のトレース情報を自動蓄積 Asub_X_Trace: Trace Asub : RefElement ValueSpecification (from BasicActivities) +guard +target + ref: = "ValueSpecification" ref: = "ForwardEdge" + impl_file: JspName + + path: String impl_class: ClassName + detail: String 0..* ref: = "Forward" B : RefElement ActionEdge ForwardEdge constraints {+source is DisplayNode} {+target is ActionNode} constraints {+source is ActionNode} ref: = "DisplayNode" 1 0..* 0..* Action FormBean ref: = "ActionNode" + + C_Y_Trace: Trace C : RefElement + + Y : RefElement detail: String ActionNode.path → Action.path ActionNode.impl_class → Action.type + ref: = "Action" name: BeanName type: ClassName [0..1] + + + + + path: RequestPath type: ClassName [0..1] name: BeanName [0..1] forward: RequestPath [0..1] scope: RequestScope D_YZ_Trace: Trace +form-bean D : RefElement ActionFormBean + + + 0..* ActionMappings 1 + detail: String DisplayNode.impl_file → Action.forward DisplayNode.impl_file → Forward.path +action DisplayDef 1 1 FormBeans * ActionNode + B_XY_Trace: Trace + DisplayNode StrutsConfig X : RefElement A_X_Trace: Trace A : RefElement + ActivityEdge * +outgoing (from BasicActivities) 1 detail: String ValueSpecification.body → Forward.name 1 +incomming ActivityNode 1 (from BasicActivities) +source + + name: String impl_class: ClassName scope: String ref: = "ActionFormBean" + detail: String ActionFormBean.name ActionFormBean.name ActionFormBean.impl_class ActionFormBean.scope → FormBean.name → Action.name → FormBean.type → Action.scope 0..1 Z : RefElement + 0..* ref: = "FormBean" Forward + + org.example.LogonForm スタート画面 name: String path: RequestPath [0..1] ログイン画面 /Logon welcom.jsp logon.jsp LogonForm success /Logoff /SubmitLogon org.example.LogoffAction 画面遷移図 認証済み画面 mainMenu.jsp failure success struts-config.xml org.example.LogonAction 設計 実装 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 4 発表の流れ 研究の背景と目的 Strutsとは メタモデルとMOF 提案手法 Strutsの成果物とトレース情報に対するメタモデル定義 メタモデルに基づく追跡可能性の実現手法 まとめと今後の課題 2005/11/29 第150回ソフトウェア工学研究会(SIGSE-150-5) Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 5 Struts JavaのWebアプリケーションフレー ムワーク Webアプリケーションの機能を個々 のコンポーネントへ分割 各コンポーネントを制御するアクション サーブレット ユーザの入出力画面を表示する JSP/HTMLファイル 入力データを保存するアクションフォー ムBeans リクエスト処理するアクションクラス アクションサーブレット フレームワークのコアエンジン 各コンポーネントを設定ファイルに基づ いて結合 struts-config.xml 2. 入力データの保存 アクションフォームBeans struts-config.xml データ の参照 3. 対応するアクションの実行 アクションクラス 4. ステータスの返却 アクションサーブレット 1. リクエスト & 入力データ ログイン 認証 アカウント ●●●●● パスワード ●●●●●●●● OK 処理 サーバ Cancel 5. 次画面の出力 認証済み UserA クライアント Inbox Outbox ================= ================ =========== =============== =============== 6 struts-config.xmlの例 <action-mappings> ユーザのリクエストを処理するアクショ ンクラスと画面の遷移に関する設定 2. 入力データの保存 アクションフォームBeans struts-config.xml データ の参照 3. 対応するアクションの実行 <form-beans> ユーザの入力情報を保存するアク ションフォームBeansに関する設定 アクションクラス 1. リクエスト & 入力データ ログイン 認証 アカウント ●●●●● パスワード ●●●●●●●● OK アクションサーブレット 4. ステータスの返却 サーバ Cancel 5. 次画面の出力 認証済み UserA クライアント Inbox Outbox ================= ================ =========== =============== =============== 7 struts-config.xmlの例 LogonForm = org.example.LogonForm 2. 入力データの保存 アクションフォームBeans struts-config.xml データ の参照 org.example.LogonAction 3. 対応するアクションの実行 アクションクラス 認証 アカウント ●●●●● パスワード ●●●●●●●● OK success failure 1. リクエスト & 入力データ ログイン <action> リクエスト処理に関する設定 <forward> アクションクラスの終了ステータスと 次画面のマッピング アクションサーブレット 4. ステータスの返却 /SubmitLogon サーバ Cancel mainMenu.jsp logon.jsp 5. 次画面の出力 認証済み ログイン 認証 UserA クライアント ================= ●●●●● アカウント================ Inbox =========== =============== ●●●●●●●● パスワード Outbox =============== OK Cancel 8 Strutsにおける成果物 実装:設定ファイルstruts-config.xml 設計:画面遷移図 フレームワークによる明示的な仕様は定められていない struts-config.xmlとして実装できる設計にする必要性 org.example.LogonForm スタート画面 設計もフレームワークに よって暗黙的な仕様で 制限されている ログイン画面 /Logon welcom.jsp logon.jsp LogonForm success /Logoff /SubmitLogon org.example.LogoffAction 認証済み画面 mainMenu.jsp failure success org.example.LogonAction Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 9 発表の流れ 研究の背景と目的 Strutsとは メタモデルとMOF 提案手法 Strutsの成果物とトレース情報に対するメタモデル定義 メタモデルに基づく追跡可能性の実現手法 まとめと今後の課題 2005/11/29 第150回ソフトウェア工学研究会(SIGSE-150-5) Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 10 メタモデルの重要性 ソフトウェア開発で扱う情報 要求,設計,実装,依存関係,進捗,etc 情報を定められた仕様に従ってモデルとして表現 仕様が曖昧な場合や明示されない場合が存在 記述仕様 <<model>> A B 対象の情報 C モデル化 開発者 仕様を形式的に定義(メタモデル)できる必要 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 11 MOF(Meta Object Facility) オブジェクト指向に基づいてメタモデルを 定義するためのOMG標準言語 UMLのクラス図に似た意味論をもつが, 表記法はない X UMLは同じ性質のオブジェクトをUMLクラス として抽象化 メタオブジェクトは他のオブジェクトの性質を 規定するオブジェクト(≒UMLクラス) MOFリポジトリを生成可能 MOF クラス 1 0..1 Y メタモデル設計者 UMLクラス図を用いて記述されることが多い MOFは同じ性質のメタオブジェクトを MOFクラスとして抽象化 <<meta-model>> モデル化 定義 <<model>> A:Y B:X MOF オブジェクト C:Y 開発者 定義 モデル化 対象の情報 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 12 MOFリポジトリ MOFで記述したメタモデルに対して,そのスキーマに従うイン スタンスを管理できるリポジトリを生成可能 メタモデ ル <<meta-model>> <<meta-model>> A 1 * A B B C 1 0..1 Generate MOFリポジトリ C メタモデル設計者 モデル (インスタン ス) 格納OK 格納OK 格納NG <<model>> A1: A B1: B <<model>> A1: A B1: B <<model>> A1: A B1: B C1: C B2: B 開発者A 開発者B C1: C 開発者C メタモデル 違反 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 13 発表の流れ 研究の背景と目的 Strutsとは メタモデルとMOF 提案手法 Strutsの成果物とトレース情報に対するメタモデル定義 メタモデルに基づく追跡可能性の実現手法 まとめと今後の課題 2005/11/29 第150回ソフトウェア工学研究会(SIGSE-150-5) Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 14 struts-config.xmlのMOFメタモデル XML文書のメタモデル DTD(Document Type Definition,文書定義型)で定義されている MOFによるXML文書のメタモデル 要素の親子関係をMOFクラスの集約関係として定義 ※ MOFで再定義するのは,全ての成果物をMOFリポジトリの上で統一的に扱うため StrutsConfig <!– struts-config.xmlのDTDの一部 --> 0..* <!ELEMENT struts-config (…, form-beans?, …, action-mappings?)> … <!ELEMENT form-beans (form-bean*)> … <!ELEMENT form-bean (…)> <!ATTLIST form-bean name %BeanName; #REQUIRED> <!ATTLIST form-bean type %ClassName; #IMPLIED> … 1 1 ActionMappings FormBeans 1 1 0..* 0..* Action FormBean + + 0..* name: BeanName type: ClassName [0..1] + + + + + path: RequestPath type: ClassName [0..1] name: BeanName [0..1] forward: RequestPath [0..1] scope: RequestScope 0..1 0..* Forward + + name: String path: RequestPath [0..1] 15 struts-config.xmlのモデル例 <<meta-model>> StrutsConfig 1 1 0..* 1 1 0..* 0..* Action FormBean + + 0..* ActionMappings FormBeans name: BeanName type: ClassName [0..1] + + + + + path: RequestPath type: ClassName [0..1] name: BeanName [0..1] forward: RequestPath [0..1] scope: RequestScope 0..1 0..* <<instance of>> Forward + + : StrutsConfig : FormBeans name: String path: RequestPath [0..1] : ActionMappings : Action : FormBean + path: = "/SubmitLogon" + name: = "LogonForm" + type: = "org.example.LogonForm" + type: = "org.example.LogonAction" + name: = "LogonForm" + scope: = "request" <<model>> : Forward : Forward + name: = "success" + path: = "mainMenu.jsp" + name: = "failure" + path: = "logon.jsp" 16 画面遷移図のMOFメタモデル UMLアクティビティのメタモデルをベースに定義 ノード ActivityNode 辺 ActivityEdge 画面DisplayNode アクションActionNode リクエストActionEdge 次画面遷移ForwardEdge ValueSpecification (from BasicActivities) ガード条件 ValueSpecification +guard +target 1 +incomming ActivityNode 1 (from BasicActivities) +source ActivityEdge * +outgoing (from BasicActivities) org.example.LogonForm 1 ログイン画面 * /Logon logon.jsp DisplayNode + impl_file: JspName ActionNode + + path: String impl_class: ClassName LogonForm /SubmitLogon 認証済み画面 mainMenu.jsp failure ActionEdge ForwardEdge constraints {+source is DisplayNode} {+target is ActionNode} constraints {+source is ActionNode} +action DisplayDef +form-bean ActionFormBean success org.example.LogonAction + + + name: String impl_class: ClassName scope: String 17 画面遷移図のモデル例 ValueSpecification (from BasicActivities) <<meta-model>> +target +guard ActivityNode 1 (from BasicActivities) +source ActivityEdge * +outgoing (from BasicActivities) 1 DisplayNode + * ActionNode impl_file: JspName + + 1 +incomming path: String impl_class: ClassName ActionEdge ForwardEdge constraints {+source is DisplayNode} {+target is ActionNode} constraints {+source is ActionNode} <<instance of>> +action DisplayDef +form-bean ActionFormBean + + + name: String impl_class: ClassName scope: String : DisplayNode + : ValueSpecification impl_file: = "logon.jsp" +source + body: = "[failure]" +target : ActionFormBean org.example.LogonForm ログイン画面 + + + name: = "LogonForm" impl_class: = "org.example.LogonForm" scope: = "request" /Logon logon.jsp +source path: = "/SubmitLogon" impl_class: = "org.example.LogonAction" LogonForm +source /SubmitLogon mainMenu.jsp +target : ActionNode + + 認証済み画面 : ForwardEdge : ActionEdge failure <<model>> : ValueSpecification : ForwardEdge + body: = "[success]" +target success : DisplayNode org.example.LogonAction + impl_file: = "mainMenu.jsp" 18 トレース情報のMOFメタモデル(1/2) 成果物間の依存関係(トレース情報)のメタモデル 依存関係を保持した状態で管理しなければならない要素対を定義 依存元の要素と依存先の要素のn対nの関係 あるトレース情報はより詳細な別のトレース情報と関連をもつ インスタンスであるトレース情報はツールが自動生成することを想定 ValueSpecification (from BasicActivities) +guard 1 + +incomming Asub_X_Trace: Trace Asub : RefElement ref: = "ValueSpecification" ActivityEdge * +outgoing (from BasicActivities) + detail: String StrutsConfig ValueSpecification.body → Forward.name 0..* 1 1 0..* ActionMappings FormBeans * ActionEdge constraints {+source is DisplayNode} {+target is ActionNode} Name A : RefElement ForwardEdge constraints {+source is ActionNode} + ref: = "ForwardEdge" X : RefElement A_X_Trace: Trace + detail: String 1 1 0..* 0..* Action FormBean + + name: BeanName ref: = "Forward" + type: ClassName [0..1] + + + + + path: RequestPath type: ClassName [0..1] name: BeanName [0..1] forward: RequestPath [0..1] scope: RequestScope +action ActionFormBean + + + name: String impl_class: ClassName scope: String 0..1 B_XY_Trace: Trace +form-bean B : RefElement + ref: = "DisplayNode" + detail: String DisplayNode.impl_file → Action.forward DisplayNode.impl_file → Forward.path 0..* Forward + + name: String path: RequestPath [0..1] C_Y_Trace: Trace : RefElement Software Engineering Laboratory, CDepartment of Computer Science, Graduate School of Information Science and Y :Technology, RefElement Osaka University + detail: String 19 トレース情報のMOFメタモデル(2/2) 画面遷移図の メタモデル要素 への参照 Asub : RefElement + ref: = "ValueSpecification" + ref: = "ForwardEdge" detail: String ValueSpecification.body → Forward.name X : RefElement A_X_Trace: Trace A : RefElement + struts-config.xmlの メタモデル要素への参照 Asub_X_Trace: Trace + + detail: String ref: = "Forward" B_XY_Trace: Trace B : RefElement + ref: = "DisplayNode" + detail: String DisplayNode.impl_file → Action.forward DisplayNode.impl_file → Forward.path C_Y_Trace: Trace C : RefElement + ref: = "ActionNode" + Y : RefElement detail: String ActionNode.path → Action.path ActionNode.impl_class → Action.type + ref: = "Action" D_YZ_Trace: Trace D : RefElement + ref: = "ActionFormBean" + detail: String ActionFormBean.name ActionFormBean.name ActionFormBean.impl_class ActionFormBean.scope → FormBean.name → Action.name → FormBean.type → Action.scope Z : RefElement + ref: = "FormBean" Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 20 メタモデルに基づく追跡可能性の実現手法 MOFリポジトリの操作による追跡可能性の実現 1. 2. 個々の成果物をMOFリポジトリで管理 トレース情報をMOFリポジトリに自動蓄積 ValueSpecification (from BasicActivities) +target ref: = "ValueSpecification" 1 StrutsConfig Asub_X_Trace: Trace Asub : RefElement + +guard + detail: String ValueSpecification.body → Forward.name 0..* +incomming ActivityNode 1 (from BasicActivities) +source ActivityEdge * +outgoing (from BasicActivities) 1 1 1 A : RefElement + ref: = "ForwardEdge" + detail: String 0..* ActionMappings FormBeans X : RefElement A_X_Trace: Trace + ref: = "Forward" 1 * 1 0..* 0..* B_XY_Trace: Trace B : RefElement DisplayNode + impl_file: JspName ActionNode + + path: String impl_class: ClassName + ActionEdge ForwardEdge constraints {+source is DisplayNode} {+target is ActionNode} constraints {+source is ActionNode} ref: = "DisplayNode" ref: = "ActionNode" + + C_Y_Trace: Trace C : RefElement + +action DisplayDef + Action FormBean + detail: String DisplayNode.impl_file → Action.forward DisplayNode.impl_file → Forward.path Y : RefElement detail: String ActionNode.path → Action.path ActionNode.impl_class → Action.type + name: BeanName type: ClassName [0..1] + + + + + path: RequestPath type: ClassName [0..1] name: BeanName [0..1] forward: RequestPath [0..1] scope: RequestScope ref: = "Action" 0..1 +form-bean 0..* D_YZ_Trace: Trace ActionFormBean + + + D : RefElement name: String impl_class: ClassName scope: String + 画面遷移図のメタモデル ref: = "ActionFormBean" + detail: String ActionFormBean.name → FormBean.name ActionFormBean.name → Action.name ActionFormBean.impl_class → FormBean.type ActionFormBean.scope → Action.scope Forward Z : RefElement + ref: = "FormBean" トレース情報のメタモデル + + name: String path: RequestPath [0..1] struts-config.xmlの メタモデル org.example.LogonForm スタート画面 ログイン画面 /Logon welcom.jsp logon.jsp LogonForm success /Logoff /SubmitLogon 正当性管理 org.example.LogoffAction 認証済み画面 mainMenu.jsp failure トレース管理 success 正当性管理 org.example.LogonAction モデリングインターフェース 開発者 開発者 21 個々の成果物の正当性管理 <<meta-model>> <<meta-model>> A RefB BX_Trace <<meta-model>> RefX B X RefC C 画面遷移図のメタモデル CY_Trace RefY Y 画面遷移図-struts-config.xml間の 依存関係のメタモデル(トレースメタモデル) struts-config.xmlの メタモデル <<model>> B1: B C1: C C2: C <<model>> 正当性管理 X1: X Y1: Y Y2: Y <<model>> B1: B <<model>> C1: C X1: X C2: C 正当性管理 モデリングインターフェース 開発者 Y1: Y Y2: Y 開発者 22 トレース情報の蓄積 <<meta-model>> <<meta-model>> A RefB RefX C 画面遷移図のメタモデル C2: C CY_Trace RefY 画面遷移図-struts-config.xml間の 依存関係のメタモデル(トレースメタモデル) <<model>> <<model>> C1: C <<meta-model>> X B RefC B1: B BX_Trace RefB1 B1X1: BX_Trace RefX1 RefC1 C1Y1: CY_Trace RefY1 RefC2 C2Y2: CY_Trace Y struts-config.xmlの メタモデル <<model>> 作成されることが要求 X1: X されるが,まだ作られて Y1: Y いない状態 Y2: Y RefY2 トレース管理 モデリングインターフェース 開発者 開発者 23 追跡可能性の実現と一貫性の管理(1/2) <<meta-model>> <<meta-model>> A RefB C 画面遷移図のメタモデル <<meta-model>> X C1: C C2: C 変更 CY_Trace RefY 画面遷移図-struts-config.xml間の 依存関係のメタモデル(トレースメタモデル) <<model>> <<model>> 正当性管理 RefX B RefC B1: B BX_Trace Y struts-config.xmlの メタモデル <<model>> RefB1 B1X1: BX_Trace RefX1 RefC1 C1Y1: CY_Trace RefY1 X1: X Y1: Y Y2: Y 要修正 RefC2 C2Y2: CY_Trace RefY2 正当性管理 トレース管理 モデリングインターフェース 開発者 開発者 24 追跡可能性の実現と一貫性の管理(2/2) <<meta-model>> <<meta-model>> メタモデル違反 A B 1 0..1 C 画面遷移図のメタモデル RefB C1: C C2: C 正当性管理 削除 要修正 RefX X RefC CY_Trace RefY 画面遷移図-struts-config.xml間の 依存関係のメタモデル(トレースメタモデル) 削除<<model>> B1: B BX_Trace <<meta-model>> <<model>> Y struts-config.xmlの メタモデル <<model>> RefB1 B1X1: BX_Trace RefX1 RefC1 C1Y1: CY_Trace RefY1 X1: X Y1: Y Y2: Y 影響 削除 RefC2 C2Y2: CY_Trace トレース情報の 削除 RefY2 正当性管理 トレース管理 モデリングインターフェース 開発者 開発者 25 発表の流れ 研究の背景と目的 Strutsとは メタモデルとMOF 提案手法 Strutsの成果物とトレース情報に対するメタモデル定義 メタモデルに基づく追跡可能性の実現手法 まとめと今後の課題 2005/11/29 第150回ソフトウェア工学研究会(SIGSE-150-5) Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 26 まとめと今後の課題 まとめ 画面遷移図とstruts-config.xml,及びそのトレース情報 に対してMOFメタモデルを定義 メタモデルから生成したMOFリポジトリを操作することで, Strutsにおける追跡可能性,一貫性管理を実現する手 法を提案 今後の課題 メタモデルの詳細化 プロトタイプツールの実装による評価実験 2005/11/29 第150回ソフトウェア工学研究会(SIGSE-150-5) Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 27 SIGSE質問,コメント トレーサビリティを確保するということだけなら,わざわざこんなことしなくて も自動的に生成してしまったら? QVTを使わなかった(使えなかった)のは?(沢田先生@京大) インスタンス決めうちであるような依存関係は?(沢田先生@京大) 単純なn対nではなくてもう少し何か.すごい数になるよね(沢田先生 @京大) 汎用的な手法のようだけど,なぜstrutsを? なぜ設計と実装の間のインスタンスに対して,適切なトレースが作れる の?(岸先生@JAIST) 簡単に言うけど…もうちょっと詳しく(落水先生@JAIST) 次々に入り組んだトレースを保存していって,いざ修正が入った場合に, その影響が及ぶ部分をどうピンポイントに取り出すのか.(落水先生 @JAIST) Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 32
© Copyright 2024 ExpyDoc