使用自定义核心元模型加速转换



首先,我对eclipse的建模特性不熟悉,所以这个问题可能是微不足道的,但我搜索了几天,还没有找到答案。

我已经用一个ecore建模项目创建了一个ecore元模型文件。URI是:/com.auth.dotnetPSM.PSMmodel/model/PSMMetamodel.ecore

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

<?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转换。因此,对于初学者,我创建了两个模块,一个main:

[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)异常。我做错了什么?

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

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

静态实例

静态实例是在您生成元模型的代码时产生的(使用.genmodel),您将项目注册为插件并创建符合您部署的元模型的模型。在这种情况下,您的元模型被部署为Eclipse插件,并且当Eclipse加载插件时,您的元模型在全局注册中心注册。在您的开发模式例程中,定义元模型并围绕它开发东西的最简单方法是处理两个 eclipse实例。第一个(我叫它"原始的")实例)是元模型项目所在的对象。第二个是通过run new eclipse configuration菜单从原始实例启动的(我将其命名为"new"实例)。下面是例程:

  1. 创建元模型
  2. 您生成链接到元模型的.genmodel 生成元模型代码
  3. 你启动你的"new"从原始的eclipse实例
  4. 通过file->new->other->Example Model EMF Creation Wizard->your_stuff向导创建模型

现在,您的模型已经创建,您的元模型已经在全局注册中心注册,因此Acceleo文件将被很好地编译,您的模型将可以被任何符合EMF的应用程序打开/读取,而无需额外的工作。这个方法很长,但也是最简单的。

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

  1. 链接你的加速项目到你的元模型项目
  2. 修改Acceleo生成的java文件,并将其添加到registerPackages方法中:resourceSet.getPackageRegistry().put(SomethingPackage.eINSTANCE.getNsURI(), SomethingPackage.eINSTANCE);

这将注册您的元模型,并且Acceleo转换应该没有任何问题地运行。但是,如果您将Acceleo项目链接到元模型项目,我不确定是否需要这个手动步骤。我认为如果元模型项目在同一工作空间中,Acceleo可以自己处理元模型(但在这种情况下,您可以手动完成)。

动态实例

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

如果你想处理这种类型的实例,你必须为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注释,它们会被评估;)。

EDIT>我刚看到你的问题解决了,我应该看看的。不好意思,写了这么久

总之,您需要使用.genmodel.

'生成模型代码'。

相关内容

  • 没有找到相关文章

最新更新