Considerações para Reexecutar Transformações UML-para-Java

A transformação UML-para-Java (reprovado) e a transformação UML-para-Java incluem a tag @generated em determinados elementos gerados. Quando você reexecuta uma transformação, ela sobrescreve elementos com a tag @generated. A transformação também sobrescreve qualificadores e membros de classes, além de qualificadores, parâmetros e o corpo de métodos.

Antes de executar uma transformação UML-para-Java, você pode remover as tags @generated dos elementos que a transformação não deve sobrescrever. Em vez disso, convém editar as tags @generated inserindo caracteres após o caractere @; por exemplo, @wasgenerated. A inserção de caracteres pode ajudá-lo a identificar o código gerado que a transformação não sobrescreve quando você reexecuta a transformação.

Elementos Gerados pela Transformação

As transformações UML-to-Java incluem a tag @generated nos seguintes elementos gerados:
  • Classes
  • Interfaces
  • Campos
  • Métodos

Protegendo o Código Gerado

Quando você reexecuta uma transformação UML-para-Java, por padrão, a transformação não sobrescreve corpos de métodos gerados por ela ou criados por um usuário. A transformação sempre preserva os corpos de métodos entre os comentários // iniciar-código-do-usuário e // encerrar-código-do-usuário, independentemente se você remover ou editar a tag @generated.

Embora a transformação sempre preserve os corpos de métodos, a tag @generated deve ser removida ou editada de um método para preservar as alterações estruturais no método. Por exemplo, você deve remover ou editar a tag @generated para o método se alterar a assinatura de método ou renomear o método.

Se você não remover ou editar a tag @generated, a transformação sobrescreverá os elementos aos quais a tag @generated se aplica.

Nota: Para incluir o método no modelo UML de origem, execute a transformação reversa.
Neste exemplo, o modelo UML de origem contém uma classe UML nomeada Class1, que contém um atributo de número inteiro nomeado attribute e duas operações nomeadas Operation1 e Operation2 que não possuem nenhum parâmetro. A tabela a seguir lista exemplos de elementos que a transformação preserva e sobrescreve. A coluna Código Modificado lista o código que contém as seguintes alterações:
Ao ser reexecutada, a transformação faz o seguinte:
  • Preserva a herança porque a tag @generated foi removida
  • Sobrescreve as alterações na assinatura de método para o método Operation1, porque a tag @generated não foi removida
  • Não preserva as alterações para o corpo de método Operation1 porque a transformação não pode localizar o método ao qual o novo corpo de método pertence
  • Preserva as alterações para o corpo de método Operation2
Elemento de Modelo UML Código Gerado Código Modificado Código Gerado após a Reexecução da Transformação
Esta imagem mostra a classe UML nomeada Class1 descrita no parágrafo anterior. Class1.java:
/** 
 * @generated "UML para Java V5.0 (com.ibm.xtools.transform.uml2.java5.internal.UML2JavaTransform)"
 */
public class Class1 {
	/** 
	 * @generated "UML para Java V5.0 (com.ibm.xtools.transform.uml2.java5.internal.UML2JavaTransform)"
	 */
	private Integer attribute1;

	/** 
	 * @generated "UML para Java V5.0 (com.ibm.xtools.transform.uml2.java5.internal.UML2JavaTransform)"
	 */
	public void Operation1() {
		// iniciar-código-do-usuário
		// TAREFA A FAZER Stub de método gerado automaticamente

		// encerrar-código-do-usuário
	}

	/** 
	 * @generated "UML para Java V5.0 (com.ibm.xtools.transform.uml2.java5.internal.UML2JavaTransform)"
	 */
	public void Operation2() {
		// iniciar-código-do-usuário
		// TAREFA A FAZER Stub de método gerado automaticamente

		// encerrar-código-do-usuário
	}
}
Class1.java:
/** 
  */
public class Class1 extends MyClass {
	/** 
	 * @generated "UML para Java V5.0 (com.ibm.xtools.transform.uml2.java5.internal.UML2JavaTransform)"
	 */
	private Integer attribute1;

	/**
	 * @generated "UML para Java V5.0 (com.ibm.xtools.transform.uml2.java5.internal.UML2JavaTransform)"
	 */
	public void Operation1(int parameter1) {
		// iniciar-código-do-usuário
		// TAREFA A FAZER Stub de método gerado automaticamente
		int i = 2;
		System.out.println(i);
		// encerrar-código-do-usuário
	}

	/**
	 * @generated "UML para Java V5.0 (com.ibm.xtools.transform.uml2.java5.internal.UML2JavaTransform)"
	 */
	public void Operation2() {
		// iniciar-código-do-usuário
		// TAREFA A FAZER Stub de método gerado automaticamente
		int j = 2;
		System.out.println(j);
		// encerrar-código-do-usuário
	}
}
Class1.java:
/**
 * 
 */

public class Class1 extends MyClass {
	/** 
	 * @generated "UML para Java V5.0 (com.ibm.xtools.transform.uml2.java5.internal.UML2JavaTransform)"
	 */
	private Integer attribute1;

	/**
	 * @generated "UML para Java V5.0 (com.ibm.xtools.transform.uml2.java5.internal.UML2JavaTransform)"
	 */
	public void Operation1() {
		// iniciar-código-do-usuário
		// TAREFA A FAZER Stub de método gerado automaticamente

		// encerrar-código-do-usuário
	}

	/**
	 * @generated "UML para Java V5.0 (com.ibm.xtools.transform.uml2.java5.internal.UML2JavaTransform)"
	 */
	public void Operation2() {
		// iniciar-código-do-usuário
		// TAREFA A FAZER Stub de método gerado automaticamente
		int j = 2;
		System.out.println(j);
		// encerrar-código-do-usuário
	}
}

Protegendo o Novo Código

A transformação não sobrescreve os elementos Java™ que você inclui no código gerado, a menos que inclua por engano a tag @generated nesses elementos.
Nota: Para incluir elementos Java no modelo UML de origem, execute a transformação reversa.

Embora a tag @generated e as seções definidas pelo usuário ofereçam flexibilidade, para evitar possíveis problemas, você deve fazer alterações estruturais no modelo UML de origem em vez do código gerado. Também é possível executar a transformação reversa para incluir novos métodos ou atributos no modelo UML de origem.


Feedback