使用Ecore分类器的OCL约束 - 未知类型异常

时间:2012-06-07 09:12:01

标签: eclipse-emf eclipse-emf-ecore invariants ocl

我正在使用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类型的不变量?

1 个答案:

答案 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