Dieses Beispiel enthält ein Umsetzungszuordnungsmodell, das einfache Zuordnungen für UML-Modelle, Pakete und Klassen definiert. Die generierte Umsetzung erstellt ein UML-Modell, das denselben Namen wie das Quellenprojekt hat, und erstellt in diesem Modell ein Paket für jedes UML-Modell, das im Quellenprojekt enthalten ist. Für jede Klasse im entsprechenden UML-Quellenmodell erstellt die Umsetzung auch eine Klasse in jedem Paket. Obwohl dieses Zuordnungsmodell einfach ist, zeigt die generierte Umsetzung, wie Sie den Code anpassen müssen, um die Angabe von Quellenmodellen durch die Angabe eines Quellenprojekts zu unterstützen.
In der Datei 'plugin.xml' gibt die Eigenschaft mit dem Namen 'sourceModelType' im Umsetzungserweiterungspunkt den Typ von Objekten an, den ein Umsetzungsbenutzer als Umsetzungsquelle angeben kann. Wenn Sie eine Modell-in-Modell-Umsetzungsprojekt erstellen, wird diese Eigenschaft standardmäßig auf den Wert resource gesetzt. Dies bedeutet, dass ein Umsetzungsbenutzer im Umsetzungskonfigurationsassistenten und -editor eine im Arbeitsbereich vorhandene Datei als Umsetzungsquelle angeben muss. Wenn Sie die Eigenschaft 'sourceModelType' auf den Wert project setzen, kann ein Umsetzungsbenutzer als Umsetzungsquelle ein Eclipse-Projekt anstelle einer Datei angeben.
Der Umsetzungskonfigurationsassistent und der Umsetzungskonfigurationseditor verwenden die Umsetzungsvalidatorklasse zur Überprüfung, ob die Umsetzung mit den vom Benutzer angegebenen Einstellungen ordnungsgemäß ausgeführt werden kann. In der Umsetzungsvalidatorklasse gibt die Standardimplementierung der Methode mit dem Namen 'isSourceElementValid' den Wert true nur dann zurück, wenn die angegebene Umsetzungsquelle eine Datei ist.
In diesem Beispiel prüft die Umsetzungsvalidatorklasse mit dem Namen 'Project4sourceTransformationValidator', ob die Umsetzung mit den vom Benutzer angegebenen Einstellungen ordnungsgemäß ausgeführt werden kann. Für dieses Beispiel überschreibt der Code in dieser Klasse die Standardimplementierung der Methode mit dem Namen 'isSourceElementValid', sodass die Methode den Wert true nur dann zurückgibt, wenn die Umsetzungsquelle ein Projekt ist. Eine leistungsfähigere Implementierung könnte außerdem prüfen, ob der Benutzer ein UML-Projekt ausgewählt hat.
Das folgende Codefragment zeigt die Standardversion der Methode 'isSourceElementValid', die von einer Umsetzung generiert wird:
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @see com.ibm.xtools.transform.authoring.TransformationValidator#isSourceElementValid(java.lang.Object)
* @generated
*/
protected boolean isSourceElementValid(Object source) {
// Entfernen Sie den Tag '@generated', um weitere Quellengültigkeitsprüfungen hinzuzufügen.
return super.isSourceElementValid(source);
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @see com.ibm.xtools.transform.authoring.TransformationValidator#isSourceElementValid(java.lang.Object)
* @generated NOT
*/
protected boolean isSourceElementValid(Object source) {
return source instanceof IProject;
}
Das folgende Codefragment zeigt die Standardversion der Methode 'createRootTransformation', die von einer 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());
}
/**
* 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 ResourcesFromProjectTransform(mainTransform)));
}};
}
Das folgende Codefragment zeigt den Quellcode für die Umsetzung mit dem Namen 'ResourcesFromProjectTransform', die einen Extraktor mit dem Namen 'ProjectContentsExtractor' und eine Regel mit dem Namen 'Project4sourceTargetRule' enthält.
protected class ResourcesFromProjectTransform extends ResourceTransform {
public ResourcesFromProjectTransform(Transform mainTransform) {
super(Project4sourceMessages.ResourcesFromProjectTransform_id);
setName(Project4sourceMessages.ResourcesFromProjectTransform_name);
add(new Project4sourceTargetRule());
add(new ProjectContentsExtractor(mainTransform));
}
}
protected class ProjectContentsExtractor extends ResourceContentsExtractor {
public static final String UML_MODEL_FILE_TYPE = "emx"; //$NON-NLS-1$
public ProjectContentsExtractor(AbstractTransform transform) {
super(transform);
setName(Project4sourceMessages.ProjectContentsExtractor_name);
}
@Override
public Collection<Model> execute(ITransformContext context) {
final ResourceSet resourceSet = ((EditingDomain) context
.getPropertyValue(TransformAuthoringConstants.SOURCE_EDITING_DOMAIN)).getResourceSet();
final Collection<Model> models = new BasicEList();
Object source = context.getSource();
if (source instanceof IProject) {
IProject project = (IProject)source;
IResourceVisitor visitor = new IResourceVisitor() {
@Override
public boolean visit(IResource resource) throws CoreException {
if (resource instanceof IProject || resource instanceof IFolder)
return true;
if (resource instanceof IFile) {
IFile file = (IFile)resource;
if (UML_MODEL_FILE_TYPE.equals(file.getFileExtension())) {
Resource modelResource = resourceSet.getResource(getPlatformURI(file), true);
for (Iterator<EObject> i = modelResource.getContents().iterator(); i.hasNext();) {
EObject content = i.next();
if (content instanceof Model)
models.add((Model)content);
}
}
}
return false;
}
};
try {
project.accept(visitor);
} catch (CoreException ce) {
Activator.getDefault().getLog().log(new Status(IStatus.ERROR, Activator.PLUGIN_ID,
Project4sourceMessages.ProjectContentsExtractor_name, ce));
}
}
return models;
}
}
protected class Project4sourceTargetRule extends ResourceTargetRule {
@Override
protected Object createTarget(ITransformContext context) {
if (context.getSource() instanceof IProject) {
Object targetContainer = context.getTargetContainer();
if (targetContainer instanceof Resource) {
return targetContainer;
} else if (targetContainer instanceof IFile){
IFile targetFile = (IFile)targetContainer;
ValidateEditRule.addAffectedFile(context, targetFile);
ResourceSet resourceSet = ((EditingDomain) context
.getPropertyValue(TransformAuthoringConstants.TARGET_EDITING_DOMAIN)).getResourceSet();
return resourceSet.createResource(getPlatformURI(targetFile));
}
}
return super.createTarget(context);
}
}