gpt4 book ai didi

java - 如何使用 Java 加载 papyrus uml 模型?

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:42:22 27 4
gpt4 key购买 nike

我使用 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);

但我有异常:

Exception in thread "main" java.lang.NoSuchMethodError: org.eclipse.emf.ecore.resource.URIConverter.createInputStream( Lorg/eclipse/emf/common/util/URI;Ljava/util/Map;)Ljava/io/InputStream;

如何使用 Java 加载 papyrus uml 模型?

最佳答案

您几乎拥有所有内容,它只遗漏了一些细节,并且有一些行需要删除。

但首先,.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 加载您的模型。 ResourceSetImpl 中包含的包 Registry 是分层的:如果它找不到链接到元模型 URI 的元模型包实例,它会尝试在全局 EPackage 中找到它。注册表。因此,要么在全局注册表中注册绑定(bind) (URI string, EPackage instance),要么在 ResourceSet 实例中注册绑定(bind)。两者都不是必需的。

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

最后,使用 ResourcetSet 中的 getResource 加载资源就差不多好了,这里是修改后的版本:

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.

另外,尽量使用UMLUtilUML2UtilEcoreUtil静态类,它提供了很多便利查找/复制/过滤...元素

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

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 修复了异常抛出。为了清理不必要的代码,其余答案仍然有效。

关于java - 如何使用 Java 加载 papyrus uml 模型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34055936/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com