在QVTo转换中使用UML配置文件?
我已经使用Papyrus工具定义了一个UML配置文件并将该文件保存为“my_profile.di”。如何在QVTo转换中使用此配置文件?在QVTo转换中使用UML配置文件?
是否有可能做这样的事情(我不知道如何指定文件的路径)?
modeltype UMLProfile uses 'platform:/resource/QVT_project_test/my_profile.di';
对不起,如果这是一个愚蠢的问题,但我对QVT是全新的。我希望有人能够启发我,提前感谢!
使用UML Profile和QVTo(或任何基于EMF的转换语言)有点棘手。简而言之,您只需要处理UML元模型,但是在这种情况下,处理配置文件的方式有点不同。基本上,有两种情况:
- 你想用它采用了资料/定型源UML模型,你要创建一个又一个新的UML模型(或修改现有的)
- 和在其上应用个人资料/刻板印象。
第一个场景
你只需要注册UML元模型,你需要使用UML(getAppliedStereotypes()
,...)所提供的操作。实际上,应用原型的元素不被视为刻板印象的实例。例如,假设您的Property prop
的刻度为EAttribute
,则QVTo将看到prop
为Property
实例,您可以使用额外信息而不是实例进行恢复。
下面是一个小例子,考虑一种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版本中删除),只需使用一个选择:
self.applyStereotype(profile.objects()[Stereotype]->selectOne(name = 'EAttribute'));
另请参阅setValue()
操作;)。
最后请注意
正如你所看到的,它可能会很麻烦一点点地处理所有沿着你改造的个人资料。一个聪明的举动可能是从你的配置文件派生一个元模型,并编写一个第一个转换,它将你的配置文件模型作为你的派生元模型的一个实例。这样,您将能够处理元模型实例,而不是“具有额外信息的UML实例”。
编辑>
为了缓和定型处理,你也可以用你最刻板的使用定义全局属性:
property mystereotype : Stereotype = profile.objects()[Stereotype]![name = 'EAttribute'];
非常感谢您! – Incinerator