Details für eine Modell-in-Modell-Umsetzung, die ein Projekt als Quelle angibt

Sie können den generierten Quellcode für eine Modell-in-Modell-Umsetzung ändern, sodass Benutzer ein Projekt angeben können, das mehrere Modelle als Quelle der Umsetzung enthält.
In der Regel gibt der Umsetzungsbenutzer ein Modell als Quelle einer Modell-in-Modell-Umsetzung an, da eine Modell-in-Modell-Umsetzung standardmäßig nur ein Modell als Eingabe akzeptiert. Dieses Beispiel zeigt, wie sich der generierte Umsetzungscode so anpassen lässt, dass Umsetzungsbenutzer ein Eclipse-Projekt anstelle einer Modelldatei als Umsetzungsquelle angeben können. In diesem Fall legt der angepasste Code fest, welche Modelle im Projekt umgesetzt werden sollen. Die UML-Modelle, die die Dateinamenerweiterung '.emx' in dem angegebenen Projekt haben, werden bei der Ausführung der Umsetzung und nicht bei der Konfiguration der Umsetzung durch den Benutzer erfasst und dienen als Eingabe für die Umsetzung.
Anmerkung: In diesem Beispiel spielt die Reihenfolge, in der die Umsetzung die Quellenmodelle verarbeitet, keine Rolle. Zur Verarbeitung der Modelle in einer bestimmten Reihenfolge fügen Sie Ihrer Implementierung der Klasse 'ProjectContentsExtractor' den entsprechenden Code hinzu.

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.

Dieses Beispiel zeigt, wie die folgenden Elemente in der generierten Umsetzung anzupassen sind:
  • Der Umsetzungserweiterungspunkt in der generierten Datei 'plugin.xml'
  • Die Methode 'isSourceElementValid' im generierten Umsetzungsvalidator
  • Die Methode 'createRootTransformation' im generierten Umsetzungsprovider

Anpassung der generierten Datei 'plugin.xml'

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.

Anpassung der Umsetzungsvalidatorklasse

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);
    }
Das folgende Codefragment zeigt eine angepasste Version dieser Methode, 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#isSourceElementValid(java.lang.Object)
     * @generated NOT
     */
    protected boolean isSourceElementValid(Object source) {
    	return source instanceof IProject;
    }

Anpassung der Umsetzungsproviderklasse

In der Umsetzungsproviderklasse mit dem Namen 'Project4sourceTransformationProvider' instanziiert die Standardimplementierung der Methode mit dem Namen 'createRootTransformation' ein Objekt mit dem Namen 'RootTransformation', das die Standardimplementierung der Klasse mit dem Namen 'ResourceTransform' instanziiert. Die Standardimplementierung der Klasse mit dem Namen 'ResourceTransform' enthält die folgenden Elemente:
  • Eine Implementierung der Methode mit dem Namen 'ResourceContentsExtractor', die eine Modelldatei öffnet und ihren Inhalt in den Speicher lädt
  • Eine Regel mit dem Namen 'ResourceTargetRule', die das Zielmodell initialisiert, das von der Umsetzung generiert wird
    Anmerkung: Diese Regel ist von der Eigenschaft 'sourceModelType' im Umsetzungskontext abhängig: Wenn Sie den Standardwert der Eigenschaft 'sourceModelType' ändern, müssen Sie auch die Regel 'ResourceTargetRule' und die Implementierung der Methode 'ResourceContentsExtractor' anpassen.
Dieses Beispiel definiert eine Klasse mit dem Namen 'ResourcesFromProjectTransform', bei der es sich um eine angepasste Version der Klasse mit dem Namen 'ResourceTransform' handelt. Diese angepasste Klasse instanziiert die folgenden Klassen:
  • Eine Klasse mit dem Namen 'ProjectContentsExtractor', die eine angepasste Version der Klasse 'ResourceContentsExtractor' ist
  • Eine Klasse mit dem Namen 'Project4sourceTargetRule', die eine angepasste Version der Klasse 'ResourceTargetRule' ist

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());
    }
Das folgende Codefragment zeigt die angepasste Version der Methode 'createRootTransformation':
    /**
     * 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);
        }
        
    }

Rückmeldung