Details zu einer Modell-in-Modell-Umsetzung mit Regeln, die sicherstellen, dass UML-Profile ordnungsgemäß auf Zielmodelle angewendet werden

Wenn die Umsetzung ein vorhandenes Modell aktualisiert, anstatt ein neues Modell zu erstellen oder ein vorhandenes Modell zu überschreiben, müssen die UML-Profile sorgfältig auf die speicherinternen Versionen des neu generierten Modells und das vorhandene Zielmodell, das bei der Zusammenführungsoperation ('Mischen') in den Speicher geladen wird, angewendet werden. Diese speicherinternen Modelle müssen sich auf dieselbe speicherinterne Instanz jedes UML-Profils beziehen, da die Modelle ansonsten nicht zusammengeführt werden können.

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.

Dieses Beispielumsetzungsprojekt stellt zwei Umsetzungsregeln bereit, um sicherzustellen, dass UML-Profile ordnungsgemäß angewendet werden:
  • UMLDefaultLibrariesAddRule: Mit dieser Regel können Sie die UML-Standardbibliotheken und -profile einem generierten speicherinternen Modell in konsistenter Weise hinzufügen.
  • CrossModelReferenceCheckRule: Mit dieser Regel können Sie sicherstellen, dass ein generiertes Modell keine modellübergreifenden Referenzen enthält, die auf eine externe Ressourcengruppe verweisen. Solche externen Referenzen können Probleme verursachen, wenn ein generiertes speicherinternes Modell und die speicherinterne Version des vorhandenen Zielmodells zusammengeführt werden.

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.

Das folgende Codefragment zeigt die Standardimplementierung der Methode 'addTransformElements' in der generierten Klasse mit dem Namen 'Model2ModelTransform'. Die Standardklasse enthält die Regel nicht. In der generierten Klasse mit dem Namen 'Model2ModelTransform' wird die Regel von der Methode mit dem Namen 'addTransformElements' instanziiert:
    /**
     * <!-- 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.
    }
Das folgende Codefragment zeigt, wie die Methode mit dem Namen 'addTransformElements' die Regel instanziiert:
Anmerkung: Um zu verhindern, dass der Prozess der Quellcodegenerierung die Änderungen am Code überschreibt, müssen Sie den Tag '@generated' entfernen oder wie im folgenden Codefragment gezeigt ändern.
    /**
     * <!-- 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.
    }
Das folgende Codefragment zeigt die Originalversion der Methode 'createRootTransformation' der generierten Klasse 'TransformationProvider' ohne die Regel 'CrossModelReferenceCheckRule':
Anmerkung: Im Beispiel hat die Klasse 'TransformationProvider' den Namen 'copyprofileTransformationProvider'.
    /**
     * 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();
            }};
    }
Das folgende Codefragment zeigt die Instanziierung der Regel 'CrossModelReferenceCheckRule' in der Methode 'createRootTransformation':
Anmerkung: Im Beispiel hat die Klasse 'TransformationProvider' den Namen 'copyprofileTransformationProvider'.
    /**
     * 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();
            }};
    }
Die Regel mit dem Namen 'CrossModelReferenceCheckRule' löst standardmäßig eine Ausnahmebedingung aus, wenn sie eine Referenz im generierten speicherinternen Modell erkennt, die nicht in dieselbe Ressourcengruppe aufgelöst wird wie das vorhandene Zielmodell. Wenn Sie diese Ausnahmebedingung sehen möchten, führen Sie die folgenden Schritte aus:
  1. Inaktivieren Sie in der Umsetzungsklasse mit dem Namen 'Model2Model' die Regel mit dem Namen 'UMLDefaultLibrariesAddRule', indem Sie sie in Kommentarzeichen setzen.
  2. Führen Sie die Umsetzung aus.
Die Umsetzung löst eine Ausnahmebedingung aus und stoppt die Ausführung, weil das generierte speicherinterne Modell auf eine UML-Basiselementbibliothek verweist, die Ressourcengruppe dieses Modells jedoch keine Basiselementbibliothek enthält.

Rückmeldung