直接ソース・オブジェクトに対応しないオブジェクトの作成

デフォルトで、マッピング・エディターを使用して、1 つのソース・コンテナーの要素から 1 つのターゲット・コンテナーの要素にマップすることができます。 ただし、生成された変換を変更して、マッピング先とは異なる別のターゲット・コンテナーに、オブジェクトを作成できるようにすることもできます。
このタスクについて

具体的に言えば、生成される変換の getCreateRule メソッドを変更して、新規実装で CreateRule コンストラクター の insertEObject メソッドをオーバーライドすることができます。

メソッドを変更してオーバーライドを追加するには、以下のようにします。

  1. マッピング・エディターで、ソースとターゲットの間の変換式を定義するサブマップで、マッピング宣言への参照を見つけます。 例えば、typeDefinitions か ら packagedElements へマップする場合 、typeDef2Class というマッピング宣言があると考えられます。
  2. 変換ソース・コードを生成します。 マッピング宣言には、それについて生成された変換式 (typeDef2ClassTransform など) があり、その変換式には getCreate_Rule メソッドが含まれます。
  3. getCreate_Rule メソッドの インスタンス化された新規 CreateRule コンストラクターで 、insertEObject メソッドのデフォルト実装をオーバーライドします。

    insertEObject メソッドは、作成済みオブジェクトおよびターゲット・コンテナー・オブジェクトを引数として受け取ります。 オーバーライド・コードで、所有者として必要なターゲット・コンテナー・オブジェクトが存在するかどうか確認できます。 ターゲット・コンテナー・オブジェクトが存在しない場合は、 それを作成して、ここで挿入するためにデフォルト実装を保持し、 ターゲット・コンテナーとして新規所有者を渡します。

以下の例では、UML Class2Class 変換式に挿入された所有者パッケージを示しています。 この例では、UML パッケージをターゲット・コンテナーとして使用していますが、あらゆるタイプのターゲット・コンテナー (サブマップに接続する出力フィーチャーとなりうるすべての項目) で同じ手法を使用できます。
     protected CreateRule getCreate_Rule(FeatureAdapter referenceAdapter) {
        CreateRule rule = new CreateRule(
            CREATE_RULE, 
            InsertOwnerMessages.Class2Class_Transform_Create_Rule, 
            this,
            referenceAdapter,
            UMLPackage.Literals.CLASS) {
        @Override
        protected void insertEObject(EObject targetContainer, EObject target) {
          final String ownerName = "owner";
          if (targetContainer instanceof Model) {
            org.eclipse.uml2.uml.Package owner = ((Model)targetContainer).getNestedPackage(ownerName);
            if (owner == null) {
              owner = ((Model)targetContainer).createNestedPackage(ownerName);
            }
            targetContainer = owner;
          } 
          super.insertEObject(targetContainer, target);
        }}; 
            
        return rule;    
    }

フィードバック