2012-08-02 2 views
1

Acceleo의 기본 템플릿에 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. 

자바 런타임 (generate.java)을 수정해야한다고 생각합니다. 지금은 인수로 2 개 모델을 사용할 수 없기 때문입니다. 어떻게 아십니까? 감사합니다.

** Kellindil 제안에서 편집 : 나는 바로 그것을 이해하면 내가 물건을 수정하기 위해 도착하기 전에

그냥, 알고 : 내가 생성() 생성자를 수정하기 위해 노력하고있어. 나는 그것을 변경 : 일반적인 경우

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

, 나는 (URI, 파일 목록>>?)는 AbstractAcceleoGenerator.initialize를 호출 볼 수 있습니다, 내가 한 번 각 모델 당 두 번 호출해야? 같은 :

//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(modelURI, targetFolder, arguments); 
initialize(modelURI2, targetFolder, arguments); 

, 내 생성() 생성자에서 슈퍼 구현에있는 코드를 모방? initialize() 호출 후에이 메서드가 내 Generate() 생성자에서 수행하는 작업을 모방하려고합니까?

답변

2

실제로 원하는 것은 Acceleo에서 가능하지만 생성 된 실행 프로그램이 예상하는 "기본"사례는 아닙니다.

생성 된 Java 클래스의 "generate"메소드를 "@generated NOT"으로 표시하거나 javadoc에서 "@generated"주석을 모두 제거해야합니다. 이 방법에서 당신이해야 할 일은 수퍼 구현 (AbstractAcceleoLauncher에서)의 동작을 모방 한 것입니다. 하나 대신 두 개의 모델을로드하고 AcceleoService # doGenerate로 전달합니다.

즉, 코드 생성을 위해 제공되는 API 인 Acceleo를 살펴보고 필요에 맞는 방식으로 사용해야합니다. 생성 된 Java 시작 프로그램과 AcceleoService 클래스는 일반적인 사용 사례에 맞는 예제를 제공합니다. 이러한 샘플을 따라하면 동작을 변경할 수 있습니다. 1) INPUT 모델 :

+0

시간이 부족하여 잘 모르겠습니다.하지만 아이디어가 있습니다. 저는 두 개의 작은 변환으로 변환을 분할하여이 문제를 피했습니다. Kellindll 힌트를 주셔서 감사합니다. – AxA

+0

안녕하세요 Kellindil, 나는 질문을 편집했습니다. 당신이 나에게 제안한 것을 시도해 볼 수도 있기 때문에, 더 이상 확신 할 수 없다면 더 이상 확신 할 수 없습니다. 감사합니다 – AxA

+0

아니요, 입력 모델을 사용하는 모든 것을 변경하고 구현을 다시 작성하여 두 번째 모델을 고려해야합니다. "초기화"방법에서는 첫 번째 모델과 동일한 자원 세트에 두 번째 모델을로드해야합니다. 그런 다음 "generate"메서드에서 "doGenerateTemplate"에 대한 호출로 "service.doGenerate"호출을 모델의 두 가지를 모두 취하는 인수 목록으로 변경해야합니다. 당신이 정말로 흉내 내야 할 것은 "AcceleoService # doGenerate"방법입니다. 이것은 사소한 작업이 아닙니다. – Kellindil

0

Generate.java 클래스를 수정해야합니다. 기본적으로 코드 생성을 수행 할 수 있어야합니다.

실행 구성을 만들고이 실행 구성에서 올바른 인수 (프로세스 및 정의)를 제공해야합니다.

모듈의 첫 번째 인수 인 'client.xmi'URI를 이해하지 못합니다. 그것은 모델 파일 인 것 같습니다. 메타 모델 URI 만 포함해야하는 인수에서 제거하면 모델 파일입니다.

+0

안녕 로랑, 발사 구성의 인수에
은 2 인자가 자동으로 (I 추가 이미지 링크 참조) Acceleo으로 가득 SimpleProcess.BPEL (루트 요소 aProcess : Process를 얻습니다.) 2) OUTPUT 폴더 : ... bpel2java/uni 다른 입력 모델은 입니다. 3) 두 번째 INPUT 모델 : SimpleProcessArtifacts.WSDL 정의 또는 메시지 : 메시지) "프로그램 인수"탭에 세 번째 인수를 두 번째 모델의 경로와 함께 추가할까요? 추신 : client.xmi URI를 수정했습니다. – AxA