检查实例上是否存在EReference(Acceleo)

时间:2014-01-17 22:15:46

标签: dsl acceleo

我的metamodel中有两个Eclasses(称为X和Y),它们之间有一个包含(X包含Y)关系,下限为0,上限为1。

我需要在我的.mtl文件中知道用户是否添加了这个Y的实例才能添加一些代码。 像这样的尝试失败了:

[if (X.relationname.oclIsUndefined() = false)]
[if (X.relationname <> null)]

提前致谢,如果您需要任何额外信息,请与我们联系。

2 个答案:

答案 0 :(得分:1)

这取决于你的遏制关系;它是否为多值(它的“upperBound”设置为“-1”,即它可以保持任意数量的Y)或monovalued(其“upperBound”为“1”或不变,它只能容纳一个Y)。

如果是多值,则引用永远不会为“null”(或“oclIsUndefined”)。当它不包含单个Y时,它将是一个空列表,因此您需要检查大小:

[if (not X.relationname.isEmpty())]

否则,对于monovalued参考,您可以检查null(您在答案中所做的事情似乎表明您的情况就是这样):

[if (not X.relationname.oclIsUndefined())]

相反,你在答案中所做的有点不同:

[if((X.relationname.attributename->size()).oclIsUndefined() <> true)]

这实际上将检索与您的X关联的Y并访问其属性值。如果没有“Y”,则不会是null:它将是“无效”,即它将失败。当然,“oclInvalid”(“失败”对象)与“true”不同,所以你的“&lt;&gt;”工作......即使它很笨重(你通常使用“not”操作而不是测试一个布尔值)。

答案 1 :(得分:0)

解决方案:

我终于解决了:

[if((X.relationname.attributename->size()).oclIsUndefined() <> true)]

这不是最好的解决方案,但它可以解决问题。该属性是一个EString。