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.
現在、引数として2つのモデルを使用できないため、Javaランチャー(generate.java)を変更する必要があると思います。どのようにするか知っていますか?ありがとう!
**ケリンディルの提案から編集:
何かを変更する前に、それが正しく理解されているかどうかを知るために、Generate()コンストラクターを変更しようとしています。私はそれを変更しました:
//MODIFIED CODE
public Generate(URI modelURI, URI modelURI2, File targetFolder,
List<? extends Object> arguments) {
initialize(modelURI, targetFolder, arguments);
}
一般的なケースでは、AbstractAcceleoGenerator.initialize(URI、File、List>?>)を呼び出すことがわかりますが、モデルごとに1回ずつ、2回呼び出す必要がありますか?お気に入り:
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()コンストラクターでこのメソッドが実行していることを模倣してみませんか?