2015-05-04 95 views
0
修改的Ecore文件及其實例

我的問題有兩個部分:創建並從代碼

1)如何創建和/或修改,然後從商店EMF的Ecore文件(的Ecore元模型與.ecore後綴)我的Scala/Java代碼?

2)如何從我的scala/java代碼創建和/或修改ecore文件(即符合ecore元模型的模型)實例?

我期待看看是否有一些可能的方法來做到這些,其他使用XML API直接操縱相應的XML文件。

提供代碼spinet或引用它非常讚賞。

ps。作爲背景思想,我想知道是否可以使用單個API來執行上述兩項任務,因爲我們可以將ecore文件看作Ecore.ecore的模型/實例。

+0

回答此問題(https://www.eclipse.org/forums/index.php?&t=msg&th=126417)。如果我可以繼續,我會嘗試使用它,並會將詳細信息和乾淨的代碼作爲答案發布。 – qartal

+0

我還在想,如果有人對「ps」有什麼想法。問題的一部分。 – qartal

回答

5

基本概念(資源,的ResourceSet,資源工廠和註冊表):

前回答這個問題,我會解釋的Ecore API的一些概念。前兩個概念是ResourceResourceSet。資源是持久性資源(如ecore文件)的程序級別表示,ResourceSet只是一組這樣的資源。每個ecore元模型文檔以及一個模型文檔(符合其元模型)是一種資源。因此,使用這些文件的第一步是提供它們的程序級別表示,作爲resourceSet中的資源。

另外兩個概念是Resource FactoryRegistry。工廠類用於生成資源,註冊管理機構在resourceSets中跟蹤這些工廠的列表。根據我們資源的存儲方式,我們可以使用不同的工廠來操作它們。例如,EcoreResourceFactoryImplXMLResourceFactoryImpl,和XMIResourceFactoryImpl是工廠實現的一些實例中,可用於處理,分別E字形芯XML,和XMI文件。如果我們想要使用這些工廠來處理資源集中的資源,我們需要先將它們放入resourceSet的註冊表列表中。所以,對於我上面提到的每個資源集,都有一個註冊表列表。讓我們看看如何在Java代碼中加載和修改ecore文件(元模型)和實例文件(模型)。

首先,我們需要創建的ResourceSet來代表我們執着的資源,我們願一起工作:在此的ResourceSet的註冊表

ResourceSet resourceSet = new ResourceSetImpl(); 

然後,我們需要註冊我們想與之合作的工廠:

resourceSet.getResourceFactoryRegistry().getExtensionToFactoryMap().put("ecore", new EcoreResourceFactoryImpl()); 
resourceSet.getResourceFactoryRegistry().getExtensionToFactoryMap().put("xmi", new XMIResourceFactoryImpl()); 

上面兩行的代碼簡單地註冊EcoreResourceFactoryImplXMIResourceFactoryImpl作爲分別的ecore和XMI文件工廠(注意ecorexmi是那裏的文件擴展名)。我認爲我的元模型文件擴展名是ecore,我的模型文件擴展名是xmi。

註冊這些工廠後,我們現在可以問我們的ResourceSet加載我們metamode(即Ecore的)文件,如下:

Resource myMetaModel= resourceSet.getResource(URI.createFileURI("./univ.ecore"), true); 

univ.ecore是我的Ecore文件的名稱。

對於加載模型文件,我們需要邁出一步!我們需要先在我們的resourceSet中註冊一件事。那就是將我們ecore元模型的包註冊到我們資源集的包的註冊表列表中。這樣做,我們需要先拿到我們的Ecore包的編程水平表示波紋管:

EPackage univEPackage = (EPackage) myMetaModel.getContents().get(0); 

,然後在我們的資源的registry list of packages設置如下注冊這個包:

resourceSet.getPackageRegistry().put("http://gholizadeh.org", univEPackage); 

我們現在準備加載我們的模型(xmi文件)。我們用下面的代碼是:

Resource myModel = resourceSet.getResource(URI.createURI("./univModel.xmi"), true); 

現在我們既帶來了我們metamode和模型文件到編程水平,我們可以簡單地操作這些代碼。

更改元模型:

例如,在一個Ecore的文件中創建一個新的類,我們使用EcoreFactory API:我們第一次獲得這個類,如下的一個實例:

EcoreFactory theCoreFactory = EcoreFactory.eINSTANCE; 

然後創建一個如下的EClass:

EClass adultEClass= theCoreFactory.createEClass(); 

然後爲了保留這個類,我們需要添加它到第我們裝的Ecore包分類電子名單波紋管:

univEPackage.getEClassifiers().add(adultEClass); 

換做你需要更熟悉ecore API aditional的變化。

更改型號:

改變一個模型,我們需要創建類型EObject對象。與上面的EcoreFactory類似,我們需要一個工廠來完成這個工作。但不是EcoreFactory,我們需要一個對象工廠。對於每個Ecore的包有EFactory類型的特定對象的工廠,我們可以得到如下所示:

EFactory univInstance = univEPackage.getEFactoryInstance(); 

注意univEPackage在上面的代碼,代表我們的Ecore包(見上文一些段落)。做完這些之後,我們準備爲我們的模型創建對象。例如

EObject adultObject = univInstance.create(adultEClass); 

在我們的模型中創建一個類型爲adultEClass的對象。請注意,爲了堅持這個新創建的對象,我們需要將其添加到我們的資源(代表我們的模型,即myModel)的內容中。由於我們的持久性文件是XMI格式,它只有一個根,我們需要把我們的所有對象的列表,並且這個列表加入到我們的資源:

EList<EObject> ModelObjects = new BasicEList<EObject>(); 
ModelObjects.add(adultObject); 

myModel.getContents().addAll(ModelObjects); 

存儲模型和元模型文件:

最後,在我們修改我們的元模型和模型元素之後,我們需要將它們再次存儲在相應的文件中。這隻需通過調用相應資源的save方法即可完成:

myModel.save(null); 

myMetaodel.save(null);