在QVTo转换中使用UML概要文件?

在QVTo转换中使用UML概要文件?,uml,transformation,m2m,papyrus,qvt,Uml,Transformation,M2m,Papyrus,Qvt,我使用Papyrus工具定义了一个UML概要文件,并将该文件保存为“my_profile.di”。如何在QVTo转换中使用此配置文件 可以这样做吗(我不确定应该如何指定文件的路径) 如果这是一个愚蠢的问题,我很抱歉,但我对QVT完全陌生。我希望有人能启发我,提前谢谢 将UML概要文件与QVTo(或任何基于EMF的转换语言)一起使用有点棘手。简而言之,您只需要处理UML元模型,但是在这种情况下,处理概要文件的方法有点不同。基本上有两种情况: 您希望使用一个源UML模型,该模型使用概要文件/原型 您

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

可以这样做吗(我不确定应该如何指定文件的路径)


如果这是一个愚蠢的问题,我很抱歉,但我对QVT完全陌生。我希望有人能启发我,提前谢谢

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

  • 您希望使用一个源UML模型,该模型使用概要文件/原型
  • 您希望从另一个UML模型(或修改现有模型)创建一个新的UML模型,并在其上应用概要文件/原型
  • 第一个场景

    您只需注册UML元模型,并且需要使用UML提供的操作(
    getAppliedSetRotypes()
    ,…)。实际上,应用构造型的元素不被认为是构造型的实例。例如,假设您有一个带有原型
    EAttribute
    属性prop
    ,QVTo会将
    prop
    视为一个
    Property
    实例,其中包含您可以恢复的额外信息,而不是
    EAttribute
    实例

    下面是一个考虑一种
    ecore
    Profile的小例子。我考虑了
    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());
    
    property mystereotype : Stereotype =  profile.objects()[Stereotype]![name = 'EAttribute'];
    
    另外,
    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()
    操作;)

    最后一个音符

    正如您所看到的,在整个转换过程中处理概要文件可能有点麻烦。明智的做法可能是从您的概要文件et代码派生元模型—第一次转换将您的概要文件模型转换为派生元模型的实例。这样,您将能够处理元模型实例,而不是“具有额外信息的UML实例”

    编辑>

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

    model.objects()[Element]->select(e | not e.getAppliedStereotype('ecore::EAttribute').oclIsUndefined());
    
    property mystereotype : Stereotype =  profile.objects()[Stereotype]![name = 'EAttribute'];