在 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 元模型,但根据情况,处理配置文件的方式有点不同。基本上有两种情况:
- 您想使用使用 Profile/Stereotypes、
的源 UML 模型
- 您想从另一个模型创建一个新的 UML 模型(或修改现有模型)并在其上应用 Profile/Stereotype。
第一个场景
您只需注册UML 元模型,您需要使用UML 提供的操作(getAppliedStereotypes()
,...)。实际上,应用构造型的元素不会被识别为构造型的实例。例如,假设您有一个带有构造型 EAttribute
的 Property 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'];
我已经使用 Papyrus 工具定义了一个 UML 配置文件并将文件保存为 "my_profile.di"。如何在 QVTo 转换中使用此配置文件?
是否可以做这样的事情(虽然我不确定应该如何指定文件的路径)?
modeltype UMLProfile uses 'platform:/resource/QVT_project_test/my_profile.di';
如果这是一个愚蠢的问题,我很抱歉,但我是 QVT 的新手。希望有高手赐教,先谢谢了!
将 UML 配置文件与 QVTo(或任何基于 EMF 的转换语言)一起使用有点棘手。简短的回答,你必须只处理 UML 元模型,但根据情况,处理配置文件的方式有点不同。基本上有两种情况:
- 您想使用使用 Profile/Stereotypes、 的源 UML 模型
- 您想从另一个模型创建一个新的 UML 模型(或修改现有模型)并在其上应用 Profile/Stereotype。
第一个场景
您只需注册UML 元模型,您需要使用UML 提供的操作(getAppliedStereotypes()
,...)。实际上,应用构造型的元素不会被识别为构造型的实例。例如,假设您有一个带有构造型 EAttribute
的 Property 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'];