サブマップ・マッピング規則の変換ソース・コードは、別の変換を呼び出します。
サブマップ・マッピング規則の入力属性がオブジェクトのコレクションを表している場合、
コレクション内のオブジェクトごとに 1 回ずつ、サブマップ規則に指定された変換が実行されます。
入力フィルターやカスタム抽出を指定することによって、このデフォルトの動作を変更できます。
生成済みの変換コードの実行時に、入力属性のコレクションではなく、カスタム抽出が戻すオブジェクトのコレクションが使用されます。
始める前に
カスタム抽出を作成するが、入力フィルターを指定しない場合は、
変換を実行すると、サブマップ抽出が戻すすべてのオブジェクトがサブマップ規則によって処理されます。
カスタム抽出は、サブマップが指定した入力属性のオブジェクト・コレクション全体を戻すという、
デフォルトの抽出動作をオーバーライドします。
マッピング・モデルを開いておく必要があります。
マッピング・モデルのファイル名拡張子は .mapping です。マッピング・モデルには、少なくとも 1 つのマッピング宣言が含まれていなければなりません。
また、マッピング宣言にサブマップ・マッピング規則が定義されていなければなりません。
このタスクについて
サブマップ・マッピング規則にカスタム抽出を作成する手順は、以下のとおりです。
- エディター領域にあるマッピング規則を右クリックし、「プロパティーで表示」をクリックします。
- 「プロパティー」ビューの「カスタム抽出」タブをクリックします。
- 「カスタム抽出」チェック・ボックスを選択します。
注: このチェック・ボックスが選択されていない場合、サブマップ規則は、変換実行時に入力フィーチャーの内容を抽出します。
- カスタム抽出のコードを指定するには、以下のいずれかのステップを実行します。
- 「インライン」をクリックして、「コード」オプションの下にあるテキスト・エリアに Java™ コードを入力し、
「適用」をクリックします。
指定したコードは、java.util.Collection 型の結果を戻さなければなりません。
ヒント: 有効な変数名のリストを表示するには、
「インライン」ボタンの下にあるテキスト・エリアで、Ctrl + スペースを押します。
注: <name>_src という名前の変数は、現行の入力オブジェクトを指定します。
- 「外部」をクリックして、
カスタム抽出コードを含む Java クラスを指定します。
指定する Java クラスは、com.ibm.xtools.transform.authoring.ExtractorExtension インターフェースを実装するものでなければなりません。
Collection execute(EObject source) メソッドも実装する必要があります。
ここで、source には現行の入力オブジェクトを設定します。
このメソッドが入力属性のコレクションからオブジェクトを抽出し、java.util.Collection 型のコレクションとしてこれらのオブジェクトを戻します。
「参照」をクリックすると、有効なクラスの選択を求めるダイアログ・ボックスが表示されます。
ヒント: カスタム抽出を実装する Java クラスを作成するには、「新規」をクリックしてから、「新規 Java クラス」ウィンドウのフィールドに必要な情報を入力します。
- をクリックします。
例
入力オブジェクトの中に Package1 という UML パッケージがあり、
そのパッケージの中に Class1 および Class2 という 2 つの UML クラスがあるとします。
また、Package1 には Package2 という UML パッケージが、Package2 には Class3 という UML クラスがあります。
- デフォルトの抽出は、execute メソッドに対する入力として Package1 を受け取ると、
Class1 および Class2 を含むコレクションを戻します。
- 以下にリストするカスタム抽出では、Class1、Class2、および Class3 を含むコレクションが戻されます。
package uml_to_ecore_example.transforms;
import java.util.Collection
public class AddClassesFromNestedPackages implements ExtractorExtension {
public Collection execute(EObject source) {
Package pkg = (Package)source;
Collection c = new BasicEList();
// このパッケージとそこにネストされたパッケージに、すべてのクラスを再帰的に追加
for (Iterator i=pkg.getPackagedElements().iterator(); i.hasNext();) {
Object obj = i.next();
if (obj instanceof Class) c.add(obj);
else if (obj instanceof Package) c.addAll(execute((Package)obj));
}
return c;}}