Использование профиля UML в преобразовании QVTo?
Я определил профиль UML с помощью инструмента Papyrus и сохранил файл как "my_profile.di". Как я могу использовать этот профиль внутри преобразования QVTo?
Можно ли сделать что-то вроде этого (хотя я не уверен, как указать путь к файлу)?
modeltype UMLProfile uses 'platform:/resource/QVT_project_test/my_profile.di';
Извините, если это глупый вопрос, но я совершенно новичок в QVT. Я надеюсь, что кто-то там может просветить меня, спасибо заранее!
1 ответ
Использование UML Profile с QVTo (или любым другим языком преобразования на основе EMF) немного сложнее. Короткий ответ: вам нужно иметь дело только с метамоделью UML, но в зависимости от ситуации способ работы с профилем немного отличается. В основном, есть два сценария:
- вы хотите использовать исходную модель UML, которая использует профиль / стереотипы,
- Вы хотите создать новую модель UML из другой (или изменить существующую) и применить к ней профиль / стереотип.
Первый сценарий
Вам нужно только зарегистрировать метамодель UML и использовать операции, предоставляемые UML (getAppliedStereotypes()
,...). Фактически, элементы, к которым применяется стереотип, не распознаются как экземпляры стереотипа. Например, если у вас есть Property prop
со стереотипом EAttribute
, QVT увидит prop
как Property
экземпляр с дополнительной информацией, которую вы можете восстановить вместо EAttribute
пример.
Вот небольшой пример, рассматривающий вид ecore
Профиль. Я считал inout
преобразование, что означает, что модель определяется как inout
будет изменено
modeltype UML "strict" uses uml('http://www.eclipse.org/uml2/5.0.0/UML');
transformation testProfile(inout model : UML);
main() {
model.objects()[Property]->map copyme();
}
mapping Property::copyme() : Property
when {
-- You need to use the fully qualified name
not self.getAppliedStereotype('ecore::EAttribute').oclIsUndefined()
}
{
-- repr() is used at the end to get a String value from the tagged value
name := self.name + self.getValue(self.getApplicableStereotype('ecore::EAttribute'), 'attributeName').repr(); -- toString() also works
}
И небольшая просьба перечислить все элементы, стереотипированные по определенному стереотипу:
model.objects()[Element]->select(e | not e.getAppliedStereotype('ecore::EAttribute').oclIsUndefined());
Также, stereotypedBy(...)
операция кажется приятной, но она еще не реализована (на моей версии QVTo).
Второй сценарий
На этот раз вам нужно будет передать профиль в качестве нового параметра вашего преобразования (если ваш профиль определен в другом файле). Ваш профиль также является моделью UML, ваша подпись преобразования становится:
transformation testProfile(inout model : UML, in profile : UML);
Сначала вам нужно применить свой профиль к вашей модели:
model.objects()[Model].applyProfile(profile.objects()![Profile]);
и когда вы хотите применить стереотип к элементу:
-- in context of an element
self.applyStereotype(profile.objects()[Stereotype]![name = 'EAttribute']);
Если двойной фильтр не работает (я думаю, он будет удален в будущих версиях QVTo), просто используйте select:
self.applyStereotype(profile.objects()[Stereotype]->selectOne(name = 'EAttribute'));
Также взгляните на setValue()
операция;).
Финальная нота
Как вы видели, иметь дело с профилем на протяжении всей вашей трансформации. Разумным шагом может быть получение метамодели из вашего профиля и кода - первое преобразование, которое берет вашу профилированную модель и переводит ее как экземпляр вашей производной метамодели. Таким образом, вы сможете работать с экземпляром метамодели вместо "экземпляров UML с дополнительной информацией".
EDIT>
Чтобы упростить обработку стереотипа, вы также можете определить глобальные свойства со своим наиболее используемым стереотипом:
property mystereotype : Stereotype = profile.objects()[Stereotype]![name = 'EAttribute'];