在XTend中加载EMF Model实例

时间:2012-09-17 12:08:03

标签: xmi metamodel emf xtend

我正在XTend中构建一个代码生成器,我已经有了一个输入模型和元模型。也就是说,我使用ATL为我的XTend代码生成器生成输入模型(作为转换序列的一部分,逐渐降低抽象级别,而不是立即降低;这就是我不使用xtext创建语法的原因)

所以非常清楚,我的代码生成器输入模型是一个XMI格式的文件,而不是xtext项目的语法(甚至没有使用它)!而且我认为这会给我带来麻烦/困惑。

我使用现有模型创建了一个新的XText项目,右键单击.text文件,运行为,生成人工制品,然后我对mwe2文件执行相同的操作。

下一步是什么,我做得对吗?如何启动代码生成器?所有示例都来自您使用XText创建DSL的POV。我有一个EMF元模型,以及一个基于XMI的实例。如何使用XTend进一步处理?

教程的任何提示或指针都很有帮助。

解决方案:

解决方案正如Sven在我接受的答案中所建议的那样,但我还要注意,您需要使用genmodel从元模型生成Java工件。此链接显示了如何:http://www.vogella.com/articles/EclipseEMF/article.html,请参阅第4节。这可能看起来太符合逻辑,但我认为无论如何都值得注意。

1 个答案:

答案 0 :(得分:19)

如果您有XMI并且只想从中生成代码,则根本不需要Xtext。 刚开始使用Java项目(我使用插件项目,重用依赖项管理)并开始编码:

import org.eclipse.emf.common.util.URI
import org.eclipse.emf.ecore.EPackage
import org.eclipse.emf.ecore.resource.Resource$Factory$Registry
import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl
import org.eclipse.emf.ecore.xmi.impl.XMIResourceFactoryImpl

class MyCodeGenerator {

  def static void main(String[] args) {
    new MyCodeGenerator().generate("mymodel.xmi")
  }

  def generate(String file) {
    doEMFSetup
    val resourceSet = new ResourceSetImpl
    val resource = resourceSet.getResource(URI.createURI(file), true)
    for (content : resource.contents) {
      generateCode(content)
    }
  }

  def dispatch generateCode(MySpecialType it) '''
    public class «name» {
      «FOR member : members»
      «ENDFOR»
    }
  '''

  def dispatch generateCode(MyMember it) '''
    private «type» «name»;
    ...
  '''

  def doEMFSetup() {
//    EPackage$Registry.INSTANCE.put(MyPackage.eINSTANCE.nsURI, MyPackage.eINSTANCE)
    Resource$Factory.Registry.INSTANCE.extensionToFactoryMap.put("xmi", new XMIResourceFactoryImpl);
  }

}

您需要添加到Manifest的依赖项:

Require-Bundle: org.eclipse.xtend.lib,
 com.google.guava,
 org.eclipse.xtext.xbase.lib,
 org.eclipse.emf.common,
 org.eclipse.emf.ecore,
 org.eclipse.emf.ecore.xmi