2

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()コンストラクターでこのメソッドが実行していることを模倣してみませんか?

4

2 に答える 2

3

あなたがやりたいことはAcceleoで確かに可能ですが、生成されたランチャーが期待する「デフォルト」のケースではありません。

生成されたJavaクラスの「generate」メソッドを「@generatedNOT」としてマークする必要があります(または、そのjavadocから「@generated」アノテーションを完全に削除します)。このメソッドでは、(AbstractAcceleoLauncherの)スーパー実装の動作を模倣し、1つではなく2つのモデルをロードして、AcceleoService#doGenerateに渡す必要があります。

つまり、コードを生成するためにAcceleoが提供するAPIを確認し、ニーズに合った方法で使用する必要があります。生成されたJavaランチャーとAcceleoServiceクラスは、一般的なユースケースに適合する例を提供するためにあります。動作の変更は、これらのサンプルに従うことで実行できます。

于 2012-08-06T08:00:13.567 に答える
0

Generate.javaクラスを変更する必要はありません。デフォルトでは、コード生成を実行できるはずです。

起動設定を作成し、この起動設定で正しい引数(プロセスと定義)を提供する必要があります。それだけです。

モジュールの最初の引数である「client.xmi」URIがわかりません。それはモデルファイルのように見えます。その場合は、メタモデルURIのみを含む必要がある引数から削除してください。

于 2012-08-03T15:31:18.140 に答える