2016-01-21 42 views
3

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

是否有可能做这样的事情(我不知道如何指定文件的路径)?

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

对不起,如果这是一个愚蠢的问题,但我对QVT是全新的。我希望有人能够启发我,提前感谢!

回答

3

使用UML Profile和QVTo(或任何基于EMF的转换语言)有点棘手。简而言之,您只需要处理UML元模型,但是在这种情况下,处理配置文件的方式有点不同。基本上,有两种情况:

  1. 你想用它采用了资料/定型源UML模型,你要创建一个又一个新的UML模型(或修改现有的)
  2. 和在其上应用个人资料/刻板印象。

第一个场景

你只需要注册UML元模型,你需要使用UML(getAppliedStereotypes(),...)所提供的操作。实际上,应用原型的元素不被视为刻板印象的实例。例如,假设您的Property prop的刻度为EAttribute,则QVTo将看到propProperty实例,您可以使用额外信息而不是实例进行恢复。

下面是一个小例子,考虑一种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']; 
+0

非常感谢您! – Incinerator

相关问题