基本概念(資源,的ResourceSet,資源工廠和註冊表):
前回答這個問題,我會解釋的Ecore API的一些概念。前兩個概念是Resource和ResourceSet。資源是持久性資源(如ecore文件)的程序級別表示,ResourceSet只是一組這樣的資源。每個ecore元模型文檔以及一個模型文檔(符合其元模型)是一種資源。因此,使用這些文件的第一步是提供它們的程序級別表示,作爲resourceSet中的資源。
另外兩個概念是Resource Factory和Registry。工廠類用於生成資源,註冊管理機構在resourceSets中跟蹤這些工廠的列表。根據我們資源的存儲方式,我們可以使用不同的工廠來操作它們。例如,EcoreResourceFactoryImpl,XMLResourceFactoryImpl,和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());
上面兩行的代碼簡單地註冊EcoreResourceFactoryImpl和XMIResourceFactoryImpl作爲分別的ecore和XMI文件工廠(注意ecore和xmi是那裏的文件擴展名)。我認爲我的元模型文件擴展名是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);
回答此問題(https://www.eclipse.org/forums/index.php?&t=msg&th=126417)。如果我可以繼續,我會嘗試使用它,並會將詳細信息和乾淨的代碼作爲答案發布。 – qartal
我還在想,如果有人對「ps」有什麼想法。問題的一部分。 – qartal