如何使用Java加载纸莎草uml模型?

时间:2015-12-03 00:50:11

标签: java uml emf papyrus

我使用纸莎草创建了一个类图,我得到了一个* .uml模型。现在我想通过编写一些Java代码来遍历* .uml元素。

我试过这段代码:

URI uri = URI.createURI("*.uml");

ResourceSet set = new ResourceSetImpl();

set.getPackageRegistry().put(UMLPackage.eNS_URI, UMLPackage.eINSTANCE);
set.getResourceFactoryRegistry().getExtensionToFactoryMap()
       .put(UMLResource.FILE_EXTENSION, UMLResource.Factory.INSTANCE);
EPackage.Registry.INSTANCE.put(UMLPackage.eNS_URI, UMLPackage.eINSTANCE);
Resource.Factory.Registry.INSTANCE.getExtensionToFactoryMap()
       .put("uml", UMLResource.Factory.INSTANCE);

set.getResourceFactoryRegistry().getExtensionToFactoryMap()
       .put("xmi", new XMIResourceFactoryImpl());
//set.createResource(uri);
Resource res = set.getResource(URI.createURI(new URL("*.uml").toString(),true),true);

但我有例外:

  

线程中的异常" main" java.lang.NoSuchMethodError:   org.eclipse.emf.ecore.resource.URIConverter.createInputStream(   Lorg /蚀/电动势/普通/ util的/ URI; Ljava / util的/地图;)Ljava / IO / InputStream的;

如何使用Java加载纸莎草uml模型?

1 个答案:

答案 0 :(得分:6)

你几乎拥有所有东西,它只缺少一些细节,而且有一些线要删除。

但首先,.uml文件与Papyrus没有直接关系。 Papyrus能够生成.uml个文件,但它们不仅仅是Papyrus文件。此文件扩展名由UML插件管理,该插件提供UML元模型(在Ecore中定义),它的实现以及处理这些文件的不同工具。

如果我们接受您的代码:

ResourceSet set = new ResourceSetImpl();
set.getPackageRegistry().put(UMLPackage.eNS_URI, UMLPackage.eINSTANCE);
set.getResourceFactoryRegistry().getExtensionToFactoryMap()
   .put(UMLResource.FILE_EXTENSION, UMLResource.Factory.INSTANCE);
Resource.Factory.Registry.INSTANCE.getExtensionToFactoryMap()
   .put(UMLResource.FILE_EXTENSION, UMLResource.Factory.INSTANCE);

此部分应足以将​​UML元模型及其工厂注册到ResourceSet

这一行:

EPackage.Registry.INSTANCE.put(UMLPackage.eNS_URI, UMLPackage.eINSTANCE);
只要您使用set加载模型,就不需要

Registry中包含的包ResourceSetImpl是层次结构:如果找不到链接到元模型URI的元模型包实例,它会尝试在全局EPackage.Registry中找到它。因此,您可以在全局注册表中注册绑定(URI string, EPackage instance),也可以在ResourceSet实例中注册绑定。两者都不是必需的。

此外,在您的情况下,xmi工厂注册也不是必需的。

最后,使用来自getResource的{​​{1}}的资源加载几乎是好的,这是修改后的版本:

ResourcetSet

此片段创建一个Resource res = set.getResource(URI.createFileURI("/path/to/my_model.uml"), true); ,指向磁盘上的文件并加载它。然后,您可以使用URI方法从资源中访问元素。

getContents()

另外,尽量使用res.getContents().get(0); // For example to get the root of your model. UMLUtilUML2Util静态类,它提供了很多查找/复制/过滤元素的工具。

这是我使用的最终片段:

EcoreUtil

编辑>问题的大部分是使用的EMF版本。从EMF 2.3到> 2.4修复了异常抛出。其余的答案仍然有效,以便清理不必要的代码。