package net.atos.optimus.m2m.engine.sdk.wizards.modelgen;
import java.io.IOException;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import net.atos.optimus.m2m.engine.core.requirements.AbstractRequirement;
import net.atos.optimus.m2m.engine.core.transformations.TransformationDataSource;
import net.atos.optimus.m2m.engine.core.transformations.TransformationDataSourceManager;
import net.atos.optimus.m2m.engine.core.transformations.TransformationReference;
import net.atos.optimus.m2m.engine.core.transformations.TransformationSet;
import net.atos.optimus.m2m.engine.sdk.wizards.Activator;
import org.eclipse.core.resources.WorkspaceJob;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.uml2.uml.Class;
import org.eclipse.uml2.uml.Dependency;
import org.eclipse.uml2.uml.Model;
import org.eclipse.uml2.uml.Package;
import org.eclipse.uml2.uml.UMLFactory;
/**
* Eclipse Job, that generates an UML model from transformation sets
*
* @author mvanbesien
*
*/
public class ModelGenerationJob extends WorkspaceJob {
/**
* Project in which we create the model (initial user selection)
*/
private IJavaProject javaProject;
/**
* Transformation Data Source. Defaultly instanciated to the extension
* points one.
*/
private List<TransformationDataSource> transformationDataSources = TransformationDataSourceManager.INSTANCE
.getTransformationDataSources();
/**
* Required. Set the java project, for which the model will be created in
*
* @param javaProject
* @return
*/
public ModelGenerationJob withJavaProject(IJavaProject javaProject) {
this.javaProject = javaProject;
return this;
}
/**
* Use this method if you want to use an external transformation data
* source.
*
* @param transformationDataSource
* @return
*/
public ModelGenerationJob withTransformationDataSources(List<TransformationDataSource> dataSources) {
this.transformationDataSources.clear();
this.transformationDataSources.addAll(dataSources);
return this;
}
public ModelGenerationJob() {
super("Transformations Model Generator");
this.setPriority(BUILD);
this.setUser(true);
}
/*
* (non-Javadoc)
*
* @see
* org.eclipse.core.resources.WorkspaceJob#runInWorkspace(org.eclipse.core
* .runtime.IProgressMonitor)
*/
@Override
public IStatus runInWorkspace(IProgressMonitor monitor) throws CoreException {
if (this.javaProject == null) {
return new Status(IStatus.CANCEL, Activator.PLUGIN_ID, "Java Project is null");
}
ResourceSet resourceSet = new ResourceSetImpl();
String fileName = String.format("TransformationModel-%d.uml", System.currentTimeMillis());
URI uri = URI.createPlatformResourceURI(
this.javaProject.getProject().getFullPath().append(fileName).toString(), true);
Resource resource = resourceSet.createResource(uri);
Model model = UMLFactory.eINSTANCE.createModel();
model.setName("Transformations");
resource.getContents().add(model);
for (TransformationDataSource transformationDataSource : this.transformationDataSources) {
Collection<TransformationReference> transformationReferences = transformationDataSource.getAll();
Map<TransformationSet, org.eclipse.uml2.uml.Package> packageMap = new HashMap<TransformationSet, Package>();
Map<TransformationReference, Class> classMap = new HashMap<TransformationReference, Class>();
for (TransformationReference transformationReference : transformationReferences) {
TransformationSet transformationSet = transformationReference.getTransformationSet();
Package ePackage = packageMap.get(transformationSet);
if (ePackage == null) {
ePackage = UMLFactory.eINSTANCE.createPackage();
ePackage.setName(transformationSet.getId());
model.getPackagedElements().add(ePackage);
packageMap.put(transformationSet, ePackage);
}
Class eClass = UMLFactory.eINSTANCE.createClass();
eClass.setName(transformationReference.getId());
ePackage.getPackagedElements().add(eClass);
classMap.put(transformationReference, eClass);
}
for (TransformationReference transformationReference : transformationReferences) {
Class eClass = classMap.get(transformationReference);
for (AbstractRequirement requirement : transformationReference.getRequirements()) {
TransformationReference requiredTransformation = transformationDataSource.getById(requirement
.getId());
if (requiredTransformation != null) {
Class referencedClass = classMap.get(requiredTransformation);
if (referencedClass != null) {
Dependency dependency = eClass.createDependency(referencedClass);
dependency.setName("<<" + requirement.getClass().getSimpleName() + ">>");
}
}
}
}
}
try {
resource.save(Collections.EMPTY_MAP);
} catch (IOException e) {
e.printStackTrace();
}
return Status.OK_STATUS;
}
}