モデルからモデルへの変換マッピング・ プロジェクト (マッピング・プロジェクトとも呼ぶ) は 、com.ibm.xtools.transform.core.transformationProviders という名前の拡張ポイントを拡張する Eclipse プラグインです。 変換マッピング・プロジェクトにモデルからモデルへの変換を作成すると、 変換の実装の詳細を表すコードを作成する代わりに、 選択したソース・モデルおよびターゲット・モデル、またはメタモデル内の要素の関連の仕方を指定することができます。
1 つのマッピング・プロジェクトに複数のマッピング・ファイル (マッピング・モデルとも呼ぶ) を含めることができます。 マッピング・モデルを変更すると、変換ソース・コードを繰り返し生成できます。 変換ソース・コードを生成すると、外部から可視の MainTransform という 1 つの変換式が自動的に登録されます。また、マッピング・モデル内のマッピング宣言ごとに、1 つの変換式の Java ソース・コードが生成されます。
マッピング・プロジェクトを作成する際には、1 つ以上のソース・メタモデルおよびターゲット・メタモデルを指定できます。 .ecore というファイル名拡張子を持つメタモデルや、.epx または .uml というファイル名拡張子を持つ UML プロファイルを指定できます。 プロジェクトの作成時にソース・メタモデルおよびターゲット・メタモデルを指定すると、必要な依存関係がプラグイン・マニフェスト・ファイルに自動的に追加されます。 マッピング・プロジェクトの作成後に、エディター領域でコマンドを使用してメタモデルを追加する場合、必要なすべての新規依存関係を、プラグイン・マニフェスト・ファイルに追加しなければなりません。
マッピング・モデル (マッピング・ファイルとも呼ぶ) は、Eclipse モデリング・フレームワーク (EMF) のメタモデル (Ecore モデルとも呼ぶ) のインスタンスであり、マップされるメタモデルへの参照を含んでいます。 マッピング・プロジェクトを作成すると、オーサリング・ツールによって、指定した入出力モデルを使用して、プロジェクト内にマッピング・モデルが作成されます。 マッピング・プロジェクトには、少なくとも 1 つのマッピング・モデルが含まれています。 マッピング・モデルのファイル名拡張子は .mapping です。1 つのプロジェクト内に複数のマッピング・モデルを作成すると、 他のマッピング・プロジェクトにおけるマップの再利用が促進されます。 この機能は、複数のマッピング・プロジェクトに複数のマッピング・モデルが存在する、大規模なマッピング・ソリューションの場合に便利です。
マッピング・モデルは、XML ファイルとして保管され、直列化されます。問題ビューは、マッピング・モデルに関する詳細なエラー情報を表示します。 このビューで項目をダブルクリックすると、テキスト・エディターでマッピング・モデルが開き、エラーを含む行が表示されます。 多くの場合、このトラブルシューティング方式の方が、エディター領域内にマッピング・モデルを表示してトラブルシューティングを行うよりも簡単です。
マッピング宣言 (マップとも呼ぶ) は、特定の入力オブジェクトに対する出力オブジェクトを作成または更新する方法を指定します。 それぞれのマッピング宣言は、入力タイプおよび出力タイプを指定します。これらのタイプは、マッピング・モデルに追加するメタモデルから選択します。 1 つのマッピング・モデルに複数のマッピング宣言を含めることができます。
マップを作成する目的は、ソースの値に基づいてターゲットに値を割り当てることです。 要素間のマップでは双方の属性間の対応が確立され、それにより相互間でのデータ交換が可能になります。 ほとんどのマップでは、ソースとターゲット間でさらに進んだデータ操作を行えます。 例えば、ターゲットへの値の割り当てを可能にするカスタム・コードを作成することによって、データに対して計算を指定したり、その他の変更を行ったりするように選択できます。
マッピング宣言は、抽象出力オブジェクトを含むことができます。 このようなマッピング宣言は、ターゲット属性が包含プロパティーを含み、 それが false に設定されているサブマップ・マッピング規則でのみ、継承、拡張、または参照できます。 このようなターゲット属性には、サブマップ・マッピング規則で指定されたマッピング宣言を 継承するマッピング宣言によって作成されたオブジェクトへの参照が取り込まれる場合があります。 抽象出力オブジェクトを指定するマッピング宣言を使用して、オブジェクト参照の作成を簡略化できる場合があります。
マッピング宣言は、通常 、x2y という命名規則に従います。ここで x は入力オブジェクト・タイプを表し 、y は出力オブジェクト・タイプを表します。 例えば、Package2EPackage という名前のマッピング宣言は、入力オブジェクト として Package を、出力オブジェクトとして EPackage を持つマッピング宣言を指定します。
変換ソース・コードを生成すると、変換サービスによって、マッピング・モデル内の各マッピング宣言に、 変換式を実装する 1 つの Java ソース・ファイルが生成されます。
マッピング宣言には、1 つ以上のマッピング規則が含まれています。
マッピング宣言は、別のマッピング宣言から継承することができます。 継承元のマッピング宣言と継承先のマッピング宣言を、同じマッピング・モデルで定義 する必要はありません。 継承先の入出力オブジェクトは、継承元のマッピング宣言の入出力オブジェクトのサブタイプでなければなりませんが、必ずしも正しいサブタイプである必要はありません。 継承先のマッピング宣言は、継承元のマッピング宣言で定義 (または継承) されるすべてのマッピングを継承します。 継承先のマッピング宣言のマッピング規則は、継承先のマッピング宣言の一部になります。ただし、カスタム・マッピング規則を作成して、継承元のマッピング宣言の規則をオーバーライドできます。 また、追加のマッピング規則を継承先のマッピング宣言で作成することもできます。 継承先のマッピング宣言から生成される変換式は、継承元のマッピング宣言から生成される変換式を拡張します。
マッピング規則 (マッピングとも呼ぶ) では、入力オブジェクトの属性値に従って、出力オブジェクトの属性に値を割り当てる方法を指定します。
また、マッピング宣言内の入力オブジェクトと出力オブジェクトの間に、サブマップ・マッピング規則を作成することもできます。
マッピング宣言のサブマップごとに、getInputFeatureToOutputFeature_UsingMap_Extractor という抽出が、収容している変換式に生成されます。ここで 、InputFeature は入力属性の名前を 、OutputFeature は出力属性の名前を 、Map はマッピング宣言の名前を表します。
Eclipse が提供するオブジェクト制約言語 (OCL) API を使用することで、意味構造の調整を指定できます。
継承元のマッピング規則、および そのマッピングから生成された規則または抽出は、オーバーライドされたマッピング規則およびそれが持つ生成済みの規則または抽出と同じ相対位置の処理順序を維持します。
マッピング宣言内 の各移動マッピング規則またはカスタム・マッピング規則ごとに、生成された変換ソース・コードに対して規則が追加されます。 サブマップ・マッピング規則ごとに、1 つのコンテンツ抽出が変換ソース・コード内に生成されます。
マッピング規則を作成すると、選択した入力属性および出力属性によって、そのタイプが決定されます。 例えば、入力属性と出力属性が、文字列や整数のような互換性のある基本タイプである場合、移動マッピング規則が指定されます。 入力属性と出力属性が複合型の場合、サブマップ規則が指定されます。 マッピング規則のタイプとして、移動もサブマップも適切ではない場合、カスタム・マッピング規則が指定されます。
また、 サブマップ、カスタム・マップ、または継承マップのマッピング規則を、入力オブジェクトと出力オブジェクト間に作成することもできます。
出力オブジェクト の特性、および出力オブジェクトの属性の包含プロパティーは、サブマップ・マッピング規則の振る舞いを決定します。
| 項目 | 表記 |
|---|---|
| InputFeature | サブマップ要素に接続された、入力オブジェクトの区画。 |
| OutputFeature | サブマップ要素に接続された、出力オブジェクトの区画。 |
| Map | 生成された変換式の実行時に、サブマップが適用するマッピング宣言。 |
| InputElement | Map マッピング宣言が指定する入力オブジェクト。 |
| OutputElement | Map マッピング宣言が指定する出力オブジェクト。 |
マッピング・モデルの変換ソース・コードを生成する際、マッピング宣言ごとに、オーサリング・ツールによって MapTransform という変換式が生成されます。マッピング宣言のサブマップごとに、オーサリング・ツールによって、getInputFeatureToOutputFeature_UsingMap_Extractor というコンテンツ抽出が変換式に生成されます。
モデルからモデルへの変換を実行する際に、変換は、メタモデルのフィーチャー設定に基づいて、オブジェクトまたは生成済みオブジェクトへの参照のいずれかを生成します。 変換がオブジェクトを生成した場合、変換は、それらのオブジェクトに関する識別情報をハッシュ・マップに記録します。 変換は、ポストプロセッシング中にそのハッシュ・マップに基づいて、オブジェクトへの参照を解決します。
マッピング宣言で出力オブジェクトとして指定した Ecore メタモデルまたは UML メタモデルの要素は、抽象または具象とすることができます。 具象要素をインスタンス化することはできますが、抽象要素はインスタンス化できません。
出力オブジェクトのフィーチャー (属性とも呼ばれる) は、その他の Ecore オブジェクトまたは UML オブジェクトを含んだり、参照したりすることができます。 オブジェクトが別のオブジェクトを含む場合、包含している側のオブジェクトが削除されると、含まれているオブジェクトも削除されます。 オブジェクトが別のオブジェクトを参照する場合は、参照を削除したり、参照の所有者を削除したりしても、参照されるオブジェクトは削除されません。
以下の表は、出力オブジェクトの特性および出力属性に従って、サブマップ・マッピング規則の振る舞いをリストしたものです。
| 出力オブジェクトのタイプ | 出力属性の包含または参照のタイプ | サブマップの振る舞い |
|---|---|---|
| 抽象 | 抽象または具象包含 | このタイプのサブマップはサポートされません。これは 、MapTransform 変換式ではオブジェクトを作成できないので、オブジェクトを OutputFeature コレクションに挿入できないためです。 |
| 抽象または具象 | 抽象または具象参照 | 他のすべての規則および抽出を処理した後、変換で以下のステップを実行することにより、このタイプのサブマップを処理します。
|
| 具象 | 抽象または具象包含 | InputFeature コレクションの
InputItem オブジェクトごとに、変換で以下のステップを実行します。
|
以下の例で、どのようにしてポストプロセッシング中に変換が出力オブジェクトへの参照を解決するのかを説明します。
このマッピング宣言は、入出力オブジェクト間の継承マップのマッピング規則を 定義します。 マッピング規則は、このマッピング宣言が Classifier2Classifier マッピング宣言を継承することを指定します。
public class Class2ClassTransform extends Classifier2ClassifierTransform {
...
}
分類子は抽象型なので、Classifier2ClassifierTransform 変換式はオブジェクトを作成できません。 ただし、クラスが分類子を継承するとしても、Class2ClassTransform 変換式はオブジェクトを作成できます。
変換を ClassA という入力クラスを含むソース・モデルで実行する場合 、Class2ClassTransform 変換式は ClassB という出力クラスを生成します。 ClassB の作成を記録するために、Class2ClassTransform 変換式は、 キーが (Class2ClassTransform+ClassA->ClassB) に等しいハッシュ・マップ・レコードを 作成します。
変換で、キーが (Classifier2ClassifierTransform+ClassA) に等しいレコードをハッシュ・マップで検索すると、キーが (Class2ClassTransform+ClassA) に等しいレコードが検索結果で戻されます。これは、Class2ClassTransform 変換式 が Classifier2ClassifierTransform 変換式を継承するためです。
名前が Package2Package であるマッピング宣言を 含む OriginalMappingModel というマッピング・モデルを例に考えてみます。マッピング宣言 の入力オブジェクトは、MyPackageDefinition という入力メタモデルにあり、マッピング宣言の出力オブジェクトは、MyOtherPackageDefinition という出力メタモデルに属しています。 マッピング宣言は、いずれも名前が PackageName である 2 つの文字列属性を結び付ける移動マッピング規則を含んでいます。 MyPackageDefinition メタモデルの URI が変更された場合、Package2Package マッピング規則は無効になります。 次回マッピング・モデルを開いたとき、問題ビューでエラー・メッセージが表示され、マッピング・エディター領域内で、無効なマッピング宣言にエラー装飾が表示されます。 正しい入力オブジェクトを指定し、さらに、どのようにしてマッピング・エディターで既存のマッピング規則をリファクタリングする必要があるかを指示する必要があります。
マッピング規則のリファクタリングが完了すると、マッピング・モデルの調整を継続して、変換コードを再生成することができます。