モデルからモデルへの変換オーサリング

モデルからモデルへのマッピング・ソリューションは、複数のマッピング・プロジェクト内の複数のマッピング・モデルに分割できます。 マッピングを使用してモデルからモデルへの変換を作成する作業は、 あるモデルのオブジェクトを別のモデルのオブジェクトにマップする方法を記述する規則を含むマッピング・モデルを作成するプロセスです。 マッピング・モデルの作成が完了すれば、ソース・モデルをターゲット・モデルに変換する変換ソース・コードを生成できます。

変換オーサリングの前提条件

注: 変換を作成するには、オプションの製品コンポーネントとしてパッケージされている拡張フィーチャーをインストールする必要があります。 モデリング機能 お よび XML デベロッパー機能を使用可能にする必要があります。

モデルからモデルへの変換オーサリング・プロセス

モデルからモデルへの変換オーサリング・プロセスは、主に以下のステップから構成されています。
  1. マッピング・モデルを含んだ、モデルからモデルへの変換マッピング・プロジェクト (マッピング・プロジェクトとも呼ぶ) を作成します。1 つのマッピング・プロジェクトに複数のマッピング・モデルを含めることができます。 マッピング・プロジェクトを作成すると、変換サービスに 1 つの変換が登録されます。 それぞれの変換には、1 つの変換プロバイダー、MainTransform という名前の変換式、およびプロジェクト内の各マッピング宣言ごとに 1 つの変換式が含まれています。
  2. マッピング・モデルにマッピング宣言 (マップとも呼ぶ) を追加します。 1 つのマッピング・モデルに 1 つ以上のマッピング宣言を含めることができます。
  3. マッピング・モデル内のマッピング宣言にマッピング規則を追加します。
  4. マッピング・プロジェクト内のマッピング・モデル (複数可) から変換ソース・コードを生成します。 モデルからモデルへの変換オーサリング・ツールは、マッピング・プロジェクト内のマッピング・モデルごとに 1 つの変換を生成します。 オーサリング・ツールは、マッピング宣言ごとに、1 つの変換式を実装した 1 つの Java™ ソース・ファイルを生成します。マッピング宣言内の 1 つの移動マッピング規則またはカスタム・マッピング規則ごとに、変換式のソース・コード内に 1 つの規則が生成されます。 マッピング宣言内の 1 つのサブマップ・マッピング規則ごとに、変換式のソース・コード内に 1 つのコンテンツ抽出が生成されます。

モデルからモデルへの変換マッピング・プロジェクト

モデルからモデルへの変換マッピング・ プロジェクト (マッピング・プロジェクトとも呼ぶ) は 、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 つ以上のマッピング規則が含まれています。

マッピング宣言の継承

マッピング宣言は、別のマッピング宣言から継承することができます。 継承元のマッピング宣言と継承先のマッピング宣言を、同じマッピング・モデルで定義 する必要はありません。 継承先の入出力オブジェクトは、継承元のマッピング宣言の入出力オブジェクトのサブタイプでなければなりませんが、必ずしも正しいサブタイプである必要はありません。 継承先のマッピング宣言は、継承元のマッピング宣言で定義 (または継承) されるすべてのマッピングを継承します。 継承先のマッピング宣言のマッピング規則は、継承先のマッピング宣言の一部になります。ただし、カスタム・マッピング規則を作成して、継承元のマッピング宣言の規則をオーバーライドできます。 また、追加のマッピング規則を継承先のマッピング宣言で作成することもできます。 継承先のマッピング宣言から生成される変換式は、継承元のマッピング宣言から生成される変換式を拡張します。

マッピング規則

マッピング規則 (マッピングとも呼ぶ) では、入力オブジェクトの属性値に従って、出力オブジェクトの属性に値を割り当てる方法を指定します。

入力オブジェクトの属性と出力オブジェクトの属性の間には、以下のタイプのマッピング規則を作成できます。
移動
移動 (シンプル・マッピング規則とも呼ぶ) は、最も基本的なタイプのマッピング規則です。 入力属性と出力属性のデータ型には互換性が必要です。 つまり、入出力の属性の Ecore EDataTypes が同じであるか、出力属性のデータ型が文字列であり入力属性のデータ型が直列化可能なものである必要があります。 入力属性と出力属性は、その両方が複数の値を持っているか、または両方とも持っていないかのどちらかです。 例えば、出力オブジェクトの属性が文字列であり、 入力オブジェクトの属性がカスタム・コードなしで文字列に変換できるものである場合に、このオプションを選択します。 このタイプのマッピング規則は、1 つのソース要素または属性と 1 つのターゲット要素または属性の間のマッピングをサポートします。 移動マッピング規則用に生成される変換ソース・コードは、1 つの入力属性の値を 1 つの出力属性にコピーする規則を実装します。
サブマップ
サブマップは、あるマップの内部から別のマップを呼び出します。 呼び出されるサブマップは、それを呼び出すマップ自身のマッピング・ファイルに定義できます (定義しなくても構いません)。 サブマップを使用すると、入力モデルの複合型を、 出力モデルの複合型にマップすることができます。 作成したサブマップで、任意のマッピング・ファイルに存在するマップを起動することができます。 NewMappingModel というマッピング・モデルと 、Package2Package というマップを含む OriginalMappingModel というマッピング・モデルを例に考えてみます。 入力パッケージと出力パッケージの間のマッピングを指定して、その振る舞い が OriginalMappingModel の Package2Package マップと同じである マップを NewMappingModel に作成するには、OriginalMappingModel のマッピング・ファイルを指定します。別々のマッピング・ファイルにサブマップを定義すると、マップの再利用が促進されますが、 複数のマッピング・ファイルを作成することで、プロジェクトの保守に要する時間が増える可能性があります。 サブマップに他のサブマップをインクルードして、階層構造にすることもできます。

また、マッピング宣言内の入力オブジェクトと出力オブジェクトの間に、サブマップ・マッピング規則を作成することもできます。

サブマップ・マッピング規則は、以下のタイプのマッピングをサポートします。
  • 入力オブジェクトと出力オブジェクト間、または入出力オブジェクトの属性間 での 1 対 1 マッピング。
  • 入出力オブジェクトの属性間での 1 対 m ま たは m 対 1 マッピング。
  • 入出力オブジェクトの属性間での mn マッピング。
サブマップ規則が 1 対 m マッピングを指定する場合、生成される変換式は、単一属性のオブジェクトをリストに追加します。 m 対 1 マッピングの場合は、変換式は、リストからオブジェクトを抽出して、それを単一属性に挿入します。

マッピング宣言のサブマップごとに、getInputFeatureToOutputFeature_UsingMap_Extractor という抽出が、収容している変換式に生成されます。ここで 、InputFeature は入力属性の名前を 、OutputFeature は出力属性の名前を 、Map はマッピング宣言の名前を表します。

カスタム
このマッピング・タイプを使用すると、出力プロパティーの値を計算するカスタム・コードを指定できます。 例えば、出力オブジェクトのプロパティー値を、入力オブジェクトの複数のプロパティーの連結値と等しく設定する場合は、このマッピング・タイプを選択します。

Eclipse が提供するオブジェクト制約言語 (OCL) API を使用することで、意味構造の調整を指定できます。

カスタム・マッピング規則は、以下のタイプのマッピングをサポートします。
  • 入力オブジェクトと出力オブジェクト間、または入出力オブジェクトの属性間 での 1 対 n マッピング。
  • 入力オブジェクトと出力オブジェクト間、または入出力オブジェクトの属性間 での mn マッピング。
  • m 対 1 マッピング。 ここで m 対 1 は以下のマッピングのうち 1 つを表します。
    • 多重度が m に設定されている単一の入力属性から、 多重度が 1 に設定されている単一の出力属性へのマッピング。
    • 複数の入力属性から単一の出力属性へのマッピング。
    • 複数の入力オブジェクトから単一の出力オブジェクトへのマッピング。
継承マップ
継承先のマッピング宣言は、継承元のマッピング宣言で定義されたマッピング規則を継承します。 以下の品質を持つマッピング規則を定義することによって、継承元のマッピング規則をオーバーライドできます。
  • 入力オブジェクト・プロパティーおよび出力オブジェクト・プロパティーが、継承元のマッピング規則と同じである。
  • オーバーライドする側のマッピング規則と継承元のマッピング規則が、一致する抽出を持つサブマップ・マッピングであるか、あるいは、オーバーライドする側のマッピング規則と 継承元のマッピング規則が、いずれも移動マッピングまたはカスタム・マッピングである。
継承マップのマッピング規則を作成する場合は、継承するマッピング規則を含むマッピング宣言を指定する必要があります。 1 つのマッピング宣言で、複数の継承マップを指定することはできません。

継承元のマッピング規則、および そのマッピングから生成された規則または抽出は、オーバーライドされたマッピング規則およびそれが持つ生成済みの規則または抽出と同じ相対位置の処理順序を維持します。

マッピング宣言内 の各移動マッピング規則またはカスタム・マッピング規則ごとに、生成された変換ソース・コードに対して規則が追加されます。 サブマップ・マッピング規則ごとに、1 つのコンテンツ抽出が変換ソース・コード内に生成されます。

マッピング規則を作成すると、選択した入力属性および出力属性によって、そのタイプが決定されます。 例えば、入力属性と出力属性が、文字列や整数のような互換性のある基本タイプである場合、移動マッピング規則が指定されます。 入力属性と出力属性が複合型の場合、サブマップ規則が指定されます。 マッピング規則のタイプとして、移動もサブマップも適切ではない場合、カスタム・マッピング規則が指定されます。

また、 サブマップ、カスタム・マップ、または継承マップのマッピング規則を、入力オブジェクトと出力オブジェクト間に作成することもできます。

サブマップ・マッピング規則の振る舞い

出力オブジェクト の特性、および出力オブジェクトの属性の包含プロパティーは、サブマップ・マッピング規則の振る舞いを決定します。

サブマップ構造
1 つのマッピング宣言に、1 つ以上のサブマップ定義を含めることができます。 各サブマップは、例えば (InputFeature、OutputFeature、(Map、InputElement、OutputElement)) のような値のセットで定義されます。ここで、これらの値は以下の表の項目を表します。
項目 表記
InputFeature サブマップ要素に接続された、入力オブジェクトの区画。
OutputFeature サブマップ要素に接続された、出力オブジェクトの区画。
Map 生成された変換式の実行時に、サブマップが適用するマッピング宣言。
InputElement Map マッピング宣言が指定する入力オブジェクト。
OutputElement Map マッピング宣言が指定する出力オブジェクト。

マッピング・モデルの変換ソース・コードを生成する際、マッピング宣言ごとに、オーサリング・ツールによって MapTransform という変換式が生成されます。マッピング宣言のサブマップごとに、オーサリング・ツールによって、getInputFeatureToOutputFeature_UsingMap_Extractor というコンテンツ抽出が変換式に生成されます。

モデルからモデルへの変換を実行する際に、変換は、メタモデルのフィーチャー設定に基づいて、オブジェクトまたは生成済みオブジェクトへの参照のいずれかを生成します。 変換がオブジェクトを生成した場合、変換は、それらのオブジェクトに関する識別情報をハッシュ・マップに記録します。 変換は、ポストプロセッシング中にそのハッシュ・マップに基づいて、オブジェクトへの参照を解決します。

サブマップ・セマンティクス

マッピング宣言で出力オブジェクトとして指定した Ecore メタモデルまたは UML メタモデルの要素は、抽象または具象とすることができます。 具象要素をインスタンス化することはできますが、抽象要素はインスタンス化できません。

出力オブジェクトのフィーチャー (属性とも呼ばれる) は、その他の Ecore オブジェクトまたは UML オブジェクトを含んだり、参照したりすることができます。 オブジェクトが別のオブジェクトを含む場合、包含している側のオブジェクトが削除されると、含まれているオブジェクトも削除されます。 オブジェクトが別のオブジェクトを参照する場合は、参照を削除したり、参照の所有者を削除したりしても、参照されるオブジェクトは削除されません。

以下の表は、出力オブジェクトの特性および出力属性に従って、サブマップ・マッピング規則の振る舞いをリストしたものです。

出力オブジェクトのタイプ 出力属性の包含または参照のタイプ サブマップの振る舞い
抽象 抽象または具象包含 このタイプのサブマップはサポートされません。これは 、MapTransform 変換式ではオブジェクトを作成できないので、オブジェクトを OutputFeature コレクションに挿入できないためです。
抽象または具象 抽象または具象参照 他のすべての規則および抽出を処理した後、変換で以下のステップを実行することにより、このタイプのサブマップを処理します。
  • (MapTransform+InputItem) に等しい検索キー (InputItemInputFeature コレクションのオブジェクトを表します) を使用して、ハッシュ・マップでターゲット・オブジェクトを検索します。
    注: 検索が完全一致する必要はありません。 例えば、(MapTransform+InputItem) に等しい検索キーは、(MapTransform*+InputItem) に等しいキーを持つレコードを 戻します。ここで、MapTransform* は、MapTransform 変換式から継承するすべての変換式のセットを表します。
    • 検索が TargetObject という名前のターゲット・オブジェクト を 1 つ戻した場合、変換は、該当する OutputFeature コレクションに 、TargetObject への参照を 1 つ挿入します。
    • 検索が候補となるオブジェクトを複数戻した場合、変換は、サブマップ出力フィルターが定義されている場合はそれを適用して、1 つのオブジェクトを選択します。その後、変換は、該当する OutputFeature コレクションに 、TargetObject への参照を挿入します。 サブマップで出力フィルターが定義されていない場合、変換は、検索結果リストの先頭にある候補のオブジェクトを選択して、該当する OutputFeature コレクションに TargetObject への参照を挿入します。
    • 検索が結果を戻さなかった場合、変換はエラーをログに記録して、メッセージを表示します。
具象 抽象または具象包含 InputFeature コレクションの InputItem オブジェクトごとに、変換で以下のステップを実行します。
  • MapTransform 変換式を実行して 、OutputElement タイプの TargetObject オブジェクトを作成します。
  • TargetObject オブジェクトのインスタンスを OutputFeature コレクションに挿入します。
  • ハッシュ・マップにアクションを記録します。そのキーは、(MapTransform+InputItem->TargetObject) というフォーマットです。

以下の例で、どのようにしてポストプロセッシング中に変換が出力オブジェクトへの参照を解決するのかを説明します。

この例では、マッピング・モデルに以下の項目が含まれています。
  • UML 分類子を入力オブジェクトおよび出力オブジェクトとして指定 する Classifier2Classifier というマッピング宣言。
  • UML クラスを入力オブジェクトおよび出力オブジェクトとして 指定する Class2Class というマッピング宣言。

    このマッピング宣言は、入出力オブジェクト間の継承マップのマッピング規則を 定義します。 マッピング規則は、このマッピング宣言が Classifier2Classifier マッピング宣言を継承することを指定します。

以下のように、生成された変換ソース・コードで、Class2ClassTransform という変換式は Classifier2ClassifierTransform という変換式を 継承していることに注目してください。
public class Class2ClassTransform extends Classifier2ClassifierTransform {

...
}

分類子は抽象型なので、Classifier2ClassifierTransform 変換式はオブジェクトを作成できません。 ただし、クラスが分類子を継承するとしても、Class2ClassTransform 変換式はオブジェクトを作成できます。

変換を ClassA という入力クラスを含むソース・モデルで実行する場合 、Class2ClassTransform 変換式は ClassB という出力クラスを生成します。 ClassB の作成を記録するために、Class2ClassTransform 変換式は、 キーが (Class2ClassTransform+ClassA->ClassB) に等しいハッシュ・マップ・レコードを 作成します。

変換で、キーが (Classifier2ClassifierTransform+ClassA) に等しいレコードをハッシュ・マップで検索すると、キーが (Class2ClassTransform+ClassA) に等しいレコードが検索結果で戻されます。これは、Class2ClassTransform 変換式 が Classifier2ClassifierTransform 変換式を継承するためです。

マッピング規則での反復型開発の影響

反復型開発環境では、マッピング・モデルで指定した 入出力メタモデルに対して、変更が発生する場合があります。 また、このような変更によって、マッピング宣言で指定した入出力オブジェクトが影響を受けたり、対応するマッピング規則が無効になったりすることも考えられます。 この状態が起きた場合は、マッピング宣言でマッピング規則をリファクタリングする必要があります。 マッピング規則をリファクタリングする際に、マッピング・エディターで、変更モデルと既存のマッピング規則の間でベストエフォート・マッピングを実行する必要があるかについて、既存のマッピング規則を切断したままとするかについて、あるいは、無効なマッピング規則を削除するかについて指定できます。 以下のタイプの変更では、マッピング宣言のリファクタリングが必要になる場合があります。
  • メタモデルの URI が変更された場合
  • マッピング・モデルで指定されたソース・オブジェクトまたはターゲット・オブジェクトを含むメタモデルが、追加または除去された場合
  • マッピング宣言の入力オブジェクトおよび出力オブジェクトが変更または除去された場合
  • ソース・モデル、ターゲット・モデル、またはメタモデルのオブジェクトの属性が変更または除去された場合
  • 入力または出力オブジェクト属性の包含プロパティーまたは多重度プロパティーが変更された場合

名前が Package2Package であるマッピング宣言を 含む OriginalMappingModel というマッピング・モデルを例に考えてみます。マッピング宣言 の入力オブジェクトは、MyPackageDefinition という入力メタモデルにあり、マッピング宣言の出力オブジェクトは、MyOtherPackageDefinition という出力メタモデルに属しています。 マッピング宣言は、いずれも名前が PackageName である 2 つの文字列属性を結び付ける移動マッピング規則を含んでいます。 MyPackageDefinition メタモデルの URI が変更された場合、Package2Package マッピング規則は無効になります。 次回マッピング・モデルを開いたとき、問題ビューでエラー・メッセージが表示され、マッピング・エディター領域内で、無効なマッピング宣言にエラー装飾が表示されます。 正しい入力オブジェクトを指定し、さらに、どのようにしてマッピング・エディターで既存のマッピング規則をリファクタリングする必要があるかを指示する必要があります。

マッピング規則のリファクタリングが完了すると、マッピング・モデルの調整を継続して、変換コードを再生成することができます。

マージ・サポートおよびオプション

変換の出力を既存のモデルにマージする計画の場合 、ターゲット・メタモデルで CompareMerge コンテンツ・タイプ拡張が宣言されていなければなりません。変換の出力が UML モデルの場合、コンテンツ・タイプ拡張はデフォルトで定義されており、マージ・サポートを構成する必要はありません。 ターゲット・モデルのメタモデルで CompareMerge 拡張が宣言されていない場合、 変換を実行するとターゲット・モデルが上書きされます。

変換の拡張性

変換コードを生成すると、クラス、属性、 命令などの Java 要素のコメントに、@generated タグが追加されます。 このタグは、コード生成プログラムに対して、特定のコード要素がそのプログラムの制御下にあることを通知します。 これにより、コード生成プログラムは、マッピング・モデルに変更があった場合に、 Java 要素のコードを更新できるようになります。 変更対象である Java 要素の @generated タグを編集または除去することによって、変換コードを変更および拡張できます。


フィードバック