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

问题描述:

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

我装两个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建议编辑:

只是为了,知道如果我的理解是正确的之前,我修改的东西: 我试图修改生成()构造函数。 我改变了它:

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

在一般情况下,我可以看到它调用AbstractAcceleoGenerator.initialize(URI,文件,目录>>?),我把它叫做两次,每次每个模型一次?像:

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

然后,在我的生成()构造模仿是在超执行代码:

//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”注释)。在这种方法中,你需要做的是模仿超级实现的行为(在AbstractAcceleoLauncher中),加载两个模型而不是一个,并将它们传递给AcceleoService#doGenerate。

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

+0

由于时间不够,我不确定我能够深入了解这一点,但我明白了。我设法将我的转换分成两个较小的转换,并避免了这个问题。 感谢提示Kellindll。 – AxA 2012-08-07 06:59:09

+0

嗨Kellindil,我编辑了这个问题,因为我可能会尝试做你所建议的我,我只是不确定了,如果我理解正确,你可以看看吗?谢谢 – AxA 2012-08-08 09:56:24

+0

不,你将不得不改变一切需要输入模型,并重新编写实现来考虑第二个模型。在“初始化”方法中,您需要在与第一个相同的资源集中加载第二个模型。然后,在“生成”方法中,您需要将调用改为“service.doGenerate”,以调用“doGenerateTemplate”,并使用包含两个模型的参数列表。你真正需要模仿的是这个“AcceleoService#doGenerate”方法。这不是一项简单的任务。 – Kellindil 2012-08-09 09:45:14

您应该不需要修改Generate.java类。默认情况下,它应该允许您执行代码生成。

您需要创建启动配置并在此启动配置中提供正确的参数(过程和定义),就这些了。

我不明白'client.xmi'URI是模块的第一个参数。它看起来像是你的模型文件,如果是这样的话,将它从参数中删除,参数只能包含你的元模型URI。

+0

您好劳伦,在启动配置的参数
,2个参数被自动填充Acceleo(见我添加图像链接): 1)输入模型:SimpleProcess。BPEL(我从中得到根元素aProcess:Process) 2)OUTPUT文件夹:... bpel2java/uni 我想添加的是另一种输入模型 3)第二个INPUT模型:SimpleProcessArtifacts.WSDL从中我想得到一个不同的根元素,定义:定义或aMessage:消息) 我应该在“程序参数”选项卡中添加第三个参数与我的第二个模型的路径? PS:我修正了client.xmi的URI – AxA 2012-08-04 11:53:12