Esta amostra contém um modelo de mapeamento de transformação que define mapeamentos básicos para modelos UML, pacotes e classes. A transformação gerada cria um modelo UML que tem o mesmo nome que o projeto de origem e, nesse modelo, cria um pacote para cada modelo UML que o projeto de origem contém. Para cada classe no modelo de origem UML correspondente, a transformação também cria uma classe em cada pacote. Apesar de esse modelo de mapeamento ser simples, a transformação gerada mostra como você deve customizar o código para suportar a especificação de modelos de origem, especificando um projeto de origem.
No arquivo plugin.xml, no ponto de extensão da transformação, a propriedade denominada sourceModelType especifica o tipo de objetos que um usuário da transformação pode especificar como a origem da transformação. Ao criar um projeto de transformação de modelo em modelo, por padrão, esse valor de propriedade é configurado para recurso, o que significa que no assistente no editor de configuração da transformação, um usuário da transformação deve especificar um arquivo existente no espaço de trabalho como a origem da transformação. Ao configurar o valor da propriedade sourceModelType para projeto, um usuário da transformação pode especificar um projeto Eclipse, em vez de um arquivo, como a origem da transformação.
O assistente e editor de configuração da transformação utilizam a classe do validador da transformação para verificar se a transformação pode ser executada corretamente com as configurações que o usuário especifica. Na classe do validador da transformação, a implementação padrão do método denominado isSourceElementValid retorna verdadeiro somente se a origem da transformação especificada for um arquivo.
Nesta amostra, a classe do validador da transformação denominada Project4sourceTransformationValidator verifica se a transformação pode ser executada corretamente com as configurações especificadas pelo usuário. Para esta amostra, o código dessa classe substitui a implementação padrão do método denominado isSourceElementValid e o método retorna verdadeiro somente se a origem da transformação for um projeto. Uma implementação mais robusta pode verificar se o usuário selecionou um projeto UML.
O fragmento do código a seguir mostra a versão padrão do método isSourceElementValid que uma transformação gera:
/**
* <!-- 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;
}
O fragmento de código a seguir mostra a versão padrão do método denominado createRootTransformation que uma transformação gera:
/**
* Creates a root transformation. É possível incluir mais regras na transformação aqui
* <!-- 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. É possível incluir mais regras na transformação aqui
* <!-- 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)));
}};
}
O fragmento de código a seguir mostra o código-fonte para a transformação denominada ResourcesFromProjectTransform, que contém um extrator denominado ProjectContentsExtractor, e uma regra denominada 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);
}
}