Я разрабатываю модель Ecore с некоторыми инвариантами, определенными в OCL, используя редактор OCLinEcore. В моей модели некоторые элементы имеют ссылки на EClassifier; в некоторых ограничениях OCL мне нужно проверить, относится ли упомянутый EClassizer EDataType или EClass. Вот, в OCLinEcore, модель похожа на ту, у меня есть:Ограничение OCL с использованием классификаторов Ecore - исключение типа Unknow
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];
}
}
Однако, когда я пытаюсь проверить динамический экземпляр моей модели, исключение происходит со следующим сообщением:
исключение произошло при делегировании оценки ограничений «Совместимость» на «Coupling»: Unknow типа ([Ecore, EDataType])
Когда я пытаюсь выражение в интерактивной консоли OCL, я получить правильный результат. Я делаю что-то неправильно при определении моего инварианта? Как я могу написать инвариант, который использует типы Ecore?