QVTo (または任意の EMF ベースの変換言語) で UML プロファイルを使用するのは少し注意が必要です。簡単に言えば、UML メタモデルのみを処理する必要がありますが、状況に応じて、プロファイルを処理する方法が少し異なります。基本的に、次の 2 つのシナリオがあります。
- プロファイル/ステレオタイプを使用するソース UML モデルを使用する場合、
- 別のモデルから新しい UML モデルを作成 (または既存のモデルを変更) し、それにプロファイル/ステレオタイプを適用する場合。
最初のシナリオ
getAppliedStereotypes()
UML メタモデルを登録するだけでよく、UML によって提供される操作 ( 、...)を使用する必要があります。実際には、ステレオタイプが適用されている要素は、ステレオタイプのインスタンスとして認識されません。たとえばProperty prop
、ステレオタイプを持つ があると仮定するとEAttribute
、QVTo は、インスタンスではなく、回復できる追加情報をprop
持つインスタンスとして認識します。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]);
また、要素にステレオタイプを適用する場合:
-- in context of an element
self.applyStereotype(profile.objects()[Stereotype]![name = 'EAttribute']);
ダブル フィルターが機能しない場合 (将来の QVTo バージョンでは削除されると思います)、select を使用します。
self.applyStereotype(profile.objects()[Stereotype]->selectOne(name = 'EAttribute'));
また、setValue()
操作を見てください;)。
ファイナルノート
ご覧のように、変換中ずっとプロファイルを処理するのは少し面倒な場合があります。スマートな方法は、プロファイルからメタモデルを派生させ、プロファイリングされたモデルを取得して派生メタモデルのインスタンスとして変換する最初の変換をコーディングすることです。このようにして、「追加情報を含む UML インスタンス」の代わりにメタモデル インスタンスを処理できるようになります。
編集>
ステレオタイプの処理を容易にするために、最も使用頻度の高いステレオタイプでグローバル プロパティを定義することもできます。
property mystereotype : Stereotype = profile.objects()[Stereotype]![name = 'EAttribute'];