이 샘플에는 UML 모델, 패키지 및 클래스의 기본 맵핑을 정의하는 변환 맵핑 모델이 포함되어 있습니다. 생성된 변환에서는 소스 프로젝트와 동일한 이름을 가진 UML 모델을 작성하며 해당 모델에서 소스 프로젝트에 포함된 각 UML 모델에 대한 패키지를 작성합니다. 해당 UML 소스 모델의 각 클래스에 대해 변환에서는 각 패키지에서 클래스도 작성합니다. 이 맵핑 모델은 단순하지만 생성된 변환에서는 소스 프로젝트를 지정하여 소스 모델을 지정하기 위해 코드를 사용자 정의해야 하는 방법을 보여줍니다.
plugin.xml 파일의 변환 확장점에서 특성 sourceModelType은 변환 사용자가 변환 소스로 지정할 수 있는 오브젝트 유형을 지정합니다. 모델에서 모델로 변환 프로젝트를 작성하면 기본적으로 이 특성 값이 자원으로 설정되며 이는 변환 구성 마법사 및 편집기에서 변환 사용자가 작업공간의 기존 파일을 변환 소스로 지정해야 함을 의미합니다. sourceModelType 특성의 값을 프로젝트로 설정하면 변환 사용자는 파일 대신 Eclipse 프로젝트를 변환 소스로 지정할 수 있습니다.
변환 구성 마법사 및 편집기에서는 변환 유효성 검증기 클래스를 사용하여 변환이 사용자가 지정하는 설정으로 올바르게 실행될 수 있는지 확인합니다. 변환 유효성 검증기 클래스에서 메소드 isSourceElementValid의 기본 구현에서는 지정된 변환 소스가 파일인 경우에만 true를 리턴합니다.
이 샘플에서 변환 유효성 검증기 클래스 Project4sourceTransformationValidator는 변환이 사용자가 지정하는 설정으로 올바르게 실행될 수 있는지 확인합니다. 이 샘플의 경우 이 클래스의 코드는 메소드 isSourceElementValid의 기본 구현을 대체하고 메소드에서는 변환 소스가 프로젝트인 경우에만 true를 리턴합니다. 더욱 강력한 구현에서는 사용자가 UML 프로젝트를 선택했는지 확인할 수 있습니다.
다음 코드 단편에는 변환에서 생성되는 isSourceElementValid 메소드의 기본 버전이 표시됩니다.
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @see com.ibm.xtools.transform.authoring.TransformationValidator#isSourceElementValid(java.lang.Object)
* @generated
*/
protected boolean isSourceElementValid(Object source) {
//Remove @generated tag to add more source validation checks
return super.isSourceElementValid(source);
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @see com.ibm.xtools.transform.authoring.TransformationValidator#isSourceElementValid(java.lang.Object)
* @generated NOT
*/
protected boolean isSourceElementValid(Object source) {
return source instanceof IProject;
}
다음 코드 단편에는 변환에서 생성되는 메소드 createRootTransformation의 기본 버전이 표시됩니다.
/**
* 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 ResourcesFromProjectTransform(mainTransform)));
}};
}
다음 코드 단편에는 추출기 ProjectContentsExtractor 및 규칙 Project4sourceTargetRule이 포함된 변환 ResourcesFromProjectTransform의 소스 코드가 표시됩니다.
protected class ResourcesFromProjectTransform extends ResourceTransform {
public ResourcesFromProjectTransform(Transform mainTransform) {
super(Project4sourceMessages.ResourcesFromProjectTransform_id);
setName(Project4sourceMessages.ResourcesFromProjectTransform_name);
add(new Project4sourceTargetRule());
add(new ProjectContentsExtractor(mainTransform));
}
}
protected class ProjectContentsExtractor extends ResourceContentsExtractor {
public static final String UML_MODEL_FILE_TYPE = "emx"; //$NON-NLS-1$
public ProjectContentsExtractor(AbstractTransform transform) {
super(transform);
setName(Project4sourceMessages.ProjectContentsExtractor_name);
}
@Override
public Collection<Model> execute(ITransformContext context) {
final ResourceSet resourceSet = ((EditingDomain) context
.getPropertyValue(TransformAuthoringConstants.SOURCE_EDITING_DOMAIN)).getResourceSet();
final Collection<Model> models = new BasicEList();
Object source = context.getSource();
if (source instanceof IProject) {
IProject project = (IProject)source;
IResourceVisitor visitor = new IResourceVisitor() {
@Override
public boolean visit(IResource resource) throws CoreException {
if (resource instanceof IProject || resource instanceof IFolder)
return true;
if (resource instanceof IFile) {
IFile file = (IFile)resource;
if (UML_MODEL_FILE_TYPE.equals(file.getFileExtension())) {
Resource modelResource = resourceSet.getResource(getPlatformURI(file), true);
for (Iterator<EObject> i = modelResource.getContents().iterator(); i.hasNext();) {
EObject content = i.next();
if (content instanceof Model)
models.add((Model)content);
}
}
}
return false;
}
};
try {
project.accept(visitor);
} catch (CoreException ce) {
Activator.getDefault().getLog().log(new Status(IStatus.ERROR, Activator.PLUGIN_ID,
Project4sourceMessages.ProjectContentsExtractor_name, ce));
}
}
return models;
}
}
protected class Project4sourceTargetRule extends ResourceTargetRule {
@Override
protected Object createTarget(ITransformContext context) {
if (context.getSource() instanceof IProject) {
Object targetContainer = context.getTargetContainer();
if (targetContainer instanceof Resource) {
return targetContainer;
} else if (targetContainer instanceof IFile){
IFile targetFile = (IFile)targetContainer;
ValidateEditRule.addAffectedFile(context, targetFile);
ResourceSet resourceSet = ((EditingDomain) context
.getPropertyValue(TransformAuthoringConstants.TARGET_EDITING_DOMAIN)).getResourceSet();
return resourceSet.createResource(getPlatformURI(targetFile));
}
}
return super.createTarget(context);
}
}