Ограничение OCL для профиля UML в Rational Software Architect 8

Я новичок в Rational Software Architect 8 и OCL. Я определил профиль, который состоит из двух стереотипов, один применяется к классу, а другой применяется к ассоциации. Смотрите рисунок для более подробной информации.

альтернативный текст

Теперь я хотел бы выразить ограничение с помощью OCL: если у класса есть стереотип <>, я хочу, чтобы все ассоциации, связанные с этим классом, имели стереотип RPAssignment. Стоит отметить, что классы, стереотипированные с помощью Permission, не будут иметь атрибутов или операций.

Я создал небольшой пример для проверки моего ограничения OCL. Вот диаграмма, а также соответствующие биты соответствующего файла xmi, созданного RSA.

модель

    <packageImport xmi:id="_dNGWEwhgEeCzvt5Jj9Wjpg">

  <importedPackage xmi:type="uml:Model" href="pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#_0"/>

</packageImport>

<packagedElement xmi:type="uml:Class" xmi:id="_sUoV4AhgEeCzvt5Jj9Wjpg" name="ProfileClass"/>

<packagedElement xmi:type="uml:Class" xmi:id="_LkpUwAkoEeCs_vLJf1t9eg" name="Perm1">

  <ownedAttribute xmi:id="_PjkJ8Qk_EeCD2J3jYOsnVw" name="clas" visibility="private" type="_OWO0IAk_EeCD2J3jYOsnVw" association="_PjbAAAk_EeCD2J3jYOsnVw">

    <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_PjkJ8wk_EeCD2J3jYOsnVw" value="1"/>

    <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_PjkJ8gk_EeCD2J3jYOsnVw" value="1"/>

  </ownedAttribute>

</packagedElement>

<packagedElement xmi:type="uml:Class" xmi:id="_OWO0IAk_EeCD2J3jYOsnVw" name="class1">

  <ownedAttribute xmi:id="_PjbAAQk_EeCD2J3jYOsnVw" name="perm1" visibility="private" type="_LkpUwAkoEeCs_vLJf1t9eg" association="_PjbAAAk_EeCD2J3jYOsnVw">

    <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_PjkJ8Ak_EeCD2J3jYOsnVw" value="1"/>

    <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_PjbAAgk_EeCD2J3jYOsnVw" value="1"/>

  </ownedAttribute>

</packagedElement>

<packagedElement xmi:type="uml:Association" xmi:id="_PjbAAAk_EeCD2J3jYOsnVw" name="gets" memberEnd="_PjbAAQk_EeCD2J3jYOsnVw _PjkJ8Qk_EeCD2J3jYOsnVw"/>

Мне кажется, что конец ассоциации, когда он помечен как судоходный, является свойством, как атрибут. Я пробовал следующее ограничение на классы с правами доступа (и несколько вариантов), но, похоже, оно работает неправильно. Вы могли заметить, что в примере, который я создал, ассоциация не имеет требуемого стереотипа, и поэтому проверка должна завершиться неудачей. Однако это удается.

self.base_Class.getAllAttributes()->forAll(att:Property | att.association.getAppliedStereotype('testProfile::RPAssignment') <> null)

Я что-то здесь упускаю?

2 ответа

Вы ссылаетесь на стереотип <>, который не является допустимым именем стереотипа. Я буду использовать XXX ради законного имени.

Что-то вроде следующего может работать в папирусе. Однако он опирается на мою экстраполяцию очень ограниченных подсказок относительно стереотипной навигации в спецификации UML. Спецификация OCL вообще не упоминает стереотип в этом смысле.

контекст XXX inv: base_Class.allAttributes()->forAll(ассоциация <> null подразумевает association.extension_RPAssignment->notEmpty ())

NB-связь для простых атрибутов равна нулю, а навигация по нулю вызовет недопустимую оценку.

Если ваш extension_RPAssignment не более одного, вы можете использовать <> null вместо ->notEmpty().

Вы не можете добавить ограничение для создания стереотипа. Вы можете только вручную создавать стереотипы на ассоциации. Ограничения должны использоваться в другом контексте, а не для создания стереотипов. Это моя копейка в этом обсуждении.

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