package armines.execution;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.ecore.EcoreFactory;
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.emf.ecore.util.BasicExtendedMetaData;
import org.eclipse.emf.ecore.util.ExtendedMetaData;
import org.eclipse.emf.ecore.xmi.XMLResource;
import org.eclipse.emf.ecore.xmi.impl.EcoreResourceFactoryImpl;
import org.eclipse.m2m.atl.core.ATLCoreException;
import org.eclipse.m2m.atl.core.IExtractor;
import org.eclipse.m2m.atl.core.IInjector;
import org.eclipse.m2m.atl.core.IModel;
import org.eclipse.m2m.atl.core.IReferenceModel;
import org.eclipse.m2m.atl.core.ModelFactory;
import org.eclipse.m2m.atl.core.emf.EMFExtractor;
import org.eclipse.m2m.atl.core.emf.EMFInjector;
import org.eclipse.m2m.atl.core.emf.EMFModel;
import org.eclipse.m2m.atl.core.emf.EMFModelFactory;
import org.eclipse.m2m.atl.core.emf.EMFReferenceModel;
import org.eclipse.m2m.atl.core.launch.ILauncher;
import org.eclipse.m2m.atl.engine.emfvm.adapter.EMFModelAdapter;
import org.eclipse.m2m.atl.engine.emfvm.adapter.IModelAdapter;
import org.eclipse.m2m.atl.engine.emfvm.launch.EMFVMLauncher;
import emfviews.dsl.generator.VpdlGenerator;
public class RunTransfoJava {
public static String ID="vpdl.dsl";
public void runTransformation(String pMetamodel, String pMetamodel2, String pTransformation, String pInputModel, String pOutputModel){
try {
/*
* Initializations
*/
ILauncher transformationLauncher = new EMFVMLauncher();
ModelFactory modelFactory = new EMFModelFactory();
IInjector injector = new EMFInjector();
IExtractor extractor = new EMFExtractor();
/*
* Load metamodel 1
*/
IReferenceModel metamodel1 = modelFactory.newReferenceModel();
injector.inject(metamodel1, pMetamodel);
/*
* Load metamodel 2
*/
//Register virtuallinks mm (we only have the .ecore file)
Resource.Factory.Registry.INSTANCE.getExtensionToFactoryMap().put("ecore", new EcoreResourceFactoryImpl());
ResourceSet rs = new ResourceSetImpl();
// enable extended metadata
final ExtendedMetaData extendedMetaData = new BasicExtendedMetaData(EPackage.Registry.INSTANCE);
rs.getLoadOptions().put(XMLResource.OPTION_EXTENDED_META_DATA,extendedMetaData);
Resource r = rs.getResource(URI.createURI("platform:/resource/EMFViewsSQLTest/metamodels/VirtualLinksMM2.ecore"), true);
EObject eObject = r.getContents().get(0);
if (eObject instanceof EPackage) {
EPackage p = (EPackage)eObject;
EPackage.Registry.INSTANCE.put(p.getNsURI(), p);
}
IReferenceModel metamodel2 = modelFactory.newReferenceModel();
injector.inject(metamodel2, pMetamodel2);
/*
* Run transformation
*/
IModel inputModel = modelFactory.newModel(metamodel1);
injector.inject(inputModel, pInputModel);
IModel outputModel = modelFactory.newModel(metamodel2);
IModelAdapter modelAdapter = new EMFModelAdapter();
modelAdapter.setAllowInterModelReferences(true); //$NON-NLS-1$ //$NON-NLS-2$
transformationLauncher.initialize(new HashMap<String,Object>());
transformationLauncher.addInModel(inputModel, "IN", "SQL");
transformationLauncher.addOutModel(outputModel, "OUT", "VL");
InputStream is_transf = null;
try {
is_transf = VpdlGenerator.class.getResource(pTransformation).openStream();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
transformationLauncher.launch(ILauncher.RUN_MODE, new NullProgressMonitor(), new HashMap<String,Object>(),
is_transf);
extractor.extract(outputModel, pOutputModel);
/*
* Unload all models and metamodels (EMF-specific)
*/
EMFModelFactory emfModelFactory = (EMFModelFactory) modelFactory;
emfModelFactory.unload((EMFModel) outputModel);
emfModelFactory.unload((EMFReferenceModel) metamodel1);
emfModelFactory.unload((EMFReferenceModel) metamodel2);
System.out.println("Finished transformation");
} catch (ATLCoreException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
RunTransfoJava rtj = new RunTransfoJava();
//metamodels, transformation, input model, output model
rtj.runTransformation("metamodels/Sqlview.ecore", "metamodels/VirtualLinksMM2.ecore", "transformations/SQL2VirtualLinks.asm",
"models/view2.xmi","models/myEAviewpoint.xmi");
//rtj.runTransformation(args[0], args[1], args[2], args[3],args[4]);
}
}