Criando Objetos sem Correspondências Diretas com Objetos de Origem

Por padrão, o editor de mapeamento possibilita o mapeamento de elementos de um contêiner de origem única para elementos de um contêiner de destino único. No entanto, você pode modificar a transformação gerada para que também seja possível criar objetos em um contêiner de destino diferente daquele para o qual se está mapeando.
Por Que e Quando Desempenhar Esta Tarefa

Especificamente, você pode modificar o método getCreateRule na transformação gerada e, na nova implementação, substituir o método insertEObject do construtor CreateRule.

Para modificar o método e incluir uma substituição:

  1. No editor de mapeamento, para o submapa que define uma transfiguração entre a origem e o destino, localize a referência para uma declaração de mapeamento. Por exemplo, se você mapear de typeDefinitions para packagedElements, poderá ter a declaração de mapeamento typeDef2Class.
  2. Gere o código-fonte da transformação. A declaração de mapeamento possui uma transfiguração gerada para ela (por exemplo, typeDef2ClassTransform) e a transfiguração contém um método getCreate_Rule.
  3. No método getCreate_Rule, no novo construtor CreateRule instanciado, substitua a implementação padrão do método insertEObject.

    O método insertEObject utiliza como argumento o objeto já criado e um objeto contêiner de destino. O código de substituição pode verificar a existência do objeto contêiner de destino que você deseja como proprietário. Crie o objeto contêiner de destino se ele não existir e retenha a implementação padrão da inserção real, passando o novo proprietário como o contêiner de destino.

Exemplo
O exemplo a seguir mostra um pacote do proprietário inserido em uma transfiguração UML Class2Class. O exemplo utiliza um pacote de UML como o contêiner de destino, mas você pode utilizar a mesma técnica com qualquer tipo de contêiner de destino, isto é, qualquer item que possa ser um recurso de saída que seja conectado a um submapa.
     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;    
    }

Feedback