La ejecución de una transformación de correlación de modelo a modelo genera un modelo temporal en memoria. Si los contenidos de este modelo son diferentes de los contenidos de un modelo de destino existente en el sistema de archivos, los modelos se fusionarán durante el postproceso. El procedimiento de fusión predeterminado, que es una regla de transformación que se proporciona en la infraestructura de transformación de modelo a modelo, carga el modelo de destino existente en la memoria y utiliza la funcionalidad de fusión estructural para combinarlo con el modelo generado en la memoria. El modelo resultante de una fusión estructural sustituye el modelo de destino existente.
A menudo, los modelos contienen referencias a objetos de otros modelos. Por ejemplo, un modelo UML puede contener referencias a estereotipos que se definen en perfiles UML, o puede contener referencias a tipos primitivos que se definen en bibliotecas UML. La fusión estructural detecta que estas referencias entre modelos hacen referencia al mismo objeto sólo si tienen la misma referencia en la instancia en memoria de ese objeto.
Por ejemplo, se supone que el estereotipo "Perspectiva", que se define en el perfil UML llamado Predeterminado, se aplica al paquete con nombre ExamplePackage de un modelo generado en memoria y también al mismo paquete en el modelo de destino existente. Cuando el modelo de destino existente se carga en la memoria para la fusión estructura, se resuelve la referencia al estereotipo "Perspectiva". Si la fusión estructural no identifica la misma instancia exacta del objeto estereotipo en la memoria que las referencias de modelo generadas en memoria, la fusión estructural no podrá detectar que a ambas versiones del paquete ExamplePackage se les aplica el mismo estereotipo. De forma predeterminada, la fusión estructural se detiene cuando detecta instancias duplicadas del mismo modelo, como el perfil UML predeterminado de este ejemplo, que se cargan y a las que hacen referencia otros modelos que se están fusionando.
Para evitar que las instancias de un modelo se dupliquen, asegúrese de que el conjunto de recursos que contiene los modelos en memoria sólo tenga una instancia por modelo.
Estas reglas se encuentran en el paquete denominado com.ibm.xtools.transform.authoring. Para obtener más información sobre estas reglas, vea la publicación de consulta Rational Transformation Authoring Developer Guide API Reference. La transformación de este ejemplo utiliza ambas reglas. Examine el código fuente de la transformación para ver si hay instanciación en las secciones del código fuente de la transformación que pueda personalizar.
En los fragmentos de código siguientes se muestra cómo utilizar la regla denominada UMLDefaultLibrariesAddRule.
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
private void addTransformElements(Registry registry) {
// Aquí puede añadir más elementos de transformación antes de los generados
// Recuerde que debe eliminar la etiqueta @generated o añadirle NOT
addGeneratedTransformElements(registry);
// Aquí puede añadir más elementos de transformación después de los generados
// Recuerde que debe eliminar la etiqueta @generated o añadirle NOT
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated NOT
*/
private void addTransformElements(Registry registry) {
add(new UMLDefaultLibrariesAddRule());
// Aquí puede añadir más elementos de transformación antes de los generados
// Recuerde que debe eliminar la etiqueta @generated o añadirle NOT
addGeneratedTransformElements(registry);
// Aquí puede añadir más elementos de transformación después de los generados
// Recuerde que debe eliminar la etiqueta @generated o añadirle NOT
}
/**
* Crea una transformación raíz. Aquí se pueden añadir más reglas de la transformación
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @param transform The root transformation
* @generated
*/
protected RootTransformation createRootTransformation(ITransformationDescriptor descriptor) {
// Cree y devuelva una instancia de una clase que amplía RootTransformation
// y gestiona los objetos de origen de tipo = (recurso) y objetos de origen de tipo = (recurso)
// y elimine la etiqueta @generated. La implementación predeterminada que se proporciona aquí es
// para los objetos de origen y destino de tipo = (recurso).
return new RootTransformation(descriptor, new MainTransform()) {
protected void addPostProcessingRules() {
add(new UMLProfilesConsistencyCheckRule());
super.addPostProcessingRules();
}};
}
/**
* Crea una transformación raíz. Aquí se pueden añadir más reglas de la transformación
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @param transform The root transformation
* @generated NOT
*/
protected RootTransformation createRootTransformation(ITransformationDescriptor descriptor) {
// Cree y devuelva una instancia de una clase que amplía RootTransformation
// y gestiona los objetos de origen de tipo = (recurso) y objetos de origen de tipo = (recurso)
// y elimine la etiqueta @generated. La implementación predeterminada que se proporciona aquí es
// para los objetos de origen y destino de tipo = (recurso).
return new RootTransformation(descriptor, new MainTransform()) {
protected void addPostProcessingRules() {
add(new CrossModelReferenceCheckRule());
add(new UMLProfilesConsistencyCheckRule());
super.addPostProcessingRules();
}};
}