Использование профиля 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, но в зависимости от ситуации способ работы с профилем немного отличается. В основном, есть два сценария:

  1. вы хотите использовать исходную модель UML, которая использует профиль / стереотипы,
  2. Вы хотите создать новую модель 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'];
Другие вопросы по тегам