网格化Acceleo用的Xtext(Meshing Acceleo with Xtext)

2019-09-21 05:21发布

我在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文件。

Answer 1:

我遗憾的是并不熟悉的Xtext ......但我相信你的问题就出在你的Java服务中加载您的DSL的方式:你生成一个运行Eclipse的情况下(“acceleo申请”),但你加载你的模型,如果你是在单机:新DSLStandaloneSetup,createInjector ...

我相信,加载模型的这种方式给你的Xtext元模型和工厂的两个实例,让OCL无法检索功能“声明”当您试图获取其值。

我能想到的一个可能的方法来绕过这将是改变你的服务采取任何形式作为参数的EObject并使用其资源设置加载您的DSL(因此使用资源设置你的发射已经初始化,一个Acceleo使用,而不是你自己的):

public DSLModel getDSLModel(String expression, EObject eObj){
    ResourceSet rSet = eObj.eResource().getResourceSet();
    [...]
}

就这样,你不应该需要你的服务做第二次的Xtext初始化...如果它不工作艰难,我真的没有一个解决方案,提出除去的Xtext论坛,并要求有如何使一个应用程序,可以加载一个DSL和无论是在独立,并在pluginized的环境中工作。



文章来源: Meshing Acceleo with Xtext