Executar uma transformação de mapeamento de modelo em modelo gera um modelo em memória temporário. Se o conteúdo desse modelo for diferente do conteúdo de um modelo de destino existente no sistema de arquivos, os modelos são mesclados durante o pós-processamento da transformação. O procedimento de mescla padrão, que é uma regra de transformação fornecida na estrutura da transformação de modelo em modelo, carrega o modelo de destino existente na memória e utiliza a funcionalidade de mescla estrutural para combiná-la ao modelo em memória gerado. O modelo que resulta da mescla estrutural substitui o modelo de destino existente.
Os modelos freqüentemente contêm referências a objetos em outros modelos. Por exemplo, um modelo UML pode conter referências a estereótipos definidos nos perfis UML ou pode conter referências a tipos primitivos definidos nas bibliotecas UML. A mescla estrutural detecta que essas referências entre modelos fazem referência ao mesmo modelo somente se fizerem referência à mesma instância em memória desse objeto.
Por exemplo, suponhamos que o estereótipo «Perspectiva», definido no perfil UML denominado Padrão, seja aplicado ao pacote denominado ExamplePackage em um modelo em memória gerado e, também, ao mesmo pacote no modelo de destino existente. Quando o modelo de destino existente é carregado na memória para mescla estrutural, a referência ao estereótipo «Perspectiva» é resolvida. Se a mescla estrutural não identificar a mesma instância exata do objeto do estereótipo na memória ao qual o modelo em memória gerado faz referência, a mescla estrutural não pode detectar que ambas as versões do pacote ExamplePackage têm o mesmo estereótipo aplicado a elas. Por padrão, a mescla estrutural pára ao detectar instâncias duplicadas do mesmo modelo, como o perfil Padrão UML neste exemplo, que são carregadas e referidas pelos modelos que estão mesclando.
Para evitar instâncias em memória duplicadas de um modelo, assegure que o conjunto de recursos que contém os modelos em memória tenha somente uma instância de cada modelo.
Essas regras estão localizadas no pacote denominado com.ibm.xtools.transform.authoring. Para obter informações adicionais sobre essas regras, consulte Rational Transformation Authoring Developer Guide API Reference. A transformação nesta amostra utiliza ambas as regras. Explore o código-fonte da transformação gerado para ver a instanciação nas seções do código-fonte da transformação que é possível customizar.
Os fragmentos de código a seguir mostram como utilizar a regra denominada UMLDefaultLibrariesAddRule.
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
private void addTransformElements(Registry registry) {
// You may add more transform element before the generated ones here
// Remember to remove the @generated tag or add NOT to it
addGeneratedTransformElements(registry);
// You may add more transform element after the generated ones here
// Remember to remove the @generated tag or add NOT to it
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated NOT
*/
private void addTransformElements(Registry registry) {
add(new UMLDefaultLibrariesAddRule());
// You may add more transform element before the generated ones here
// Remember to remove the @generated tag or add NOT to it
addGeneratedTransformElements(registry);
// You may add more transform element after the generated ones here
// Remember to remove the @generated tag or add NOT to it
}
/**
* Creates a root transformation. É possível incluir mais regras na transformação aqui
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @param transform The root transformation
* @generated
*/
protected RootTransformation createRootTransformation(ITransformationDescriptor descriptor) {
// Create and return an instance of a class that extends RootTransformation
// and handles source objects of type = (resource) and target objects of type = (resource)
// and remove the @generated tag. The default implementation provided here is
// for source and target objects of type = (resource).
return new RootTransformation(descriptor, new MainTransform()) {
protected void addPostProcessingRules() {
add(new UMLProfilesConsistencyCheckRule());
super.addPostProcessingRules();
}};
}
/**
* Creates a root transformation. É possível incluir mais regras na transformação aqui
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @param transform The root transformation
* @generated NOT
*/
protected RootTransformation createRootTransformation(ITransformationDescriptor descriptor) {
// Create and return an instance of a class that extends RootTransformation
// and handles source objects of type = (resource) and target objects of type = (resource)
// and remove the @generated tag. The default implementation provided here is
// for source and target objects of type = (resource).
return new RootTransformation(descriptor, new MainTransform()) {
protected void addPostProcessingRules() {
add(new CrossModelReferenceCheckRule());
add(new UMLProfilesConsistencyCheckRule());
super.addPostProcessingRules();
}};
}