モデルからモデルへの変換を実行すると、メモリー内モデルが生成されます。デフォルトでは、変換の後処 理の一部として、変換フレームワークにより、生成されたメモリー内モデルのコンテンツがワークスペース内 のファイルに書き込まれます。 ユーザーは、モデルからモデルへの変換の変換構成を作成する場合に、そのファイルを変換のターゲッ ト・コンテナーとして指定したり、新規のターゲット・コンテナーを作成したりすることができます。変換構成で、 「ターゲット・コンテナー」という構成プロパティーに、ターゲット・モデルのファイル名が含まれます。このファイルは、変換 の実行前にワークスペースに存在する必要があります。
このサンプルの変換プロジェクトでは、生成された変換ソース・コードをカスタマイズすることによって、 ユーザーがターゲット・コンテナーを構成する代替方法を示します。変換の作成者は、モデルからモデルへの変 換のソース・コードを生成した後に、そのコードをカスタマイズして、変換ユーザーが 変換のターゲット・コンテナーとしてモデル・ファイルではなく URI を指定できるようにすることができます。 URI が識別するファイルは、変換の実行前に存在する必要はありません。存在しない場合は、変 換によってファイルが作成されます。
変換ソース・コードの生成後に、 plugin.xml ファイルの変換拡張ポイントで、targetModelType というプロパティーが、 変換ユーザーがターゲット・コンテナーとして指定できるモデルのタイプをリストします。デフォ ルトで、このプロパティー値は resource に設定されます。つまり、変換構成で、ユーザーはワー クスペース内に存在するファイルを指定する必要があります。カスタマイズされた plugin.xml ファイルで、targetModelType プロパティーは none に設定されます。
plugin.xml ファイルで、生成された変換拡張要素には、Target Model URI という新規変換プロパティーが含まれます。 このサンプルでは、「変換構成」ウィザードおよびエディターの「プロパティー」タブの 「ターゲット・モデル URI (Target Model URI)」フィールドで、ユーザーはプロパ ティーの文字列値を指定します。
変換構成ウィザードおよびエディ ターは、Uri4targetTransformationValidator という生成されたカスタム変換バリデーター・クラスを使用 して、変換構成内の設定を検証します。デフォルトで、isTargetElementValid というメソッドの実装は、構成 されたターゲット・コンテナーがファイルである場合にのみ、true を戻します。このサンプルでは、デ フォルトの実装がオーバーライドされ、値がターゲット・コンテナーとして指定されているかいないかにか かわらず、true を戻します。より強固な実装では、 ユーザーが指定する URI に対して、変換に固有またはプロジェクトに固有の検証が行われる場合があります。
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @see com.ibm.xtools.transform.authoring.TransformationValidator#isTargetElementValid(java.lang.Object)
* @generated
*/
protected boolean isTargetElementValid(Object target) {
//Remove @generated tag to add more target validation checks
return super.isTargetElementValid(target);
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @see com.ibm.xtools.transform.authoring.TransformationValidator#isTargetElementValid(java.lang.Object)
* @generated NOT
*/
protected boolean isTargetElementValid(Object target) {
return true;
}
Uri4targetTransformationProvider という生成されたカスタム・クラスでは、createRootTransformation と いうメソッドのデフォルトの実装が RootTransformation というクラスをインスタンス化し 、次にこれが ResourceTransform というクラスをインスタンス化します。 ResourceTransform というクラスのデフォルトの実装は、構成されたターゲット・コンテナーを表すファイ ルを開く ResourceTargetRule という実装を使用します。このサン プルでは、構成されたターゲット・コンテナーはファイルではなく URI であるため、 ResourceFromUriTransform というカスタムの ResourceTransform 実装および ResourceFromUriTargetRule というカスタムの ResourceTargetRule 規則が Uri4targetTransformationProvider クラスに追加されます。
/**
* Creates a root transformation. You may add more rules to the transformation here
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @param transform The root transformation
* @generated
*/
protected RootTransformation createRootTransformation(ITransformationDescriptor descriptor) {
return new RootTransformation(descriptor, new MainTransform());
}
/**
* Creates a root transformation. You may add more rules to the transformation here
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @param transform The root transformation
* @generated NOT
*/
protected RootTransformation createRootTransformation(ITransformationDescriptor descriptor) {
return new RootTransformation(descriptor, new MainTransform()) {
@Override
protected void addInitialExtractor(Transform mainTransform) {
add(new ResourceListExtractor(new ResourceFromUriTransform(mainTransform)));
}};
}
protected class ResourceFromUriTransform extends ResourceTransform {
public ResourceFromUriTransform(Transform mainTransform) {
super(Uri4targetMessages.ResourceFromUriTransform_id);
setName(Uri4targetMessages.ResourceFromUriTransform_name);
add(new ResourceFromUriTargetRule());
add(new ResourceContentsExtractor(mainTransform));
}
}
protected class ResourceFromUriTargetRule extends ResourceTargetRule {
@Override
protected Object createTarget(ITransformContext context) {
ResourceSet resourceSet = ((EditingDomain) context
.getPropertyValue(TransformAuthoringConstants.TARGET_EDITING_DOMAIN))
.getResourceSet();
Resource resource = null;
Object targetModelURIString = context.getPropertyValue("TargetModelURI"); //$NON-NLS-1$
if (targetModelURIString instanceof String) {
URI targetModelURI = URI.createURI((String)targetModelURIString);
IPath targetModelPath = new Path(targetModelURI.path());
IWorkspaceRoot wsRoot = ResourcesPlugin.getWorkspace().getRoot();
IFile targetModelFile = wsRoot.getFile(targetModelPath);
ValidateEditRule.addAffectedFile(context, targetModelFile);
resource = resourceSet.createResource(getPlatformURI(targetModelFile));
ITransformContext rootContext = context;
while (rootContext.getParentContext() != null)
rootContext = rootContext.getParentContext();
rootContext.setPropertyValue(ITransformContext.TARGET_CONTAINER, targetModelFile);
}
return resource;
}
}