我想在我的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]
但是当我运行加速模板时,我收到了这个错误:
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&gt;?&gt;),我应该调用它两次,每个模型一次?像:
initialize(modelURI, targetFolder, arguments);
initialize(modelURI2, targetFolder, arguments);
然后,在我的Generate()构造函数中模仿超实现中的代码:
//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()构造函数中做了什么吗?
答案 0 :(得分:2)
你想要做的事情确实可以使用Acceleo,但它不是生成的启动器所期望的“默认”情况。
您必须将生成的java类的“generate”方法标记为“@generated NOT”(或者从其javadoc中删除“@generated”注释)。在这个方法中,你需要做的是模仿超级实现的行为(在AbstractAcceleoLauncher中),加载两个模型而不是一个模型并将它们传递给AcceleoService#doGenerate。
换句话说,您需要查看API Acceleo提供的代码,并以适合您需要的方式使用它。我们生成的java启动程序和AcceleoService类提供了一个适合一般用例的示例。可以通过遵循这些样本来改变行为。
答案 1 :(得分:0)
您不需要修改Generate.java类。默认情况下,它应该允许您执行代码生成。
您需要创建一个启动配置并在此启动配置中提供正确的参数(进程和定义),这就是全部。
我不理解'client.xmi'URL是你模块的第一个参数。看起来它是你的模型文件,如果是这样,从参数中删除它,它必须只包含你的元模型URI。