我使用Papyrus工具定义了一个UML配置文件,并将文件另存为" my_profile.di"。如何在QVTo转换中使用此配置文件?
是否可以做这样的事情(我不知道应该如何指定文件的路径)?
modeltype UMLProfile uses 'platform:/resource/QVT_project_test/my_profile.di';
对不起,如果这是一个愚蠢的问题,但我对QVT来说是全新的。我希望有人可以在此提前启发我!
答案 0 :(得分:4)
将UML Profile与QVTo(或任何基于EMF的转换语言)一起使用有点棘手。简而言之,您只需要处理UML元模型,但是根据情况,处理配置文件的方式有点不同。基本上,有两种情况:
第一个场景
您只需注册UML元模型,您需要使用UML(getAppliedStereotypes()
,...)提供的操作。实际上,应用构造型的元素不被识别为构造型的实例。例如,假设您的Property prop
具有刻板印象EAttribute
,QVTo会将prop
视为Property
个实例,其中包含您可以恢复的额外信息,而不是{{1}实例。
这是一个考虑一种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());
操作看起来不错,但尚未实现(在我的QVTo版本上)。
第二种情景
这一次,您需要将配置文件作为转换的新参数传递(如果您的配置文件在另一个文件中定义)。您的个人资料也是一个UML模型,您的转换签名将变为:
stereotypedBy(...)
首先,您需要将个人资料应用于您的模型:
transformation testProfile(inout model : UML, in profile : UML);
当你想将一个Stereotype应用于一个元素时:
model.objects()[Model].applyProfile(profile.objects()![Profile]);
如果双重过滤器不起作用(我认为它将在未来的QVTo版本中删除),只需使用选择:
-- in context of an element
self.applyStereotype(profile.objects()[Stereotype]![name = 'EAttribute']);
另请参阅self.applyStereotype(profile.objects()[Stereotype]->selectOne(name = 'EAttribute'));
操作;)。
最后的注释
如您所见,在您的转型过程中处理配置文件可能有点麻烦。一个聪明的举动可能是从您的个人资料和代码中获取元模型第一个转换,它将获取您的分析模型并将其转换为派生元模型的实例。这样,您将能够处理元模型实例而不是“具有额外信息的UML实例”。
<强>编辑&gt; 强>
为了简化构造型处理,您还可以使用最常用的构造型定义全局属性:
setValue()