모델에서 모델로 변환을 실행하면 메모리 내 모델이 생성됩니다. 기본적으로 변환 사후 처리의 일부로서 변환 프레임워크는 생성된 메모리 내 모델의 컨텐츠를 작업공간의 파일에 작성합니다. 사용자가 모델에서 모델로 변환에 대한 변환 구성을 작성하면 사용자는 해당 파일을 변환의 대상 컨테이너로 지정하거나 새 대상 컨테이너를 작성할 수 있습니다. 변환 구성에서 구성 특성 "대상 컨테이너"에는 대상 모델의 파일 이름이 포함되어 있습니다. 변환이 실행되기 전에 이 파일이 작업공간에 있어야 합니다.
이 샘플 변환 프로젝트에서는 사용자가 생성된 변환 소스 코드를 사용자 정의하여 대상 컨테이너를 구성하는 대체 방법을 제공하는 방법을 보여줍니다. 변환 작성자인 경우에는 모델에서 모델로 변환에 대한 소스 코드를 생성한 후 변환 사용자가 모델 파일 대신 URI를 변환 대상 컨테이너로 지정할 수 있도록 코드를 사용자 정의할 수 있습니다. URI가 식별하는 파일은 변환이 실행되기 전에 없어도 됩니다. 해당 파일이 없는 경우 변환에서는 해당 파일을 작성합니다.
변환 소스 코드를 생성한 후 plugin.xml 파일의 변환 확장점에서 targetModelType 특성은 변환 사용자가 대상 컨테이너로 지정할 수 있는 모델 유형을 나열합니다. 기본적으로 이 특성은 자원으로 설정되며 이는 변환 구성에서 사용자가 작업공간에 존재하는 파일을 지정해야 함을 의미합니다. 사용자 정의된 plugin.xml 파일에서는 targetModelType 특성이 없음으로 설정됩니다.
plugin.xml 파일에서 생성된 변환 확장 요소에는 새 변환 특성 대상 모델 URI가 포함되어 있습니다. 이 샘플에서는 변환 구성 마법사 및 편집기의 특성 탭에 있는 대상 모델 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이므로 사용자 정의 ResourceTransform 구현 ResourceFromUriTransform과 사용자 정의 ResourceTargetRule 규칙 ResourceFromUriTargetRule이 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;
}
}