Durch die Ausführung einer Modell-in-Modell-Zuordnungsumsetzung wird ein temporäres speicherinternes Modell generiert. Wenn sich der Inhalt dieses Modells vom Inhalt eines vorhandenen Zielmodells im Dateisystem unterscheidet, werden die Modelle während der Nachbearbeitung der Umsetzung zusammengeführt. Die Standardzusammenführungsprozedur, die in Form einer Umsetzungsregel im Modell-in-Modell-Umsetzungsframework bereitgestellt wird, lädt das vorhandene Zielmodell in den Speicher und kombiniert es unter Verwendung der Funktionalität zur Strukturzusammenführung mit dem generierten speicherinternen Modell. Das Modell, das aus der Strukturzusammenführung resultiert, ersetzt das vorhandene Zielmodell.
Modelle enthalten oft Verweise auf Objekte in anderen Modellen. Ein UML-Modell kann beispielsweise Verweise auf Stereotypen enthalten, die in UML-Profilen definiert sind, oder es kann Verweise auf primitive Typen enthalten, die in UML-Bibliotheken definiert sind. Die Strukturzusammenführung erkennt, dass sich diese modellübergreifenden Verweise nur dann auf dasselbe Objekt beziehen, wenn sie auf dieselbe speicherinterne Instanz des betreffenden Objekts verweisen.
Nehmen Sie zum Beispiel an, dass der Stereotyp «Perspective», der im UML-Profil mit dem Namen 'Default' definiert ist, auf das Paket mit dem Namen 'ExamplePackage' in einem generierten speicherinternen Modell und außerdem auf das gleiche Paket im vorhandenen Zielmodell angewendet wird. Wenn das vorhandene Zielmodell zur Strukturzusammenführung in den Speicher geladen wird, wird der Verweis auf den Stereotyp «Perspective» aufgelöst. Wenn die Strukturzusammenführung nicht exakt dieselbe Instanz des Stereotypobjekts im Speicher erkennt, das vom generierten speicherinternen Modell angegeben wird, kann die Strukturzusammenführung nicht feststellen, dass auf beide Versionen des Pakets 'ExamplePackage' derselbe Stereotyp angewendet wurde. Standardmäßig wird die Strukturzusammenführung gestoppt, wenn sie doppelte Instanzen desselben Modells, wie das UML-Profil 'Default' in diesem Beispiel, erkennt, die geladen und auf die von den Modellen, die zusammengeführt werden, verwiesen wird.
Zur Vermeidung doppelter speicherinterner Instanzen eines Modells stellen Sie sicher, dass die Ressourcengruppe, die die speicherinternen Modelle enthält, nur eine Instanz jedes Modells hat.
Diese Regeln befinden sich im Paket mit dem Namen 'com.ibm.xtools.transform.authoring'. Weitere Informationen zu diesen Regeln finden Sie im Handbuch 'Rational Transformation Authoring Developer Guide API Reference'. Die Umsetzung in diesem Beispiel verwendet beide dieser Regeln. Untersuchen Sie den generierten Umsetzungsquellcode, um sich die Instanziierung dieser Regeln in den Abschnitten des Umsetzungsquellcodes, den Sie anpassen können, anzusehen.
Die folgenden Codefragmente veranschaulichen, wie die Regel mit dem Namen 'UMLDefaultLibrariesAddRule' verwendet wird.
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
private void addTransformElements(Registry registry) {
// Sie können hier weitere Umsetzungselemente vor den generierten hinzufügen.
// Denken Sie daran, den Tag '@generated' zu entfernen oder NOT hinzuzufügen.
addGeneratedTransformElements(registry);
// Sie können hier weitere Umsetzungselemente nach den generierten hinzufügen.
// Denken Sie daran, den Tag '@generated' zu entfernen oder NOT hinzuzufügen.
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated NOT
*/
private void addTransformElements(Registry registry) {
add(new UMLDefaultLibrariesAddRule());
// Sie können hier weitere Umsetzungselemente vor den generierten hinzufügen.
// Denken Sie daran, den Tag '@generated' zu entfernen oder NOT hinzuzufügen.
addGeneratedTransformElements(registry);
// Sie können hier weitere Umsetzungselemente nach den generierten hinzufügen.
// Denken Sie daran, den Tag '@generated' zu entfernen oder NOT hinzuzufügen.
}
/**
* Erstellt eine Rootumsetzung. Sie können hier der Umsetzung weitere Regeln hinzufügen.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @param transform The root transformation
* @generated
*/
protected RootTransformation createRootTransformation(ITransformationDescriptor descriptor) {
// Erstellen Sie eine Instanz einer Klasse (und geben Sie diese zurück), die RootTransformation erweitert
// und Quellenobjekte mit Typ = (resource) und Zielobjekte mit Typ = (resource) behandelt,
// und entfernen Sie den Tag '@generated'. Die hier bereitgestellte Standardimplementierung ist
// für Quellen- und Zielobjekte mit Typ = (resource).
return new RootTransformation(descriptor, new MainTransform()){
protected void addPostProcessingRules() {
add(new UMLProfilesConsistencyCheckRule());
super.addPostProcessingRules();
}};
}
/**
* Erstellt eine Rootumsetzung. Sie können hier der Umsetzung weitere Regeln hinzufügen.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @param transform The root transformation
* @generated NOT
*/
protected RootTransformation createRootTransformation(ITransformationDescriptor descriptor) {
// Erstellen Sie eine Instanz einer Klasse (und geben Sie diese zurück), die RootTransformation erweitert
// und Quellenobjekte mit Typ = (resource) und Zielobjekte mit Typ = (resource) behandelt,
// und entfernen Sie den Tag '@generated'. Die hier bereitgestellte Standardimplementierung ist
// für Quellen- und Zielobjekte mit Typ = (resource).
return new RootTransformation(descriptor, new MainTransform()){
protected void addPostProcessingRules() {
add(new CrossModelReferenceCheckRule());
add(new UMLProfilesConsistencyCheckRule());
super.addPostProcessingRules();
}};
}