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:
- Na área do editor, clique com o botão direito do mouse na regra de mapeamento e, em seguida, clique em Mostrar
em Propriedades.
- Na visualização Propriedades, clique na guia Extrator
Customizado.
- 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.
- 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.
- Clique em .
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.
- Quando o extrator padrão receber o Package1 como entrada para seu método execute,
ele retornará uma coleta contendo Class1 e Class2.
- O extrator customizado listada abaixo retorna uma coleta contendo Class1,
Class2 e 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;}}