我正在使用OCLinEcore编辑器开发一个带有一些在OCL中定义的不变量的Ecore模型。在我的模型中,一些元素引用了EClassifier;在一些OCL约束中,我需要检查引用的EClassifier是EDataType还是EClass。在OCLinEcore中,这是一个类似于我的模型:
import ecore : 'http://www.eclipse.org/emf/2002/Ecore#/';
package Foo : foo = 'some_namespace'
{
class EndPoint
{
attribute name : String[1];
property type : ecore::EClassifier[1];
}
class Coupling
{
invariant Compatibility:
(destination.type.oclIsKindOf(ecore::EDataType) and source.type = destination.type) or
let destinationClass : ecore::EClass = destination.type.oclAsType(ecore::EClass) in
destinationClass.isSuperTypeOf(source.type.oclAsType(ecore::EClass));
property source : EndPoint[1];
property destination : EndPoint[1];
}
}
但是,当我尝试验证模型的动态实例时,会出现以下消息的异常:
委派评估时出现异常 '耦合'的“兼容性”约束:未知类型([ecore, EDataType])
当我在OCL交互式控制台中尝试表达式时,我获得了正确的结果。在定义我的不变量时我做错了吗?如何编写使用Ecore类型的不变量?
答案 0 :(得分:1)
Edward Willink在the OCL forum上给了我一个解释和解决方法:
Naked OCL不支持将ecore绑定到有用的东西上, 所以oclAsType(ecore :: EClass)因为每个都有一个未解析的引用 ecxpression是ECore文件中的一个独立片段。
因此,Juno版本增加了一个包的扩展名 限定符可能是一个URI,所以如果你看到上面的序列化它 可能 oclAsType(_'http://www.eclipse.org/emf/2002/Ecore':: E字形芯::的EClass)
Juno版本还增加了您是否使用新版本的灵活性 使用此扩展功能进行透视绑定。在里面 Window-> Preferences-> OCL页面确保所选的执行程序为 默认委托是 http://www.eclipse.org/emf/2002/Ecore/OCL/Pivot