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.
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.
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.
/**
* <!-- 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);
}
/**
* <!-- 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;
}
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.
/**
* 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());
}
/**
* 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)));
}};
}
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;
}
}