Autoria da transformação JET

É possível criar transformações de modelo em texto utilizando a ferramenta Java Emitter Templates (JET) e, em seguida, as transformações para automatizar a aplicação de padrões de design. Os padrões de design são soluções comprovadas para problemas recorrentes; as ferramentas que automatizam sua aplicação são chamadas de implementações de padrão. A criação de transformações de JET é um processo, também chamado de autoria de transformação de JET, que acelera a criação de implementações de padrão utilizando JET.

Padrões de Design e Implementações de Padrão

Os padrões de design descrevem uma solução padrão para um problema recorrente de desenvolvimento de software e fornecem soluções que podem ser aplicadas em muitas situações. Se você reutilizar designs utilizando padrões de design, é possível aumentar a qualidade e a confiabilidade da solução.

Uma especificação de padrão descreve o problema que um padrão soluciona, o contexto no qual a solução proposta é apropriada e fornece uma descrição abstrata da solução. O processo de aplicação dessa abstração a um problema ewspecífico é chamado de aplicação de padrão. Uma ferramenta que auxilia na aplicação de padrão é chamada de uma implementação de padrão. Uma implementação de padrão possibilita descrever uma aplicação de padrão em termos de abstrações na especificação de padrão. É possível utilizar a implementação de padrão para gerar os artefatos, como atquivos, pastas e projetos, que formam sua solução. Dependendo do padrão de design, você pode especificar lógica adicional nos artefatos gerados.

JET e a funcionalidade de autoria de transformação de JET suportam implementações onde a entrada é descrita em um modelo estruturado e a solução de padrão gerada consiste em arquivos de texto. Essas implementações de padrão também são chamadas de transformações de modelo em texto.

As transformações de modelo JET em texto aceitam documentos de Extensible Markup Language (XML) e modelos Eclipse Modeling Framework (EMF) como entrada e produzem arquivos, pastas e projetos Eclipse como saída. Os tipos de entrada e saída que a transformação de JET produz são extensíveis utilizando-se o JET Software Development Kit (SDK).

Fluxo de Trabalho para Desenvolver Implementações de Padrão

Para desenvolver uma implementação de padrão, você executa as seguintes etapas de alto nível:
  1. Identifique um problema recorrente.
  2. Implemente uma solução de referência, também chamada de um exemplar, que funciona como uma solução de modelo que outros podem copiar e adaptar.
  3. Utilize a funcionalidade de autoria de transformação de JET para criar uma transformação de modelo em texto, examinando a solução de referência. Esse processo é chamado de análise de exemplar.
  4. (Opcional) Integre a transformação de JET a outras transformações, interfaces com o usuário ou ambas.
A implementação de uma solução de referência é a que consome mais tempo destas etapas. A finalidade de uma análise de exemplar é tornar a produção de uma implementação de padrão um esforço incremental, após você identificar e implementar uma solução de referência.

Pré-requisitos de Autoria da Transformação de JET

Para criar transformações de JET, você deve instalar o componente de Autoria de Transformação.

Fluxo de Trabalho para Autoria de Transformações de Modelo JET em Texto

Para criar uma transformação de modelo em texto utilizando a funcionalidade de autoria de transformação de JET, você executa as seguintes etapas de alto nível:

  1. Crie uma transformação de JET que especifique um ou mais projetos de exemplares.
  2. Crie um esquema de entrada que descreva a estrutura da entrada de transformação. A estrutura da entrada de transformação reflete as abstrações do padrão de design.
  3. Crie ações que sejam associadas ao esquema de entrada de transformação. Essas ações são chamadas de ações de transformação ou de ações JET e podem criar projetos, pastas e arquivos na solução. Após criar uma ação JET, você deve utilizar a funcionalidade de autoria de transformação para atualizar os modelos JET com as alterações feitas no modelo de transformação.
  4. Edite i modelo JET associado a cada ação de arquivo para produzir o conteúdo específico da entrada de transformação.

O esquema de entrada de transformação e as ações JET são coletivamente chamadas de modelo de transformação e são exibidas na área do editor. A maioria das transformações de JET são criadas repetindo-se as etapas 2, 3 e 4, conforme necessário.

Esquemas de Entrada de Transformação

Um esquema de entrada de transformação descreve a estrutura da entrada para a transformação. O esquema de entrada é exibido como uma hierarquia de tipos e atributos de elementos.

Apesar de JET poder ler modelos que têm esquemas de entrada muito complexos, para facilitar o processo de autoria, a funcionalidade para a autoria de transformações de JET está restrita à definição de esquemas básicos.

A funcionalidade para autoria de transformações de JET suporta esquemas de entrada com as seguintes características:
  • Hierárquica e contém um elemento raiz
  • Cada elemento do modelo pode conter zero ou mais atributos que têm valores de cadeia
  • Cada elemento do modelo pode conter zero ou mais elementos filhos

    Não é permitido especificar cardinalidades com a funcionalidade de autoria de transformação de JET. Toda retenção de elemento é de zero para muitos. Por exemplo, um esquema de entrada pode especificar que manuais contêm capítulos, mas o esquema de entrada não pode especificar o número de capítulos que os manuais contêm.

Ao gerar os modelos JET atualizando o projeto, duas implementações do esquema de entrada são criadas:
  • schema.xsd: Esse arquivo XML Schema Definition (XSD) é criado no projeto de transformação de JET. Esse arquivo pode ser utilizado para criar documentos XML que estão em conformidade com a estrutura de entrada da transformação.
  • input.ecore: Esse arquivo é um metamodelo Eclipse Modeling Framework (EMF), que também é chamado de um arquivo Ecore.
Eclipse Modeling Framework pode ser utilizado para gerar uma API Java para a entrada de transformação. Essa API permite gravar o código Java para criar a entrada de transformação e, em seguida, utilizar a API de JET para chamar a transformação de JET. Você também pode utilizar essa API Java gerada em uma transformação de mapeamento de modelo em modelo.

Por exemplo, é possível criar um mapeamento de entrada de transformação de UML em JET que chame a transformação de JET. Esse mapeamento permite desenvolver uma transformação de JET com um esquema básico de entrada, mas permite que usuários de transformações descrevam a entrada, utilizando Extensible Markup Language (UML).

Nota: Não é permitido especificar o metamodelo UML como o modelo de origem em um mapeamento.

Ações de Transformação

Quando as abstrações do padrão de design são capturadas no esquema de entrada, você deve determinar como os artefatos na solução de referência, também chamados de exemplar, derivam desse esquema. As ações de transformação, também chamadas de ações JET, criam projetos, pastas e arquivos. Quando a transformação de JET é executada, uma ação JET é chamada toda vez que um elemento desse tipo é encontrado na entrada de transformação.

A funcionalidade para autoria de transformações de JET suporta as seguintes ações JET:
  • Ações de arquivo
  • Ações de pasta
  • Ações de projeto
Você cria as ações JET para corresponder a artefatos exemplares. Uma ação JET pode ser correspondida a um artefato exemplar das seguintes formas:
  • Crie uma ação JET que produza o artefato.
  • Crie uma ação JET condicional.
  • Associe um artefato a uma ação existente.
  • Crie uma ação JET que produza o artefato contido por uma ação que cria pastas ou projetos.
  • Exclua o artefato da área do área do editor se a transformação não gerar um tipo de artefato específico. O arquivo físico, a pasta ou o projeto excluído não é afetado.
  • Ignore o artefato. Essa opção permite que o artefato permaneça na área do editor e permite desfazer a ação ignorar e associar o artefato ao esquema de entrada da transformação.

Cada ação JET tem parâmetros de ação que controlam como a ação se comporta. Esses parâmetros são configurados para valores que recriam o artefato exemplar que cria a ação JET. Geralmente, você customiza esses valores de parâmetros para incluir os valores extraídos da entrada da transformação.

Ações de arquivo JET criam conteúdo de arquivo avaliando um modelo JET. Ao atualizar o projeto, esses modelos são criados se não existirem. O conteúdo inicial dos modelos é o mesmo que o conteúdo no arquivo exemplar especificado na criação da ação de arquivo correspondente. É possível modificar o modelo gerado para gerar o conteúdo customizado para a entrada de transformação.

Ao justificar artefatos exemplares no modelo de transformação, é possível excluir um artefato da área do editor se a transformação não gerar um tipo específico de artefato. O arquivo físico, a pasta ou o projeto excluído não é afetado. Você também pode ignorar um artefato, o que permite que o artefato permaneça na área do editor e permite desfazer a ação ignorar e associar o artefato ao esquema de entrada da transformação.

Customizando Ações e Modelos JET

As ações e os modelos JET criados quando da autoria de uma transformação são cópias dos artefatos exemplares. Geralmente, você modifica os parâmetros da ação e o conteúdo do modelo para especificar os valores na entrada da transformação.

É possível substituir texto selecionado por referências à entrada de transformação ao editar os valores de parâmetros das ações JET.

Referências de entrada da transformação são no formato de expressões de XML Path (XPath). XPath, que é um padrão do World Wide Web Consortium, é projetado para documentos XML; no entanto, JET adapta esse padrão para suportar diversos tipos de modelos de entrada.

Expressões XPath integradas a valores de parâmetros de ação são colocadas entre chaves ({ }) e, quando você substituir variáveis por referências de modelo, essas expressões são exibidas em um formato {$variable/@attribute}, onde variable é o nome de um elemento de modelo de entrada e attribute é o nome de um atributo no elemento. Cada elemento de modelo de entrada tem um nome de variável XPath associado. Por padrão, o ambiente de autoria mantém o nome da variável sincronizado com o nome do elemento.

Apesar de a funcionalidade de autoria criar expressões XPath básicas, JET fornece uma implementação abrangente da especificação XPath 1.0 e inclui um conjunto de funções XPath que podem manipular valores da entrada da transformação. Por exemplo, a expressão XPath {lower-case($person/@name)} converte a referência de entrada $person/@name para minúsculas.

As funções XPath podem ser utilizadas em qualquer lugar que uma expressão XPath seja permitida.

Texto Substituível em Modelos JET

O editor de autoria JET exibe marcadores no texto do modelo que você pode substituir pelas referências do modelo. É possível identificar quais modelos contêm marcadores JET observando-se as decorações JET nos seguintes locais:
  • Na área do editor, em uma ação JET
  • Nas visualizações Project Explorer ou Package Explorer ou nas visualizações do navegador no arquivo de modelo JET

Verifique a visualização Problemas para obter informações detalhadas sobre os marcadores JET.

Atributos Derivados

É possível criar atributos derivados para eliminar os cálculos repetitivos. Um atributo derivado é um atributo de um elemento de esquema de entrada que é gerado por um cálculo, em vez de fornecido como entrada de transformação. O cálculo pode fazer referência a outros elementos e atributos no esquema de entrada. É possível criar atributos derivados diretamente ao editar um modelo de mapeamento de transformação ou sempre que você inserir referências do modelo de transformação.

Implementação de Transformação de JET e Passagem do Modelo de Entrada

Quando da autoria de transformações de JET, o código para calcular atributos derivados e executar ações JET é gerado quando o projeto é atualizado. Esse código está no modelo principal da transformação, que é chamado templates/main.jet. O modelo principal calcula atributos derivados e chama as ações JET realizando duas passagens de primeira profundidade da entrada de transformação. Para cada elemento na entrada de transformação, as etapas a seguir são executadas:
  1. A transação cria uma variável XPath que representa o elemento de entrada atual. O nome da variável é derivado das propriedades do elemento do esquema de entrada correspondente.
  2. Durante a primeira passagem da entrada da transformação, a transformação calcula e armazena as expressões de atributos derivadas. Durante a segunda passagem, a transformação chama as ações JET.
  3. A transformação processa os elementos filho na entrada da transformação.

Durante a passagem da entrada da transformação, os cálculos de atributos derivados e os cálculos para parâmetros de ação JET associados a um elemento de esquema de entrada podem fazer referência às variáveis XPath que referem-se ao elemento atual e a cada uma das variáveis pertencentes aos elementos ascendentes.

Customização do Modelo JET

A etapa final a criação de uma transformação de JET é editar os modelos JET que são gerados através da execução do comando Update Project. Essa customização permite adaptar os modelos para acomoda a entrada da transformação. Editar os modelos JET pode envolver uma ou mais das seguintes etapas:
  • Substituir texto nos modelos com referências à entrada da transformação: Essa ação pode incluir a criação de novos tributos, atributos derivados ou novos elementos do esquema de entrada. A tag JET c:get implementa o texto de substituição quando a transformação é executada.
  • Incluir texto em um bloco de código de iteração: Essa ação faz com que um bloco de texto e qualquer referência à entrada a transformação sejam avaliados diversas vezes com base na entrada da transformação. Iterações são implementadas pela tag JET c:iterate.
  • Incluir texto em um bloco condicional: Quando uma condição específica na entrada da transformação é verdadeira, a transformação avalia o texto no bloco de código condicional. Os blocos condicionais são implementados pela tag JET c:if para condições únicas. Também é possível utilizar as tags c:choose, c:when e c:otherwise para seções de texto alternativas.

Para auxiliá-lo a identificar o texto nos modelos que devem ser substituídos por referências à entrada da transformação, as substituições de texto especificadas são monitoradas. Toda vez que você substituir uma cadeia de texto por uma referência específica à entrada da transformação, esse texto é armazenado como texto exemplar no modelo de entrada da transformação, que você pode visualizar, incluir ou remover. Esse texto também é utilizado para criar marcadores JET de Substituição, que realça texto que é semelhante ao texto nos modelos JET que a transformação gera. É possível resolver os marcadores JET de Substituição utilizando o mecanismo Eclipse Quick Fix. Essa funcionalidade possibilita substituir o texto pela tage JET apropriada ou ignorar o marcador, pois nenhuma alteração é necessária no texto.

Geração de Modelos de Entrada JET para Transformações de JET

É possível criar uma estrutura de interface e projeto UML que transforma um modelo UML em um modelo de entrada JET que pode ser utilizado como entrada para uma transformação de JET. Essa funcionalidade pode ser utilizada para representar graficamente modelos não-gráficos que funcionam como a entrada para transformações de JET. Por exemplo, você pode criar essa infra-estrutura para criar uma interface UML para um modelo não-gráfico, como um padrão de bean Java baseado em JET.

A infra-estrutura do projeto consiste em um ou mais dos seguintes elementos:
  • Transformação de mapeamento de modelo em modelo

    A transformação de mapeamento de modelo em modelo transforma um modelo UML em um modelo de entrada JET.

  • Projeto de perfil UML

    O perfil UML nesse projeto define os estereótipos e as extensões para o modelo UML que funciona como entrada para a transformação de modelo em modelo. O projeto do perfil UML gerado é compatível com a funcionalidade das ferramentas do perfil UML.

  • Projeto Eclipse Modeling Framework (EMF)

    Esse projeto contém a interface de programação de aplicativos (API) de Java para o modelo de entrada JET gerado.

  • Projeto de recurso Eclipse

    Esse projeto de recurso faz referência à transformação de modelo em texto JET que transforma o modelo de entrada JET gerado e o projeto EMF que contém a API de Java para o modelo de entrada JET gerado. É possível exportar esse projeto utilizando a funcionalidade de exportação Eclipse Deployable Feature.


Feedback