Ограничение OCL с использованием классификаторов Ecore - исключение неизвестного типа
Я разрабатываю модель Ecore с некоторыми инвариантами, определенными в OCL, используя редактор OCLinEcore. В моей модели некоторые элементы имеют ссылки на 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 ответ
Эдвард Виллинк дал мне объяснение и обходной путь на форуме OCL:
Открытый OCL не поддерживает привязку ecore к чему-либо полезному, поэтому у oclAsType(ecore::EClass) есть неразрешенная ссылка, поскольку каждое выражение ecx является независимым фрагментом в файле ECore.
Поэтому в выпуске Juno добавлено расширение, в соответствии с которым квалификатор пакета может быть URI, так что, если вы видели сериализованное выше, это может быть oclAsType(_'http://www.eclipse.org/emf/2002/Ecore'::ecore::EClass).
Релиз Juno также добавляет гибкости в отношении того, используете ли вы новую привязку Pivot с этой расширенной функциональностью. На странице Window->Preferences->OCL убедитесь, что выбранным исполнителем для делегата по умолчанию является http://www.eclipse.org/emf/2002/Ecore/OCL/Pivot.