eclipse-emf - 在 Acceleo 中加载 2 个不同的输入模型

标签 eclipse-emf acceleo emf

我想在我的 Acceleo 主模板中加载 2 个不同的输入模型(一个 .bpel 和一个 .wsdl)。

我加载了 bpel 和 wsdl 的 ecore 元模型,我希望能够使用这样的东西:

[comment encoding = UTF-8 /]
[module generate('http:///org/eclipse/bpel/model/bpel.ecore','http://www.eclipse.org/wsdl/2003/WSDL')/]

[import org::eclipse::acceleo::module::sample::files::processJavaFile /]

[template public generate(aProcess : Process, aDefinition : Definition)]
[comment @main /]
    Process Name : [aProcess.name/]
    Def Location : [aDefinition.location/]  

[/template]

但是当我运行 acceleo 模板时,我收到此错误:

An internal error occurred during: "Launching Generate".
Could not find public template generate in module generate.

我想我必须修改java启动器(generate.java),因为现在它不能接受2个模型作为参数。你知不知道怎么? 谢谢!

** Kellindil 建议的编辑:

在修改内容之前,只是想知道我是否理解正确: 我正在尝试修改Generate()构造函数。 我将其更改为:

//MODIFIED CODE
public Generate(URI modelURI, URI modelURI2, File targetFolder, 
                List<? extends Object> arguments) {
initialize(modelURI, targetFolder, arguments);
}

在一般情况下,我可以看到它调用 AbstractAcceleoGenerator.initialize(URI, File, List>?>),我应该调用它两次,每个模型一次吗?像:

initialize(modelURI, targetFolder, arguments);
initialize(modelURI2, targetFolder, arguments);

然后,在我的Generate()构造函数中模仿 super 实现中的代码:

//NON MODIFIED ACCELEO CODE 
Map<String, String> AbstractAcceleoLauncher.generate(Monitor monitor) {
File target = getTargetFolder();
if (!target.exists() && !target.mkdirs()) {
        throw new IOException("target directory " + target + " couldn't be   created."); //$NON-NLS-1$ //$NON-NLS-2$
    }
    AcceleoService service = createAcceleoService();
    String[] templateNames = getTemplateNames();
    Map<String, String> result = new HashMap<String, String>();
    for (int i = 0; i < templateNames.length; i++) {
        result.putAll(service.doGenerate(getModule(), templateNames[i], getModel(), getArguments(),
                target, monitor));
    }

    postGenerate(getModule().eResource().getResourceSet());
    originalResources.clear();

    return result;
}

我该怎么办?我应该在调用initialize()之后尝试模仿此方法在Generate()构造函数中执行的操作吗?

最佳答案

您想要做的事情确实可以通过 Acceleo 实现,但这不是生成的启动器所期望的“默认”情况。

您必须将生成的 java 类的“generate”方法标记为“@ generated NOT”(或者从其 javadoc 中完全删除“@ generated”注释)。在此方法中,您需要做的是模仿 super 实现(在 AbstractAcceleoLauncher 中)的行为,加载两个模型而不是一个模型,并将它们传递给 AcceleoService#doGenerate。

换句话说,您需要查看 Acceleo 提供的 API 来生成代码,并以适合您需要的方式使用它。我们生成的 java 启动器和 AcceleoService 类提供了适合一般用例的示例。可以通过遵循这些示例来更改行为。

关于eclipse-emf - 在 Acceleo 中加载 2 个不同的输入模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11782134/

相关文章:

eclipse - 创建 Acceleo 插件时出错 : failed to create task or type apitooling. apigeneration

java - 无法从 Java 独立项目中的 ATL EMFTVM 转换读取模块

eclipse-emf - 在 FOR 循环内递增变量

java - EMF:生成编辑器代码

eclipse - 什么是 Eclipse 建模框架?

url - 将 java.net.URI 转换为 org.eclipse.emf.common.util.URI

eclipse-emf - 我可以制作一个 Ecore 元模型来使模型能够引用 Java 类吗?

java - 在 acceleo 中使用注释的问题

eclipse - 异常加载 EMF 文件