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:
- 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.
- 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.
- 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;
}