< Anterior | Próximo >

Lição 6: Criar e Refinar uma Declaração de Mapeamento de Pacote para Pacote

Esta lição mostra como criar uma declaração de mapeamento de pacote para pacote e várias regras de mapeamento. As regras de mapeamento especificam como a transformação gerada processa pacotes aninhados ou elementos de classes no pacote que o modelo de origem contém.
Por Que e Quando Desempenhar Esta Tarefa

Os objetos de entrada e saída de pacote contêm um recurso denominado packagedElement. Esse recurso é uma coleta que contém diferentes tipos de objetos UML válidos. As regras de mapeamento que você criar nesta lição definirão como a transformação processa os elementos de coleta que são do tipo pacote ou classe.

Nesta lição, você criará as seguintes regras de mapeamento:
  • Uma regra de mapeamento de movimentação que cria um pacote no projeto de destino; esse pacote tem o mesmo nome que o pacote no modelo de origem
  • Uma regra de mapeamento de submapa que invocará a transformação Class2ClassTransform se o elemento for do tipo classe
  • Uma regra de mapeamento de submapa que invocará a transformação Class2InterfaceTransform se o elemento for do tipo classe
  • Uma regra de mapeamento de submapa que invocará a transformação Package2PackageTransform se o elemento for do tipo pacote

A Lição 3: Criar e Refinar uma Declaração de Mapeamento de Classe para Classe mostrou que, para cada regra de mapeamento de movimentação em uma declaração de mapeamento, uma regra que copia um valor de atributo do modelo de origem para o modelo de destino é incluída no código-fonte da transformação gerado. Para cada regra de mapeamento de submapa, um extrator que extrai elementos na coleta especificada é gerado no código-fonte da transformação. A regra de submapa será aplicada a um objeto se o objeto de entrada atual for uma instância do tipo de entrada definido na declaração de mapeamento.

Quando você executar a transformação gerada, se o modelo de origem contiver um pacote, a transformação Package2PackageTransform será chamada e criará um pacote com o mesmo nome no modelo de destino. A transformação Package2PackageTransform atravessa a coleta do recurso packagedElement. Para cada elemento de coleta que for do tipo pacote, significando que o modelo de origem contém pacotes aninhados, a transformação invocará a transformação Package2PackageTransform. Para cada elemento de coleta que for do tipo classe, a transformação invocará as regras para transformar a classe em uma classe e uma interface correspondentes no modelo de saída de destino.

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

  1. Se o arquivo Generalize_Classes.mapping não estiver aberto no editor de mapeamentos de transformação, na visualização Package Explorer, dê um clique duplo nesse arquivo.
  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 Package2Package 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 Pacote para Pacote

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á um pacote UML como objeto de entrada e saída.

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

  1. Clique no ícone Incluir um objeto de entrada, que corresponde ao ícone na extremidade esquerda da barra de ferramentas referente ao mapa que você está editando.
  2. Na janela Incluir Entrada, no painel Elemento, expanda uml, clique em Pacote 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 você está editando.
  4. Na janela Incluir Saída, no painel Elemento, expanda uml, clique em Pacote e em OK.
  5. Clique em Arquivo > Salvar.
Resultados
Agora, você já pode definir as regras de mapeamento entre os recursos dos objetos de entrada e saída.

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

Por Que e Quando Desempenhar Esta Tarefa
Depois de incluir os objetos de entrada e saída do pacote na declaração de mapeamento, você pode criar as regras de mapeamento entre os atributos dos objetos de entrada e saída.
Nota: Quando o código-fonte da transformação é gerado, uma transformação é gerada para cada declaração de mapeamento. Cada transformação gerada contém um método getAccept_Condition(). Por padrão, esse método retornará true se o elemento de entrada atual for uma instância do objeto de entrada que está definido na declaração de mapeamento. Se o método retornar false, a transformação não processará o elemento de entrada atual. Nesta lição, você poderá criar filtros de entrada que também verificam se o objeto de entrada é uma instância do tipo de entrada. Embora esses filtros de entrada sejam redundantes, eles também são inofensivos e apenas demonstram como criar filtros de entrada. Filtros de entrada em regras de mapeamento de submapa precisam ser gravados em Java e retornar um valor booleano.

Para criar as regras de mapeamento entre os atributos dos objetos de entrada e saída de pacote:

  1. Crie uma regra de mapeamento de movimentação entre os atributos name arrastando a alça do atributo name do objeto de entrada até o atributo name no objeto de saída.
  2. Crie uma regra de mapeamento de submapa entre o atributo packagedElement dos objetos de entrada e saída e especifique que esse submapa invoque a transformação Class2ClassTransform se o elemento for do tipo classe:
    1. Arraste a alça do atributo packagedElement do objeto de entrada até o atributo packagedElement do objeto de saída. Como o atributo packagedElement é uma coleta, o editor de mapeamento cria uma regra de mapeamento de submapa por padrão.
    2. Na área do editor, clique com o botão direito no novo elemento Submapa e clique em Mostrar em Propriedades.
    3. Na visualização Propriedades, na guia Detalhes, na lista Mapa, selecione Class2Class.
    Quando você executar a transformação gerada, para cada elemento no pacote de entrada, a transformação invocará a transformação Class2ClassTransform, mas apenas se o elemento for do tipo classe.
  3. Opcional: Na regra de submapa criada na etapa 2, crie um filtro de entrada que verifique se o objeto atual é uma instância de uma classe:
    1. Na área do editor, clique com o botão direito no elemento Submapa que você criou na etapa 2.
    2. Na visualização Propriedades, na guia Filtro de Entrada, marque a caixa de seleção Elementos de Entrada do Filtro.
    3. Clique em Seqüencial.
    4. Na área de texto do campo Código, abaixo da assinatura de método, especifique o seguinte código: return packagedElement_src instanceof org.eclipse.uml2.uml.Class;
    5. Clique em Aplicar.
  4. Crie uma regra de mapeamento de submapa entre o recurso packagedElement dos objetos de entrada e saída e especifique que, se o elemento atual na coleta packagedElement for do tipo classe, a transformação Package2PackageTransform transformará essa classe em uma interface no modelo de destino.
    1. Repita a etapa 2a para criar outro submapa entre os recursos packagedElement.
    2. Na área do editor, clique com o botão direito no novo elemento Submapa e clique em Mostrar em Propriedades.
    3. Na visualização Propriedades, na guia Detalhes, a partir da lista Mapa, selecione Class2Interface.
  5. Opcional: Na regra de submapa criada na etapa 4, crie um filtro de entrada que verifique se o objeto atual é uma instância de uma interface:
    1. Na área do editor, clique com o botão direito no elemento Submapa criado na etapa 4 e clique em Mostrar em Propriedades.
    2. Repita as etapas 3b, 3c, 3d e 3e para especificar o mesmo filtro de entrada.
  6. Crie uma regra de mapeamento de submapa que processe pacotes aninhados. Se o elemento atual na coleta packagedElement for um pacote, a transformação invocará a transformação Package2PackageTransform.
    1. Repita a etapa 2a para criar outro submapa entre os recursos packagedElement.
    2. Na área do editor, clique com o botão direito no novo elemento Submapa e clique em Mostrar em Propriedades.
    3. Na visualização Propriedades, na guia Detalhes, a partir da lista Mapa, selecione Package2Package.
  7. Opcional: Na regra de submapa criada na etapa 6, crie um filtro de entrada que verifique se o elemento de entrada atual é uma instância de um pacote:
    1. Na área do editor, clique com o botão direito no elemento Submapa criado na etapa 6 e clique em Mostrar em Propriedades.
    2. Repita as etapas 3b e 3c para especificar que essa regra possui um filtro de entrada.
    3. Na área de texto do campo Código, abaixo da assinatura de método, especifique o seguinte código: return packagedElement_src instanceof org.eclipse.uml2.uml.Package;
    4. Clique em Aplicar.
  8. Clique em Arquivo > Salvar.
Resultados
A declaração de mapeamento contém uma regra de mapeamento de movimentação entre os atributos name e várias regras de submapa entre os atributos packagedElement.
< Anterior | Próximo >

Feedback