package com.opentrafficsimulation.screen.simulation;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.SwingWorker;
import com.opentrafficsimulation.connector.Connector;
import com.opentrafficsimulation.connector.TraciConnector;
import com.opentrafficsimulation.connector.utility.ConnectorType;
import com.opentrafficsimulation.editor.light.LightEditor;
import com.opentrafficsimulation.editor.road.RoadEditor;
import com.opentrafficsimulation.gui.CreateMapFrame;
import com.opentrafficsimulation.gui.CreateSimulationFrame;
import com.opentrafficsimulation.gui.EditTrafficLights;
import com.opentrafficsimulation.gui.MainGUI;
import com.opentrafficsimulation.screen.report.EmissionScreen;
import com.opentrafficsimulation.screen.report.ReportScreen;
import java.awt.Dimension;
import java.io.File;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
public class SimulationScreen {
// Singleton instance
private static SimulationScreen simulationScreen = new SimulationScreen();
public static int SIMULATION_TIME;
public static int SIMULATION_BEGIN;
public static int SIMULATION_END;
public int portNumber;
public TraciConnector traciConnector;
public EditTrafficLights edt;
private SimulationScreen() {
}
public static SimulationScreen getInstance() {
return simulationScreen;
}
public void runSimulation() {
if (CreateMapFrame.getInstance().netgenerate_file != null) {
try {
DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
// config element
Document doc = docBuilder.newDocument();
Element rootElement = doc.createElement("configuration");
rootElement.setAttribute("xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance");
rootElement.setAttribute("xsi:noNamespaceSchemaLocation", "http://sumo.sf.net/xsd/sumoConfiguration.xsd");
doc.appendChild(rootElement);
// input element
Element inputElement = doc.createElement("input");
// net file value
Element netFile = doc.createElement("net-file");
netFile.setAttribute("value", CreateMapFrame.getInstance().netgenerate_file + ".net.xml");
// rou file value
Element rouFile = doc.createElement("route-files");
rouFile.setAttribute("value", CreateMapFrame.getInstance().netgenerate_file + ".rou.xml");
// appending rou and net file to input element
inputElement.appendChild(netFile);
inputElement.appendChild(rouFile);
// appending input element to config element
rootElement.appendChild(inputElement);
// time element
Element timeElement = doc.createElement("time");
// begin time
Element beginTime = doc.createElement("begin");
beginTime.setAttribute("value", String.valueOf(SIMULATION_BEGIN));
// TO-DO: adding report tags for report screen
// end time
Element endTime = doc.createElement("end");
endTime.setAttribute("value", String.valueOf(SIMULATION_END));
// append begin and end time to time element
timeElement.appendChild(beginTime);
timeElement.appendChild(endTime);
// append time element to config element
rootElement.appendChild(timeElement);
// write the content into xml file with the net file name
String configurationFileName = new Connector(ConnectorType.CONNECTOR_NETCONVERT).getOutputDir() + CreateMapFrame.getInstance().netgenerate_file + ".sumo.cfg";
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
DOMSource source = new DOMSource(doc);
StreamResult result = new StreamResult(new File(configurationFileName));
// Output to console for testing
transformer.transform(source, result);
SwingWorker trafficLightWindow = new SwingWorker<String, Object>() {
@Override
public String doInBackground() {
if(LightEditor.getInstance().tlModel.size() > 0){
edt = new EditTrafficLights();
edt.setVisible(true);
edt.setLocation(30, 30);
}
return "running";
}
@Override
public void done() {
}
};
trafficLightWindow.execute();
// Run the simulation with the configuration
SwingWorker worker = new SwingWorker<String, Object>() {
@Override
public String doInBackground() {
String configurationFileName = new Connector(ConnectorType.CONNECTOR_NETCONVERT).getOutputDir() + CreateMapFrame.getInstance().netgenerate_file + ".sumo.cfg";
traciConnector = new TraciConnector();
traciConnector.runSimulation(configurationFileName);
return "running";
}
@Override
public void done() {
System.out.println("simalation screen closed / simulation completed");
String emissionFilename = new Connector(ConnectorType.CONNECTOR_NETCONVERT).getOutputDir() + CreateMapFrame.getInstance().netgenerate_file + Integer.toString(portNumber) + ".emission.xml";
String filename = new Connector(ConnectorType.CONNECTOR_NETCONVERT).getOutputDir() + CreateMapFrame.getInstance().netgenerate_file + Integer.toString(portNumber) + ".trip.xml";
new ReportScreen(filename);
edt.dispose();
new EmissionScreen(emissionFilename);
}
};
worker.execute();
} catch (Exception e) {
e.printStackTrace();
}
} else {
JDialog errorDialog = new JDialog(MainGUI.getInstance(), true);
errorDialog.setPreferredSize(new Dimension(300, 200));
errorDialog.setSize(300, 200);
errorDialog.setTitle("Missing files for configuration");
JLabel errorLabel = new JLabel();
errorLabel.setText("<html><p>Please check net and rou files<br/>before running simulation!</p></html>");
errorDialog.add(errorLabel);
errorDialog.setVisible(true);
}
}
}