3

我使用纸莎草创建了一个类图,并得到了一个 *.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);

但我有例外:

线程“主”java.lang.NoSuchMethodError 中的异常:org.eclipse.emf.ecore.resource.URIConverter.createInputStream(Lorg/eclipse/emf/common/util/URI;Ljava/util/Map;)Ljava/io/InputStream ;

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

4

1 回答 1

6

你几乎得到了所有东西,它只遗漏了一些细节,并且有一些线条需要删除。

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

如果我们采用您的代码:

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您的情况也不需要工厂注册。

最后,使用getResourcefrom的资源加载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.

另外,尽量使用UMLUtil,UML2UtilEcoreUtil静态类,它提供了很多工具来查找/复制/过滤...元素

这是我使用的最后一个片段:

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);

Resource res = set.getResource(URI.createFileURI("/path/to/my_model.uml"), true);

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

于 2015-12-03T08:39:31.950 回答