使用自定义ecore元模型进行加速转换

时间:2015-05-19 19:28:39

标签: eclipse eclipse-emf-ecore metamodel acceleo

首先,我是eclipse的建模功能的新手,所以这个问题可能很简单,但我正在寻找几天并且没有找到答案。

我创建了一个带有ecore建模项目的ecore元模型文件。 URI是这样的:/com.auth.dotnetPSM.PSMmodel/model/PSMMetamodel.ecore

我还生成了(通过ATL转换)xmi模型文件。第一个元素是这样的:

<?xml version="1.0" encoding="ISO-8859-1"?>
<RESTfulServicePSM
    xmi:version="2.0" 
    xmlns:xmi="http://www.omg.org/XMI" 
    xmlns="/com.auth.dotnetPSM.PSMmodel/model/PSMMetamodel.ecore" 
    name="WSAT">

在ATL项目中,一切都按预期工作。

现在我需要使用Acceleo创建M2T转换。所以对于初学者,我创建了两个模块,一个主要的:

[comment encoding = UTF-8 /]

[module PsmToCode('/com.auth.dotnetPSM.PSMmodel/model/PSMMetamodel.ecore')]
[import org::eclipse::acceleo::psm2code::files::ResourceModelClasses/]

[template public PsmToCode(aRESTfulServicePSM : RESTfulServicePSM)]
[comment @main/]
[for ( aCSharpResourceModel : CSharpResourceModel | aRESTfulServicePSM.hasCSharpRModel)]
        [aCSharpResourceModel.generateResourceModelClasses()/]
 [/for]
[/template]

另一个:

[comment encoding = UTF-8 /]
[module ResourceModelClasses('/com.auth.dotnetPSM.PSMmodel/model/PSMMetamodel.ecore')]

[template public generateResourceModelClasses(aCSharpResourceModel : CSharpResourceModel)]

[file (aCSharpResourceModel.parentName.toUpperFirst().concat('.cs'), false, 'UTF-8')]

[/file]
[/template]

当我运行时,我得到Package with uri '/com.auth.dotnetPSM.PSMmodel/model/PSMMetamodel.ecore' not found. (file:/H:/Users/doumas/workspace/PIM2PSM/WSATPSM.xmi, 6, 15)例外。我做错了什么?

提前致谢。

2 个答案:

答案 0 :(得分:3)

您的元模型可能有.ecore,但您没有生成元模型代码(使用.genmodel)。当您尝试使用EMF工具(Acceleo / QVT等)打开.xmi文件时,会出现错误。所以,这里有很多要点;)。

您可以处理元模型的静态或动态实例。

静态实例

生成元模型的代码时生成静态实例(使用.genmodel),将项目注册为插件,并创建符合部署的元模型的模型。在这种情况下,您的元模型被部署为Eclipse插件,并且当Eclipse加载插件时,您的元模型将在全局注册表中注册。在开发模式例程中,定义元模型和开发元素的最简单方法是处理两个 eclipse实例。第一个(我将其称为&#34;原始&#34;实例)是您的元模型项目所在的那个。第二个是通过原始实例的run new eclipse configuration菜单启动的(我将其称为&#34; new&#34;实例)。所以,这是例程:

  1. 您创建了元模型
  2. 您生成与您的元模型相关联的.genmodel
  3. 您生成元模型代码
  4. 你推出了新的&#34;原始实例中的eclipse实例
  5. 您将通过file->new->other->Example Model EMF Creation Wizard->your_stuff向导创建模型
  6. 现在,您的模型已创建,并且您的元模型已在全局注册表中注册,因此Acceleo文件将很好地编译,您的模型将可由任何符合EMF的应用程序打开/重新编译,无需额外的工作。这种方法很长,但也是最简单的方法。

    如果您只想处理一个Eclipse实例,并且生成了元模型代码,那么您也可以执行此操作:

    1. 将您的加速项目链接到元模型项目
    2. 修改Acceleo生成的java文件,并在registerPackages方法中添加: resourceSet.getPackageRegistry().put(SomethingPackage.eINSTANCE.getNsURI(), SomethingPackage.eINSTANCE);
    3. 这将注册您的元模型,并且Acceleo转换应该没有任何问题。但是,如果您将Acceleo项目链接到元模型项目,我不确定是否需要此手动步骤。我认为如果元模型项目在同一个工作区中,Acceleo可以自己处理元模型(但是,如果你可以手动完成)。

      动态实例

      在您描述的情况下,您正在处理动态实例。这意味着不生成元模型代码。 ATL可以处理动态实例,这就是为什么你能够生成.xmi的原因。顺便说一下,您可以通过打开元模型来创建.xmi,选择您的根EClass并点击right_click->Create dynamic instance...

      如果要处理此类实例,则必须手动为Acceleo注册元模型。为此,您必须修改Acceleo生成的java文件,并将其添加到registerPackages方法中:

      File file = new File("path/to/your/metamodel.ecore"); 
      EObject obj = ModelUtils.load(file, resourceSet); 
      resourceSet.getPackageRegistry().put("metamodel_ns_uri", obj); 
      

      ModelUtils来自org.eclipse.acceleo.common.utils) 使用此功能,您可以使用动态实例从Acceleo生成代码。

      此外,只需快速了解Acceleo,如果您的RESTfulServicePSM实例无法生成代码,您可以直接将@main注释直接放在generateResourceModelClasses模板上。 Acceleo引擎将自己迭代每个CSharpResourceModel个实例。哦,您可以在许多模板上放置许多@main注释,它们将被评估;)。

      编辑&gt; 我刚看到你的问题已经解决了,我应该看看。对不起,很长的帖子。

答案 1 :(得分:0)

简而言之,您需要使用.genmodel“生成模型代码”。