Details für eine Modell-in-Modell-Umsetzung, die einen URI als Ziel angibt

Sie können den Quellcode, der für eine Modell-in-Modell-Umsetzung generiert wird, ändern, um Benutzern die Möglichkeit zu geben, einen Uniform Resource Identifier (URI) als Zielmodelldatei anzugeben.

Durch die Ausführung einer Modell-in-Modell-Umsetzung wird ein speicherinternes Modell generiert. Im Rahmen der Umsetzungsnachbearbeitung schreibt das Umsetzungsframework den Inhalt des generierten speicherinternen Modells standardmäßig in eine Datei im Arbeitsbereich. Wenn ein Benutzer eine Umsetzungskonfiguration für die Modell-in-Modell-Umsetzung erstellt, kann er die Datei als Zielcontainer der Umsetzung angeben oder alternativ einen neuen Zielcontainer erstellen. In einer Umsetzungskonfiguration enthält die Konfigurationseigenschaft "Zielcontainer" ("target container") den Dateinamen des Zielmodells. Diese Datei muss im Arbeitsbereich vorhanden sein, bevor die Umsetzung ausgeführt wird.

Dieses Beispielumsetzungsprojekt veranschaulicht, wie für Benutzer eine alternative Methode zur Konfiguration des Zielcontainers bereitgestellt werden kann, indem der generierte Umsetzungsquellcode angepasst wird. Als Autor einer Umsetzung können Sie nach der Generierung des Quellcodes für eine Modell-in-Modell-Umsetzung den Code anpassen, sodass ein Umsetzungsbenutzer einen URI anstelle einer Modelldatei als Umsetzungszielcontainer angeben kann. Die durch den URI angegebene Datei braucht vor der Ausführung der Umsetzung nicht vorhanden zu sein. Die Umsetzung erstellt die Datei, wenn sie nicht vorhanden ist.

Dieses Beispiel enthält ein einfaches Umsetzungszuordnungsmodell, das nur eine Zuordnung von einem UML-Modell zu einem UML-Modell definiert. Die Zuordnung ordnet dem generierten Zielmodell einen Namen zu, der aus dem Namen des Quellenmodells abgeleitet wird.
Anmerkung: Der interne Name eines Modells muss nicht mit dem Namen der Datei übereinstimmen, die das Modell im Dateisystem enthält.
Da das Zuordnungsmodell in diesem Beispiel recht einfach ist, demonstriert die generierte Umsetzung nur die Anpassung, die erforderlich ist, um die Verwendung eines URI zur Angabe eines Zielcontainers zu unterstützen. Die Umsetzung kopiert keine Elemente aus dem Quellenmodell in das Zielmodell.
Dieses Beispiel zeigt, wie die folgenden Elemente in der generierten Umsetzung anzupassen sind:
  • Der Umsetzungserweiterungspunkt in der Datei 'plugin.xml'
  • Die Methode 'isTargetElementValid' in der generierten Umsetzungsvalidatorklasse
  • Die Methode 'createRootTransformation' in der generierten Umsetzungsproviderklasse mit dem Namen 'Uri4targetTransformationProvider'

Anpassung der Datei 'plugin.xml'

Nach der Generierung des Umsetzungsquellcodes listet die Eigenschaft mit dem Namen 'targetModelType' im Umsetzungserweiterungspunkt den Typ von Modellen auf, den ein Umsetzungsbenutzer als Zielcontainer angeben kann. Standardmäßig ist diese Eigenschaft auf den Wert resource gesetzt. Dies bedeutet, dass der Benutzer in der Umsetzungskonfiguration eine Datei angeben muss, die im Arbeitsbereich vorhanden ist. In der angepassten Datei 'plugin.xml' ist die Eigenschaft 'targetModelType' auf den Wert none gesetzt.

Das generierte Umsetzungserweiterungselement in der Datei 'plugin.xml' enthält eine neue Umsetzungseigenschaft mit dem Namen 'Target Model URI' ('Zielmodell-URI'). In diesem Beispiel gibt der Benutzer im Umsetzungskonfigurationsassistenten bzw. -editor auf der Seite Eigenschaften im Feld Target Model URI ('Zielmodell-URI') einen Zeichenfolgewert für die Eigenschaft an.

Anpassung der Umsetzungsvalidatorklasse

Der Umsetzungskonfigurationsassistent und der Umsetzungskonfigurationseditor verwenden die generierte angepasste Umsetzungsvalidatorklasse mit dem Namen 'Uri4targetTransformationValidator' zur Überprüfung der Einstellungen in der Umsetzungskonfiguration. Standardmäßig gibt die Implementierung der Methode mit dem Namen 'isTargetElementValid ' den Wert true nur dann zurück, wenn der konfigurierte Zielcontainer eine Datei ist. In diesem Beispiel wird die Standardimplementierung überschrieben und gibt den Wert true zurück, unabhängig davon, ob als Zielcontainer ein Wert angegeben wird. Eine leistungsfähigere Implementierung könnte eine umsetzungs- oder projektspezifische Prüfung des vom Benutzer angegebenen URI durchführen.

Das folgende Codefragment zeigt die Standardimplementierung der Methode mit dem Namen 'isTargetElementValid', die von der Umsetzung generiert wird:
    /**
     * <!-- begin-user-doc -->
     * <!-- end-user-doc -->
     * @see com.ibm.xtools.transform.authoring.TransformationValidator#isTargetElementValid(java.lang.Object)
     * @generated
     */
    protected boolean isTargetElementValid(Object target) {
    	// Entfernen Sie den Tag '@generated', um weitere Zielgültigkeitsprüfungen hinzuzufügen.
    	return super.isTargetElementValid(target);
    }
Das folgende Codefragment zeigt die angepasste Implementierung, die im Beispiel enthalten ist und die für den Zweck dieses Beispiels immer den Wert true zurückgibt:
    /**
     * <!-- begin-user-doc -->
     * <!-- end-user-doc -->
     * @see com.ibm.xtools.transform.authoring.TransformationValidator#isTargetElementValid(java.lang.Object)
     * @generated NOT
     */
    protected boolean isTargetElementValid(Object target) {
        return true;
    }

Anpassung des Umsetzungsproviders

In der generierten angepassten Klasse mit dem Namen 'Uri4targetTransformationProvider' instanziiert die Standardimplementierung der Methode mit dem Namen 'createRootTransformation' die Klasse mit dem Namen 'RootTransformation', die wiederum die Klasse mit dem Namen 'ResourceTransform' instanziiert. Die Standardimplementierung der Klasse mit dem Namen 'ResourceTransform' verwendet eine Implementierung mit dem Namen 'ResourceTargetRule', die die Datei öffnet, die den konfigurierten Zielcontainer darstellt. In diesem Beispiel ist der konfigurierte Zielcontainer ein URI und keine Datei. Daher werden der Klasse 'Uri4targetTransformationProvider' eine angepasste Implementierung der Klasse 'ResourceTransform' mit dem Namen 'ResourceFromUriTransform' und eine angepasste Version der Regel 'ResourceTargetRule' mit dem Namen 'ResourceFromUriTargetRule' hinzugefügt.

Die angepasste Implementierung mit dem Namen 'ResourceFromUriTargetRule' führt die folgenden Schritte aus:
  • Sie erstellt die durch den URI angegebene Datei, falls sie nicht vorhanden ist.
  • Sie öffnet die durch den URI angegebene Datei.
  • Sie ordnet eine speicherinterne Modellressource einer Datei zu und speichert das Dateiobjekt im Rootumsetzungskontext, sodass sie von anderen Umsetzungsregeln abgerufen werden kann.
Das folgende Codefragment zeigt die Standardimplementierung der Methode 'createRootTransformation', die von der Umsetzung generiert wird:
    /**
     * 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) {
        return new RootTransformation(descriptor, new MainTransform());
    }
Das folgende Codefragment zeigt die angepasste Implementierung der Methode mit dem Namen 'createRootTransformation', die im Beispiel enthalten ist:
    /**
     * 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) {
        return new RootTransformation(descriptor, new MainTransform()) {
            @Override
             protected void addInitialExtractor(Transform mainTransform) {
                add(new ResourceListExtractor(new ResourceFromUriTransform(mainTransform)));
             }};
    }
    
Das folgende Codefragment zeigt die angepassten Implementierungen mit den Namen 'ResourceFromUriTransform' und 'ResourceFromUriTargetRule', die in der Klasse mit dem Namen 'Uri4targetTransformationProvider' enthalten sind:
    protected class ResourceFromUriTransform extends ResourceTransform {
        public ResourceFromUriTransform(Transform mainTransform) {
            super(Uri4targetMessages.ResourceFromUriTransform_id);
            setName(Uri4targetMessages.ResourceFromUriTransform_name);
            add(new ResourceFromUriTargetRule());
            add(new ResourceContentsExtractor(mainTransform));
        }
    }

    protected class ResourceFromUriTargetRule extends ResourceTargetRule {
        @Override
        protected Object createTarget(ITransformContext context) {
            ResourceSet resourceSet = ((EditingDomain) context
.getPropertyValue(TransformAuthoringConstants.TARGET_EDITING_DOMAIN))
.getResourceSet();
            Resource resource = null;
            Object targetModelURIString = context.getPropertyValue("TargetModelURI"); //$NON-NLS-1$
            if (targetModelURIString instanceof String) {
                URI targetModelURI = URI.createURI((String)targetModelURIString);
                IPath targetModelPath = new Path(targetModelURI.path());                
                IWorkspaceRoot wsRoot = ResourcesPlugin.getWorkspace().getRoot();
                IFile targetModelFile = wsRoot.getFile(targetModelPath);
                ValidateEditRule.addAffectedFile(context, targetModelFile);
                resource = resourceSet.createResource(getPlatformURI(targetModelFile));
                ITransformContext rootContext = context;
                while (rootContext.getParentContext() != null)
                    rootContext = rootContext.getParentContext();
                rootContext.setPropertyValue(ITransformContext.TARGET_CONTAINER, targetModelFile);
            }
            return resource;
        }        
    }

Rückmeldung