• 検索結果がありません。

第 5 章 プログラム変更検出ツール 53

5.2 ツールの実装

5.2.1 編集操作履歴の読み込み

編集操作の記録された編集操作履歴には,バージョンが5.0.0より前の Opera-tionRecorderによって記録された「バージョン4」と,それ以降のOperationRecorder によって記録された「バージョン5」の2つのバージョンがあり,どちらのバージョ ンでも本手法で利用する編集操作の情報を含んでいるものの,それぞれ編集操作 履歴を格納しているフォルダの構成やXMLファイルの形式が異なる.

バージョン4とバージョン5のフォルダ構成と読み込み処理の違いを図 5.1に示 す.この図は,編集操作を記録する前のプロジェクトのフォルダの構成が図中の 上のようであった場合に,バージョン4では図中の左のようなフォルダ構成で編集 操作履歴が格納され,バージョン5では図中の右のようなフォルダ構成で編集操 作履歴が格納されることを表している.また本手法ではそれぞれのバージョンの 編集操作履歴ごとに異なる読み込み処理を行い,本手法で用いる編集操作のデー タ形式に変換する.

図 5.1: 編集操作履歴の相違点

バージョン4の編集操作履歴では,historyフォルダ以下にJavaソースファイル が格納されているフォルダ(srcフォルダ)以下と同様のフォルダ構成で各フォル

5.2. ツールの実装 55 ダが作成され,Javaソースファイルの名前に対応するフォルダの中に,そのソー スファイルに対する編集操作を格納したXMLファイルが格納されている.それに 対し,バージョン5の編集操作履歴では,historyフォルダの下に,プロジェクト に対して行われたすべての編集操作を格納したXMLファイルがまとめて格納され ている.またバージョン4とバージョン5の両方において,編集操作を格納してい る各XMLファイルのファイル名はそのファイルが作成された時刻をミリ秒の精度 のUnix時刻で表したものとなる.

本手法で用いる編集操作はバージョン4と同様にその編集操作の編集対象とな るソースファイルごとに管理しているため(図中の下),バージョン4の編集操作 履歴に対しては再帰的にフォルダを探索し,ソースファイルに対応した編集操作 の記録されたXMLファイルを読み込むだけでよい.しかし,バージョン5の編集 操作履歴では一つのフォルダに全てのXMLファイルが管理されおり,さらに単一 のXMLファイルの中に編集対象となるファイルが異なる編集操作が格納されてい るため,一度全てのXMLファイルを読み込み,それぞれのXMLファイルに格納 されている全ての編集操作を取得した上で,編集対象が同じ編集操作同士を集め,

それらを編集時刻が若い順にソートするという処理を行っている.

バージョン4の編集操作履歴のXMLファイルは,OperationRecorderの機能を呼 び出すことで全ての編集操作を読み込むことができる.それに対し,バージョン5 の編集操作履歴は本手法で扱う編集操作に変換する必要があったため,XMLファ イルを読み込む処理以外は本ツールで実装した.

ここで,バージョン4の編集操作履歴のXMLファイルの形式は以下のように なる.

バージョン4のXMLファイル形式

<OperationHistory version="">

<basicData>

<file></file>

<developer></developer>

</basicData>

<sourceCode></sourceCode>

<operations>

<normalOperation time="" offset="" copy="">

<inserted></inserted>

<deleted></deleted>

</normalOperation>

<compoundedOperations name="">

<normalOperation>...</normalOperation>

</compoundedOperations>

<triggeredOperations name="">

<normalOperation>...</normalOperation>

</triggeredOperations>

<copyingOperation time="" offset="">

<copied></copied>

</copyingOperation >

<fileOperation time="" type=""/>

</operations>

</OperationHistory>

OperationHistoryタグはXMLファイルのルート要素である.version属性に

は編集操作履歴のバージョン(記録されたOperationRecorderのバージョン)が格 納されている.basicDataタグにはそのXMLファイルの基本的な情報が格納され ている.fileタグのインナーテキストには編集対象であるJavaファイルの完全 限定名が格納されている.developerタグには開発者の名前(whoamiコマンドに よって取得されるユーザ名)が格納されている.sourceCodeタグのインナーテキ ストにはそのXMLファイルにおける初期状態のソースコードが格納されている.

このソースコードに対して同じoperationsタグに格納されている編集操作を時 刻の若い順に適用することでソースコードを復元することができる.operations タグには記録された操作が記録された分だけ格納されている.normalOperation

5.2. ツールの実装 57 タグにはテキストを書き換える編集操作の情報が格納されている.time属性は その編集操作の編集時刻を表し,offset属性はその編集操作の編集箇所を表す.

copy属性はその編集操作がCut操作か,Paste操作かを表す.insertedタグの インナーテキストにはその編集操作によって挿入されたテキストが格納されてい

る.deletedタグのインナーテキストにはその編集操作によって削除されたテキ

ストが格納されている.compoundedOperationsタグは複合操作に関する情報が 格納されている.複合操作は主にEclipseによって行われた自動編集操作が記録

される.name属性はEclipseによって定義されている各自動編集機能の名前が記

録される.またcompoundedOperationsタグは子要素として自動編集によって適 用された編集操作を適用された分だけ持つ.triggeredOperationsタグの内容は compoundedOperationsタグとほぼ同様である.compoundedOperationsタグには

開発中にEclipseによって自動的に行われた編集操作が記録されているのに対して,

triggeredOperationsタグにはユーザーがEclipseの自動編集機能を選択するこ

とによって行われた自動編集操作を記録されている.copyingOperationタグはコ ピー操作の情報を格納している.time属性はコピーの行われた時刻,offset属性 はコピーの行われた箇所の情報が格納されている.copiedタグのインナーテキス トにはコピーされたテキストが格納されている.fileOperationタグにはファイ ル操作に関する情報が格納されている.time属性にはそのファイル操作が行われ た時刻が格納されている.type属性にはファイルオープン,ファイルセーブ,ファ イルクローズのどれかの操作を表す情報が格納されている.

バージョン5の編集操作履歴のXMLファイルの形式は以下のようになる.また,

バージョン5の編集操作履歴のXMLファイルの形式は大森によって公開されてい る 1

1http://www.fse.cs.ritsumei.ac.jp/takayuki/

バージョン5のXMLファイル形式

<OperationHistory version=>

<basicData><developer></developer></basicData>

<operations>

<normalOperation ccp="" file="" hash="" offset="" time="">

<inserted></inserted>

<deleted></deleted>

</normalOperation>

<compoundOperation name="" hash="" time="">

<normalOperation>...</normalOperation>

</compoundOperation>

<copyOperation file="" offset="" time="">

<copied></copied>

</copyOperation>

<menuOperation file="" label="" time=""/>

<fileOperation file="" time="" type="">

<code></code>

</fileOperation>

<commitOperation time="" file="" comment=""/>

</operations>

</OperationHistory>

バージョン5の編集操作履歴の形式はバージョン4と重複する部分があるため,

ここではバージョン4と異なる部分についてだけ述べる.normalOperationタグの ccp属性にはバージョン4のnormalOperationタグのcopy属性と同様にこの編集 操作がカット操作やペースト操作かどうかを表す情報が格納されている.file属 性にはこの編集操作の編集対象となるファイルの名前が格納されている.ここで,

バージョン4では1つのXMLファイルのbasicDataタグに編集対象となるファイ ル名が格納されていたの対してバージョン5ではXMLファイルに格納されている 各編集操作のそれぞれに編集対象となるファイル名が格納されている.そのため バージョン5では異なるファイルに対する編集操作が1つのXMLファイルに格納 されている場合がある.このfile属性はcopyOperationタグやmenuOperationタ

グ,fileOperationタグにも同様に存在する.hash属性にはその操作を一意に特

定するためのハッシュ値が格納されている.このhash属性はcompoundOperation タグにも同様に存在する.compoundOperationタグはバージョン4のものと同様 だが,先ほど述べたように編集対象の違う編集操作が複合操作としてまとめられて

5.2. ツールの実装 59 いる場合がある.copyOperationタグはバージョン4のcopyingOperationと同 様である.menuOperationタグはEclipse上で選択したメニューについての情報が 格納される.label属性にはそのメニューの名前が格納されている.time属性に はそのメニューが選択された時刻が格納されている.fileOperationタグはバー ジョン4のものほぼ同様だが,type属性の種別としてACT(そのファイルを表示 しているエディタをアクティブにした状態)が追加されている.また,この操作が ファイルオープンの操作であった場合に,fileOperationタグがもつcodeタグの インナーテキストに,開いたファイルのソースコードが格納される.バージョン5 ではバージョン4に存在していたソースコードの初期状態を表すsourceCodeタグ が存在しない代わりに,ファイルを開いた時のソースコードの状態がcodeタグの インナーテキストに格納されている.commitOperationタグは擬似的なコミット の操作に関する情報が格納されている.バージョン5の編集操作履歴を記録する OperationRecorderでは,Eclipse上でメニューを選ぶことでコミット時のコメントを 記入するダイアログが現れ,擬似的コミットを行うとその内容がcommitOperation タグに記録される.time属性にはそのコミットが行われた時刻が格納されている.

file属性にはそのコミットが行われた時にアクティブになっていたファイルの名 前が格納されている.comment属性はそのコミットと一緒に記録されたそのコミッ トに関するコメントが格納されている.