Epsilon 模型迁移群 - 完整副本

问题描述

在Epsilon Model Migration Language (https://www.eclipse.org/epsilon/doc/flock/) 的网页中,有“Full copy”原语的描述。我想用它以最简单的方式复制模型,生成一个具有另一个名称的新模型(但本质上是第一个的完整副本)。你能告诉我一些代码吗?这是我第一次使用 Epsilon。谢谢。

解决方法

下面是一个最小示例,演示了从 Java 运行 Flock 以迁移基于 EMF 的树模型。完整的 Maven 项目位于 Epsilon's Git repo

package org.eclipse.epsilon.examples.standalone.flock;

import java.nio.file.Path;
import java.nio.file.Paths;

import org.eclipse.epsilon.emc.emf.EmfModel;
import org.eclipse.epsilon.flock.FlockModule;

public class FlockStandaloneExample {
    
    public static void main(String[] args) throws Exception {
        
        Path root = Paths.get(FlockStandaloneExample.class.getResource("").toURI()),modelsRoot = root.getParent().resolve("models");
            
        // Set up the original model
        EmfModel original = new EmfModel();
        original.setName("Source");
        original.setReadOnLoad(true);
        original.setStoredOnDisposal(false);
        original.setMetamodelFile(modelsRoot.resolve("Tree.ecore").toAbsolutePath().toString());
        original.setModelFile(modelsRoot.resolve("Tree.xmi").toAbsolutePath().toString());
        original.load();
        
        // Set up the migrated model
        EmfModel migrated = new EmfModel();
        migrated.setName("Migrated");
        migrated.setReadOnLoad(false);
        migrated.setStoredOnDisposal(true);
        migrated.setMetamodelFile(modelsRoot.resolve("Tree.ecore").toAbsolutePath().toString());
        migrated.setModelFile(modelsRoot.resolve("Tree.migrated.xmi").toAbsolutePath().toString().replace("/target/classes/","/src/"));
        migrated.load();
        
        // Run the migration transformation
        FlockModule module = new FlockModule();
        module.parse(root.resolve("tree2tree.mig"));
        module.getContext().getModelRepository().addModel(original);
        module.getContext().getModelRepository().addModel(migrated);
        module.getContext().setOriginalModel(original);
        module.getContext().setMigratedModel(migrated);
        module.execute();
        
        // Save the migrated model
        module.getContext().getModelRepository().dispose();
    }
    
}