以下に、本願の開示するソースコード変換装置、ソースコード変換方法及びソースコード変換プログラムの実施例を図面に基づいて説明する。以下に示す実施例においては、アプリケーションを構成するために作成された複数のソースコードについて、複数ソースコードの構造及び呼出関係を解析し、解析結果に基づいて変換対象箇所の抽出を行い、抽出された変換対象箇所に対応するソースコードの該当箇所の書き換えを行う実施例について説明を行う。しかしながら、本願の開示するソースコード変換装置、ソースコード変換方法及びソースコード変換プログラムの実施例は以下で説明するものに限られるわけでなく、ソースコードの変換を自動的に行う各種装置、方法およびプログラムにも同様に適用することが可能である。
最初に、本実施例に係るソースコード変換装置の全体構成の概要について説明する。図1は、本実施例に係るソースコード変換装置の全体構成を示す図である。ソースコード変換装置1は、ソースコード構造解析処理部101、ソースコード構造記憶部104、ソースコード変換処理部102、変換規則記憶部105とから構成される。さらに、ソースコード変換処理部102は、ソースコード検査処理部103、検査規則記憶部107、検査結果記憶部106とから構成されていてもよい。ソースコード変換処理部102がさらに、ソースコード検査処理部103、検査規則記憶部107、検査結果記憶部106とから構成される場合については実施例3として後述する。
ソースコード変換装置1は、コンピュータに保存されている修正対象となるソースコード一式を入力データとして読み取り、読み取ったソースコード一式の構造及び呼出関係を解析する。そして、解析結果に基づいてソースコードの変換を行い、変換されたソースコード一式を、コンピュータ内に保存する。
ソースコード変換装置1が有する各処理部及び記憶部について説明する。
まず、ソースコード構造解析処理部101とソースコード構造記憶部104について説明する。
ソースコード構造解析処理部101は、修正対象となるソースコード一式をコンピュータ上から読み取りソースコードの構造及び呼出関係の解析を行う。ソースコードの構造解析は、読み取ったソースコードそれぞれについて構文解析を行うことによって行われる。例えば、ソースコードがVISUAL BASIC(登録商標)言語で作成されている場合、VISUAL BASIC言語の構文ルールに基づいて、ソースコード内で定義されているクラス定義、メソッド定義、インスタンス定義、などの箇所を抽出しソースコード構造として解析する。
それぞれの定義箇所の抽出は、例えば、言語の構文ルールに基づいて作成された正規表現によって抽出してもよいし、ソースコードを行単位で読み込んで行データと言語の構文ルールとの比較を行うことによって、どのような定義なのかを判別することによって抽出してもよい。例えば、言語の構文ルールによって、「クラス定義はClassの文字列が定義文字として含まれている行で始まり、End Classの記述で終わる」と定められている場合は、「Class」および「End Class」の文字列定義箇所を正規表現や行データの比較などにより検索することで、クラス定義箇所の抽出を行い、クラス定義行の内容及びクラス定義の開始行、終了行の抽出を行う。
さらに、ソースコードの構造解析は、読み取ったソースコードそれぞれについての呼出関係についても解析される。ソースコードの呼出関係についても、ソースコードの構造解析を行う場合と同様に、読み取ったソースコードそれぞれについて構文解析を行うことによって行われる。例えば、ソースコードはVISUAL BASIC言語で作成されている場合、VISUAL BASIC言語の構文ルールに基づいて、ソースコード内で定義されているインスタンス定義の箇所を抽出し、さらに抽出したインスタンス定義から、インスタンスの生成元となるクラスおよびインスタンス定義から呼び出しているメソッドの抽出を行うことにより、どのクラスのどのメソッドを呼び出しているのかを解析する。
これらのインスタンス定義箇所の抽出、クラスおよびメソッドの抽出は、例えば、言語の構文ルールに基づいて作成された正規表現によって抽出してもよいし、ソースコードを行単位で読み込んで行データと言語の構文ルールとの比較を行うことによって、どのような定義なのかを判別することによって抽出してもよい。
例えば、言語の構文ルールによって、インスタンス定義は「インスタンス名=new クラス名」として定義されることが定められており、メソッド呼出は「インスタンス名.メソッド名」として記述されることが定められている場合は、まず、newの文字列の定義箇所を正規表現や行データの比較などによって検索することで、インスタンス定義箇所の抽出を行い、インスタンス名およびクラス名を取得する。そして、取得したインスタンス名の文字列を、正規表現や行データの比較などによって検索することによって呼び出しているメソッド名を取得する。
ソースコード構造記憶部104には、ソースコード構造解析処理部101によって解析されたソースコードの構造及び呼出関係が記憶される。ソースコード構造解析処理部101によって解析された構造及び呼出関係がどのようなデータ構造としてソースコード構造記憶部104に記憶されるかのデータ構造の例として、クラス構造、メソッド構造、インスタンス構造、メソッド呼出関係、のそれぞれについて説明する。
図2は、クラス構造の解析結果としてソースコード構造記憶部104に記憶されるデータ構造の例である。クラス構造の解析結果としては図2に示されるように「クラス名」「ファイル名」「開始行番号」「終了行番号」「修飾子」「継承元」の情報を有する。「クラス名」は定義されているクラスの名称を、「ファイル名」は定義されているクラスが記述されているソースコードのファイル名称の保存場所を含めたフルパス形式を、「開始行番号」は定義されているクラスが記述されているファイル名で表されるソースコード内での開始行番号を、「終了行番号」は定義されているクラスが記述されているファイル名で表されるソースコード内での終了行番号を、「修飾子」は定義されているクラスがどの範囲からアクセスできるかを表すアクセス修飾子を、「継承元」は定義されているクラスが継承している継承元クラスを、それぞれ記憶するものである。
例えば、「クラス名」が“M_SHAINView”、「ファイルパス」が“WebASMaster/M_SHAINView.vb”、「開始行番号」が“4”、「終了行番号」が“89”、「修飾子」が“Public”、「継承元」が“BasePage”として記憶されている場合は、クラスM_SHAINViewが修飾子PublicとしてBasePageクラスを承継して定義されており、WebASMaster/M_SHAINView.vbのファイル内の4行目から89行目に記述されている事を表す。
図3は、メソッド構造の解析結果としてソースコード構造記憶部104に記憶されるデータ構造の例である。メソッド構造の解析結果としては、図3に示されるように「メソッド名」「パラメータ」「戻り値型」「ファイル名」「クラス名」「開始行番号」「終了行番号」の情報を有する。「メソッド名」は定義されているメソッドの名称を、「パラメータ名」は定義されているメソッドが受け取る引数パラメータを、「戻り値型」は定義されているメソッドが返却する値の型を、「ファイル名」は定義されているメソッドが記述されているソースコードのファイル名称の保存場所を含めたフルパス形式を、「クラス名」は定義されているメソッドが記述されているクラス名を、「開始行番号」は定義されているメソッドが記述されているファイル名で表されるソースコード内での開始行番号を、「終了行番号」は定義されているメソッドが記述されているファイル名で表されるソースコード内での終了行番号を、それぞれ記憶するものである。
例えば、「メソッド名」が“Page_Load”、「パラメータ」が“Object,EventArgs”、「戻り値型」が“String”、「ファイル名」が“WebASMaster/M_SHAINView.vb”、「クラス名」が“M_SHAINView”、「開始行番号」が“7”、「終了行番号」が“23”、として記憶されている場合は、メソッドPage_LoadはM_SHAINViewクラスに定義されており、引数としてパラメータObjectとEventArgsを受け取り、戻り値型としてStringを返し、WebASMaster/M_SHAINView.vbのファイル内の7行目から23行目に記述されている事を表す。
図4は、インスタンス構造の解析結果としてソースコード構造記憶部104に記憶されるデータ構造の例である。インスタンス構造の解析結果としては図4に示されるように「宣言変数名」「インスタンス型」「ファイル名」「クラス名」「メソッド名」「宣言行番号」の情報を有する。「宣言変数名」は定義さているインスタンスの名称を、「インスタンス型」は定義されているインスタンスのクラス型を、「ファイル名」は定義されているインスタンスが記述されているソースコードのファイル名称の保存場所を含めたフルパス形式を、「クラス名」は定義されているインスタンスが記述されているクラス名を、「メソッド名」は定義されているインスタンスが記述されているメソッド名を、「宣言行番号」は定義されているインスタンスが記述されているファイル名で表されるソースコード内での宣言行番号を、それぞれ記憶するものである。
例えば、「宣言変数名」が“param”、「インスタンス型」が“M_SHAINMANAGERParam”、「ファイル名」が“WebASMaster/M_SHAINView.vb”、「クラス名」が“M_SHAINView”、「メソッド名」が“InsertButton_Click”、「宣言行番号」が“37”、として記憶されている場合は、インスタンスparamはインスタンス型がM_SHAINMANAGERParamとして、M_SHAINViewクラス内のInsertButton_Clickメソッド内に定義されており、WebASMaster/M_SHAINView.vbのファイル内の37行目に記述されている事を表す。
図5は、メソッド呼出関係の解析結果としてソースコード構造記憶部104に記憶されるデータ構造の例である。メソッド呼出関係の解析結果としては図5に示されるように「ファイル名」「クラス名」「メソッド名」「呼出先クラス名」「呼出先メソッド名」「呼出先メソッドパラメータ」「呼出行番号」の情報を有する。「ファイル名」はメソッド呼出処理が記述されているソースコードのファイル名称の保存場所を含めたフルパス形式を、「クラス名」はメソッド呼出処理が記述されているクラス名を、「メソッド名」はメソッド呼出処理が記述されているメソッド名を、「呼出先クラス」は呼出先のメソッドが定義されているクラス名を、「呼出先メソッド名」は呼出先メソッドの名称を、「呼出先メソッドパラメータ」はメソッド呼出処理によって呼び出すメソッドに引き渡すパラメータを、「呼出行番号」はメソッド呼出処理が記述されているファイル名で表されるソースコード内での行番号を、それぞれ記憶するものである。
例えば、「ファイル名」が“WebASMaster/M_SHAINView.vb”、「クラス名」が“M_SHAINView”、「メソッド名」が“InsertButton_Click”、「呼出先クラス名」が“Validator”、「呼出先メソッド名」が“ServerValidate”、「呼出先メソッドパラメータ」が“param”、「呼出行番号」が“32”、として定義されている場合は、M_SHAINViewクラスのメソッドInsertButton_ClickからValidatorクラスのServerValidateメソッドにパラメータparamを渡して呼出を行っており、その呼出はWebASMaster/M_SHAINView.vbのファイル内の32行目に記述されている事を表す。
次に、ソースコード変換処理部102と変換規則記憶部105について説明する。
ソースコード変換処理部102は変換規則記憶部105に記憶されている変換規則を読み取り、変換規則に基づいてソースコード構造記憶部104に記憶されているソースコードの構造及び呼出関係から変換対象箇所の特定を行う。変換対象箇所が特定されたら、修正対象となるソースコードをコンピュータ上から読み込み、変換対象箇所のソースコードの書き換えが必要かどうかを判断し、書き換えが必要であると判断された場合には、ソースコードの書き換えを行う。そして、変換されたソースコード一式をコンピュータ上に保存する。
図6は、変換規則記憶部105に記憶されている変換規則の例を示したものである。例えば、変換規則は図6に示されるようなXML(Extensible Markup Language)データ形式で変換規則が記憶されている。図6の例では、メソッド内のCatchの記述行とEnd Tryの記述行の間にLM.WriteButtonEvent(Me,sender,e)という記述がされていなかった場合に、当該記述を追記するという変換規則の例を表している。具体的には、図6の5行目の<method targetword1=“¥sCatch¥s” targetword2=“¥sEnd¥sTry¥s”>の記述が変換対象の元となる箇所の記述の定義であり、6行目の<item mode=“insert” target=“LM.WriteButtonEvent(Me,sender,e)” />の記述が変換対象の元となる記述をどのように変換するのかの変換ルールの定義である。
図6の5行目の変換元となる箇所の定義では、methodタグに属性値としてtargetword1とtargetword2が定義されているため、メソッド定義内に記述されているtargetword1とtargetword2の定義文字にマッチする間の箇所が変換対象箇所となる。すなわち、メソッド定義内のCatchの記述行とEnd Tryの記述行の間の記述が変換対象の元となる箇所になる。
そして、図6の6行目の変換対象の元なる記述をどのように変換するかの定義では、itemタグに属性値として、modeとtargetが定義されている。modeにはどのように変換するのかが定義されており、targetは変換の内容が定義されている。当該例においては、modeの値が“insert”と定義されており、targetの値が“LM.WriteButtonEvent(Me,sender,e)”とされているため、変換対象の元となる箇所にtargetの値をinsert、すなわち、値を挿入する、という定義になっている。
このように変換規則を定義することにより、メソッド内のCatchの記述行とEnd Tryの記述行の間にLM.WriteButtonEvent(Me,sender,e)という記述がされていなかった場合に、当該記述を追記するという変換規則の定義となる。
次にフローチャートを用いて、ソースコード変換装置がどのようにソースコードの変換処理を行うのか、具体的な処理フローを説明する。
図9は実施例1におけるソースコード変換処理の全体処理フローを表したフローチャート図である。ソースコード変換装置1においては、まず初めに、修正対象となるソースコード一式の構造及びメソッド呼出関係の構造解析が行われる(S901)。この解析処理は、事前にソースコードの全体について、ソースコード構造解析処理部101によって行われ、解析結果はソースコード構造記憶部104に記憶される。ソースコード構造解析処理の詳細については後述する。
ソースコード全体の構造解析が事前に行われると、ソースコードの変換処理が行われる(S902)。ソースコードの変換処理はソースコード変換処理部102によって行われる。ソースコードの変換は変換規則記憶部105に記憶されている変換規則ごとに行われる。いずれの変換規則の変換処理を行うのか、指示を受け付けて、指示された変換規則の変換処理のみを行うようにしてもよいし、すべての変換規則の変換処理を繰り返しすべて行うようにしてもよい。ソースコードの変換処理はソースコード構造記憶部104に記憶されているソースコードの構造に基づいて変換箇所の特定を行い、特定された変換箇所に該当するソースコードの書き換えが行われる。ソースコード変換処理の詳細については後述する。
ここで、1つの変換規則の変換処理が行われ、次の変換規則の変換処理を行う際には、再度ソースコードの構造解析処理が行われる(S903)。これは、S902のソースコード変換処理によって解析結果の元となるソースコードの内容が書き換わっているため、再度の構造解析処理が必要なためである。S903におけるソースコードの解析処理は、ソースコード全体について、再度、構造解析を行ってもよいし、ソースコード変換処理部によって変換されたソースコードに関連するソースコードについてのみ、再度、構造解析を行うようにしてもよい。
次に、ソースコード構造解析処理部101によって行われる、ソースコード構造解析処理の詳細について説明する。
図10は実施例1におけるソースコード構造解析処理部101によって行われる、ソースコード構造解析処理の処理フローを表したフローチャート図である。
ソースコード構造解析処理部101は解析対象となるソースコード一式をコンピュータ上から読み込みを行うと、読み込んだソースコードからクラス定義一覧の取得を行う(S1001)。クラス定義の取得は、ソースコードが記載されている言語のクラス定義の構文ルールに基づいて、正規表現によって抽出してもよいし、ソースコードを行単位で読み込んで行データと言語のクラス定義の構文ルールとの比較を行うことによって取得してもよい。以下の処理で述べる、メソッド定義、インスタンス定義、メソッド呼出定義などの取得についても同様である。
クラス定義の一覧が取得されたら、取得したクラス定義ごとに繰り返し処理を行う(S1002)。まず、取得したクラス定義についてクラス構造情報をソースコードから取得して、取得したクラス構造情報をソースコード構造記憶部104に記憶する(S1003)。ここで記憶するクラス構造情報は図2に示されているような「クラス名」「ファイル名」「開始行番号」「終了行番号」「修飾子」「継承元」などである。
次に、当該クラス定義内に定義されているメソッド定義の一覧を取得する(S1004)。メソッド定義一覧の取得は、当該クラスが定義されているファイル名のファイルの開始行番号から終了行番号の間に定義されているメソッド定義の一覧を取得することによって行われる。
メソッド定義の一覧が取得されたら、取得したメソッド定義ごとに繰り返し処理を行う(S1005)。まず、取得したメソッド定義についてメソッド構造情報をソースコードから取得して、取得したメソッド構造情報をソースコード構造記憶部104に記憶する(S1006)。ここで記憶するメソッド構造情報は図3に示されているような「メソッド名」「パラメータ」「戻り値型」「ファイル名」「クラス名」「開始行番号」「終了行番号」などである。
その次に、当該メソッド定義内に定義されているインスタンス定義の一覧を取得する。インスタンス定義一覧の取得は、当該メソッドが定義されているファイル名のファイルの開始行番号から終了行番号の間に定義されているインスタンス定義の一覧を取得することによって行われる。インスタンス定義の一覧を取得したら、それぞれのインスタンス構造情報をソースコードから取得して、取得したインスタンス構造情報をソースコード構造記憶部104に記憶する(S1007)。ここで記憶するインスタンス構造情報は図4に示されているような「宣言変数名」「インスタンス型」「ファイル名」「クラス名」「メソッド名」「宣言行番号」などである。
その次に、当該メソッド定義内に他のメソッドの呼出処理を行っているメソッド呼出箇所の一覧を取得する。メソッド呼出箇所一覧の取得は、当該メソッドが定義されているファイル名のファイルの開始行番号から終了行番号の間に定義されているメソッド呼出定義の一覧を取得することによって行われる。メソッド呼出定義の一覧を取得したら、それぞれのメソッド呼出情報をソースコードから取得して、取得したメソッド呼出情報をソースコード構造記憶部104に記憶する(S1008)。ここで記憶するメソッド呼出情報は図5に示されているような「ファイル名」「クラス名」「メソッド名」「呼出先クラス名」「呼出先メソッド名」「呼出メソッドパラメータ」「呼出行番号」などである。
そして、S1004で取得したメソッド定義の一覧すべてについてS1006からS1008の処理を行ったかをチェックする(S1009)。取得したメソッド定義すべてについて処理が行われていない場合は、S1005に戻って処理を行っていないメソッド定義について処理を行う(S1009:NO)。取得したメソッド定義すべてについて処理が行われている場合(S1009:YES)は、S1001で取得したクラス定義の一覧すべてについて、S1002からS1009の処理を行ったかをチェックする(S1010)。取得したクラス定義すべてについて処理が行われていない場合は、S1002に戻って、処理を行っていないクラス定義について処理を行う(S1010:NO)。取得したクラス定義すべてについて処理を行っていた場合(S1010:YES)は、ソースコードの構造解析処理を終了する。
次に、ソースコード変換処理部102によって行われるソースコード変換処理の詳細について説明する。
図11は実施例1におけるソースコード変換処理部102によって行われる、ソースコード変換処理の処理フローを表したフローチャート図である。
まず、ソースコード変換処理部102は変換規則記憶部105からソースコードの変換規則の一覧を取得する(S1101)。そして、取得した変換規則ごとに繰り返し処理を行う(S1102)。例えば、変換規則は図6に示されているようなXMLデータ形式で作成されている。
次に、変換規則から変換処理の対象となる記述の定義を取得し、変換対象箇所の一覧をソースコード構造記憶部104から取得し変換対象箇所およびソースコードを特定する(S1103)。例えば、図6の定義例においては、変換元となる箇所としてメソッド定義内に記述されているtargetword1とtargetword2の定義文字にマッチする間の箇所が定義されているため、ソースコード構造記憶部104に記憶されているメソッド構造情報から、メソッド一覧の取得を行い、取得されたメソッドに対応する「ファイル名」の「開始行番号」と「終了行番号」の間にtargetword1とtargetword2の定義文字が含まれる箇所を変換対象箇所として特定する。
変換対象箇所が特定できたら、取得した変換対象箇所の一覧についてそれぞれの箇所を繰り返し処理する(S1104)。そして、変換対象箇所について、変換規則の定義情報を元に、ソースコードの変換が必要かどうかを判定する(S1105)。例えば、図6の定義例においては、変換対象の元となる箇所にtargetの値を挿入する、という定義になっているため、当該変換対象箇所にtargetの値が存在するかどうかを判定する。targetの値が存在した場合は、すでに必要な記述がされているということであり、ソースコードの変換は不要であると判断され、targetの値が存在しない場合は、必要な記述がされていないということなので、ソースコードの変換が必要であると判断される。
ソースコードの変換が必要であると判断された場合は(S1105:YES)、ソースコードの変換処理を行い変換したソースコードをコンピュータ上に記録する(S1106)。図6の定義例においては、変換規則の定義に従ってtargetword1とtargetword2の定義文字の間にtargetの値を記述する。ソースコードの変換が必要ないと判断された場合は(S1105:NO)、ソースコードの変換処理は行わない。
その次に、全ての変換対象箇所について処理を行ったかを確認し(S1107)、未処理の変換対象箇所がある場合は(S1107:NO)、S1104に戻り次の変換対象箇所の処理を行う。未処理の変換対象箇所がない場合は(S1107:YES)、全ての変換規則について処理を行ったかを判定し(S1108)、未処理の変換規則がある場合は(S1108:NO)、S1102に戻り、未処理の変換規則について繰り返し処理を行う。すべての変換規則について処理を行った場合は(S1108:YES)、ソースコード変換処理を終了する。
以上が、実施例1におけるソースコード変換装置のソースコードの変換処理の詳細となる。本実施例においては、ソースコード変換処理部が事前に解析されたソースコードの構造や呼出関係に基づいて変換対象箇所を特定することにより、変換対象箇所が分散している場合や複数のソースコードに跨っている場合であっても、変換対象箇所を特定しソースコードの変換処理を行うことが可能となっている。
実施例2では、ソースコードの種類に対応してソースコードの変換処理を行う場合について説明する。ここでいうソースコードの種類とは、ソースコードにどのような処理が記述されているかの種別である。例えば、画面処理を行うソースコード、データベース処理を行うソースコードといった、処理目的による種別の事をいう。
実施例1においては、ソースコード内において特定の記述が必要な箇所に、必要な記述がされていない場合に、記述を追記して書き換える例について説明を行った。例えば、図6の変換規則では、メソッド内の特定箇所に特定の記述を追記するという場合の定義例であった。しかし、ソースコードの作成規約によっては、全てのソースコードに対して同様に処理を記述するのではなく、ソースコードの種類に応じて記述する処理の内容が異なる場合がある。例えば、画面処理を行うソースコード内のメソッドに記述する例外処理と、データベース処理を行うソースコード内のメソッドに記述する例外処理と、記述内容が異なるような場合である。
このような場合においては、変換規則記憶部105に記憶されている変換規則の定義を複数用意しておくことで対応することができる。例えば、図7は、画面処理を行うソースコードのメソッドに対して例外処理が記述されていなかった場合に例外処理を記述する変換規則の定義例であり、図8は、データベース処理を行うソースコードのメソッドに対して例外処理が記述されていなかった場合に例外処理を記述する変換規則の定義例である。
まず、図7の変換規則の定義においては、画面処理を行うソースコードのメソッドに対して例外処理が記述されていなかった場合に例外処理を記述する変換規則の定義例として、メソッド記述の開始直後に例外処理記述の開始の記述を行い、メソッド記述の終了直前に例外処理記述の終了の記述を行うことを定義している。
具体的には、図7の5行目において、methodタグのtargetwordの値としてメソッド記述の開始文字列の正規表現を定義することで、メソッド記述の開始位置を変換対象箇所として特定している。さらに、targetclassの値として“View”を定義することにより、変換対象のクラスとして定義されているViewクラスを承継しているクラスのソースコード、すなわち画面処理のソースコードとして指定している。このように変換対象のソースコードを指定できることにより、ソースコードの種類に対応したソースコードの変換処理が可能となる。
また、図7の変換規則の定義例に示されている様に、1つの変換規則の定義内に複数の変換規則を記述してもよい。例えば、図7においては、5行目と10行目にmethodタグが記述されている。このように変換規則を定義することによって、5行目から8行目の変換規則の定義では、メソッド記述の開始直後に例外処理記述の開始の記述がされていなかった場合には、例外処理記述の開始を追記するといった定義を行い、10行目から14行目の変換規則の定義では、メソッド記述の終了直前に例外処理の終了の記述がされていなかった場合には、例外処理記述の終了を追記するといった定義を行うことができる。
次に、図8の変換規則の定義においては、データベース処理を行うソースコードのメソッドに対して例外処理が記述されていなかった場合に例外処理を記述する変換規則の定義例として、メソッドの記述行に例外処理の記述がされていなかったら、メソッド記述行に例外処理の記述を行うことを定義している。
具体的には、図8の5行目において、methodタグのtargetwordの値としてメソッド記述の開始文字列の正規表現を定義することで、メソッド記述の開始位置を変換対象箇所として特定している。さらに、targetclassの値としてManagerを定義することにより、変換対象のクラスをとして定義されているManagerクラスを承継しているクラスのソースコード、すなわちデータベース処理のソースコードとして指定している。そして、図8の7行目において、itemタグのmodeの値を“add”と定義することによって、変換対象箇所にtargetの値がなかった場合に、targetの値を追記するといった定義を行っている。
以上のようにソースコードの種類に対応して複数の変換規則を定義し、変換規則記憶部105に記憶させておくことで、ソースコード変換装置1は、ソースコードの種別に応じたソースコードの変換を行うことが可能となる。この場合における、ソースコードの変換処理の処理フローについては実施例1と、同様な処理フローとなる。
すなわち、実施例1において説明した図11のソースコード変換処理の処理フローのS1101において、図7に示すような画面処理を行うソースコードに対する変換規則の定義や、図8に示すようなデータベース処理を行うソースコードに対する変換規則の定義の取得を行い、取得した変換規則に対応した変換箇所一覧の取得(S1103)および変換処理の必要性の判断(S1105)、変換処理の実行を行う(S1106)。
以上が、実施例1、実施例2におけるソースコード変換装置1のソースコードの変換処理の詳細となる。なお、変換規則の定義例として図6および図7、図8において、XMLによる定義例を示したが、変換規則の定義は実施例に示した形式に限定されるのではなく、実施例に示したような変換処理を行う定義データであればどのような形式の定義データであってもよい。
実施例1および実施例2においては、変換規則記憶部105に記憶されている変換規則の定義によってソースコードの変換対象となる箇所を特定し、変換処理を行う実施例について説明を行ったが、ソースコードの変換対象となる箇所の特定は、変換規則の定義によって行うのではなく、事前にソースコードの検査を行い、検査結果に対応してソースコードの変換処理を行うようにしてもよい。
このような処理を行うために、実施例3におけるソースコード変換装置1は、実施例1のソースコード変換装置1のソースコード変換処理部102がさらに、ソースコード検査処理部103、検査規則記憶部107および検査結果記憶部106とから構成される。実施例3におけるソースコード変換装置1においても実施例1におけるソースコード変換装置1と同様に、コンピュータに保存されている修正対象となるソースコード一式を入力データとして読み取り、読み取ったソースコード一式の構造及び呼出関係を解析する。そして、解析結果に基づいてソースコードの変換を行い、変換されたソースコード一式を、コンピュータ内に保存する。
まず、実施例3におけるソースコード変換装置1のソースコード変換処理部102がさらに有する、ソースコード検査処理部103、検査規則記憶部107および検査結果記憶部106について説明する。
ソースコード検査処理部103は、検査対象となるソースコード一式をコンピュータ上から読み取りソースコードが検査規則記憶部107に記憶されている検査規則通りの構成になっているかどうかの検査の処理を行う。ソースコードの検査はソースコード構造記憶部104に記憶されている事前解析されたソースコードの構造及び呼出関係に基づいて検査される。
図12は、検査規則記憶部107に記憶されている検査規則の例を示したものである。例えば、検査規則は図12に示されるようなソースコード形式で検査規則が記憶されている。図12は、ソースコード中のCatchの記述行とEnd Tryの記述行の間にログを出力する記述がされているかどうかを検査する検査規則である。
図12の検査規則に基づいて、ソースコード検査処理部103がどのようにソースコードの検査を行うかについて説明する。検査規則記憶部107は検査規則を読み込むと、読み込んだ検査規則を順次実行することでソースコードの検査を行う。
まず、検査規則記憶部107は、図12の21行目の記述に基づいて、ソースコード構造記憶部104からすべてのメソッド定義一覧を取得する。そして、取得したメソッド定義ごとに、24行目から45行目の検査処理を行う。具体的には、27行目において、検査を行うメソッド定義の「ファイル名」「開始行番号」「終了行番号」の情報に基づいて、ソースコードからCatch句の記述情報を取得する。そして、30行目において、取得したCatch句の記述情報にLog出力処理が記述されているかを検査する。Log出力処理の記述がされていなかった場合は、39行目において、検査結果を検査結果記憶部106に記憶する。
検査結果記憶部106には、ソースコード検査処理部103において検査されたソースコードの検査結果が記憶される。図13は検査結果記憶部106に記憶される検査結果のデータ構造の例である。検査結果は図13に示されるように「チェックID」「ファイル名」「開始行番号」「終了行番号」「指摘事項」の情報を有する。「チェックID」は検査規則のチェックIDを、「ファイル名」は検査規則によって検査されたソースコードのファイル名称の保存場所を含めたフルパス形式を、「開始行番号」は検査規則によって検査されたファイル名で表されるソースコード内での開始行番号を、「終了行番号」は検査規則によって検査されたファイル名で表されるソースコード内での終了行番号を、「指摘事項」は検査規則によって検査された結果の指摘事項を、それぞれ記憶するものである。
例えば、「チェックID」が“F50001”、「ファイル名」が“D:¥src¥CommonUtil.vb”、「開始行番号」が“21”、「終了行番号」が“28”、「指摘事項」が“例外発生個所にログ出力処理が記載されていません。”、と記憶されている場合は、D:¥src¥CommonUtil.vbのソースコードをF50001のルールIDの検査規則で検査した結果、21行目から28行目について、例外発生個所にログ出力処理が記載されていなかったということを表す。
次にフローチャートを用いて、実施例3において、ソースコード変換装置がどのようにソースコードの変換処理を行うのか、具体的な処理フローを説明する。
図14は実施例3におけるソースコード変換処理の全体処理フローを表したフローチャート図である。実施例3におけるソースコード変換装置1においては、まず初めに、修正対象となるソースコード一式の構造及びメソッド呼出関係の構造解析が行われる(S1401)。この解析処理は、事前にソースコードの全体について、ソースコード構造解析処理部101によって行われ、解析結果はソースコード構造記憶部104に記憶される。ソースコード構造解析処理の詳細については実施例1におけるソースコード解析処理と同様である。
ソースコード全体の構造解析が事前に行われると、次にソースコード全体の検査処理が行われる(S1402)。ソースコードの検査処理はソースコード検査処理部103にて行われる。ソースコード検査処理の詳細については後述する。
ソースコードの検査処理行われたら、次にソースコードの変換処理が行われる(S1403)。ソースコードの変換処理はソースコード変換処理部102によって行われる。ソースコードの変換は変換規則記憶部105に記憶されている変換規則ごとに行われる。いずれの変換規則の変換処理を行うのか、指示を受け付けて、指示された変換規則の変換処理のみを行うようにしてもよいし、すべての変換規則の変換処理を繰り返しすべて行うようにしてもよい。ソースコードの変換処理は検査結果記憶部106に記憶されているソースコードの検査結果に基づいて変換箇所の特定を行い、特定された変換箇所に該当するソースコードの書き換えが行われる。ソースコード変換処理の詳細については後述する。
ここで、1つの変換規則の変換処理が行われ、次の変換規則の変換処理を行う際には、再度ソースコードの構造解析処理が行われる(S1404)。これは、S1403のソースコード変換処理によって解析結果の元となるソースコードの内容が書き換わっているため、再度の構造解析処理が必要なためである。S1403におけるソースコードの解析処理は、ソースコード全体について、再度、構造解析を行ってもよいし、ソースコード変換処理部によって変換されたソースコードに関連するソースコードについてのみ、再度、構造解析を行うようにしてもよい。
図15は、実施例3においてソースコード検査処理部103において行われる。ソースコード検査処理の処理フローを表したフローチャート図である。図15のフローチャートに基づいてソースコード検査処理について詳述する。まず、ソースコード検査処理部103は検査規則記憶部107から検査規則の一覧を取得する(S1501)。そして、取得した検査規則ごとに繰り返し処理を行う(S1502)。例えば、検査規則は図12に示されているようなソースコード形式で作成されている。
次に、検査規則の定義を逐次実行することにより、検査処理を実行する(S1503)。例えば、図12の検査規則に基づいた検査においては、ソースコードからCatch句にLog出力処理の記述がされているかどうかが検査される。そして、検査の結果が検査結果記憶部106に記録される(S1504)。検査結果は、検査の結果が不適合であった場合のみ記録される。例えば、図12の検査規則に基づいた検査においては、ソースコードからCatch句にLog出力処理の記述がされていない箇所の一覧が記録される。
その次に、全ての検査規則について検査処理を行ったかを確認し(S1505)、未検査の検査規則がある場合は(S1505:NO)、S1502に戻り次の検査規則の処理を行う。未検査の規則がない場合は(S1505:YES)、ソースコード検査処理を終了する。
次に、ソースコード変換処理部102によって行われる、ソースコード変換処理の詳細について説明する。
図16は実施例3におけるソースコード変換処理部102によって行われるソースコード変換処理の処理フローを表したフローチャート図である。
まず、ソースコード変換処理部102は検査結果記憶部106からソースコードの検査結果の一覧を取得する(S1601)。そして、検査結果があるかどうかを判定する(S1602)。検査結果が無かった場合は、変換対象の元となる箇所が無いということなので処理を終了する(S1602:NO)。検査結果が存在した場合は(S1602:YES)、変換規則記憶部105からソースコードの変換規則の一覧を取得する(S1603)。そして、取得した変換規則ごとに繰り返し処理を行う(S1604)。例えば、変換規則は図17に示されているようなXMLデータ形式で作成されている。
次に、変換規則の定義に基づいて、変換対象箇所の一覧を検査結果記憶部107から取得し、取得した情報に基づいて、変換対象箇所およびソースコードを特定することによってソースコードの変換処理を実行する(S1605)。具体的には、図17に示されている様に変換規則が定義されている場合、図17の5行目において、fileタグにtargetCheckIDの値として“F5001”が定義されているため、変換対象箇所は、検査結果記憶部106に記憶されている検査結果のうち、チェックIDが“F5001”で記憶されている箇所となる。
すなわち、チェックIDが“F5001”でチェックされた箇所の一覧を検査結果記憶部106から取得し、検査結果から「ファイル名」「開始行番号」「終了行番号」を取得する。そして、検査結果の情報に基づいて、ソースコードから変換対象箇所を特定する。変換対象箇所が特定されたら、実施例1の場合と同様に変換規則に基づいてソースコードの変換処理を実行する。
ソースコード変換処理を実行したら、全ての変換規則について処理を行ったかを確認し(S1606)、未処理の変換規則がある場合は(S1606:NO)、S1604に戻り次の変換規則の処理を行う。未処理の変換規則がない場合は(S1606:YES)、ソースコード変換処理を終了する。
以上が、実施例3におけるソースコード変換装置のソースコードの変換処理の詳細となる。実施例3におけるソースコード変換装置においては、事前に検査規則に基づいて、ソースコードの検査を行い、ソースコードの記述が検査結果に適合しない箇所のみをソースコードの変換元として特定することによって、より適切に変換箇所の特定を行うことが可能となる。
さらには、ソースコードの種類に対応した構造及び呼出関係になっているかをソースコード作成規約として用いることにより、ソースコードの構造及び呼出関係が規定通りになっていない箇所を規定通りに変換することや、複数ソースコードに跨ってソースコードの変換が必要となる場合に、変換箇所の特定を事前に行い、変換処理を行うことが可能となる。
以上、実施例1ないし実施例3において、本発明におけるソースコード変換装置の構成について説明を行ったが、図示した各装置の各構成要素は機能概念的なものであり、必ずしも物理的に図示された構成要素と同一であることを要しない。
すなわち、各装置の分散・統合の具体的形態は図示のものに限られず、その全部または一部を、各種の負荷や使用状況などに応じて、任意の単位で機能的または物理的に分散・統合して構成することができる。例えば、ソースコード構造解析処理部101またはソースコード構造記憶部104を外部の装置としてネットワーク経由で接続するようにしてもよい。
また、上記実施例においては、ソースコード変換装置に基づいて説明を行ったが、上記実施例はハードウェアロジックやプログラムによって各種の処理を実行することが実現されているコンピュータに処理を実行させる方法であってもよいし、上記実施例を行う予め用意されたプログラムをコンピュータに読み込ませて実行するようなプログラムであってもよい。