【问题标题】:How do I implement a model by code in EMF?如何在 EMF 中通过代码实现模型?
【发布时间】:2014-12-05 23:37:29
【问题描述】:

我在 EMF 中创建了一个模型。我还设法从中生成代码(.genmodel 文件),我查看了文件,我有点了解模型、编辑和编辑器插件的实现。

但我不明白如何通过代码创建自己的元模型实例。我了解代码的编写方式,但我不知道现在将我自己的东西放在哪里,所以它会被调用。

【问题讨论】:

  • 你自己的东西放在哪里是什么意思?您是否已经查看了模型插件中生成的各个工厂?它们允许您通过调用相应的 create 方法来创建元模型的实例,如果这是您正在寻找的。​​span>
  • 我的意思是如何调用我的实现?如何将它加载到我的“模型”中?我知道如何创建代码,但我真的不知道如何使用它。是什么让它运行?
  • 您是否尝试过生成 RCP 应用程序? (在 .genmodel 属性中,您可以设置 Rich Client Platform = true)

标签: java implementation eclipse-emf


【解决方案1】:

简答:看看EMF Book。本书将帮助您了解如何使用生成的代码以及如何构建模型(第四部分)。

有两种方法可以创建模型:以编程方式或使用生成的编辑器。编辑器允许您在树视图中创建模型。要使用编辑器,您需要将编辑器插件作为 Eclipse 应用程序运行(右键单击 -> 运行方式)。一旦进入嵌套的 Eclipse,您应该能够使用您的编辑器来创建模型。

单独的模型不是很有用,我假设您想加载模型以读取其内容、修改它们、查询它们等。首先要知道的是 EMF 模型作为 XMI 文件(名称.xmi)。全局扩展名是“xmi”,但在 genmodel 中,您可以使用您的或引用的扩展名(假设是“soq”)。 XMI 是 XML 的扩展,因此如果您使用文本编辑器查看 XMI 文件,它看起来就像一个 XML。加载一个 emf 模型的基本代码是:

ResourceSet resourceSet = new ResourceSetImpl();
URI uri = URI.createURI("file:/c:/data/model.soq"); 
Resource resource = resourceSet.createResource(uri);
try 
{ 
    resource.load(null); 
    System.out.println("loaded"); 
} 
catch (IOException e) 
{ 
    System.out.println("failed to read " + uri); 
} 

资源现在将包含模型的所有元素。它们中的每一个都将是 genmodel 生成的相应 java 类的实例。要获取资源(元素)的内容,您可以遍历resource.getContents()resource.getAllContents(),不同之处在于后者将遍历所有模型内容,前者仅遍历第一级。然后,例如,您可以测试类型并做一些事情:

for (EObject eo : resource.getAllContents()) {
    if (eo instanceof MyEmfClass2) {
        System.out.println("Found an element of MyEmfClass2");
    }
}

您可以做的另一件事是创建元模型类的实例并将它们添加到资源中。例如,您可以这样做以通过从另一个源(db、文件)读取信息来生成模型:

MyEmfClass2 c2 = soqFactory.createMyEmfClass2 ();
c2.name = otherDataSource.name;
ResourceSet resourceSet = new ResourceSetImpl(); 

URI uri = URI.createURI("file:/c:/data/newm.soq"); 
Resource resource = resourceSet.createResource(uri); 
resource.getContents().add(c2); 
try 
{ 
    resource.save(null); 
    System.out.println("saved"); 
} 
catch (IOException e) 
{ 
    System.out.println("failed to write " + uri); 
}

请注意,具体的工厂名称和方法取决于您的元模型。此代码还假设您从 Eclipse 运行时应用程序运行(也就是说,您的 metamodel 插件安装在 Eclipse IDE 中)。如果您想在没有运行时 eclipse 的情况下运行或在独立环境中运行,则需要采取额外的预防措施:

EcorePackage.eINSTANCE.eClass();    // Makes sure EMF is up and running
resourceSet.getResourceFactoryRegistry().getExtensionToFactoryMap(). 
put("soq", new XMIResourceFactoryImpl());  // make sure EMF knows how to load your models
YourPackage.eINSTANCE.eClass();    // Makes sure all your factories are registered and classes loaded

EMF 元模型和生成的代码只是一个“数据模型”。所以开箱即用它只会帮助您存储和操作数据。任何额外的功能都必须围绕它进行编码。

最后一点,Eclipse 站点上的 EMF Forum 拥有一个活跃的社区,与 Stackoverflow 相比,EMF 开发人员更有可能在那里监控问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-20
    • 2011-05-01
    • 1970-01-01
    • 2015-07-04
    • 2020-12-16
    • 2012-05-20
    • 2020-06-02
    相关资源
    最近更新 更多