当前位置: 首页 > 知识库问答 >
问题:

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

叶鸿煊
2023-03-14

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

但我有例外:

共有1个答案

段干茂实
2023-03-14

你已经得到了几乎所有的东西,它只遗漏了很少的细节,还有一些线条需要删除。

但是首先,.uml文件与纸莎草没有直接的关系。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);

这一行:

EPackage.Registry.INSTANCE.put(UMLPackage.eNS_URI, UMLPackage.eINSTANCE);

只要使用set加载模型,就不需要。包含在ResourceSetIMPL中的包Registry是分层的:如果它找不到链接到元模型URI的元模型包实例,它会尝试在全局的ePackage.Registry中找到它。因此,您可以在全局注册表中注册绑定(URI字符串、EPackage实例)或者在ResourceSet实例中注册绑定。两者都不是必需的。

此外,在您的情况下也不需要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版本。从EMF2.3到>2.4修复了异常抛出。为了清除不需要的代码,答案的其余部分仍然有效。

 类似资料:
  • 问题内容: 我有一个处理多部分表单发布的servlet。该帖子实际上是由嵌入在页面中的Flash文件上传组件发布的。在某些浏览器中,Flash生成的POST不包含JSESSIONID,这使我无法在发布期间从会话中加载某些信息。 Flash上​​载组件的确在特殊格式字段中包含cookie和会话信息。使用此表单字段,我实际上可以检索JSESSIONID值。问题是,我不知道如何使用此JSESSIONID

  • 问题内容: 我已经在服务器上加载了一个CSS文件,所以我有一个URL。如何使用JQuery将其加载到我的Perl代码中? 所以目前我正在对梅森页面中的css进行硬编码,而该页面中缺少这样的内容 我想避免对此CSS进行硬编码? 问题答案: 我不明白为什么您不能只在该部分中插入元素,但这是一个jQuery代码片段:

  • 问题内容: 在Java中,我可以向类路径中动态添加内容并加载类(“动态”的意思是无需重新启动应用程序)。是否有一个已知的框架/库可以处理模块的动态加载/卸载而无需重新启动? 通常的设置是负载平衡器,应用程序的多个实例以及逐步部署和重新启动新版本(尤其是对于Web应用程序)。我正在寻找其他东西- 具有多个服务/插件的应用程序,可能是单实例桌面应用程序,在其中禁用单个服务很便宜,但是关闭或重新启动完整

  • 问题内容: 我想加载IPython外壳(不是IPython笔记本),可以在其中通过命令行使用PySpark。那可能吗?我已经安装了Spark 1.4.1。 问题答案: 如果使用Spark <1.2,则可以简单地使用环境变量执行。 要么 尽管以上内容仍可在Spark 1.2及以上版本上正常使用,但建议为这些版本设置Python环境的方法是 要么 您可以替换为您选择的解释器的路径。

  • 我是flutter的新手,上周才开始。我正在从在线课程中学习,然后我想在我的flutter应用程序中加载一个图像。但有一个错误是: