我在Acceleo转型的目的是从输入UML模型生成代码(即Java的)中间。
这个UML模型的一些元素(即活动不透明的行动)包含一些文本这是符合一个的Xtext语法,我想获得在Acceleo改造相当于AST的Ecore表示。
为此我已经开发出具有其作为输入的字符串,将含有DSL摘录的方法的Java类,并产生一个Ecore模型符合它(见http://www.eclipse.org/forums/index.php/米/ 901947 /#msg_901947进一步的细节)。 我曾在一个单独的Java应用程序测试,它似乎它工作正常。
因此,我写了一个简单的Acceleo模块(即getDSLModel)包装是Java类,并让我得到来自DSL文字表述的Ecore模型。
假设我的DSL(和等效E字形芯)由根元素命名的DSLModel
含有(0 .. *)号的DSLStatement
秒(这是一个简化)。 当Acceleo我调用包装从一个字符串,包含一个正确的DSL脚本,我注意到它正确返回ModelImpl
。
['statement1;statement2'.getDSLModel()/]
因此Java服务和解析的Xtext工作。
但是,如果我试图让模型语句,即:
['statement1;statement2'.getDSLModel().statements/]
它返回一个“无效”的字符串。 所以我不能在使用它的循环
因此,我试着打从模型实例即eAllContents()OCL服务:
['statement1;statement2'.getDSLModel().eAllContents()/]
它实际上返回语句列表。 我不明白为什么从解析器的Xtext返回的Ecore实体的功能都不能正常工作。
这里是Java服务,变成一个字符串到我的DSL模型(Ecore的AST)的一个实例。 我曾与一个独立的Java应用程序测试,它工作得很好!
public class GetDSLModel {
public DSLModel getDSLModel(String expression){
DSLStandaloneSetupGenerated dslsas = new DSLStandaloneSetupGenerated();
Injector injector = dslsas.createInjectorAndDoEMFRegistration();
XtextResourceSet resourceSet = injector.getInstance(XtextResourceSet.class);
resourceSet.addLoadOption(XtextResource.OPTION_RESOLVE_ALL, Boolean.TRUE);
Resource resource = resourceSet.createResource(URI.createURI("dummy:/example.dsl"));
InputStream in = new ByteArrayInputStream(expression.getBytes());
try {
resource.load(in, resourceSet.getLoadOptions());
DSLModel model = (DSLModel) resource.getContents().get(0);
return model;
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
}
现在我需要在主Acceleo(UML2Text)改造从而这里的AST是Acceleo包装
[query public getDSLModel(str:String): DSLModel = (invoke('sfg.baleno.src.mloaders.GetDSLModel','getDSLModel(java.lang.String)',Sequence{str})).oclAsType(DSLModel)/]
这里是我所得到的,如果它运行
input: ['statement1;statement2'.getDSLModel()/]
output: mypackage.dsl.impl.DSLModelImpl@a1c7a
input: ['statement1;statement2'.getDSLModel().statements/] (Syntactically VALID)
output: invalid
input: ['statement1;statement2'.getDSLModel().eAllContents()/]
output: mypackage.dsl.impl.DSLStatement@e53202 (......
UPDATE
到主Acceleo模块的Java类我已经添加了以下几行
@Override
public void initialize(EObject element, File folder, java.util.List<? extends Object> arguments) throws IOException { preInitialize();
super.initialize(element, folder, arguments);
}
@Override
public void initialize(URI modelURI, File folder, java.util.List<?> arguments) throws IOException {
preInitialize();
super.initialize(modelURI, folder, arguments);
}
protected void preInitialize() {
DSLStandaloneSetup.doSetup();
}
和
@Override
public void registerPackages(ResourceSet resourceSet) {
super.registerPackages(resourceSet);
if (!isInWorkspace(org.eclipse.uml2.uml.UMLPackage.class)) {
resourceSet.getPackageRegistry().put(org.eclipse.uml2.uml.UMLPackage.eINSTANCE.getNsURI(), org.eclipse.uml2.uml.UMLPackage.eINSTANCE);
}
if (!isInWorkspace(mypackages.DSLPackage.class)) {
resourceSet.getPackageRegistry().put(mypackages.DSLPackage.eINSTANCE.getNsURI(), mypackages.DSLPackage.eINSTANCE);
}
EcoreUtil.resolveAll(resourceSet);
}
但它仍然表现相同。
UPDATE
在这个环节,你临时找包含Acceleo和XTEXT项目再现问题的示例EMF工作空间的压缩文件。 奇怪的是,如果你运行它作为一个Java应用程序,它的工作原理,但如果你运行它作为一个Acceleo应用它不...
https://docs.google.com/open?id=0B2_ovo8IiZaZaXdNdFdPMTI4Yjg
在左上角,你应该找到一个文件菜单,从中可以下载的zip文件。