在 QVTo 转换中使用 UML 配置文件?

Using an UML profile in QVTo transformation?

我已经使用 Papyrus 工具定义了一个 UML 配置文件并将文件保存为 "my_profile.di"。如何在 QVTo 转换中使用此配置文件?

是否可以做这样的事情(虽然我不确定应该如何指定文件的路径)?

modeltype UMLProfile uses 'platform:/resource/QVT_project_test/my_profile.di';

如果这是一个愚蠢的问题,我很抱歉,但我是 QVT 的新手。希望有高手赐教,先谢谢了!

将 UML 配置文件与 QVTo(或任何基于 EMF 的转换语言)一起使用有点棘手。简短的回答,你必须只处理 UML 元模型,但根据情况,处理配置文件的方式有点不同。基本上有两种情况:

  1. 您想使用使用 Profile/Stereotypes、
  2. 的源 UML 模型
  3. 您想从另一个模型创建一个新的 UML 模型(或修改现有模型)并在其上应用 Profile/Stereotype。

第一个场景

您只需注册UML 元模型,您需要使用UML 提供的操作(getAppliedStereotypes(),...)。实际上,应用构造型的元素不会被识别为构造型的实例。例如,假设您有一个带有构造型 EAttributeProperty prop,QVTo 会将 prop 视为带有 extra-information 的 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]);

以及当您想将 Stereotype 应用于元素时:

-- in context of an element
self.applyStereotype(profile.objects()[Stereotype]![name = 'EAttribute']);

如果双重过滤器不起作用(我认为它会在未来的 QVTo 版本中删除),只需使用 select:

self.applyStereotype(profile.objects()[Stereotype]->selectOne(name = 'EAttribute'));

另请查看 setValue() 操作 ;)。

最后的笔记

如您所见,在整个转换过程中处理配置文件可能有点麻烦。一个明智的举动可能是从您的配置文件中派生一个元模型,然后编写第一个转换代码,该转换采用您的配置文件模型并将其转换为派生元模型的实例。这样,您将能够处理元模型实例而不是 "UML instances with extra-information".

编辑>

为了简化构造型处理,您还可以使用最常用的构造型定义全局属性:

property mystereotype : Stereotype =  profile.objects()[Stereotype]![name = 'EAttribute'];