2012-05-28 23 views
0

我想用Acceleo生成一些代码。我正在构建我的模型实体在内存中,我想为它生成代码。如何在内存模型上生成加速代码?

现在,当Acceleo尝试将我的模型对象与我的模板函数的参数类型相匹配时,它不匹配。这些类完全相同,但由于Acceleo的包注册表和我的内存模型不同,它们不匹配,Acceleo表示没有匹配的模型元素可以找到主模板。

我能纠正这个问题吗?我可以强制加速套件注册表成为内存注册表吗?我可以强制类匹配在语义层面(而不是仅仅基于Java ==?)

+0

用于注册软件包的nsURI是'http:// mypackage.com/1.0 /'。 Acceleo使用的类的容器是一个'EPackageImpl',而我传递的模型类的容器是'MyOwnPackageImpl'。这表明Acceleo未使用与我的运行时实例相同的软件包注册表。 – parasietje

+0

啊哈,当我使用XMI编译模式时,Acceleo只获得一个代理! – parasietje

+0

Acceleo使用的代理URI是'file:/// path/to/file.emtl#// mypackage/Object',而不是'http://mypackage.com/1.0/#/mypackage/Object'。我的模块在MTL文件中正确定义为'[module generateRCode('http://mypackage.com/1.0/')]'。 – parasietje

回答

0

为了回答这个问题的人谁沿着这里来:

真正的问题是我的EMF包的URI。我有一个commonscommons.study包。 commons包的URI被设置为http://domain.com/model.ecore#/。 Acceleo在运行时添加了自己的(空白)http://domain.com/model.ecore,这会阻止代理解析器将请求委派给工作区。

解决方案是将我的根commons包重命名为合适的http://domain.com/model.ecore,并将commons.study URI设置为http://domain.com/model.ecore#//study。这样,Acceleo资源集将不会包含空白包,并将加载正确委派给Workspace包注册表。

请注意,您的根包需要生成。如果没有,则它没有正确注册并且不会出现在Workspace包注册表中。因此,如果根包只包含一个子包,那么也要在其中添加一个DUMMY类。

1

,如果它不能在全局注册表中找到Acceleo只注册在自己的注册表车型。你确定你使用正确的NsURI来注册包吗?您在Acceleo模块([module myModule('<NsURI>')])开头设置的URI必须与您的元模型根包的NsURI相匹配。它还必须与您在主模块旁边生成的java类的registerPackages方法中定义的内容相匹配(请注意,因为您正在内存中创建模型,所以最后一步可能不是必需的)。

如果这三者匹配,Acceleo应该能够将模型的元素与生成模块中定义的类型相匹配。如果这还不够,我们需要知道在创建内存模型之前如何注册包?

洛朗Goubet Obeo