此样本包含一个变换映射模型,用于为 UML 模型、包和类定义基本映射。生成的变换将创建一个与源项目同名的 UML 模型,并且在该模型中,将为该源项目中包含的每个 UML 模型创建一个包。对于相应 UML 源模型中的每个类,此变换还会在每个包中创建一个类。尽管此映射模型比较简单,但是所生成的变换说明了您必须如何定制代码以支持通过指定源项目来指定源模型。
在 plugin.xml 文件包含的变换扩展点中,名为 sourceModelType 的属性指定变换用户可以指定为变换源的对象的类型。当创建模型到模型变换项目时,此属性值在缺省情况下设置为 resource,这意味着在变换配置向导和编辑器中,变换用户必须将工作空间中的现有文件指定为变换源。将 sourceModelType 属性的值设置为 project 时,变换用户可以将 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)));
}};
}
以下代码段显示了名为 ResourcesFromProjectTransform 的变换的源代码,其中包含一个名为 ProjectContentsExtractor 的抽取器和一项名为 Project4sourceTargetRule 的规则。
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);
}
}