如何通过EMF中的代码实现模型? (Eclipse Modeling Framework)

时间:2014-12-05 23:37:30

标签: java implementation emf

我在EMF中创建了一个模型。我还设法从它生成代码(.genmodel文件),我查看了文件,我有点了解模型的实现,编辑和编辑插件。 但我无法理解,我如何通过代码创建自己的元模型实例。我理解代码编写的方式,但我不知道现在放在哪里我自己的东西所以它会被调用。 希望这里的任何人都可以帮助我,因为在stackoverflow上没有真正讨论的EMF线程。 问候,我

1 个答案:

答案 0 :(得分:0)

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

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

它的模型bylef并不是非常有用,我假设你想加载模型来读取它的内容,修改它们,查询它们等。首先要知道的是,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,file)读取信息来生成模型:

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运行时应用程序运行(即,您的metmodel插件安装在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有一个活跃的社区,EMF开发人员更有可能监控那里的问题而不是Stackoverflow。