Ограничение 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.

Другие вопросы по тегам