Especificando Extratores Customizados em Regras de Mapeamento de Submapa

O código de origem da transformação de uma regra de mapeamento de submapa chama outra transformação. Se o atributo de entrada em uma regra de mapeamento de submapa representar uma coleta de objetos, a transformação especificada na regra de submapa será executada uma vez para cada objeto na coleta. Você pode modificar esse comportamento padrão especificando um filtro de entrada ou um extrator customizado. Ao executar o código de transformação gerado, a coleta de objetos retornada pelo extrator customizado será utilizada no lugar da coleta do atributo de entrada.
Antes de Iniciar

Se você criar um extrator customizado, mas não especificar um filtro de entrada, todos os objetos retornados pelo extrator de submapa serão processados pela regra do submapa quando a transformação for executada. Os extratores customizados substituem o comportamento dos extratores padrão, que retornam a coleta inteira de objetos em um atributo de entrada especificado pelo submapa.

É necessário ter um modelo de mapeamento aberto. Um modelo de mapeamento tem .mapping como extensão de nome de arquivo. O modelo de mapeamento deve conter pelo menos uma declaração de mapeamento e uma regra de mapeamento de submapa deve estar definida na declaração de mapeamento.

Por Que e Quando Desempenhar Esta Tarefa

Para criar um extrator customizado em uma regra de mapeamento de submapa:

  1. Na área do editor, clique com o botão direito do mouse na regra de mapeamento e, em seguida, clique em Mostrar em Propriedades.
  2. Na visualização Propriedades, clique na guia Extrator Customizado.
  3. Selecione a caixa de opção Extrator Customizado.
    Nota: Se essa caixa de opção estiver limpa, a regra de submapa extrairá o conteúdo do recurso de entrada quando a transformação for executada.
  4. Para especificar o código do extrator customizado, conclua uma das seguintes etapas:
    • Clique em Seqüencial para digitar o código Java™ na área de texto abaixo da opção Código e, em seguida, clique em Aplicar. O código especificado deve retornar um resultado do tipo java.util.Collection.
      Dica: Para consultar uma lista de nomes de variáveis válidos, na área de texto abaixo do botão Seqüencial, pressione Ctrl+Espaço.
      Nota: A variável chamada <name>_src especifica o objeto de entrada atual.
    • Clique em Externo para especificar uma classe Java que contenha o código do extrator customizado. A classe Java especificada deve implementar a interface com.ibm.xtools.transform.authoring.ExtractorExtension. O método Collection execute(EObject source) também deve ser implementado, em que source é configurado com o objeto de entrada atual. O método extrai objetos da coleta no atributo de entrada e retorna esses objetos em uma coleta do tipo java.util.Collection. Quando você clicar em Procurar, uma caixa de diálogo utilizará a seleção de uma classe válida.
      Dica: Para criar uma classe Java que implemente um extrator customizado, clique em Novo e, em seguida, preencha os campos na janela Nova Classe Java.
  5. Clique em Arquivo > Salvar.
Exemplo
Considere um objeto de entrada que contenha um pacote UML chamado Package1, que contenha duas classes UML chamadas Class1 e Class2. O Package1 também contém um pacote UML chamado Package2 e o Package2 contém uma classe UML chamada Class3.
package uml_to_ecore_example.transforms;
import java.util.Collection
public class AddClassesFromNestedPackages implements ExtractorExtension {
    public Collection execute(EObject source) {
        Package pkg = (Package)source;
        Collection c = new BasicEList();
        // incluir, recursivamente, todas as classes deste pacote e seus pacotes aninhados
        for (Iterator i=pkg.getPackagedElements().iterator(); i.hasNext();) {
            Object obj = i.next();
            if (obj instanceof Class) c.add(obj);
            else if (obj instanceof Package) c.addAll(execute((Package)obj));
        }
        return c;}}

Feedback