2012-06-07 11 views
0

Я разрабатываю модель 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?

ответ

1

Эдвард Willink дал мне объяснение и обходной путь на the OCL forum:

Голого OCL не поддерживает связывание Ecore к чему-то полезному, так oclAsType (Ecore :: EClass) имеет неразрешенную ссылку с момента каждый ecxpression является независимым фрагментом в файле ECore.

Высвобождение Juno поэтому добавляет расширение в результате чего пакет классификатор может представлять собой URI, так что если вы видели выше сериализовать его может быть oclAsType (_'http: //www.eclipse.org/emf/ 2002/Ecore ':: Ecore :: EClass).

В выпуске Juno также добавлена ​​гибкость в отношении того, используете ли вы новый Pivot-binding с этой расширенной функциональностью. На странице Window-> Preferences-> OCL убедитесь, что выбранный исполнитель для делегат по умолчанию: http://www.eclipse.org/emf/2002/Ecore/OCL/Pivot.

 Смежные вопросы

  • Нет связанных вопросов^_^