package simpleaspects;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.emf.common.util.BasicDiagnostic;
import org.eclipse.emf.common.util.Diagnostic;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EPackage;
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.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.launch.EMFVMLauncher;
import org.eclipse.m2m.qvt.oml.BasicModelExtent;
import org.eclipse.m2m.qvt.oml.ExecutionContextImpl;
import org.eclipse.m2m.qvt.oml.ExecutionDiagnostic;
import org.eclipse.m2m.qvt.oml.ModelExtent;
import org.eclipse.m2m.qvt.oml.TransformationExecutor;
import org.eclipse.m2m.qvt.oml.util.Log;
import org.eclipse.m2m.qvt.oml.util.WriterLog;
import simpleaspects.fsmmt.fsm.FSM;
public class Main {
public static void execute(FSM fsm) {
System.out.print("Output: ");
fsm.execute("adcdce");
System.out.println();
}
public static void prettyPrint(FSM fsm) {
fsm.getOwnedState().forEach(s -> {
System.out.println("State" + s.getName());
s.getIncomingTransition().forEach(t -> {
System.out.println("\tIncoming " + t.getInput() + "(" + t.getOutput() + ")");
});
s.getOutgoingTransition().forEach(t -> {
System.out.println("\tOutgoing " + t.getInput() + "(" + t.getOutput() + ")");
});
});
}
public static void reflexivePrettyPrint(EObject o) {
o.eClass().getEStructuralFeatures().forEach(f -> {
System.out.println(f.getName() + " = " + o.eGet(f));
o.eContents().forEach(c -> reflexivePrettyPrint(c));
});
}
public static void runQVTo(String inputURI, String outputURI) {
ResourceSet rs = new ResourceSetImpl();
Resource inRes = rs.getResource(URI.createURI(inputURI), true);
EList<EObject> inObjects = inRes.getContents();
URI transformationURI = URI.createFileURI(
"/home/dig/git/melange/examples/SimpleFsmQVTo/transforms/DummyInvert.qvto");
TransformationExecutor executor = new TransformationExecutor(transformationURI);
ExecutionContextImpl context = new ExecutionContextImpl();
ModelExtent input = new BasicModelExtent(inObjects);
ModelExtent output = new BasicModelExtent();
OutputStreamWriter outStream = new OutputStreamWriter(System.out);
Log log = new WriterLog(outStream);
context.setLog(log);
ExecutionDiagnostic result = executor.execute(context, input, output);
if(result.getSeverity() == Diagnostic.OK) {
List<EObject> outObjects = output.getContents();
URI outUri = URI.createURI("output/" + outputURI);
Resource res = rs.createResource(outUri);
res.getContents().addAll(outObjects);
try {
res.save(Collections.emptyMap());
} catch (IOException e) {
e.printStackTrace();
}
} else {
IStatus status = BasicDiagnostic.toIStatus(result);
System.err.println("Error status " + status);
}
}
public static void runATL(String inputURI, String outputURI) {
try {
ILauncher transformationLauncher = new EMFVMLauncher();
ModelFactory modelFactory = new EMFModelFactory();
IInjector injector = new EMFInjector();
IExtractor extractor = new EMFExtractor();
IReferenceModel fsmmt = modelFactory.newReferenceModel();
injector.inject(fsmmt, "http://fsmmt/");
IReferenceModel fsm = modelFactory.newReferenceModel();
injector.inject(fsm, "http://fsm/");
IModel inModel = modelFactory.newModel(fsmmt);
injector.inject(inModel, inputURI);
IModel outModel = modelFactory.newModel(fsm);
transformationLauncher.initialize(new HashMap<String,Object>());
transformationLauncher.addInModel(inModel, "IN", "FsmMT");
transformationLauncher.addOutModel(outModel, "OUT", "Fsm");
transformationLauncher.launch(ILauncher.RUN_MODE, new NullProgressMonitor(), new HashMap<String,Object>(),
new FileInputStream("../SimpleFsmATL/DummyInvert.asm"));
extractor.extract(outModel, "output/" + outputURI);
EMFModelFactory emfModelFactory = (EMFModelFactory) modelFactory;
emfModelFactory.unload((EMFModel) inModel);
emfModelFactory.unload((EMFModel) outModel);
emfModelFactory.unload((EMFReferenceModel) fsmmt);
emfModelFactory.unload((EMFReferenceModel) fsm);
} catch (ATLCoreException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
EPackage.Registry.INSTANCE.put(simpleaspects.fsmmt.fsm.FsmPackage.eNS_URI,
simpleaspects.fsmmt.fsm.FsmPackage.eINSTANCE);
StandaloneSetup.doSetup();
ResourceSet rs = new ResourceSetImpl();
Resource fsmRes = rs.getResource(
URI.createURI("melange:/file/input/Simple.fsm?mt=simpleaspects.FsmMT"), true);
Resource tfsmRes = rs.getResource(
URI.createURI("melange:/file/input/Simple.timedfsm?mt=simpleaspects.FsmMT"), true);
// Polymorphic execution
System.out.println("execute:\n");
execute((FSM) fsmRes.getContents().get(0));
execute((FSM) tfsmRes.getContents().get(0));
// Polymorphic prettyPrint
System.out.println("prettyPrint:\n");
prettyPrint((FSM) fsmRes.getContents().get(0));
prettyPrint((FSM) tfsmRes.getContents().get(0));
// Polymorphic reflexive prettyPrint
System.out.println("reflexivePrettyPrint:\n");
reflexivePrettyPrint(fsmRes.getContents().get(0));
reflexivePrettyPrint(tfsmRes.getContents().get(0));
// Polymorphic QVTo invocation
System.out.println("runQVTo:\n");
runQVTo("melange:/file/input/Simple.fsm?mt=simpleaspects.FsmMT",
"OutputQVToFsm.fsm");
runQVTo("melange:/file/input/Simple.timedfsm?mt=simpleaspects.FsmMT",
"OutputQVToTimedFsm.fsm");
// Polymorphic ATL invocation
System.out.println("runATL:\n");
runATL("melange:/file/input/Simple.fsm?mt=simpleaspects.FsmMT",
"OutputATLFsm.fsm");
runATL("melange:/file/input/Simple.timedfsm?mt=simpleaspects.FsmMT",
"OutputATLTimedFsm.fsm");
}
}