Ограничение 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().
Вы не можете добавить ограничение для создания стереотипа. Вы можете только вручную создавать стереотипы на ассоциации. Ограничения должны использоваться в другом контексте, а не для создания стереотипов. Это моя копейка в этом обсуждении.