2015-12-03 66 views
3

我使用紙莎草紙創建了一個類圖,並且我有一個* .uml模型。現在我想通過編寫一些Java代碼來遍歷* .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

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;

如何裝入紙莎草的UML模型?

回答

5

你幾乎擁有了所有的東西,它只遺漏了一些細節,並且有一些線條可以刪除。

但首先,.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.Registry中找到它。因此,您要麼在全局註冊表中註冊綁定(URI string, EPackage instance),要麼將您的綁定註冊到您的ResourceSet實例中。兩者都不是必需的。

此外,xmi工廠註冊也不是你所需要的。

最後,使用從ResourcetSetgetResource資源負載幾乎是好的,下面是修改的版本:

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固定異常拋出。其餘的答案仍然有效,以清理不必要的代碼。

+0

謝謝你的答案,我試過你的代碼,但我得到一個異常: 線程「主」的異常java.lang.NoSuchMethodError:org.eclipse.emf.ecore.resource.URIConverter.createInputStream(Lorg/eclipse /電動勢/普通/ util的/ URI; Ljava/util的/地圖;)Ljava/IO/InputStream的; \t在org.eclipse.emf.ecore.xmi.impl.XMLHandler.getPackageForURI(XMLHandler.java:2534) \t在org.eclipse.emf.ecore.xmi.impl.XMLHandler.getFactoryForPrefix(XMLHandler.java:2422) \t at org.eclipse.emf.ecore.xmi.impl.XMLHandler.createObjectByType(XMLHandler.java:1299) – Ahmadkt

+0

似乎您的依賴關係存在問題,您使用的是哪種版本的EMF? –

+0

我在我的項目中使用這些emf jar包: eclipse-emf-ecore-2.3.1.jar org.eclipse.emf.common-2.8.0.v20130125-0546.jar org.eclipse.emf。 ecore.xmi.jar org.eclipse.emf.ecore-2.8.1.v20120911-0500.jar org.eclipse.uml2.common_1.7.0.v20120913-1441.jar org.eclipse.uml2.types_1.0.0。 v20120913-1441.jar org.eclipse.uml2.uml.resources-3.1.0.v201005031530.jar org.eclipse.uml2.uml_4.0.1.v20120913-1441.jar 感謝您的幫助.. – Ahmadkt