L'exécution d'une transformation de mappage de modèle à modèle génère un modèle temporaire en mémoire. Si le contenu de ce modèle est différent de celui d'un modèle cible existant dans le système de fichiers, les deux modèles sont fusionnés durant la phase de post-traitement de la transformation. La procédure de fusion par défaut, qui est une règle de transformation fournie dans l'infrastructure de transformation de modèle à modèle, charge le modèle cible existant en mémoire et utilise la fonctionnalité de fusion structurelle pour le combiner avec le modèle généré en mémoire. Le modèle résultant de la fusion structurelle remplace le modèle cible existant.
Les modèles contiennent souvent des références à des objets dans d'autres modèles. Par exemple, un modèle UML peut contenir des références à des stéréotypes définis dans des profils UML, ou bien il peut contenir des références à des types primitifs définis dans des bibliothèques UML. La fonctionnalité de fusion structurelle détecte que ces références intermodèles désignent le même objet uniquement si elles pointent sur la même instance en mémoire de cet objet.
Par exemple, supposons que le stéréotype «Perspective», qui est défini dans le profil UML nommé Default, est appliqué au package ExamplePackage dans un modèle généré en mémoire, ainsi qu'au même package dans le modèle cible existant. Lorsque le modèle cible existant est chargé en mémoire en vue de sa fusion structurelle, la référence au stéréotype «Perspective» est résolue. Si la fusion structurelle identifie une instance de l'objet stéréotype en mémoire qui n'est pas exactement la même que celle qui est référencée par le modèle généré en mémoire, elle ne peut pas détecter que le même stéréotype est appliqué aux deux versions du package ExamplePackage. Par défaut, la fusion structurelle s'arrête lorsqu'elle détecte des instances en double du même modèle chargées et référencées par les modèles à fusionner ; dans notre exemple, c'est le cas du profil UML Default.
Pour éviter que plusieurs instances d'un même modèle ne soient chargées dans la mémoire, assurez-vous que le jeu de ressources qui contient les modèles en mémoire ne comporte qu'une seule instance de chaque modèle.
Ces règles sont situées dans le package com.ibm.xtools.transform.authoring. Pour plus d'informations à leur propos, reportez-vous au manuel Rational Transformation Authoring Developer Guide API Reference. La transformation dans cet exemple utilise les deux règles. Explorez le code source généré de la transformation pour voir où elles sont instanciées dans les sections du code source que vous pouvez personnaliser.
Les fragments de code suivants montrent comment utiliser la règle nommée 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. You may add more rules to the transformation here
* <!-- 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. You may add more rules to the transformation here
* <!-- 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();
}};
}