以下、図面を参照して、各実施形態について説明する。
(第1の実施形態)
図1は、第1の実施形態に係るプログラムテンプレート自動生成装置のハードウェア構成を示すブロック図である。図1に示すように、コンピュータ10は、例えばハードディスクドライブ(HDD:Hard Disk Drive)のような外部記憶装置20と接続されている。この外部記憶装置20は、コンピュータ10によって実行されるプログラム21を格納する。コンピュータ10および外部記憶装置20は、プログラムテンプレート自動生成装置30を構成する。
このプログラムテンプレート自動生成装置30は、後述するプログラムテンプレートを用いて、プログラム(アプリケーション)を自動生成する機能を有する。また、プログラムテンプレート自動生成装置30は、予め定められた命名規則(例えば、プロジェクトで決まっている命名規則)が反映されたプログラムの自動生成に用いられるプログラムテンプレートを生成する機能を有する。
図2は、図1に示すプログラムテンプレート自動生成装置30の主として機能構成を示すブロック図である。
図2に示すように、プログラムテンプレート自動生成装置30は、プログラム自動生成部31を含む。本実施形態において、プログラム自動生成部31は、図1に示すコンピュータ10が外部記憶装置20に格納されているプログラム(プログラムテンプレート自動生成プログラム)21を実行することにより実現されるものとする。このプログラム21は、コンピュータ読み取り可能な記憶媒体に予め格納して頒布可能である。また、このプログラム21が、例えばネットワークを介してコンピュータ10にダウンロードされても構わない。
また、プログラムテンプレート自動生成装置30は、テンプレート格納部22、テーブル定義格納部23および変数リスト格納部24を含む。本実施形態において、テンプレート格納部22、テーブル定義格納部23および変数リスト格納部24は、例えば外部記憶装置20に格納される。
テンプレート格納部22には、プログラムの自動生成に用いられるプログラムテンプレート(第1のプログラムテンプレート)が予め格納される。テンプレート格納部22に格納されているプログラムテンプレートには、変数が含まれる。なお、テンプレート格納部22には、自動生成されるプログラム毎のプログラムテンプレートが格納されている。
テーブル定義格納部23には、プログラムテンプレート自動生成装置30において自動生成されるプログラムにおいて用いられるテーブルの構造を定義するテーブル情報が格納される。テーブル定義格納部23に格納されているテーブル情報は、テーブルのデータ要素および当該データ要素の値が含まれる。なお、テーブル情報に含まれるデータ要素には、当該テーブルを識別するためのテーブルIDおよび当該テーブルを構成するカラムを識別するためのカラムID等が含まれる。また、テーブル情報に含まれるデータ要素の値には、テーブルIDおよびカラムIDの値等が含まれる。
変数リスト格納部24には、テンプレート格納部22に格納されているプログラムテンプレートに含まれる変数に対応づけて、当該変数に対して置換される値(以下、置換情報と表記)を保持する変数リストが格納される。変数リスト格納部24に格納されている変数リストに保持される置換情報には、テーブル定義格納部23に格納されているテーブル情報に含まれるデータ要素が含まれる。なお、この置換情報は、プログラムテンプレート自動生成装置30において自動生成されるプログラムに対して予め定められた命名規則を反映するために用いられる。また、変数リスト格納部24に格納されている変数リストは、例えばプログラムにおいて定義されるクラス名または属性名等の単位で定義される。
プログラム自動生成部31は、変数リスト格納部24に格納されている変数リストに基づいて、テンプレート格納部22に格納されているプログラムテンプレートに対して置換処理を実行することによって、上記した命名規則を反映したプログラムを自動生成するためのプログラムテンプレート(以下、単に命名規則を反映したプログラムテンプレートと表記)を生成する処理を実行する。
具体的には、プログラム自動生成部31は、テンプレート格納部22に格納されているプログラムテンプレートに含まれる変数を、当該変数に対応づけて変数リスト(変数リスト格納部24に格納されている変数リスト)に保持されている置換情報で置換することによって、当該置換情報を含むプログラムテンプレート(第2のプログラムテンプレート)を生成する。
プログラム自動生成部31は、生成された命名規則を反映したプログラムテンプレートに含まれる置換情報に含まれるデータ要素を、テーブル情報(テーブル定義格納部23に格納されているテーブル情報)に含まれる当該データ要素の値で置換することによって、プログラムを自動生成する。これにより、命名規則を反映したプログラムが自動生成される。
図3は、図2に示すテンプレート格納部22に格納されているプログラムテンプレートのデータ構造の一例を示す。
図3に示すプログラムテンプレートの例では、例えば「${class.Dataset クラス名}」が変数(名)を表している。なお、図3に示す「${class.Action クラス名}」および「${attribute.自テーブルの属性名}」も同様である。
図3では、1つのプログラムテンプレートについて説明したが、テンプレート格納部22には、上記したように自動生成されるプログラム毎のプログラムテンプレート(つまり、複数のプログラムテンプレート)が格納されていてもよい。
図4は、図2に示すテーブル定義格納部23に格納されているテーブル情報のデータ構造の一例を示す。
図4に示す例では、テーブルIDの値が「Emp」であるテーブル(以下、Empテーブルと表記)の構造を定義するテーブル情報およびテーブルIDの値が「Dept」であるテーブル(以下、Deptテーブルと表記)の構造を定義するテーブル情報が示されている。なお、Empテーブルの構造を定義するテーブル情報(以下、Empテーブルのテーブル情報と表記)は図4の1行目〜10行目であり、Deptテーブルの構造を定義するテーブル情報(以下、Deptテーブルのテーブル情報と表記)は図4の12行目〜15行目である。
図4に示すEmpテーブルのテーブル情報においては、最初の行(ここでは、図4の1行目)にテーブルID(テーブル名)が記述され、次の行以降(ここでは、図4の2〜8行目)に当該Empテーブルを構成するカラムの定義が記述されている。なお、カラムの定義の記述の後(ここでは、図4の9および10行目)に、外部キーの定義が記述されている。
また、図4に示すDeptテーブルのテーブル情報においては、最初の行(ここでは、図4の12行目)にテーブルID(テーブル名)が記述され、次の行以降(ここでは、図4の13〜15行目)に当該Deptテーブルを構成するカラムの定義が記述されている。
なお、図4に示すテーブルIDおよびカラムID等は、テーブル情報に含まれるデータ要素である。また、例えばEmpテーブルのテーブル情報に含まれるデータ要素「テーブルID」の値は、Empである。
図5は、図2に示す変数リスト格納部24に格納されている変数リストのデータ構造の一例を示す。
図5に示すように、変数リストの左辺には、テンプレート格納部22に格納されているプログラムテンプレートに含まれる変数(名)が記述されている。一方、変数リストの右辺には、左辺の変数に対して置換される置換情報(値)が記述されている。
具体的には、図5に示す変数リストの1行目は、例えば「class.Action クラス名」がプログラムテンプレートに含まれている場合には、当該プログラムテンプレート中の「class.Action クラス名」が$[テーブルID]Actionで置換されることを示している。
なお、図5に示すように、変数リストの右辺の置換情報には、$[テーブルID]のように図4に示すテーブル情報に含まれるデータ要素が含まれている。つまり、この$[テーブルID]は、テーブル情報から取得できる値を示している。
つまり、上記したようにプログラムテンプレート中の「class.Action クラス名」が$[テーブルID]Actionで置換された場合、当該プログラムテンプレート中の$[テーブルID]は、テーブル情報に含まれるデータ要素「テーブルID」の値(例えば、Emp)で更に置換される。
次に、図6のフローチャートを参照して、本実施形態に係るプログラムテンプレート自動生成装置30の処理手順について説明する。
ここでは、テーブル定義格納部23に格納されているテーブル情報の各々について以下のステップS1〜S6の処理が実行される。
まず、プログラム自動生成部31は、テーブル定義格納部23に格納されているテーブル情報を1つ取得する(ステップS1)。つまり、プログラム自動生成部31は、テーブル定義格納部23から、1テーブル分のテーブル情報を取得する。
次に、プログラム自動生成部31は、変数リスト格納部24に格納されている変数リストを取得する(ステップS2)。
以下、テンプレート格納部22に格納されているプログラムテンプレートの各々についてステップS3〜S5の処理が実行される。
プログラム自動生成部31は、テンプレート格納部22に格納されているプログラムテンプレート(第1のプログラムテンプレート)を1つ取得する(ステップS3)。
プログラム自動生成部31は、ステップS3において取得されたプログラムテンプレートに含まれる変数を、ステップS2において取得された変数リストの値で置換する(ステップS4)。具体的には、プログラム自動生成部31は、プログラムテンプレートに含まれる変数を、当該変数に対応づけて変数リストに保持されている値(置換情報)で置換する。
ここで、ステップS4の置換処理について具体的に説明する。ここでは、上記したステップS2において、上述した図5に示す変数リストが取得されたものとする。また、上記したステップS3において、上述した図3に示すプログラムテンプレートが取得されたものとする。
まず、図3に示すプログラムテンプレートの1行目の「${class.Dataset クラス名}」の{}の内容は、図5に示す変数リストの3行目の左辺と一致する。この場合、図3に示すプログラムテンプレートの1行目の「${class.Dataset クラス名}」は、図5に示す変数リストの3行目の右辺の値「$[テーブルID]DS」で置換される。
また、図3に示すプログラムテンプレートの3行目の「${class.Action クラス名}」の{}の内容は、図5に示す変数リストの1行目の左辺と一致する。このため、図3に示すプログラムテンプレートの3行目の「${class.Action クラス名}」は、図5に示す変数リストの1行目の右辺の値「$[テーブルID]Action」で置換される。
更に、図3に示すプログラムテンプレートの4行目の「${attribute.自テーブルの属性名}」の{}の内容は、図5に示す変数リストの4行目の左辺と一致する。このため、図3に示すプログラムテンプレートの4行目の「${attribute.自テーブルの属性名}」は、図5に示す変数リストの4行目の右辺の値「$[カラムID]」で置換される。
このようにステップS4の置換処理が実行されることによって、プログラムテンプレートに含まれる変数が変数リストの値で置換されたプログラムテンプレート(第2のプログラムテンプレート)が生成される。
なお、図7は、上記したようにステップS4の置換処理が実行されることによって生成されたプログラムテンプレートの一例を示す。図7に示す例では、ステップS4の置換処理が実行されることによって生成されたプログラムテンプレートには、テーブルIDおよびカラムID等のテーブル情報に含まれるデータ要素が含まれている。
再び図6に戻ると、プログラム自動生成部31は、ステップS4で置換処理が実行されることによって生成されたプログラムテンプレートに含まれるデータ要素を、ステップS1において取得されたテーブル情報(に含まれる当該データの要素の値)で置換する(ステップS5)。
ここで、ステップS5の置換処理について具体的に説明する。ここでは、上記したステップS1において、上述した図4に示すEmpテーブル(テーブルIDがEmpであるテーブル)のテーブル情報(つまり、図4の1行目〜10行目)が取得されたものとする。また、上記したステップS4の置換処理が実行されることによって、図7に示すプログラムテンプレートが得られたものとする。
まず、図7に示すプログラムテンプレートの1行目の「$[テーブルID]」の[]の内容は、図1に示すEmpテーブルのテーブル情報の1行目に存在する。この場合、図7に示すプログラムテンプレートの1行目の「$[テーブルID]」は、図4に示すEmpテーブルを示すテーブル情報の1行目のテーブルID(データ要素)の値「Emp」で置換される。
また、図7に示すプログラムテンプレートの3行目の「$[テーブルID]」の[]の内容は、図1に示すEmpテーブルのテーブル情報の1行目に存在する。この場合、図7に示すプログラムテンプレートの3行目の「$[テーブルID]」は、図4に示すEmpテーブルのテーブル情報の1行目のテーブルID(データ要素)の値「Emp」で置換される。
更に、図7に示すプログラムテンプレートの4行目の「$[カラムID]」の[]の内容は、図1に示すEmpテーブルのテーブル情報の2行目〜8行目に存在する。この場合、図7に示すプログラムテンプレートの4行目の「$[カラムID]」は、図4に示すEmpテーブルのテーブル情報の2行目〜8行目のカラムID(データ要素)の値「empno」、[ename]、[job]、[mgr]、[hiredate]、[sal]、[deptno]でそれぞれ置換される。
このようにステップS5の置換処理が実行されることによって、命名規則を反映したプログラムが自動生成される。
なお、図8は、上記したようにステップS5の置換処理が実行されることによって生成されたプログラムの一例を示す。上記したようにステップS4およびS5の置換処理が実行されることによって、この図8に示すプログラムは、予め定められた命名規則を反映したプログラムとなる。
再び図6に戻ると、テンプレート格納部22に格納されている全てのプログラムテンプレートについて上記したステップS3〜S5の処理が実行されたか否かが判定される。
全てのプログラムテンプレートについて処理が実行されていないと判定された場合(ステップS6のNO)、上記したステップS3に戻って処理が繰り返される。
一方、全てのプログラムテンプレートについて処理が実行されたと判定された場合(ステップS6のYES)、テーブル定義格納部23に格納されている全てのテーブル情報について上記したステップS1〜S6の処理が実行されたか否かが判定される(ステップS7)。
全てのテーブル情報について処理が実行されていないと判定された場合(ステップS7のNO)、上記したステップS1に戻って処理が繰り返される。
一方、全てのテーブル情報について処理が実行されたと判定された場合(ステップS7のYES)、本実施形態に係るプログラムテンプレート自動生成装置30の処理は終了される。
上記したように、プログラムテンプレート自動生成装置30に含まれるプログラム自動生成部31は、テンプレート格納部22に格納されているプログラムテンプレートおよび変数リスト格納部24に格納されている変数リストに基づいて命名規則を反映したプログラムテンプレートを生成し、当該プログラムテンプレートを用いてプログラムを自動生成することができる。
なお、図6においては、命名規則を反映したプログラムテンプレートの生成処理及びプログラムの生成処理が一連の処理として実行されるものとして説明したが、例えばプログラムテンプレートの生成処理(つまり、図6に示すステップS5以外の処理)のみが実行され、プログラムの生成処理は後で行われるような構成としても構わない。
上記したように本実施形態においては、テンプレート格納部22に格納されているプログラムテンプレート(第1のプログラムテンプレート)に含まれる変数を、当該変数に対応づけて変数リストに保持されている値(置換情報)で置換することによって当該置換情報を含むプログラムテンプレート(第2のプログラムテンプレート)を生成する構成により、予め定められた(例えばプロジェクト等で決まっている)命名規則を反映したプログラムを自動生成するためのプログラムテンプレートを生成することが可能となる。
つまり、本実施形態においては、例えばクラス名または属性名等の単位で定義されている変数リストを利用することにより、例えばプログラムテンプレートに反映された命名規則を変更する場合であっても、当該変数リストを変更した上でプログラムテンプレートを再生成することで容易に当該変更をプログラムテンプレートに反映することができる。
また、本実施形態においては、上記したように生成されたプログラムテンプレートに含まれる置換情報に含まれるデータ要素を、テーブル定義格納部23に格納されているテーブル情報に含まれる当該データ要素の値で置換することによってプログラムを生成する構成により、予め定められた命名規則を反映したプログラム(アプリケーション)を自動生成することができ、ユーザのプログラム開発の効率を向上させることが可能となる。
(第2の実施形態)
次に、第2の実施形態について説明する。図9は、本実施形態に係るプログラムテンプレート自動生成装置の主として機能構成を示すブロック図である。なお、前述した図2と同様の部分には同一参照符号を付してその詳しい説明を省略する。ここでは、図2と異なる部分について主に述べる。
また、本実施形態に係るプログラムテンプレート自動生成装置のハードウェア構成は、前述した第1の実施形態と同様であるため、適宜、図1を用いて説明する。
本実施形態においては、ユーザによって定義された命名規則(以下、命名規則ユーザ定義と表記)を前述した第1の実施形態において用いられる変数リストに自動的に反映させる点および当該命名規則ユーザ定義が予め定められている形式で定義されているか否かを検証する点が、前述した第1の実施形態とは異なる。
図9に示すように、本実施形態に係るプログラムテンプレート自動生成装置30は、変数リスト生成部51および命名規則検証部52を含む。本実施形態において、変数リスト生成部51および命名規則検証部52は、図1に示すコンピュータ10が外部記憶装置20に格納されているプログラム(プログラムテンプレート自動生成プログラム)21を実行することにより実現されるものとする。このプログラム21は、コンピュータ読み取り可能な記憶媒体に予め格納して頒布可能である。また、このプログラム21が、例えばネットワークを介してコンピュータ10にダウンロードされても構わない。
また、プログラムテンプレート自動生成装置30は、命名規則格納部25、変数生成ルール格納部26および検証結果格納部27を含む。本実施形態において、命名規則格納部25、変数生成ルール格納部26および検証結果格納部27は、例えば外部記憶装置20に格納される。
命名規則格納部25には、命名規則ユーザ定義(ユーザによって定義された命名規則)が予め格納されている。この命名規則ユーザ定義は、前述した第1の実施形態において説明したようにプログラムに対して反映されるべきものである。
変数生成ルール格納部26には、変数に対応づけて当該変数が変換される値を含む変数生成ルールが予め格納されている。この変数生成ルール格納部26に格納されている変数生成ルールは、前述した第1の実施形態における変数リストを生成するために用いられる。
なお、命名規則格納部25に格納されている命名規則ユーザ定義および変数生成ルール格納部26に格納されている変数生成ルールの具体的なデータ構造については、後述する。
変数リスト生成部51は、命名規則格納部25に格納されている命名規則ユーザ定義を変数生成ルール格納部26に格納されている変数生成ルール(に含まれる値)に適用することによって、変数に対応づけて置換情報を保持する変数リストを生成する。なお、変数リスト生成部51によって生成された変数リストは、変数リスト格納部24に格納される。
命名規則検証部52は、命名規則格納部25に格納されている命名規則ユーザ定義が予め定められている形式で定義されているか否かを検証する。命名規則検証部52による検証結果は、検証結果格納部27に出力される(格納される)。なお、検証結果格納部27に格納された検証結果は、例えばユーザに対して提示される。
図10は、図9に示す命名規則格納部25に格納されている命名規則ユーザ定義のデータ構造の一例を示す。なお、命名規則ユーザ定義は、ユーザによって設定される。
図10に示す例において、命名規則ユーザ定義の1行目は、クラス名の先頭に“Stv”をつけるという命名規則を表している。具体的には、この命名規則ユーザ定義の左辺は、後述する変数生成ルール(の左辺)のドットより前がclassであるもの全てに当該命名規則ユーザ定義が適用されることを表す。一方、この命名規則ユーザ定義の右辺は、[this]の箇所に該当する変数生成ルールの右辺が挿入されることを表す。
命名規則ユーザ定義の2行目は、変数生成ルール(の右辺)の末尾に“Logic”をつけることによってServiceクラス名とすることを表している。なお、この命名規則ユーザ定義の右辺の[class.Serviceクラス名]は、変数生成ルールの左辺が同名のものと対応する。
命名規則ユーザ定義の3行目は、変数生成ルールを利用することなく、当該命名規則ユーザ定義において記述されている$[テーブルID]DataSetを利用することを表している。なお、$[テーブルID]は、テーブル定義格納部23に格納されているテーブル情報に含まれているデータ要素を表す。
命名規則ユーザ定義の4行目は、変数生成ルールのものをそのまま利用することを表している。なお、後述するように対応する命名規則ユーザ定義が命名規則格納部25に格納されていない場合には、変数生成ルールが利用される。つまり、命名規則ユーザ定義の4行目が定義されていない場合であっても、同様の結果を得ることは可能である。命名規則ユーザ定義は、全ての変数生成ルールに対応して作成される必要はない。
上記したような命名規則ユーザ定義の左辺に定義できるものは、変数生成ルールの左辺のドットより前と一致するもの(class、attribute等)および変数生成ルールの左辺のドットより後ろと一致するもの(図10の例では、Serviceクラス名、DataSetクラス名、自テーブルの属性名等)である。
また、命名規則ユーザ定義の[]に定義できるものは、命名規則ユーザ定義の左辺に一致するもの(図10に示す例では、Serviceクラス名、DataSetクラス名、自テーブルの属性名等)、変数生成ルールの左辺と一致するもの(図10に示す例では、class.Serviceクラス名、attribute.自テーブルの属性名等)およびthisである。
図11は、図9に示す変数生成ルール格納部26に格納されている変数生成ルールのデータ構造の一例を示す。
図11に示すように、変数生成ルールの左辺は、前述したプログラムテンプレートの変数(名)と対応している。一方、変数生成ルールの右辺は、対応する変数が変換される値を表す。
図11に示す例では、変数生成ルールの1行目は、プログラムテンプレートにclass.Actionクラス名という変数が含まれている場合に、当該class.Actionクラス名という変数を$[テーブルID]Actionに変換することを表している。
また、変数生成ルールの2行目は、プログラムテンプレートにclass.Serviceクラス名という変数が含まれている場合に、当該class.Serviceクラス名という変数を$[テーブルID]Serviceに変換することを表している。
変数生成ルールの3行目は、プログラムテンプレートにclass.Datasetクラス名という変数が含まれている場合に、当該class.Datasetクラス名という変数を$[テーブルID]DSに変換することを表している。
変数生成ルールの4行目は、プログラムテンプレートにattribute.自テーブルの属性名という変数が含まれている場合に、当該attribute.自テーブルの属性名という変数を$[カラムID]に変換することを表している。
更に、変数生成ルールの5行目は、プログラムテンプレートにattribute.親テーブルの属性名という変数が含まれている場合に、当該attribute.親テーブルの属性名という変数を$[テーブルID]_$[カラムID]に変換することを表している。
また、変数生成ルールの6行目は、プログラムテンプレートにattribute.参照先のテーブルの属性名という変数が含まれている場合に、当該attribute.参照先のテーブルの属性名という変数を$[カラムID]_$[参照先カラムID]に変換することを表している。
上記した変数生成ルールに含まれる$[テーブルID]、$[カラムID]および$[参照先カラムID]は、テーブル定義格納部23に格納されているテーブル情報に含まれているデータ要素を表す。
なお、図11に示すように、変数生成ルール格納部26に格納されている変数生成ルールは、前述した第1の実施形態における変数リストと同様の形式である。
以下、本実施形態に係るプログラムテンプレート自動生成装置50の動作について説明する。本実施形態に係るプログラムテンプレート自動生成装置50は、後述するように変数リスト生成処理および命名規則検証処理を実行する。
まず、図12および図13のフローチャートを参照して、本実施形態に係るプログラムテンプレート自動生成装置50によって実行される変数リスト生成処理の処理手順について説明する。
なお、変数リスト生成処理においては、命名規則格納部25に格納されている命名規則ユーザ定義を変数生成ルール格納部26に格納されている変数生成ルールに適用することによって変数リストが生成される。この変数リスト生成処理において生成された変数リストは、前述した第1の実施形態において説明したようにプログラムテンプレートの自動生成に用いられる。
変数リスト生成処理においては、まず、変数生成ルール格納部26に格納されている変数生成ルールの各々について以下のステップS11〜S16の処理が実行される。なお、以下の説明においては、上述した図11に示す各行がそれぞれ1つの変数生成ルールであるものとして説明する。
変数リスト生成部51は、変数生成ルール格納部26に格納されている変数生成ルールを1つ取得する(ステップS11)。
次に、変数リスト生成部51は、命名規則格納部25に格納されている命名規則ユーザ定義を1つ取得する(ステップS12)。なお、上述した図10に示す各行がそれぞれ1つの命名規則ユーザ定義であるものとする。
変数リスト生成部51は、ステップS11において取得された変数生成ルールおよびステップS12において取得された命名規則ユーザ定義を比較することによって、該当箇所が一致するか否かを判定する(ステップS13)。なお、ステップS13における該当箇所とは、ステップS11において取得された変数生成ルールの左辺のドットより後ろおよびステップS12において取得された命名規則ユーザ定義の左辺を指す。つまり、ステップS13においては、変数生成ルールの左辺のドットより後ろと命名規則ユーザ定義の左辺とが一致するか否かが判定される。
該当箇所が一致しない(つまり、変数生成ルールの左辺のドットより後ろと命名規則ユーザ定義の左辺とが一致しない)と判定された場合(ステップS13のNO)、変数リスト生成部51は、命名規則格納部25に他の命名規則ユーザ定義があるか否かを判定する(ステップS14)。
命名規則格納部25に他の命名規則ユーザ定義があると判定された場合(ステップS14のYES)、上記したステップS12に戻って処理が繰り返される。
一方、命名規則格納部25に他の命名規則ユーザ定義がないと判定された場合、後述するステップS16の処理が実行される。
また、上記したステップS13において、該当箇所が一致する(つまり、変数生成ルールの左辺のドットより後ろと命名規則ユーザ定義の左辺とが一致する)と判定された場合、変数リスト生成部51は、第1の文字列置換処理を実行する(ステップS15)。この第1の文字列置換処理では、変数生成ルール格納部26に格納されている変数生成ルールにステップS12において取得された命名規則ユーザ定義を適用することによって当該命名規則ユーザ定義(または変数生成ルール)の文字列を置換(変換)し、新たな変数生成ルールが取得される。なお、第1の文字列置換処理の詳細については後述する。
変数リスト生成部51は、第1の文字列置換処理が実行されることによって取得された新たな変数生成ルールを変数リストAに追加する(ステップS16)。
なお、上記したようにステップS14において命名規則格納部25に他の命名規則ユーザ定義がないと判定された場合にはステップS16の処理が実行されるが、この場合、ステップS11において取得された変数生成ルールがそのまま新たな変数生成ルールとして変数リストAに追加される。
ステップS16の処理が実行されると、変数リスト生成部51は、変数生成ルール格納部26に他の変数生成ルールがあるか否かを判定する(ステップS17)。
変数生成ルール格納部26に他の変数生成ルールがあると判定された場合(ステップS17のYES)、上記したステップS11に戻って処理が繰り返される。
一方、変数生成ルール格納部26に他の変数生成ルールがないと判定された場合(ステップS17のNO)、変数生成ルール格納部26に格納されている変数生成ルールの各々について以下のステップS18〜S23の処理が実行される。
変数リスト生成部51は、上記した変数リストAに追加された変数生成ルール(新たな変数生成ルール)を1つ取得する(ステップS18)。
次に、変数リスト生成部51は、命名規則格納部25に格納されている命名規則ユーザ定義を1つ取得する(ステップS19)。
変数リスト生成部51は、ステップS18において取得された変数生成ルールおよびステップS19において取得された命名規則ユーザ定義を比較することによって、該当箇所が一致するか否かを判定する(ステップS20)。なお、ステップS20における該当箇所とは、ステップS18において取得された変数生成ルールの左辺のドットより前およびステップS19において取得された命名規則ユーザ定義の左辺を指す。つまり、ステップS20においては、変数生成ルールの左辺のドットより前と命名規則ユーザ定義の左辺とが一致するか否かが判定される。
該当箇所が一致しない(つまり、変数生成ルールの左辺のドットより前と命名規則ユーザ定義の左辺とが一致しない)と判定された場合(ステップS20のNO)、変数リスト生成部51は、命名規則格納部25に他の命名規則ユーザ定義があるか否かを判定する(ステップS21)。
命名規則格納部25に他の命名規則ユーザ定義があると判定された場合(ステップS21のYES)、上記したステップS19に戻って処理が繰り返される。
一方、命名規則格納部25に他の命名規則ユーザ定義がないと判定された場合(ステップS21のNO)、後述するステップS23の処理が実行される。
また、上記したステップS20において、該当箇所が一致する(つまり、変数生成ルールの左辺のドットより前と命名規則ユーザ定義の左辺とが一致する)と判定された場合、変数リスト生成部51は、第2の文字列置換処理を実行する(ステップS22)。この第2の文字列置換処理では、上述した変数リストAに追加された変数生成ルールにステップS19において取得された命名規則ユーザ定義を適用することによって当該命名規則ユーザ定義(または変数生成ルール)の文字列を置換(変換)し、新たな変数生成ルールが取得される。なお、第2の文字列置換処理の詳細については後述する。
変数リスト生成部51は、第2の文字列置換処理が実行されることによって取得された新たな変数生成ルールを変数リストBに追加する(ステップS23)。
なお、上記したようにステップS21において命名規則格納部25に他の命名規則ユーザ定義がないと判定された場合にはステップS23の処理が実行されるが、この場合、ステップS18において取得された変数生成ルールがそのまま新たな変数生成ルールとして変数リストBに追加される。
ステップS23の処理が実行されると、変数リスト生成部51は、変数リストAに他の変数生成ルールがあるか否かを判定する(ステップS24)。
変数リストAに他の変数生成ルールがあると判定された場合(ステップS24のYES)、上記したステップS18に戻って処理が繰り返される。
一方、変数リストAに他の変数生成ルールがないと判定された場合(ステップS24のNO)、変数リスト生成処理は終了される。
なお、変数リスト生成処理が終了されると、変数リストB(の内容)が変数リストとして変数リスト格納部24に格納される。
次に、図14のフローチャートを参照して、前述した第1の文字列置換処理(図12に示すステップS15の処理)の処理手順について説明する。この第1の文字列置換処理によれば、上述したように新たな変数生成ルールが取得される。
ここでは、図12に示すステップS11において取得された変数生成ルール(つまり、図12に示すステップS13において該当箇所が一致すると判定された変数生成ルール)を対象変数生成ルール、図12に示すステップS12において取得された命名規則ユーザ定義(つまり、図12に示すステップS13において該当箇所が一致すると判定された命名規則ユーザ定義)を対象命名規則ユーザ定義と称する。
まず、変数リスト生成部51は、対象命名規則ユーザ定義の右辺の大括弧に囲まれた文字列がthisであるか否かを判定する(ステップS31)。
対象命名規則ユーザ定義の右辺の大括弧に囲まれた文字列がthisでないと判定された場合(ステップS31のNO)、変数リスト生成部51は、対象変数生成ルールおよび対象命名規則ユーザ定義を比較することによって、該当箇所が一致するか否かを判定する(ステップS32)。なお、ステップS32における該当箇所とは、対象変数生成ルールの左辺および対象命名規則ユーザ定義の右辺の大括弧に囲まれた文字列を指す。つまり、ステップS32においては、対象変数生成ルールの左辺と対象命名規則ユーザ定義の右辺の大括弧に囲まれた文字列とが一致するか否かが判定される。
該当箇所が一致する(つまり、対象変数生成ルールの左辺と対象命名規則ユーザ定義の右辺の大括弧に囲まれた文字列とが一致する)と判定された場合(ステップS32のYES)、変数リスト生成部51は、新たな変数生成ルールの左辺を、対象変数生成ルールの左辺とする(ステップS33)。
次に、変数リスト生成部51は、対象命名規則ユーザ定義の右辺の大括弧および当該大括弧に囲まれた文字列(大括弧の文字列)を対象変数生成ルールの右辺で置換する(ステップS34)。この場合、変数リスト生成部51は、大括弧および当該大括弧に囲まれた文字列が対象変数生成ルールの右辺で置換された後の対象命名規則ユーザ定義の右辺を、新たな変数生成ルールの右辺とする。
なお、対象命名規則ユーザ定義の右辺の大括弧に囲まれた文字列がthisであると判定された場合(ステップS31のYES)、変数リスト生成部51は、ステップS33およびS34の処理を実行する。具体的には、変数リスト生成部51は、新たな変数生成ルールの左辺を対象変数生成ルールの左辺とし、対象命名規則ユーザ定義の右辺の大括弧および当該大括弧に囲まれた文字列(ここでは、this)を対象変数生成ルールの右辺で置換して新たな変数生成ルールの右辺とする。
これにより、対象命名規則ユーザ定義の右辺の大括弧に囲まれた文字列がthisであると判定された場合、および対象命名規則ユーザ定義の右辺の大括弧に囲まれた文字列がthisでないと判定され、かつ、該当箇所が一致すると判定された場合には、対象変数生成ルールの左辺を左辺とし、大括弧および当該大括弧に囲まれた文字列が対象変数生成ルールの右辺で置換された後の対象命名規則ユーザ定義の右辺を右辺とする、新たな変数生成ルールが取得される。
一方、該当箇所が一致しない(つまり、対象変数生成ルールの左辺と対象命名規則ユーザ定義の右辺の大括弧に囲まれた文字列とが一致しない)と判定された場合(ステップS32のNO)、変数リスト生成部51は、新たな変数生成ルールの左辺を、対象変数生成ルールの左辺とする(ステップS35)。
次に、変数生成リスト生成部51は、新たな変数生成ルールの右辺を、対象命名規則ユーザ定義の右辺とする(ステップS36)。
これにより、該当箇所が一致すると判定された場合には、対象変数生成ルールの左辺を左辺とし、対象命名規則ユーザ定義の右辺を右辺とする、新たな変数生成ルールが取得される。
ここでは、第1の文字列置換処理について説明したが、前述した第2の文字列置換処理(図13に示すステップS22の処理)においても上述した図14に示す処理と同様の処理が実行される。なお、第2の文字列置換処理においては、図13に示すステップS18において取得された変数生成ルール(つまり、図13に示すステップS20において該当箇所が一致すると判定された変数生成ルール)を対象変数生成ルール、図13に示すステップS19に示すステップS19において取得された命名規則ユーザ定義(つまり、図13に示すステップS20において該当箇所が一致すると判定された命名規則ユーザ定義)を対象命名規則ユーザ定義として、図14に示す処理が実行される。
ここで、上述した変数リスト生成処理について具体的に説明する。ここでは、便宜的に、図10(に示す命名規則ユーザ定義)および図11(に示す変数生成ルール)を用いて説明する。
まず、上述した図12に示す変数リスト生成処理におけるステップS11〜S17の処理について具体的に説明する。
この場合、変数リスト生成部51は、変数生成ルールを1つ取得する。ここでは、変数生成ルールとして、図11の1行目(class.Actionクラス名=$[テーブルID]Action)が取得されたものとする。
また、変数リスト生成部51は、命名規則ユーザ定義を1つ取得する。ここでは、命名規則ユーザ定義として、図10の1行目(class=Stv[this])が取得されたものとする。
この場合、変数リスト生成部51は、取得された変数生成ルール「class.Actionクラス名=$[テーブルID]Action」の左辺のドットより後ろと取得された命名規則ユーザ定義「class=Stv[this]」の左辺とが一致するか否かを判定する。
ここで、変数リスト生成部51によって取得された変数生成ルールの左辺のドットより後ろはActionクラス名であり、変数リスト生成部51によって取得された命名規則ユーザ定義の左辺はclassであるため、変数リスト生成部51は、該当箇所(つまり、変数生成ルールの左辺のドットより後ろおよび命名規則ユーザ定義の左辺)が一致しないと判定する。
このように該当箇所が一致しないと判定された場合、上述したように他の命名規則ユーザ定義についても同様の処理が実行されるが、変数生成ルール「class.Actionクラス名=$[テーブルID]Action」の左辺のドットより後ろは、図10に示す全ての命名規則ユーザ定義の左辺と一致しない。このため、この変数生成ルール「class.Actionクラス名=$[テーブルID]Action」は、そのまま新たな変数生成ルールとして変数リストAに追加されることになる。
同様に、変数リスト生成部51は、次の変数生成ルールを1つ取得する。ここでは、変数生成ルールとして、図11の2行目(class.Serviceクラス名=$[テーブルID]Service)が取得されたものとする。
また、変数リスト生成部51は、命名規則ユーザ定義を1つ取得する。ここでは、命名規則ユーザ定義として、図10の1行目(class=Stv[this])が取得されたものとする。
この場合、変数リスト生成部51は、取得された変数生成ルール「class.Serviceクラス名=$[テーブルID]Service」の左辺のドットより後ろと取得された命名規則ユーザ定義「class=Stv[this]」の左辺とが一致するか否かを判定する。
ここで、変数リスト生成部51によって取得された変数生成ルールの左辺のドットより後ろはServiceクラス名であり、変数リスト生成部51によって取得された命名規則ユーザ定義の左辺はclassであるため、変数リスト生成部51は、該当箇所が一致しないと判定する。
この場合、変数リスト生成部51は、次の命名規則ユーザ定義を1つ取得する。ここでは、命名規則ユーザ定義として、図10の2行目(Serviceクラス名=[class.Serviceクラス名]Logic)が取得されたものとする。
次に、変数リスト生成部51は、取得された変数生成ルール「class.Serviceクラス名=$[テーブルID]Service」の左辺のドットより後ろと取得された命名規則ユーザ定義「Serviceクラス名=[class.Serviceクラス名]Logic」の左辺とが一致するか否かを判定する。
ここで、変数リスト生成部51によって取得された変数生成ルールの左辺のドットより後ろはServiceクラス名であり、変数リスト生成部51によって取得された命名規則ユーザ定義の左辺はServiceクラス名であるため、変数リスト生成部51は、該当箇所が一致すると判定する。
このように該当箇所が一致すると判定された場合、上述したように第1の文字列置換処理が実行される。
第1の文字列置換処理においては、変数リスト生成部51は、命名規則ユーザ定義「Serviceクラス名=[class.Serviceクラス名]Logic」の右辺の大括弧(つまり、[])に囲まれた文字列がthisであるか否かを判定する。ここでは、命名規則ユーザ定義の右辺の大括弧に囲まれた文字列は、class.Serviceクラス名である。したがって、変数リスト生成部51は、命名規則ユーザ定義の右辺の大括弧に囲まれた文字列がthisでないと判定する。
この場合、変数リスト生成部51は、変数生成ルール「class.Serviceクラス名=$[テーブルID]Service」の左辺と命名規則ユーザ定義「Serviceクラス名=[class.Serviceクラス名]Logic」の右辺の大括弧に囲まれた文字列とが一致するか否かを判定する。
ここで、変数生成ルールの左辺はclass.Serviceクラス名であり、命名規則ユーザ定義の右辺の大括弧に囲まれた文字列はclass.Serviceクラス名であるため、変数リスト生成部51は、該当箇所(つまり、変数生成ルールの左辺および命名規則ユーザ定義の右辺の大括弧に囲まれた文字列)が一致すると判定する。
この場合、変数リスト生成部51は、変数生成ルール「class.Serviceクラス名=$[テーブルID]Service」の左辺を新たな変数生成ルールの左辺とする。
また、変数リスト生成部51は、命名規則ユーザ定義の右辺の大括弧および当該大括弧に囲まれた文字列(ここでは、[class.Serviceクラス名])を、変数生成ルールの右辺(ここでは、$[テーブルID]Service)で置換する。変数リスト生成部51は、置換処理後の命名規則ユーザ定義の右辺(ここでは、$[テーブルID]ServiceLogic)を新たな変数生成ルールの右辺とする。
これにより、変数リスト生成部51は、新たな変数生成ルールとして「class.Serviceクラス名=$[テーブルID]ServiceLogic」を取得し、当該新たな変数生成ルールを変数リストAに追加する。
ここでは、図11に示す変数生成ルールのうち、1行目(class.Actionクラス名=$[テーブルID]Action)および2行目(class.Serviceクラス名=$[テーブルID]Service)について主に説明したが、他の変数生成ルールについても同様の処理が実行される。
なお、図15は、図12に示すステップS11〜S17の処理が実行されることによって生成された変数リストAを示す。図15に示す例では、変数リストAには、新たな変数生成ルールとして、「class.Actionクラス名=$[テーブルID]Action」、「class.Serviceクラス名=$[テーブルID]ServiceLogic」、「class.Datasetクラス名=$[テーブルID]Dataset」、「attribute.自テーブルの属性名=$[カラムID]」、「attribute.親テーブルの属性名=$[テーブルID]_$[カラムID]」および「attribute.参照先テーブルの属性名=$[カラムID]_$[参照先カラムID]」が追加されている。
次に、上述した図13に示す変数リスト生成処理におけるステップS18〜S24の処理について具体的に説明する。
この場合、変数リスト生成部51は、変数リストAから変数生成ルール(新たな変数生成ルール)を1つ取得する。ここでは、変数生成ルールとして、図15の1行目(class.Actionクラス名=$[テーブルID]Action)が取得されたものとする。
また、変数リスト生成部51は、命名規則ユーザ定義を1つ取得する。ここでは、命名規則ユーザ定義として、図10の1行目(class=Stv[this])が取得されたものとする。
この場合、変数リスト生成部51は、取得された変数生成ルール「class.Actionクラス名=$[テーブルID]Action」の左辺のドットより前と取得された命名規則ユーザ定義「class=Stv[this]」の左辺とが一致するか否かを判定する。
ここで、変数リスト生成部51によって取得された変数生成ルールの左辺のドットより前はclassであり、変数リスト生成部51によって取得された命名規則ユーザ定義の左辺はclassであるため、変数リスト生成部51は、該当箇所(つまり、変数生成ルールの左辺のドットより前および命名規則ユーザ定義の左辺)が一致すると判定する。
このように該当箇所が一致すると判定された場合、上述したように第2の文字列置換処理が実行される。
第2の文字列置換処理においては、変数リスト生成部51は、命名規則ユーザ定義「class=Stv[this]」の右辺の大括弧に囲まれた文字列がthisであるか否かを判定する。ここでは、命名規則ユーザ定義の右辺の大括弧に囲まれた文字列は、thisである。したがって、変数リスト生成部51は、命名規則ユーザ定義の右辺の大括弧に囲まれた文字列がthisであると判定する。
この場合、変数リスト生成部51は、変数生成ルール「class.Actionクラス名=$[テーブルID]Action」の左辺を新たな変数生成ルールの左辺とする。
また、変数リスト生成部51は、命名規則ユーザ定義の右辺の大括弧および当該大括弧に囲まれた文字列(ここでは、[this])を、変数生成ルールの右辺(ここでは、$[テーブルID]Action)で置換する。変数リスト生成部51は、置換処理後の命名規則ユーザ定義の右辺(ここでは、Stv$[テーブルID]Action)を新たな変数生成ルールの右辺とする。
これにより、変数リスト生成部51は、新たな変数生成ルールとして「class.Actionクラス名=Stv$[テーブルID]Action」を取得し、当該新たな変数生成ルールを変数リストBに追加する。
なお、図15に示す変数リストAの「class.Serviceクラス名=$[テーブルID]ServiceLogic」および「class.Datasetクラス名=$[テーブルID]Dataset」についても、上記した「class.Actionクラス名=$[テーブルID]Action」と同様な処理が実行されることにより、「class.Serviceクラス名=Stv$[テーブルID]ServiceLogic」および「class.Datasetクラス名=Stv$[テーブルID]Dataset」が変数リストBに追加される。
上述したように命名規則ユーザ定義「class=Stv[this]」は、クラス名の先頭に“Stv”をつけるという命名規則である。このため、変数リストAに追加された「class.Actionクラス名=$[テーブルID]Action」、「class.Serviceクラス名=$[テーブルID]ServiceLogic」および「class.Datasetクラス名=$[テーブルID]Dataset」に命名規則ユーザ定義「class=Stv[this]」が適用されると、「class.Actionクラス名=Stv$[テーブルID]Action」、「class.Serviceクラス名=Stv$[テーブルID]ServiceLogic」および「class.Datasetクラス名=Stv$[テーブルID]Dataset」となる。
同様に、変数リスト生成部51は、次の変数生成ルールを1つ取得する。ここでは、変数生成ルールとして、図15の4行目(attribute.自テーブルの属性名=$[カラムID])が取得されたものとする。
また、変数リスト生成部51は、命名規則ユーザ定義を1つ取得する。ここでは、命名規則ユーザ定義として、図10の1行目(class=Stv[this])が取得されたものとする。
この場合、変数リスト生成部51は、取得された変数生成ルール「attribute.自テーブルの属性名=$[カラムID]」の左辺のドットより前と取得された命名規則ユーザ定義「class=Stv[this]」の左辺とが一致するか否かを判定する。
ここで、変数リスト生成部51によって取得された変数生成ルールの左辺のドットより前はattributeであり、変数リスト生成部51によって取得された命名規則ユーザ定義の左辺はclassであるため、変数リスト生成部51は、該当箇所が一致しないと判定する。
このように該当箇所が一致しないと判定された場合、上述したように他の命名規則ユーザ定義についても同様の処理が実行されるが、変数生成ルール「attribute.自テーブルの属性名=$[カラムID]」の左辺のドットより前は、図10に示す全ての命名規則ユーザ定義の左辺と一致しない。このため、この変数生成ルール「attribute.自テーブルの属性名=$[カラムID]」は、そのまま新たな変数生成ルールとして変数リストBに追加されることになる。
なお、図15に示す変数リストAの「attribute.親テーブルの属性名=$[テーブルID]_$[カラムID]」および「attribute.参照先テーブルの属性名=$[カラムID]_$[参照先カラムID]」についても、上記した「attribute.自テーブルの属性名=$[カラムID]」と同様な処理が実行されることにより、「attribute.親テーブルの属性名=$[テーブルID]_$[カラムID]」および「attribute.参照先テーブルの属性名=$[カラムID]_$[参照先カラムID]」が変数リストBに追加される。
なお、図16は、図15に示す全ての変数生成ルールに対して前述した図13に示すステップS19〜S23の処理が実行されることによって生成された変数リストBを示す。図16に示す例では、変数リストBには、新たな変数生成ルールとして、上記したように「class.Actionクラス名=Stv$[テーブルID]Action」、「class.Serviceクラス名=Stv$[テーブルID]ServiceLogic」、「class.Datasetクラス名=Stv$[テーブルID]Dataset」、「attribute.自テーブルの属性名=$[カラムID]」、「attribute.親テーブルの属性名=$[テーブルID]_$[カラムID]」および「attribute.参照先テーブルの属性名=$[カラムID]_$[参照先カラムID]」が追加されている。
このように変数リスト生成処理が実行されることによって生成された図16に示すような変数リストBは、変数リストとして用いられることができる。この場合、変数リストBは、変数リストとして変数リスト格納部24に格納される。
なお、図10に示す命名規則ユーザ定義の例では、図14に示すステップS31において右辺の大括弧に囲まれた文字列がthisでないと判定されるものはないが、例えば「class=Stv[class.Serviceクラス名]」のような命名規則ユーザ定義が定義されている場合には、当該右辺の大括弧に囲まれた文字列がthisでないと判定される。
次に、本実施形態に係るプログラムテンプレート自動生成装置50によって実行される命名規則検証処理について説明する。命名規則検証処理は、上述した変数リスト生成処理において用いられる命名規則ユーザ定義に問題があるか否かを検証するために実行される処理である。なお、命名規則検証処理は、命名規則ユーザ定義がユーザによって定義された後、命名規則検証部52によって実行される。
この命名規則検証処理は、第1〜第3の命名規則検証処理を含む。以下、この第1〜第3の命名規則検証処理の各々について説明する。
まず、図17のフローチャートを参照して、第1の命名規則検証処理の処理手順について説明する。第1の命名規則検証処理は、命名規則ユーザ定義において左辺に定義できないものが定義されていないかを検証するための処理である。なお、上述したように命名規則ユーザ定義の左辺に定義できるものは、変数生成ルールの左辺のドットより前または後ろと一致するものである。
第1の命名規則検証処理においては、命名規則格納部25に格納されている命名規則ユーザ定義の各々について以下のステップS41〜S46の処理が実行される。
命名規則検証部52は、命名規則格納部25に格納されている命名規則ユーザ定義を1つ取得する(ステップS41)。
次に、命名規則検証部52は、変数生成ルール格納部26に格納されている変数生成ルールを1つ取得する(ステップS42)。
命名規則検証部52は、ステップS41において取得された命名規則ユーザ定義の左辺がステップS42において取得された変数生成ルールの左辺のドットより後ろと一致するか否かを判定する(ステップS43)。
命名規則ユーザ定義の左辺が変数生成ルールの左辺のドットより後ろと一致しないと判定された場合(ステップS43のNO)、命名規則検証部52は、ステップS41において取得された命名規則ユーザ定義の左辺がステップS42において取得された変数生成ルールの左辺のドットより前と一致するか否かを判定する(ステップS44)。
命名規則ユーザ定義の左辺が変数生成ルールの左辺のドットより前と一致しないと判定された場合(ステップS44のNO)、命名規則検証部52は、変数生成ルール格納部26に他の変数生成ルールがあるか否かを判定する(ステップS45)。
変数生成ルール格納部26に他の変数生成ルールがあると判定された場合(ステップS45のYES)、上記したステップS42に戻って処理が繰り返される。
一方、変数生成ルール格納部26に他の変数生成ルールがないと判定された場合(ステップS45のNO)、命名規則検証部52は、検証結果としてエラーメッセージを検証結果格納部27に出力する(ステップS46)。このステップS46において出力されるエラーメッセージは、命名規則ユーザ定義の左辺に定義できないものが定義されていることを警告するメッセージである。なお、このエラーメッセージは、例えばユーザに対して提示されることができる。
ステップS46の処理が実行されると、命名規則検証部52は、命名規則格納部25に他の命名規則ユーザ定義があるか否かを判定する(ステップS47)。
命名規則格納部25に他の命名規則ユーザ定義があると判定された場合(ステップS47のYES)、上記したステップS41に戻って処理が繰り返される。
一方、命名規則格納部25に他の命名規則ユーザ定義がないと判定された場合(ステップS47のNO)、第1の命名規則検証処理は終了される。
上記したように第1の命名規則検証処理が実行されることによって、命名規則格納部25に格納されている命名規則ユーザ定義の各々が当該命名規則ユーザ定義の左辺に定義できないものを定義している場合に、その旨を警告するエラーメッセージを出力することができる。
次に、図18のフローチャートを参照して、第2の命名規則検証処理の処理手順について説明する。第2の命名規則検証処理は、命名規則ユーザ定義においてクラス名が重複していないかを検証するための処理である。
なお、命名規則ユーザ定義においてクラス名が重複している場合、当該命名規則ユーザ定義に基づいて生成されたプログラムテンプレートを用いて生成されたプログラムをコンパイルした際にエラーが発生してしまう。このため、第2の命名規則検証処理によってクラス名の重複が検証される。
まず、命名規則検証部52は、変数生成ルール格納部26に格納されている変数生成ルールのうち、左辺のドットより前がclassである変数生成ルールを取得する(ステップS51)。なお、左辺のドットより前がclassである変数生成ルールが変数生成ルール格納部26内に複数存在する場合には、全ての変数生成ルールが取得される。
次に、命名規則検証部52は、ステップS51において取得された変数生成ルールの左辺のドットより後ろを左辺とする命名規則ユーザ定義(つまり、当該変数生成ルールの左辺のドットより後ろと左辺が一致する命名規則ユーザ定義)が命名規則格納部25内にあるか否かを判定する(ステップS52)。
変数生成ルールの左辺のドットより後ろを左辺とする命名規則ユーザ定義が命名規則格納部25内にあると判定された場合(ステップS52のYES)、命名規則検証部52は、命名規則格納部25から当該命名規則ユーザ定義を取得する(ステップS53)。なお、ステップS53においては、複数の命名規則ユーザ定義が取得されても構わない。
次に、命名規則検証部52は、ステップS51において取得された変数生成ルールおよびステップS53において取得された命名規則ユーザ定義を用いて、第3の文字列置換処理を実行する(ステップS54)。この第3の文字列置換処理においては、ステップS51において取得された変数生成ルールにステップS53において取得された命名規則ユーザ定義を適用することによって当該命名規則ユーザ定義(または変数生成ルール)の文字列を置換し、当該置換結果を含む変数リストが生成される。この第3の文字列置換処理において生成される変数リストには、変数を左辺とし、当該変数に対して置換される値を右辺とする情報が保持される。なお、この第3の文字列置換処理の詳細については後述する。
命名規則検証部52は、第3の文字列置換処理において生成された変数リスト内において右辺が重複したものがあるか否かを判定する(ステップS55)。
変数リスト内において右辺が重複したものがあると判定された場合(ステップS55のYES)、命名規則検証部52は、検証結果としてエラーメッセージを検証結果格納部27に出力する(ステップS56)。このステップS56において出力されるエラーメッセージは、命名規則ユーザ定義においてクラス名が重複していることを警告するメッセージである。なお、このエラーメッセージは、例えばユーザに対して提示されることができる。
一方、ステップS52において変数生成ルールの左辺のドットより後ろを左辺とする命名規則ユーザ定義が命名規則格納部25内にないと判定された場合および変数リスト内において右辺が重複したものがないと判定された場合、ステップS56の処理は実行されず、第2の命名規則検証処理は終了される。
ここで、図19および図20のフローチャートを参照して、上述した第3の文字列置換処理(図18に示すステップS54の処理)の処理手順について説明する。ここでは、図18に示すステップS51において取得された変数生成ルールを対象変数生成ルール、ステップS53において取得された命名規則ユーザ定義を対象命名規則ユーザ定義と称する。
第3の文字列置換処理においては、まず、対象命名規則ユーザ定義の各々について以下のステップS61〜S66の処理が実行される。
命名規則検証部52は、対象命名規則ユーザ定義のうちの1つを取得する(ステップS61)。
次に、命名規則検証部52は、対象変数生成ルールのうちの1つを取得する(ステップS62)。
命名規則検証部52は、ステップS61において取得された対象命名規則ユーザ定義およびステップS62において取得された対象変数生成ルールを比較することによって、該当箇所が一致するか否かを判定する(ステップS63)。なお、ステップS63における該当箇所とは、ステップS61において取得された対象命名規則ユーザ定義の右辺の大括弧に囲まれた文字列およびステップS62において取得された対象変数生成ルールの左辺を指す。つまり、ステップS63においては、対象命名規則ユーザ定義の右辺の大括弧に囲まれた文字列と対象変数生成ルールの左辺とが一致するか否かが判定される。
該当箇所が一致しない(つまり、対象命名規則ユーザ定義の右辺の大括弧に囲まれた文字列と対象変数生成ルールの左辺とが一致しない)と判定された場合(ステップS63のNO)、命名規則検証部52は、他の対象変数生成ルールがあるか否かを判定する(ステップS64)。
他の対象変数生成ルールがあると判定された場合(ステップS64のYES)、上記したステップS62に戻って処理が繰り返される。
一方、他の対象変数生成ルールがないと判定された場合(ステップS64のNO)、後述するステップS66の処理が実行される。
また、上記したステップS63において、該当箇所が一致する(つまり、対象命名規則ユーザ定義の右辺の大括弧に囲まれた文字列と対象変数生成ルールの左辺とが一致する)と判定された場合、命名規則検証部52は、当該対象命名規則ユーザ定義の右辺の大括弧および当該大括弧に囲まれた文字列を当該対象変数生成ルールの右辺で置換する(ステップS65)。
命名規則検証部52は、置換結果、つまり、右辺の大括弧および当該大括弧に囲まれた文字列が対象変数生成ルールの右辺で置換された対象命名規則ユーザ定義を、変数リストCに追加する(ステップS66)。
なお、上記したようにステップS64において他の対象変数生成ルールがないと判定された場合にはステップS66の処理が実行されるが、この場合、ステップS61において取得された対象命名規則ユーザ定義がそのまま変数リストCに追加される。
ステップS66の処理が実行されると、命名規則検証部52は、他の対象命名規則ユーザ定義があるか否かを判定する(ステップS67)。
他の対象命名規則ユーザ定義があると判定された場合(ステップS67のYES)、上記したステップS61に戻って処理が繰り返される。
一方、他の対象命名規則ユーザ定義がないと判定された場合(ステップS67のNO)、対象変数生成ルールの各々について以下のステップS68〜S73の処理が実行される。
命名規則検証部52は、対象変数生成ルールのうちの1つを取得する(ステップS68)。
次に、命名規則検証部52は、上記した変数リストCに追加された対象命名規則ユーザ定義を1つ取得する(ステップS69)。
命名規則検証部52は、ステップS68において取得された対象変数生成ルールおよびステップS69において取得された対象命名規則ユーザ定義を比較することによって、該当箇所が一致するか否かを判定する(ステップS70)。なお、ステップS70における該当箇所とは、ステップS68において取得された対象変数生成ルールの左辺のドットより後ろおよびステップS69において取得された対象命名規則ユーザ定義の左辺を指す。つまり、ステップS70においては、対象変数生成ルールの左辺のドットより後ろと対象命名規則ユーザ定義の左辺とが一致するか否かが判定される。
該当箇所が一致しない(つまり、対象変数生成ルールの左辺のドットより後ろと対象命名規則ユーザ定義の左辺とが一致しない)と判定された場合(ステップS70のNO)、命名規則検証部52は、他の対象命名規則ユーザ定義があるか否かを判定する(ステップS71)。
他の対象命名規則ユーザ定義があると判定された場合(ステップS71のYES)、上記したステップS69の処理が実行される。
一方、他の対象命名規則ユーザ定義がないと判定された場合(ステップS71のNO)、後述するステップS73の処理が実行される。
また、上記したステップS70において、該当箇所が一致する(つまり、対象変数生成ルールの左辺のドットより後ろと対象命名規則ユーザ定義の左辺とが一致する)と判定された場合、命名規則検証部52は、当該対象変数生成ルールの右辺を当該対象命名規則ユーザ定義の右辺で置換する(ステップS72)。
命名規則検証部52は、置換結果、つまり、右辺が対象命名規則ユーザ定義の右辺で置換された対象変数生成ルールを、変数リストDに追加する(ステップS73)。
なお、上記したようにステップS71において他の対象命名規則ユーザ定義がないと判定された場合にはステップS73の処理が実行されるが、この場合、ステップS68において取得された対象変数生成ルールがそのまま変数リストDに追加される。
ステップS73の処理が実行されると、命名規則検証部52は、他の対象変数生成ルールがあるか否かを判定する(ステップS74)。
他の対象変数生成ルールがあると判定された場合(ステップS74のYES)、上記したステップS68に戻って処理が繰り返される。
一方、他の対象変数生成ルールがないと判定された場合(ステップS74のNO)、第3の文字列置換処理は終了される。
なお、上述した図18に示すステップS54において生成される変数リストとは上記した変数リストDであり、上述したステップS55の処理は、当該変数リストDを用いて実行される。
ここで、上述した第2の命名規則検証処理について具体的に説明する。ここでは、変数生成ルール格納部26には、前述した図11に示す変数生成ルールが格納されているものとする。また、命名規則格納部25には、図21に示す命名規則ユーザ定義が格納されているものとする。
まず、命名規則検証部52は、変数生成ルール格納部26に格納されている変数生成ルールのうち、左辺のドットより前がclassである変数生成ルールを取得する。ここでは、図11に示す変数生成ルールのうち、図22に示す変数生成ルール「class.Actionクラス名=$[テーブル名]Action」、「class.Serviceクラス名=$[テーブルID]Service」および「class.Datasetクラス名=$[テーブルID]DS」が取得される。
次に、命名規則検証部52は、取得された変数生成ルールの左辺のドットより後ろを左辺とする命名規則ユーザ定義が命名規則格納部25内にあるか否かを判定する。図21を参照すると、取得された変数生成ルール「class.Actionクラス名=$[テーブル名]Action」の左辺のドットより後ろ(つまり、「Actionクラス名」)を左辺とする命名規則ユーザ定義「Actionクラス名=[class.Actionクラス名]Service」および取得された変数生成ルール「class.Serviceクラス名=$[テーブルID]Service」の左辺のドットより後ろ(つまり、「Serviceクラス名」)を左辺とする命名規則ユーザ定義「Serviceクラス名=$[テーブルID]ActionService」が命名規則格納部25内に存在する。
この場合、命名規則検証部52は、取得された変数生成ルールの左辺のドットより後ろを左辺とする命名規則ユーザ定義が命名規則格納部25内にあると判定し、図23に示す命名規則ユーザ定義「Actionクラス名=[class.Actionクラス名]Service」および「Serviceクラス名=$[テーブルID]ActionService」を取得する。
次に、命名規則検証部52は、図22に示す変数生成ルール「class.Actionクラス名=$[テーブル名]Action」、「class.Serviceクラス名=$[テーブルID]Service」および「class.Datasetクラス名=$[テーブルID]DS」と図23に示す命名規則ユーザ定義「Actionクラス名=[class.Actionクラス名]Service」および「Serviceクラス名=$[テーブルID]ActionService」とを用いて、第3の文字列置換処理を実行する。
まず、上述した図19に示す第3の文字列置換処理におけるステップS61〜S67の処理について具体的に説明する。
この場合、命名規則検証部52は、図23に示す命名規則ユーザ定義のうちの1つを取得する。ここでは、図23に示す命名規則ユーザ定義のうち、命名規則ユーザ定義「Actionクラス名=[class.Actionクラス名]Service」が取得されたものとする。
また、命名規則検証部52は、図22に示す変数生成ルールのうちの1つを取得する。ここでは、図22に示す変数生成ルールのうち、変数生成ルール「class.Actionクラス名=$[テーブルID]Action」が取得されたものとする。
命名規則検証部52は、取得された命名規則ユーザ定義「Actionクラス名=[class.Actionクラス名]Service」の右辺の大括弧に囲まれた文字列と取得された変数生成ルール「class.Actionクラス名=$[テーブルID]Action」の左辺とが一致するか否かを判定する。
ここで、命名規則ユーザ定義「Actionクラス名=[class.Actionクラス名]Service」の右辺の大括弧に囲まれた文字列は「class.Actionクラス名」であり、変数生成ルール「class.Actionクラス名=$[テーブルID]Action」の左辺は「class.Actionクラス名」である。このため、命名規則検証部52は、命名規則ユーザ定義の右辺の大括弧に囲まれた文字列と変数生成ルールの左辺とが一致すると判定する。
この場合、命名規則検証部52は、命名規則ユーザ定義「Actionクラス名=[class.Actionクラス名]Service」の右辺の大括弧および当該大括弧に囲まれた文字列(つまり、[class.Actionクラス名])を、変数生成ルール「class.Actionクラス名=$[テーブルID]Action」の右辺(つまり、$[テーブルID]Action)で置換する。
命名規則検証部52は、置換後の命名規則ユーザ定義「Actionクラス名=$[テーブルID]ActionService」を変数リストCに追加する。
同様に、命名規則検証部52は、図23に示す命名規則ユーザ定義のうちの1つを取得する。ここでは、図23に示す命名規則ユーザ定義のうち、命名規則ユーザ定義「Serviceクラス名=$[テーブルID]ActionService」が取得される。
また、命名規則検証部52は、図22に示す変数生成ルールのうちの1つを取得する。ここでは、図22に示す変数生成ルールのうち、変数生成ルール「class.Actionクラス名=$[テーブルID]Action」が取得されたものとする。
命名規則検証部52は、取得された命名規則ユーザ定義「Serviceクラス名=$[テーブルID]ActionService」の右辺の大括弧に囲まれた文字列と取得された変数生成ルール「class.Actionクラス名=$[テーブルID]Action」の左辺とが一致するか否かを判定する。
ここで、命名規則ユーザ定義「Serviceクラス名=$[テーブルID]ActionService」の右辺の大括弧に囲まれた文字列は「テーブルID」であり、変数生成ルール「class.Actionクラス名=$[テーブルID]Action」の左辺は「class.Actionクラス名」である。このため、命名規則検証部52は、命名規則検証部52は、命名規則ユーザ定義の右辺の大括弧に囲まれた文字列と変数生成ルールの左辺とが一致しないと判定する。
この場合、命名規則検証部52は、命名規則ユーザ定義「Serviceクラス名=$[テーブルID]ActionService」を変数リストCに追加する。
上記したように図19に示すステップS61〜S67の処理が実行された場合、変数リストCには、図24に示す命名規則ユーザ定義「Actionクラス名=$[テーブル名]ActionService」および「Serviceクラス名=$[テーブルID]ActionService」が追加される。
次に、上述した図20に示す第3の文字列置換処理におけるステップS68〜S74の処理について具体的に説明する。
この場合、命名規則検証部52は、上記した図22に示す変数生成ルールのうちの1つを取得する。ここでは、図22に示す変数生成ルールのうち、変数生成ルール「class.Actionクラス名=$[テーブルID]Action」が取得されたものとする。
また、命名規則検証部52は、上記した図24に示す変数リストCに追加された命名規則ユーザ定義のうちの1つを取得する。ここでは、図24に示す変数リストCに追加された命名規則ユーザ定義のうち、命名規則ユーザ定義「Actionクラス名=$[テーブルID]ActionService」が取得されたものとする。
命名規則検証部52は、取得された変数生成ルール「class.Actionクラス名=$[テーブルID]Action」の左辺のドットより後ろと取得された命名規則ユーザ定義「Actionクラス名=$[テーブルID]ActionService」の左辺とが一致するか否かを判定する。
ここで、変数生成ルール「class.Actionクラス名=$[テーブルID]Action」の左辺のドットより後ろは「Actionクラス名」であり、命名規則ユーザ定義「Actionクラス名=$[テーブルID]ActionService」の左辺は「Actionクラス名」である。このため、命名規則検証部52は、変数生成ルールの左辺のドットより後ろと命名規則ユーザ定義の左辺とが一致すると判定する。
この場合、命名規則検証部52は、変数生成ルール「class.Actionクラス名=$[テーブルID]Action」の右辺を命名規則ユーザ定義「Actionクラス名=$[テーブルID]ActionService」の右辺で置換する。
命名規則検証部52は、置換後の変数生成ルール「class.Actionクラス名=$[テーブルID]ActionService」を変数リストDに追加する。
同様に、命名規則検証部52は、図22に示す変数生成ルールのうちの1つを取得する。ここでは、図22に示す変数生成ルールのうち、変数生成ルール「class.Serviceクラス名=$[テーブルID]Service」が取得されたものとする。
また、命名規則検証部52は、上記した図24に示す変数リストCに追加された命名規則ユーザ定義のうちの1つを取得する。ここでは、図24に示す変数リストCに追加された命名規則ユーザ定義のうち、命名規則ユーザ定義「Serviceクラス名=$[テーブルID]ActionService」が取得されたものとする。
命名規則検証部52は、取得された変数生成ルール「class.Serviceクラス名=$[テーブルID]Service」の左辺のドットより後ろと取得された命名規則ユーザ定義「Serviceクラス名=$[テーブルID]ActionService」の左辺とが一致するか否かを判定する。
ここで、変数生成ルール「class.Serviceクラス名=$[テーブルID]Service」の左辺のドットより後ろは「Serviceクラス名」であり、命名規則ユーザ定義「Serviceクラス名=$[テーブルID]ActionService」の左辺は「Serviceクラス名」である。このため、命名規則検証部52は、変数生成ルールの左辺のドットより後ろと命名規則ユーザ定義の左辺とが一致すると判定する。
この場合、命名規則検証部52は、変数生成ルール「class.Serviceクラス名=$[テーブルID]Service」の右辺を命名規則ユーザ定義「Serviceクラス名=$[テーブルID]ActionService」の右辺で置換する。
命名規則検証部52は、置換後の変数生成ルール変数生成ルール「class.Serviceクラス名=$[テーブルID]ActionService」を変数リストDに追加する。
なお、図22に示す変数生成ルールのうちの変数生成ルール「class.Datasetクラス名=$[テーブルID]DS」についても同様の処理(図20に示すステップS68〜73の処理)が実行される。この場合、詳しい説明は省略するが、変数生成ルール「class.Datasetクラス名=$[テーブルID]DS」の左辺のドットより後ろを左辺とする命名規則ユーザ定義は変数リストC内に存在しないため、当該変数生成ルール「class.Datasetクラス名=$[テーブルID]DS」が変数リストDに追加される。
上記したように図20に示すステップS68〜S74の処理が実行された場合、変数リストDには、図25に示す変数生成ルール「class.Actionクラス名=$[テーブルID]ActionService」、「class.Serviceクラス名=$[テーブルID]ActionService」および「class.Datasetクラス名=$[テーブルID]DS」が追加される。
第3の文字列置換処理が実行されることによって変数リストDが生成されると、命名規則検証部52は、当該変数リストD内において右辺が重複したものがあるか否かを判定する。
ここで、図25を参照すると、変数リストD内の「class.Actionクラス名=$[テーブルID]ActionService」および「class.Serviceクラス名=$[テーブルID]ActionService」は、右辺が一致している。
この場合、命名規則検証部52は、変数リストD内において右辺が重複したものがあると判定し、命名規則ユーザ定義においてクラス名が重複していることを警告するエラーメッセージを出力する。
上記したように第2の命名規則検証処理が実行されることによって、命名規則ユーザ定義においてクラス名が重複している場合に、エラーメッセージを出力することができる。
なお、本実施形態においては、第2の命名規則検証処理が命名規則ユーザ定義においてクラス名が重複していないかを検証するための処理であるものとして説明したが、第2の命名規則検証処理によって例えば命名規則ユーザ定義において属性名が重複していないかを検証することも可能である。この場合、図18に示すステップS51において左辺のドットより前がattributeである変数生成ルールを取得することによって、命名規則ユーザ定義において属性名が重複していないかを検証することができる。
更に、第2の命名規則検証処理において、クラス名および属性名の一方のみでなく、両方が重複していないかを検証することも可能である。
次に、図26のフローチャートを参照して、第3の命名規則検証処理の処理手順について説明する。第3の命名規則検証処理は、命名規則ユーザ定義が循環していないかを検証するための処理である。命名規則ユーザ定義が循環している場合とは、当該命名規則ユーザ定義が自身の定義を利用している場合および例えば2つの命名規則ユーザ定義が互いに参照している場合等をいう。
なお、このように命名規則ユーザ定義が循環している場合、適切に変数リストを生成することができない。このため、第3の命名規則検証処理によって命名規則ユーザ定義の循環が検証される。
第3の命名規則検証処理においては、命名規則格納部25に格納されている命名規則ユーザ定義の各々について以下のステップS81〜S86の処理が実行される。
命名規則検証部52は、命名規則格納部25に格納されている命名規則ユーザ定義を1つ取得する(ステップS81)。以下、ステップS81において取得された命名規則ユーザ定義を、便宜的に第1の命名規則ユーザ定義と称する。
次に、命名規則検証部52は、第1の命名規則ユーザ定義の右辺の大括弧に囲まれた文字列がthisであるか否かを判定する(ステップS82)。
第1の命名規則ユーザ定義の右辺の大括弧に囲まれた文字列がthisでないと判定された場合(ステップS82のNO)、命名規則検証部52は、対象の命名規則ユーザ定義が命名規則格納部25内にあるか否かを判定する(ステップS83)。なお、このステップS83における対象の命名規則ユーザ定義は、ここでは、第1の命名規則ユーザ定義の右辺の大括弧に囲まれた文字列を左辺とする命名規則ユーザ定義(つまり、第1の命名規則ユーザ定義の右辺の大括弧に囲まれた文字列と左辺が一致する命名規則ユーザ定義)である。
対象の命名規則ユーザ定義が命名規則格納部25内にあると判定された場合(ステップS83のYES)、命名規則検証部52は、命名規則格納部25から当該対象の命名規則ユーザ定義(つまり、第1の命名規則ユーザ定義の右辺の大括弧に囲まれた文字列を左辺とする命名規則ユーザ定義)を取得する(ステップS84)。以下、ステップS84において取得された命名規則ユーザ定義を、便宜的に第2の命名規則ユーザ定義と称する。
次に、命名規則検証部52は、第2の命名規則ユーザ定義が第1の命名規則ユーザ定義(つまり、既に取得されていた命名規則ユーザ定義)と一致するか否かを判定する(ステップS85)。
第2の命名規則ユーザ定義が第1の命名規則ユーザ定義と一致すると判定された場合(ステップS85のYES)、命名規則検証部52は、検証結果としてエラーメッセージを検証結果格納部27に出力する(ステップS86)。このステップS86において出力されるエラーメッセージは、命名規則ユーザ定義が循環していることを警告するメッセージである。このエラーメッセージは、例えばユーザに対して提示されることができる。ステップS86の処理が実行されると、第3の命名規則検証処理は終了される。
一方、第2の命名規則ユーザ定義が第1の命名規則ユーザ定義と一致しないと判定された場合(ステップS85のNO)、ステップS83に戻って処理が繰り返される。
ここで、第2の命名規則ユーザ定義が第1の命名規則ユーザ定義と一致しないと判定され、ステップS83に戻って処理が繰り返される場合における当該ステップS83以降の処理について説明する。
この場合、命名規則検証部52は、上述した第1の命名規則ユーザ定義を第2の命名規則ユーザ定義としてステップS83の処理を実行する。つまり、この場合のステップS83における対象の命名規則ユーザ定義は、第2の命名規則ユーザ定義の右辺の大括弧に囲まれた文字列を左辺とする命名規則ユーザ定義となる。
ここで、対象の命名規則ユーザ定義が命名規則格納部25内にあると判定された場合(ステップS83のYES)、命名規則検証部52は、命名規則格納部25から当該対象の命名規則ユーザ定義(つまり、第2の命名規則ユーザ定義の右辺の大括弧に囲まれた文字列を左辺とする命名規則ユーザ定義)を取得する(ステップS84)。
このステップS84において取得された命名規則ユーザ定義を便宜的に第3の命名規則ユーザ定義とすると、命名規則検証部52は、当該第3の命名規則ユーザ定義が第1または第2の命名規則ユーザ定義と一致するか否かを判定する(ステップS85)。
このステップS85において第3の命名規則ユーザ定義が第1または第2の命名規則ユーザ定義と一致すると判定された場合には、上述したステップS86の処理が実行される。一方、第3の命名規則ユーザ定義が第1または第2の命名規則と一致しないと判定された場合には、再びステップS83に戻って処理が繰り返される。この場合、命名規則検証部52は、上述した第2の命名規則ユーザ定義を第3の命名規則ユーザ定義としてステップS83の処理を実行する。以下、同様に処理が繰り返される。
なお、ステップS82において第1の命名規則ユーザ定義の右辺の大括弧に囲まれた文字列がthisであると判定された場合およびステップS83において対象の命名規則ユーザ定義が命名規則格納部25内にないと判定された場合、命名規則検証部52は、命名規則格納部25に他の命名規則ユーザ定義があるか否かを判定する(ステップS87)。
命名規則格納部25に他の命名規則ユーザ定義があると判定された場合(ステップS87のYES)、上記したステップS81に戻って処理が繰り返される。
一方、命名規則格納部25に他の命名規則ユーザ定義がないと判定された場合(ステップS87のNO)、第3の命名規則検証処理は終了される。
以下、上述した第3の命名規則検証処理について具体的に説明する。ここでは、命名規則格納部25には、図27に示す命名規則ユーザ定義が格納されているものとする。
ここで、図27を参照して、命名規則ユーザ定義が循環している場合について具体的に説明する。
まず、図27の1行目の命名規則ユーザ定義(Actionクラス名=Stv[Actionクラス名])について説明すると、1行目の命名規則ユーザ定義の右辺の大括弧に囲まれている「Actionクラス名」は、当該1行目の命名規則ユーザ定義の左辺と一致している。この図27の1行目の命名規則ユーザ定義のように、命名規則ユーザ定義が自身の定義を利用しようとしている場合には循環していると判断される。
次に、図27の2行目の命名規則ユーザ定義(Serviceクラス名=Stv1[Datasetクラス名])および3行目の命名規則ユーザ定義(Datasetクラス名=Stv2[Serviceクラス名])について説明すると、2行目の命名規則ユーザ定義の右辺の大括弧に囲まれている「Datasetクラス名」は3行目の命名規則ユーザ定義の左辺「Datasetクラス名」と一致しており、かつ、3行目の命名規則ユーザ定義の右辺の大括弧に囲まれている「Serviceクラス名」は2行目の命名規則ユーザ定義の左辺「Serviceクラス名」と一致している。このような場合には、図27の2行目の命名規則ユーザ定義および図27の3行目の命名規則ユーザ定義は、参照が循環していると判断される。
第3の命名規則検証処理においては、命名規則格納部25に格納されている命名規則ユーザ定義の各々について処理が実行される。
まず、図27に示す命名規則ユーザ定義のうち、命名規則ユーザ定義「Actionクラス名=Stv[Actionクラス名]」について説明する。
この場合、命名規則検証部52は、命名規則ユーザ定義「Actionクラス名=Stv[Actionクラス名]」を取得する。なお、ここで取得された命名規則ユーザ定義を第1の命名規則ユーザ定義と称する。
次に、命名規則検証部52は、第1の命名規則ユーザ定義の右辺の大括弧に囲まれた文字列がthisであるか否かを判定する。ここでは、第1の命名規則ユーザ定義「Actionクラス名=Stv[Actionクラス名]」の右辺の大括弧に囲まれた文字列は「Actionクラス名」であるため、当該第1の命名規則ユーザ定義「Actionクラス名=Stv[Actionクラス名]」の右辺の大括弧に囲まれた文字列はthisでないと判定される。
この場合、命名規則検証部52は、第1の命名規則ユーザ定義の右辺の大括弧に囲まれた文字列を左辺とする命名規則ユーザ定義が命名規則格納部25内にあるか否かを判定する。
ここで、図27に示す命名規則ユーザ定義の中には、第1の命名規則ユーザ定義「Actionクラス名=Stv[Actionクラス名]」の右辺の大括弧に囲まれた文字列「Actionクラス名」を左辺とする命名規則ユーザ定義「Actionクラス名=Stv[Actionクラス名]」が存在する。
この場合、命名規則検証部52は、第1の命名規則ユーザ定義の右辺の大括弧に囲まれた文字列を左辺とする命名規則ユーザ定義が命名規則格納部25内にあると判定し、命名規則格納部25から命名規則ユーザ定義「Actionクラス名=Stv[Actionクラス名]」を取得する。なお、ここで取得された命名規則ユーザ定義を第2の命名規則ユーザ定義と称する。
次に、命名規則検証部52は、第2の命名規則ユーザ定義が第1の命名規則ユーザ定義と一致するか否かを判定する。
ここでは、第2の命名規則ユーザ定義が「Actionクラス名=Stv[Actionクラス名]」であり、第1の命名規則ユーザ定義が「Actionクラス名=Stv[Actionクラス名]」であるため、第2の命名規則ユーザ定義が第1の命名規則ユーザ定義と一致すると判定される。
この場合、命名規則検証部52は、命名規則ユーザ定義が循環していることを警告するエラーメッセージを出力する。
このように第3の命名規則検証処理によれば、図27の1行目の命名規則ユーザ定義が循環していることを検出し、エラーメッセージを出力することができる。
次に、図27に示す命名規則ユーザ定義のうち、命名規則ユーザ定義「Serviceクラス名=Stv1[Datasetクラス名]」について説明する。
この場合、命名規則検証部52は、命名規則ユーザ定義「Serviceクラス名=Stv1[Datasetクラス名]」を取得する。なお、ここで取得された命名規則ユーザ定義を第1の命名規則ユーザ定義と称する。
次に、命名規則検証部52は、第1の命名規則ユーザ定義の右辺の大括弧に囲まれた文字列がthisであるか否かを判定する。ここでは、第1の命名規則ユーザ定義「Serviceクラス名=Stv1[Datasetクラス名]」の右辺の大括弧に囲まれた文字列は「Datasetクラス名」であるため、当該第1の命名規則ユーザ定義「Serviceクラス名=Stv1[Datasetクラス名]」の右辺の大括弧に囲まれた文字列はthisでないと判定される。
この場合、命名規則検証部52は、第1の命名規則ユーザ定義の右辺の大括弧に囲まれた文字列を左辺とする命名規則ユーザ定義が命名規則格納部25内にあるか否かを判定する。
ここで、図27に示す命名規則ユーザ定義の中には、第1の命名規則ユーザ定義「Serviceクラス名=Stv1[Datasetクラス名]」の右辺の大括弧に囲まれた文字列「Datasetクラス名」を左辺とする命名規則ユーザ定義「Datasetクラス名=Stv2[Serviceクラス名]」が存在する。
この場合、命名規則検証部52は、第1の命名規則ユーザ定義の右辺の大括弧に囲まれた文字列を左辺とする命名規則ユーザ定義が命名規則格納部25内にあると判定し、命名規則格納部25から命名規則ユーザ定義「Datasetクラス名=Stv2[Serviceクラス名]」を取得する。なお、ここで取得された命名規則ユーザ定義を第2の命名規則ユーザ定義と称する。
次に、命名規則検証部52は、第2の命名規則ユーザ定義が第1の命名規則ユーザ定義と一致するか否かを判定する。
ここでは、第2の命名規則ユーザ定義が「Datasetクラス名=Stv2[Serviceクラス名]」であり、第1の命名規則ユーザ定義が「Serviceクラス名=Stv1[Datasetクラス名]」であるため、第2の命名規則ユーザ定義が第1の命名規則ユーザ定義と一致しないと判定される。
この場合、命令規則検証部52は、第2の命名規則ユーザ定義の右辺の大括弧に囲まれた文字列を左辺とする命名規則ユーザ定義が命名規則格納部25内にあるか否かを判定する。
ここで、図27に示す命名規則ユーザ定義の中には、第2の命名規則ユーザ定義「Datasetクラス名=Stv2[Serviceクラス名]」の右辺の大括弧に囲まれた文字列「Serviceクラス名」を左辺とする命名規則ユーザ定義「Serviceクラス名=Stv1[Datasetクラス名]」が存在する。
この場合、命名規則検証部52は、第2の命名規則ユーザ定義の右辺の大括弧に囲まれた文字列を左辺とする命名規則ユーザ定義が命名規則格納部25内にあると判定し、命名規則格納部25から命名規則ユーザ定義「Serviceクラス名=Stv1[Datasetクラス名]」を取得する。なお、ここで取得された命名規則ユーザ定義を第3の命名規則ユーザ定義と称する。
次に、命名規則検証部52は、第3の命名規則ユーザ定義が第1の命名規則ユーザ定義または第2の命名規則ユーザ定義と一致するか否かを判定する。
ここでは、第3の命名規則ユーザ定義が「Serviceクラス名=Stv1[Datasetクラス名]」であり、第1の命名規則ユーザ定義が「Serviceクラス名=Stv1[Datasetクラス名]」であり、第2の命名規則ユーザ定義が「Datasetクラス名=Stv2[Serviceクラス名]」であるため、当該第3の命名規則ユーザ定義が当該第1の命名規則ユーザ定義と一致する。したがって、第3の命名規則ユーザ定義が第1の命名規則ユーザ定義または第2の命名規則ユーザ定義と一致すると判定される。
この場合、命名規則検証部52は、命名規則ユーザ定義が循環していることを警告するエラーメッセージを出力する。
このように第3の命名規則検証処理によれば、図27の2行目および3行目の命名規則ユーザ定義が循環していることを検出し、エラーメッセージを出力することができる。
ここでは、図27の1行目の命名規則ユーザ定義(Actionクラス名=Stv[Actionクラス名])および2行目の命名規則ユーザ定義(Serviceクラス名=Stv1[Datasetクラス名])について主に述べたが、図27の3行目の命名規則ユーザ定義(Datasetクラス名=Stv2[Serviceクラス名])について処理が実行された場合にも同様にエラーメッセージが出力される。
上記したように第3の命名規則検証処理が実行されることによって、命名規則ユーザ定義が循環している場合に、エラーメッセージを出力することができる。
なお、本実施形態においては、第1〜第3の命名規則検証処理においてエラーメッセージが出力されるものとして説明したが、命名規則ユーザ定義が予め定められている形式(つまり、問題のない形式)で定義されている場合には、その旨のメッセージが出力される構成であってもよい。
上記したように本実施形態においては、命名規則格納部25に格納されている命名規則を変数生成ルール格納部26に格納されている変数生成ルールに含まれる値に適用することによって変数に対応づけて置換情報を保持する変数リストを生成し、当該生成された変数リストを変数リスト格納部24に格納する構成により、変数リストをユーザが設定する手間を省くことができ、かつ、例えばプロジェクト等で決まっている命名規則の反映を容易に行うことが可能となる。
また、本実施形態においては、命名規則格納部25に格納されている命名規則ユーザ定義が予め定められている形式で定義されているかを検証し、当該検証結果(例えば、エラーメッセージ)を出力する構成により、問題のある形式で定義された命名規則ユーザ定義を用いて変数リストが生成されることを防止することができる。
なお、本願発明は、上記各実施形態そのままに限定されるものではなく、実施段階ではその要旨を逸脱しない範囲で構成要素を変形して具体化できる。また、上記各実施形態に開示されている複数の構成要素の適宜な組合せにより種々の発明を形成できる。例えば、各実施形態に示される全構成要素から幾つかの構成要素を削除してもよい。更に、異なる実施形態に亘る構成要素を適宜組合せてもよい。