< Anterior | Próximo >

Lição 3: Criar e Refinar uma Declaração de Mapeamento de Classe para Classe

Esta lição mostra como criar uma declaração de mapeamento que especifique uma classe UML tanto como objeto de entrada quanto objeto de saída. Essa declaração de mapeamento de classe para classe contém regras de mapeamento que, no momento em que você executar a transformação gerada, irão criar uma cópia da classe e suas operações no modelo de origem e colocar essa cópia no modelo de destino. Você também pode criar uma declaração de mapeamento de operação para operação, invocada pelo submapa na declaração de mapeamento de classe para classe.
Por Que e Quando Desempenhar Esta Tarefa
Uma declaração de mapeamento, também chamada de mapa, especifica como criar ou atualizar um objeto de saída para um determinado objeto de entrada. Ao criar transformações, você pode utilizar uma declaração de mapeamento a fim de especificar como os atributos em um objeto de entrada correspondem aos atributos de um objeto de saída. Cada declaração de mapeamento especifica um tipo de entrada e um tipo de saída, que você seleciona a partir dos metamodelos que inclui no modelo de mapeamento.

Para cada declaração de mapeamento no modelo de mapeamento, a estrutura de criação de transformação gera um arquivo de origem Java com o nome nTransform.java, em que n representa o nome da declaração de mapeamento. Coletivamente, esses arquivos Java formam o código de transformação. Além de gerar o código de implementação para a transformação, a estrutura de criação de transformação também gera o código para registrar a transformação no Serviço de Transformação. Depois de criar uma declaração de mapeamento, você pode incluir regras de mapeamento incrementalmente e gerar o código-fonte, ou implementações, para as regras de mapeamento. Não é necessário definir todas as regras de mapeamento para poder gerar o código-fonte.

Em geral, declarações de mapeamento seguem uma convenção de nomenclatura de x2y, em que x representa o tipo de objeto de entrada e y representa o tipo de objeto de saída. Por exemplo, uma declaração de mapeamento denominada Package2EPackage especifica uma declaração de mapeamento que possui Package como objeto de entrada e EPackage como objeto de saída.

Um mapa entre elementos estabelece a correspondência entre seus atributos, o que permite a troca de dados entre eles. A maioria dos mapas oferece a capacidade de manipular ainda mais os dados entre a origem e o destino. Por exemplo, você pode optar por especificar cálculos ou fazer outras modificações nos dados criando um código customizado, que possibilita designar valores ao destino.

Para criar uma declaração de mapeamento de classe para classe no modelo de mapeamento:

  1. Se ainda não estiver aberto, na visualização Package Explorer, na pasta model, dê um clique duplo no arquivo .mapping.
  2. No editor de mapeamentos de transformação, na seção Raiz do Mapeamento, clique com o botão direito em Generalize_Classes e clique em Criar Mapa.
  3. Na janela Novo Mapa, no campo Nome do mapa, digite Class2Class e clique em OK. O mapa é exibido na visualização Esboço e é aberto na área do editor, na seção Raiz do Mapeamento.

Incluir Objetos de Entrada e Saída na Declaração de Mapeamento de Classe para Classe

Por Que e Quando Desempenhar Esta Tarefa
Depois de criar a declaração de mapeamento, você precisa incluir nela um objeto de entrada e um objeto de saída. Nesta lição, você especificará uma classe UML como objeto de entrada e saída.
Nota: Quando você criar transformações de modelo para modelo, para incluir um tipo de objeto que não está disponível no metamodelo de entrada ou saída utilizado pelo mapa, poderá incluir os perfis UML apropriados ou os metamodelos Ecore no escopo dessa mapa. Na janela Incluir Entrada, clique em Incluir Modelo e especifique o modelo apropriado.

Para incluir um objeto de entrada e um objeto de saída na declaração de mapeamento de classe para classe:

  1. Clique no ícone Incluir um objeto de entrada, que corresponde ao ícone na extremidade esquerda da barra de ferramentas referente ao mapa que está sendo editado:
    Esta imagem mostra o ícone Incluir um objeto de entrada, localizado na barra de ferramentas referente ao mapa que você está editando.
  2. Na janela Incluir Entrada, no painel Elemento, selecione um objeto de metamodelo. O painel Elemento exibe os elementos em um ou mais metamodelos que você especificar como origem ou destino para o modelo de mapeamento. Para este tutorial, no painel Elemento, expanda uml, clique em Classe e em OK.
  3. Clique no ícone Incluir um objeto de saída, que corresponde ao segundo ícone a partir da esquerda na barra de ferramentas referente ao mapa que está sendo editado:
    Esta imagem mostra o ícone Incluir um objeto de saída, que é o segundo ícone a partir da esquerda na barra de ferramentas referente ao mapa que você está editando.
  4. Na janela Incluir Saída, no painel Elemento, expanda uml, clique em Classe e em OK.
  5. Clique em Arquivo > Salvar.
Resultados
Agora, você já pode definir as regras de mapeamento entre os atributos dos objetos de entrada e saída de classe.

Definir Regras de Mapeamento entre Atributos dos Objetos de Entrada e Saída de Classe

Por Que e Quando Desempenhar Esta Tarefa

Depois de incluir os objetos de entrada e saída na declaração de mapeamento, você pode definir as regras de mapeamento entre os atributos.Regras de mapeamento, também chamadas de mapeamentos, especificam como designar um valor a um atributo de um objeto de saída, de acordo com os valores dos atributos de um objeto de entrada.

Na declaração de mapeamento de classe para classe, conclua as seguintes etapas:
  • Crie uma regra de mapeamento de movimentação que crie uma classe no modelo de destino

    Você cria uma regra de mapeamento entre o atributo name dos objetos de entrada e de saída. A classe de destino tem o mesmo nome que a classe no modelo de entrada; considere esse processo como a criação de uma cópia da classe. Em uma lição mais adiante, você irá incluir as operações de mapeamento na regra de mapeamento.

  • Crie uma regra de mapeamento de submapa que, para cada operação na classe, crie uma operação correspondente na classe do modelo de destino.

    Você cria uma regra de mapeamento de submapa entre o atributo ownedOperation dos objetos de entrada e de saída. Para cada operação na coleta ownedOperation, a operação gerada no modelo de destino tem o mesmo nome e visibilidade que a operação no modelo de entrada.

Regras de mapeamento, também chamadas de mapeamentos, especificam como designar um valor a um atributo de um objeto de saída, de acordo com os valores dos atributos de um objeto de entrada. Você pode criar várias regras de mapeamento entre o objeto de entrada e saída e, como demonstra uma lição posterior neste tutorial, também pode criar várias regras de mapeamento entre um atributo de um objeto de entrada e um objeto de saída. Você pode criar os seguintes tipos de regras de mapeamento:
Mover
Uma movimentação, também chamada de regra de mapeamento simples, é o tipo mais básico de regra de mapeamento. Os atributos de entrada e saída devem ser tipos de dados compatíveis. Ambos os atributos de entrada e saída, ou nenhum deles, têm vários valores. Por exemplo, selecione essa opção se um atributo do objeto de saída for Cadeia e um atributo do objeto de entrada puder ser convertido em Cadeia sem um código customizado. Esse tipo de regra de mapeamento suporta um mapeamento entre um atributo ou elemento de origem e um atributo ou elemento de destino.O código-fonte da transformação que é gerado para uma regra de mapeamento de movimentação implementa uma regra que copia o valor de um atributo de entrada para um atributo de saída.
Submapa

Um submapa é uma chamada de um mapa a partir de outro mapa. O submapa que está sendo invocado pode, mas não precisa, ser definido no mesmo arquivo de mapeamento do que o mapa que o invoca. Um submapa permite mapear um tipo complexo no modelo de entrada para um tipo complexo no modelo de saída. O submapa que você criar pode invocar um mapa existente em qualquer arquivo de mapeamento. A definição de submapas em arquivos de mapeamento separados incentiva a reutilização de mapas; entretanto, a criação de vários arquivos de mapeamento pode intensificar a manutenção do projeto. Submapas também podem incluir outros submapas, resultando em uma estrutura hierárquica.

Regras de mapeamento de submapa suportam os seguintes tipos de mapeamentos:
  • Mapeamentos de 1 para 1 entre objetos de entrada e objetos de saída ou entre os atributos dos objetos de entrada e saída
  • Mapeamentos de 1 para m ou m para 1 entre atributos dos objetos de entrada e saída
  • Mapeamentos de m para n entre atributos dos objetos de entrada e saída
Se a regra de submapa especificar um mapeamento de 1 para m, a transformação gerada anexará um objeto a partir de um atributo singular a uma lista; para um mapeamento de m para 1, a transformação irá extrair um objeto de uma lista e inseri-lo em um atributo singular.

Você também pode criar regras de mapeamento de submapas entre os objetos de entrada e os objetos de saída em uma declaração de mapeamento.

Para cada submapa em uma declaração de mapeamento, um extrator denominado getInputFeatureToOutputFeature_UsingMap_Extractor é gerado na transformação de inclusão, em que InputFeature representa o nome do atributo de entrada e OutputFeature representa o nome do atributo de saída, enquanto Map representa o nome da declaração de mapeamento.

Customizado
Esse tipo de regra de mapeamento permite especificar um código customizado que calcule o valor de uma propriedade de saída. Por exemplo, selecione esse tipo de mapeamento para configurar o valor de uma propriedade no objeto de saída como igual à concatenação de várias propriedades de objeto de entrada.

Você pode especificar refinamentos semânticos utilizando a API OCL (Object Constraint Language) fornecida pelo Eclipse.

Regras de mapeamento customizadas suportam os seguintes tipos de mapeamentos:
  • Mapeamentos de 1 para n entre objetos de entrada e saída, ou entre atributos dos objetos de entrada e saída
  • Mapeamentos de m para n entre objetos de entrada e saída, ou entre atributos dos objetos de entrada e saída
  • Mapeamentos de m para 1, em que m para 1 representa um dos seguintes mapeamentos:
    • Um mapeamento a partir de um único atributo de entrada, cuja multiplicidade esteja configurada para m, para um único atributo de saída, cuja multiplicidade esteja configurada para 1
    • Um mapeamento a partir de vários atributos de entrada para um único atributo de saída
    • Um mapeamento a partir de vários objetos de entrada para um único objeto de saída
Mapas herdados
Você pode criar essa regra de mapeamento somente entre um objeto de entrada e um objeto de saída.
Uma declaração de mapeamento hereditária herda as regras de mapeamento que são definidas na declaração de mapeamento herdada. Você pode substituir regras de mapeamento herdadas definindo uma regra de mapeamento que tenha as seguintes qualidades:
  • A propriedade de objeto de entrada e a propriedade de objeto de saída são iguais à regra de mapeamento herdada.
  • As regras de mapeamento de substituição e herdada são mapeamentos de submapa que possuem extratores correspondentes, ou as regras de mapeamento de substituição e herdada são ambas mapeamentos de movimentação ou mapeamentos customizados.
Se você criar uma regra de mapeamento de mapas herdada, deverá especificar a declaração de mapeamento que contém as regras de mapeamento que deseja herdar. Não é possível especificar mais de um mapa herdado em uma declaração de mapeamento.

Uma regra de mapeamento herdada, e a regra ou o extrator gerado a partir desse mapeamento, mantêm a mesma posição relativa na ordem de processamento que a regra de mapeamento e sua regra ou seu extrator gerado.

Para cada regra de mapeamento de movimentação ou customizada em uma declaração de mapeamento, é incluída uma regra no código-fonte de transformação gerado. Para cada regra de mapeamento de submapa, é gerado um extrator de conteúdo no código-fonte da transformação. Quando você cria uma regra de mapeamento, seu tipo é determinado pelos atributos de entrada e saída que são selecionados. Por exemplo, se os atributos de entrada e saída forem tipos primitivos compatíveis, como cadeias ou inteiros, uma regra de mapeamento de movimentação será especificada. Se os atributos de entrada e saída forem tipos complexos, uma regra de submapa será especificada. Se movimentação e submapa não forem tipos de regras de mapeamento apropriados, uma regra de mapeamento customizada será especificada.

Para definir as regras de mapeamento na declaração de mapeamento Class2Class:

  1. Crie uma regra de mapeamento de movimentação entre o atributo name do objeto de entrada e do objeto de saída:
    1. Na área do editor, no objeto de entrada de classe, clique no atributo name.
    2. Arraste a alça do atributo name até o atributo name no objeto de saída da classe.
  2. Crie uma regra de mapeamento de submapa entre o atributo ownedOperation do objeto de entrada e de saída.
    1. Na área do editor, no objeto de entrada de classe, clique no atributo ownedOperation.
    2. Arraste a alça do atributo ownedOperation até o atributo ownedOperation no objeto de saída da classe. Como o atributo ownedOperation é uma coleta, uma regra de mapeamento de submapa é criada por padrão.
  3. Clique em Arquivo > Salvar.
Resultados
Agora, você já pode criar a declaração de mapeamento de operação para operação.

Criar uma Declaração de Mapeamento de Operação para Operação

Por Que e Quando Desempenhar Esta Tarefa

Neste ponto da lição, na área do editor, o submapa tem uma indicação com um X circulado em vermelho, que representa um erro. Coloque o ponteiro do mouse sobre essa indicação para visualizar a mensagem de erro. Essa mensagem de erro afirma que você precisa selecionar uma declaração de mapeamento a ser invocada pela regra de mapeamento de submapa. Para resolver esse erro, crie uma declaração de mapeamento de operação para operação.

Para criar uma declaração de mapeamento de operação para operação:

  1. Se a visualização Propriedades não estiver aberta, na área do editor, clique com o botão direito no elemento de submapa criado na seção anterior, na etapa 2, e clique em Mostrar em Propriedades.
  2. Na visualização Propriedades, na guia Detalhes, ao lado do campo Mapa, clique em Novo.
  3. Na janela Novo Mapa, no campo Nome do mapa, digite Operation2Operation.
  4. Se o campo Entrada não contiver um valor de Operação, clique em Procurar e, na janela Incluir Entrada, no painel Elemento, clique em Operação.
  5. Se o campo Saída não contiver um valor de Operação, clique em Procurar e, na janela Incluir Saída, no painel Elemento, clique em Operação.
  6. Clique em OK. A indicação de erro é removida, e a declaração de mapeamento de operação para operação é exibida na visualização Esboço. Em uma lição mais adiante, você irá criar regras de mapeamento nessa declaração de mapeamento.
  7. Clique em Arquivo > Salvar.
Resultados
Na próxima lição, você define uma declaração de mapeamento de classe para interface.
< Anterior | Próximo >

Feedback