当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《如何使用Java加载纸莎草uml模型?》经验,为你挑选了1个好方法。

我使用纸莎草创建了一个类图,我得到了一个*.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/eclipse/emf/common/util/URI; Ljava/util/Map;)Ljava/io/InputStream ;

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



1> Vincent Aran..:

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

但首先,.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);

这部分应该足以将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修复了异常抛出.其余的答案仍然有效,以清理不必要的代码.

推荐阅读
wurtjq
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有