/**
*
*/
package org.js.model.stageconfig.handler;
import hub.top.editor.ptnetLoLA.Arc;
import hub.top.editor.ptnetLoLA.Place;
import hub.top.editor.ptnetLoLA.PtNet;
import hub.top.editor.ptnetLoLA.PtnetLoLAPackage;
import hub.top.editor.ptnetLoLA.Transition;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Iterator;
import java.util.List;
import org.eclipse.core.commands.AbstractHandler;
import org.eclipse.core.commands.ExecutionEvent;
import org.eclipse.core.commands.ExecutionException;
import org.eclipse.core.resources.IFile;
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.resource.Resource;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.ui.ISelectionService;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.handlers.HandlerUtil;
/**
* Handler for creating Lola Files
* @author Tim Winkelmann
*
*/
public class PrepareLolaHandler extends AbstractHandler {
/*
* (non-Javadoc)
*
* @see
* org.eclipse.core.commands.IHandler#execute(org.eclipse.core.commands.
* ExecutionEvent)
*/
@Override
public Object execute(ExecutionEvent event) throws ExecutionException {
ISelection sel = HandlerUtil.getActiveMenuSelection(event);
IStructuredSelection selection = (IStructuredSelection) sel;
Object firstElement = selection.getFirstElement();
if (firstElement instanceof IFile) {
IFile file = (IFile) firstElement;
System.out.println(file.getProject().getLocation().toString());
PtnetLoLAPackage einstance = PtnetLoLAPackage.eINSTANCE;
ResourceSet resourceSet = new ResourceSetImpl();
String path = file.getFullPath().toString();
URI uri = URI.createPlatformResourceURI(path, true);
Resource resource = resourceSet.getResource(uri,true);
if (resource != null) {
if (!resource.getContents().isEmpty()) {
EObject eObject = resource.getContents().get(0);
eObject.eContainer();
if (eObject instanceof PtNet) {
PtNet ptnet = (PtNet) eObject;
String lolaFilePath = file.getProject().getLocation().toString() + "/" + file.getName();
lolaFilePath = lolaFilePath.replace(".ptnet", ".lola");
File lolaFile = new File(lolaFilePath);
createLolaFile(lolaFile,ptnet);
EList<Transition> transitions = ptnet.getTransitions();
for (Transition transition : transitions) {
String taskFilePath = file.getProject().getLocation().toString() + "/" + file.getName() + "." + transition.getName() + ".task";
taskFilePath = taskFilePath.replace(".ptnet", ".lola");
File taskFile = new File(taskFilePath);
try {
System.out.println(taskFile.getAbsolutePath());
taskFile.createNewFile();
FileWriter fileWriter = new FileWriter(taskFile);
String formulaForTransaction = createFormulaForTransaction(transition);
System.out.println(formulaForTransaction);
fileWriter.write(formulaForTransaction);
fileWriter.close();
} catch (IOException e) {
e.printStackTrace();
}
}
String taskFilePath = file.getProject().getLocation().toString() + "/" + file.getName() + "." + "t_star" + ".task";
taskFilePath = taskFilePath.replace(".ptnet", ".lola");
File taskFile = new File(taskFilePath);
try {
System.out.println(taskFile.getAbsolutePath());
taskFile.createNewFile();
FileWriter fileWriter = new FileWriter(taskFile);
String formula = "FORMULA ( o >= 1 )";
System.out.println(formula);
fileWriter.write(formula);
fileWriter.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
return null;
}
/**
* Creates lola file
* @param lolaFile
* @param ptnet
*/
private void createLolaFile(File lolaFile, PtNet ptnet) {
//create file
try {
lolaFile.createNewFile();
//create places
FileWriter fileWriter = new FileWriter(lolaFile);
fileWriter.write("PLACE\n\r");
EList<Place> places = ptnet.getPlaces();
for (Iterator iterator = places.iterator(); iterator.hasNext();) {
Place place = (Place) iterator.next();
fileWriter.write(place.getName());
if (iterator.hasNext()) {
fileWriter.write(", ");
} else {
fileWriter.write(";\n\r");
}
}
//create marking
fileWriter.write("MARKING\n\r");
fileWriter.write("i:1;\n\r");
//create t*
fileWriter.write("TRANSITION t_star\n\r");
fileWriter.write("CONSUME\n\r");
fileWriter.write("o:1;\n\r");
fileWriter.write("PRODUCE\n\r");
fileWriter.write("i:1;\n\r");
//create transitions
EList<Transition> transitions = ptnet.getTransitions();
for (Transition transition : transitions) {
fileWriter.write("TRANSITION " + transition.getName() + "\n\r");
fileWriter.write("CONSUME\n\r");
EList<Arc> incoming = transition.getIncoming();
for (Iterator iterator = incoming.iterator(); iterator.hasNext();) {
Arc arc = (Arc) iterator.next();
fileWriter.write(arc.getSource().getName());
if (iterator.hasNext()) {
fileWriter.write(":1,\n\r");
} else {
fileWriter.write(":1;\n\r");
}
}
fileWriter.write("PRODUCE\n\r");
EList<Arc> outgoing = transition.getOutgoing();
for (Iterator iterator = outgoing.iterator(); iterator.hasNext();) {
Arc arc = (Arc) iterator.next();
fileWriter.write(arc.getTarget().getName());
if (iterator.hasNext()) {
fileWriter.write(":1,\n\r");
} else {
fileWriter.write(":1;\n\r");
}
}
}
fileWriter.close();
} catch (IOException e) {
System.err.println("Could not create a new lola file!");
e.printStackTrace();
return;
}
}
/**
* Creates the liveness formula for the task file
* @param transition the transition for the liveness check
* @return the formula
*/
private String createFormulaForTransaction(Transition transition){
EList<Arc> incoming = transition.getIncoming();
String formula = "FORMULA ( ";
for (Arc arc : incoming) {
formula = formula + arc.getSource().getName();
formula = formula + " >= 1 AND ";
}
//remove last AND
formula = formula.substring(0, formula.length()-5);
formula = formula + ")";
return formula;
}
/*
* (non-Javadoc)
*
* @see org.eclipse.core.commands.IHandler#isEnabled()
*/
@Override
public boolean isEnabled() {
IWorkbench wb = PlatformUI.getWorkbench();
IWorkbenchWindow activeWorkbenchWindow = wb.getActiveWorkbenchWindow();
if (activeWorkbenchWindow == null) {
return false;
}
ISelectionService selectionService = activeWorkbenchWindow.getSelectionService();
if (selectionService == null) {
return false;
}
ISelection selection = selectionService.getSelection();
if (selection == null) {
return false;
}
if (selection instanceof IStructuredSelection) {
IStructuredSelection structSelection = (IStructuredSelection) selection;
List<?> selected = structSelection.toList();
for (Object object : selected) {
if (object instanceof IFile) {
IFile file = (IFile) object;
String fileExtension = file.getFileExtension();
if (fileExtension.equals("ptnet")) {
return true;
}
}
}
}
return false;
}
}