eclipse - 使用自定义 ecore 元模型进行 Acceleo 转换

标签 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 转换。所以对于初学者,我创建了两个模块,一个 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)异常(exception)。我究竟做错了什么?

提前致谢。

最佳答案

你可能有 .ecore为您的元模型,并且您没有生成元模型代码(使用 .genmodel )。当您尝试打开 .xmi 时出现错误。使用 EMF 工具(Acceleo/QVT...等)创建文件。所以,这里有很多要点;)。
您可以处理元模型的静态或动态实例。
静态实例
当您生成元模型的代码(使用 .genmodel ),将项目注册为插件并创建符合已部署元模型的模型时,会生成静态实例。在这种情况下,您的元模型被部署为 Eclipse 插件,并且当 Eclipse 加载插件时,您的元模型在全局注册表中注册。在您的开发模式例程中,定义元模型并围绕它开发东西的最简单方法是处理 两个 eclipse 实例。第一个(我将其称为“原始”实例)是您的元模型项目所在的那个。第二个是通过run new eclipse configuration发起的。来自原始实例的菜单(我将其称为"new"实例)。所以,这里是例程:

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

  • 现在,您的模型已创建,并且您的元模型已在全局注册表中注册,因此 Acceleo 文件将编译良好,并且您的模型将可由任何符合 EMF 的应用程序打开/读取,而无需额外工作。这个方法很长,但也是最简单的。
    如果您只想处理一个 Eclipse 实例并且生成了元模型代码,您还可以执行以下操作:
  • 将您的 acceleo 项目链接到您的元模型项目
  • 修改Acceleo生成的java文件,添加到registerPackages方法:resourceSet.getPackageRegistry().put(SomethingPackage.eINSTANCE.getNsURI(), SomethingPackage.eINSTANCE);

  • 这将注册您的元模型,并且 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 生成代码。
    此外,如果您的 RESTfulServicePSM实例不会生成代码,你可以直接把你的@main您的 generateResourceModelClasses 上的注释直接模板。 Acceleo 引擎将迭代每个 CSharpResourceModel实例本身。哦,你可以放很多@main许多模板上的注释,它们将被评估;)。
    编辑>
    我刚刚看到你的问题已经解决了,我应该看看。对不起,很长的帖子。

    关于eclipse - 使用自定义 ecore 元模型进行 Acceleo 转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30334503/

    相关文章:

    hibernate - javac 8 元模型生成错误(hibernate-jpamodelgen)

    java - 如何使用 Gradle 5.x 生成 JPA 元模型

    java - JDBC 无法解析为 Eclipse 中的变量

    java - 如何通过eclipse插件连接服务器并执行操作

    java - 使用 EMF 加载 XML 文件时 "Package with uri ' null ' not found"

    java - 将 eclipse.emf.ecore.xmi.impl.XMIResourceImpl 转换为 eclipse.emf.ecore.resource.Resource$Factory

    java - 从mysql数据库填充选择框

    eclipse - Gradle:从子项目中递归执行调用根任务

    java - 从 EContentAdapter 更新 UI 的正确方法

    spring - 通过maven生成JPA 2.0元模型而不需要persistence.xml?