2015-05-04 51 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);