<<<<<<< HEAD package simulation; import helpers.ApplicationSettings; import helpers.StreamGobbler; import java.io.BufferedWriter; import java.io.File; import java.io.FileOutputStream; import java.io.FileWriter; import java.util.ArrayList; import java.util.Collections; import java.util.List; import javax.swing.JOptionPane; import roadnetwork.RoadNetwork; import trafficdefinition.ActivityBasedTrafficDefinitionLayer; import trafficdefinition.RandomTrafficDefinitionLayer; import trafficdefinition.TrafficDefinitionElement; import trafficdefinition.TrafficDefinitionLayer; import trafficdefinition.UserDefinedTrafficDefinitionLayer; import classes.Project; /** * Class responsible for exporting the simulation * */ public class SimulationExporter { /** * Exports the specified road network to disk * * @param net * the road network to export * @param path * the folder to export the network to * @param name * the name of the files to create * @throws Exception */ private static void ExportNet(RoadNetwork net, String path, String name, boolean speedInKMH) throws Exception { // Delete the user-deleted elements from the documents and save the // .edg.xml and .nod.xml files to disk FileOutputStream edgefo = new FileOutputStream(path + File.separator + name + ".edg.xml"); FileOutputStream nodefo = new FileOutputStream(path + File.separator + name + ".nod.xml"); net.RemoveDeletedFromXMLDocuments(nodefo, edgefo); edgefo.close(); nodefo.close(); // Run SUMO netconvert utility to convert the files to a road network String[] args = new String[4]; args[0] = name + ".nod.xml"; args[1] = name + ".edg.xml"; args[2] = name + ".net.xml"; args[3] = ""; if(speedInKMH){ args[3]="--speed-in-kmh"; } ProcessBuilder pb = new ProcessBuilder(ApplicationSettings.getNetConvertPath(),"-n",args[0],"-e",args[1],"-o",args[2],args[3]); pb.directory(new File(path)); Process sumo = pb.start(); StreamGobbler gi = new StreamGobbler(sumo.getInputStream()); StreamGobbler ge = new StreamGobbler(sumo.getErrorStream()); gi.start(); ge.start(); int exitvalue = sumo.waitFor(); gi.stop(); ge.stop(); List<String> gir = gi.getReadLines(); List<String> ger = ge.getReadLines(); for (String s : ger) { System.out.println(s); } } /** * Exports polygons to an additional file for traffic definition elements * whose exportPolygon property is true * * @param layersToExport * the list of layers to export * @throws Exception * if anything goes wrong */ private static void ExportPolygons(List<TrafficDefinitionLayer> layersToExport, String path, String name) throws Exception { StringBuilder polygonBuilder = new StringBuilder(); // Loop through all elements in all selected layers for (TrafficDefinitionLayer layer : layersToExport) { for (TrafficDefinitionElement element : layer.getElements()) { // If the user has requested that a polygon will be exported if (element.getExportPolygon() && element.isEnabled()) { polygonBuilder.append(element.getGeometryXML()); } } } // Write the polygons to the file BufferedWriter geomout = new BufferedWriter(new FileWriter(path + File.separator + name + ".geometry.xml")); geomout.write("<polys>\n"); geomout.write(polygonBuilder.toString()); geomout.write("</polys>\n"); geomout.close(); } /** * Exports the simulation to disk. This method exports the * .edg.xml,.nod.xml,.net.xml,.rou.xml,.rou.alt.xml,.trips.xml and .sumo.cfg * files * * @param project * The project to export * @param layersToExport * The project's layers to export */ public static void ExportSimulation(Project project, List<TrafficDefinitionLayer> layersToExport) { Simulation sim = project.getSimulation(); // Empty the target folder if (JOptionPane.showConfirmDialog(null, "All files in the folder " + sim.getExportPath() + " will be deleted.\nAre you sure you want to continue?", "Confirm file deletion", JOptionPane.YES_NO_OPTION, JOptionPane.WARNING_MESSAGE) == JOptionPane.YES_OPTION) { File exportFolder = new File(sim.getExportPath()); for (File child : exportFolder.listFiles()) { if (!child.delete()) { JOptionPane.showMessageDialog(null, "Unable to empty simulation export folder. The operation was cancelled.", "Error", JOptionPane.ERROR_MESSAGE); return; } } } else { return; } // Try to export the road network try { ExportNet(project.getRoadNetwork(), sim.getExportPath(), sim.getName(), sim.isRoadNetworkSpeedInKMH()); } catch (Exception e) { JOptionPane.showMessageDialog(null, "Error while exporting road network", "Error", JOptionPane.ERROR_MESSAGE); e.printStackTrace(); return; } // Export polygons for traffic definition elements if (sim.getExportPolygons()) { try { ExportPolygons(layersToExport, sim.getExportPath(), sim.getName()); } catch (Exception e) { JOptionPane.showMessageDialog(null, "Error while exporting element geometry", "Error", JOptionPane.ERROR_MESSAGE); e.printStackTrace(); return; } } // Create a list that will hold all the generated trips SUMOInstructionList<Trip> tripsList = new SUMOInstructionList<Trip>(); // Create a string builder that will hold all the generated routes SUMOInstructionList<Route> routesList = new SUMOInstructionList<Route>(); // Create a string builder that will hold all the generated routes for // accidents SUMOInstructionList<Route> accidentRoutesList = new SUMOInstructionList<Route>(); try { // List of statistical traffic definition elements (areas and schools) List<TrafficDefinitionElement> statisticalDefinitionElements = new ArrayList<TrafficDefinitionElement>(); // Loop through each selected traffic definition layer for (TrafficDefinitionLayer selectedLayer : layersToExport) { if(selectedLayer instanceof UserDefinedTrafficDefinitionLayer){ TrafficGenerator.GenerateUserDefinedLayerTraffic(project.getRoadNetwork(), (UserDefinedTrafficDefinitionLayer) selectedLayer, tripsList, accidentRoutesList); } else if (selectedLayer instanceof RandomTrafficDefinitionLayer){ TrafficGenerator.GenerateRandomLayerTraffic(project.getRoadNetwork(),(RandomTrafficDefinitionLayer)selectedLayer, tripsList); } else if(selectedLayer instanceof ActivityBasedTrafficDefinitionLayer){ //Group together all enabled activity based elements for(TrafficDefinitionElement e:selectedLayer.getElements()){ if(e.isEnabled()){ statisticalDefinitionElements.add(e); } } } } // Generate traffic for statistical elements TrafficGenerator.GenerateActivityBasedTraffic(project.getRoadNetwork(), project.getJobTypes(), project.getActivityBasedTrafficVehicleSelection(), statisticalDefinitionElements, tripsList, routesList); } catch (Exception e) { JOptionPane.showMessageDialog(null, "Error while creating traffic for selected layers"); e.printStackTrace(); return; } // Check to see if any trips or routes were generated if (tripsList.isEmpty() && routesList.isEmpty() && accidentRoutesList.isEmpty()) { JOptionPane.showMessageDialog(null, "No trips or routes were generated"); } //Sort the generated lists by vehicle departure time Collections.sort(tripsList, new CustomComparator()); Collections.sort(routesList, new CustomComparator()); Collections.sort(accidentRoutesList, new CustomComparator()); // Write the trips to the trip file if (!tripsList.isEmpty()) { try { BufferedWriter tripout = new BufferedWriter(new FileWriter(sim.getExportPath() + File.separator + sim.getName() + ".generated-trips.xml")); tripout.write("<tripdefs>\n"); // Write the project's vehicle types for (VehicleType vehicleType : project.getVehicleTypes()) { tripout.write(vehicleType.toXML()); } // Write the generated trips tripout.write(tripsList.toString()); tripout.write("</tripdefs>"); tripout.close(); } catch (Exception e) { JOptionPane.showMessageDialog(null, "Error while writing trip file", "Error", JOptionPane.ERROR_MESSAGE); e.printStackTrace(); return; } } // Write the routes to the route file if (!routesList.isEmpty()) { try { BufferedWriter routeout = new BufferedWriter(new FileWriter(sim.getExportPath() + File.separator + sim.getName() + ".generated-routes.xml")); routeout.write("<routes>\n"); // Write the project's vehicle types for (VehicleType vehicleType : project.getVehicleTypes()) { routeout.write(vehicleType.toXML()); } // Write the generated routes routeout.write(routesList.toString()); routeout.write("</routes>"); routeout.close(); } catch (Exception e) { JOptionPane.showMessageDialog(null, "Error while writing route file", "Error", JOptionPane.ERROR_MESSAGE); e.printStackTrace(); return; } } // Write the accident routes to the additional route file if (!accidentRoutesList.isEmpty()) { try { BufferedWriter accidentRouteout = new BufferedWriter(new FileWriter(sim.getExportPath() + File.separator + sim.getName() + ".accidents.xml")); accidentRouteout.write("<routes>\n"); // If the vehicle types were not already written in another file if (routesList.isEmpty() && tripsList.isEmpty()) { // Write the project's vehicle types for (VehicleType vehicleType : project.getVehicleTypes()) { accidentRouteout.write(vehicleType.toXML()); } } // Write the generated routes accidentRouteout.write(accidentRoutesList.toString()); accidentRouteout.write("</routes>"); accidentRouteout.close(); } catch (Exception e) { JOptionPane.showMessageDialog(null, "Error while writing accident routes file", "Error", JOptionPane.ERROR_MESSAGE); e.printStackTrace(); return; } } if ((!tripsList.isEmpty()) || (!routesList.isEmpty())) { // Run dua router utility to convert the trips to routes List<String> args = new ArrayList<String>(); args.add("\"" + ApplicationSettings.getDUARouterPath() + "\""); if (!tripsList.isEmpty()) { args.add("-t=" + sim.getName() + "\".generated-trips.xml\""); } if (!routesList.isEmpty()) { args.add("-s=" + sim.getName() + "\".generated-routes.xml\""); } args.add("-n=" + sim.getName() + "\".net.xml\""); args.add("-o=" + sim.getName() + "\".rou.xml\""); args.add("--continue-on-unbuild"); try { ProcessBuilder pb = new ProcessBuilder(args); pb.directory(new File(sim.getExportPath())); Process dua = pb.start(); StreamGobbler gi = new StreamGobbler(dua.getInputStream()); StreamGobbler ge = new StreamGobbler(dua.getErrorStream()); gi.start(); ge.start(); int exitvalue = dua.waitFor(); gi.stop(); ge.stop(); List<String> gir = gi.getReadLines(); List<String> ger = ge.getReadLines(); for (String s : ger) { System.out.println(s); } } catch (Exception e) { JOptionPane.showMessageDialog(null, "Error while generating routes from trips", "Error", JOptionPane.ERROR_MESSAGE); e.printStackTrace(); return; } } // Export the simulation configuration file try { BufferedWriter out = new BufferedWriter(new FileWriter(sim.getExportPath() + File.separator + sim.getName() + ".sumo.cfg")); StringBuilder cfgBuilder = new StringBuilder(); cfgBuilder.append("<configuration>\n"); cfgBuilder.append("<input-files>\n"); cfgBuilder.append("<net-file>" + sim.getName() + ".net.xml</net-file>\n"); if ((!tripsList.isEmpty()) || (!routesList.isEmpty()) || (!accidentRoutesList.isEmpty())) { if (((!tripsList.isEmpty()) || (!routesList.isEmpty())) && (accidentRoutesList.isEmpty())) { cfgBuilder.append("<route-files>"); cfgBuilder.append(sim.getName() + ".rou.xml"); cfgBuilder.append("</route-files>\n"); } else if ((tripsList.isEmpty()&& routesList.isEmpty()) && (!accidentRoutesList.isEmpty())) { cfgBuilder.append("<route-files>"); cfgBuilder.append(sim.getName() + ".accidents.xml"); cfgBuilder.append("</route-files>\n"); } else { cfgBuilder.append("<route-files>"); cfgBuilder.append(sim.getName() + ".rou.xml" + ";" + sim.getName() + ".accidents.xml"); cfgBuilder.append("</route-files>\n"); } } if (sim.getExportPolygons()) { cfgBuilder.append("<additional-files>" + sim.getName() + ".geometry.xml</additional-files>\n"); } cfgBuilder.append("</input-files>\n"); cfgBuilder.append("<netstate-dump>" + sim.getName() + ".netdmp.xml</netstate-dump>\n"); cfgBuilder.append("<simulation>\n"); cfgBuilder.append("<begin>" + sim.getBeginTime() + "</begin>\n"); cfgBuilder.append("<end>" + sim.getEndTime() + "</end>\n"); cfgBuilder.append("</simulation>\n"); cfgBuilder.append("</configuration>\n"); out.write(cfgBuilder.toString()); out.close(); } catch (Exception e) { JOptionPane.showMessageDialog(null, "Error while writing simulation file", "Error", JOptionPane.ERROR_MESSAGE); e.printStackTrace(); return; } } ======= package simulation; import helpers.ApplicationSettings; import helpers.StreamGobbler; import java.io.BufferedWriter; import java.io.File; import java.io.FileOutputStream; import java.io.FileWriter; import java.util.ArrayList; import java.util.Collections; import java.util.List; import javax.swing.JOptionPane; import roadnetwork.RoadNetwork; import trafficdefinition.ActivityBasedTrafficDefinitionLayer; import trafficdefinition.RandomTrafficDefinitionLayer; import trafficdefinition.TrafficDefinitionElement; import trafficdefinition.TrafficDefinitionLayer; import trafficdefinition.UserDefinedTrafficDefinitionLayer; import classes.Project; /** * Class responsible for exporting the simulation * */ public class SimulationExporter { /** * Exports the specified road network to disk * * @param net * the road network to export * @param path * the folder to export the network to * @param name * the name of the files to create * @throws Exception */ private static void ExportNet(RoadNetwork net, String path, String name, boolean speedInKMH) throws Exception { // Delete the user-deleted elements from the documents and save the // .edg.xml and .nod.xml files to disk FileOutputStream edgefo = new FileOutputStream(path + File.separator + name + ".edg.xml"); FileOutputStream nodefo = new FileOutputStream(path + File.separator + name + ".nod.xml"); net.RemoveDeletedFromXMLDocuments(nodefo, edgefo); edgefo.close(); nodefo.close(); // Run SUMO netconvert utility to convert the files to a road network String[] args = new String[4]; args[0] = name + ".nod.xml"; args[1] = name + ".edg.xml"; args[2] = name + ".net.xml"; args[3] = ""; if(speedInKMH){ args[3]="--speed-in-kmh"; } ProcessBuilder pb = new ProcessBuilder(ApplicationSettings.getNetConvertPath(),"-n",args[0],"-e",args[1],"-o",args[2],args[3]); pb.directory(new File(path)); Process sumo = pb.start(); StreamGobbler gi = new StreamGobbler(sumo.getInputStream()); StreamGobbler ge = new StreamGobbler(sumo.getErrorStream()); gi.start(); ge.start(); int exitvalue = sumo.waitFor(); gi.stop(); ge.stop(); List<String> gir = gi.getReadLines(); List<String> ger = ge.getReadLines(); for (String s : ger) { System.out.println(s); } } /** * Exports polygons to an additional file for traffic definition elements * whose exportPolygon property is true * * @param layersToExport * the list of layers to export * @throws Exception * if anything goes wrong */ private static void ExportPolygons(List<TrafficDefinitionLayer> layersToExport, String path, String name) throws Exception { StringBuilder polygonBuilder = new StringBuilder(); // Loop through all elements in all selected layers for (TrafficDefinitionLayer layer : layersToExport) { for (TrafficDefinitionElement element : layer.getElements()) { // If the user has requested that a polygon will be exported if (element.getExportPolygon() && element.isEnabled()) { polygonBuilder.append(element.getGeometryXML()); } } } // Write the polygons to the file BufferedWriter geomout = new BufferedWriter(new FileWriter(path + File.separator + name + ".geometry.xml")); geomout.write("<polys>\n"); geomout.write(polygonBuilder.toString()); geomout.write("</polys>\n"); geomout.close(); } /** * Exports the simulation to disk. This method exports the * .edg.xml,.nod.xml,.net.xml,.rou.xml,.rou.alt.xml,.trips.xml and .sumo.cfg * files * * @param project * The project to export * @param layersToExport * The project's layers to export */ public static void ExportSimulation(Project project, List<TrafficDefinitionLayer> layersToExport) { Simulation sim = project.getSimulation(); // Empty the target folder if (JOptionPane.showConfirmDialog(null, "All files in the folder " + sim.getExportPath() + " will be deleted.\nAre you sure you want to continue?", "Confirm file deletion", JOptionPane.YES_NO_OPTION, JOptionPane.WARNING_MESSAGE) == JOptionPane.YES_OPTION) { File exportFolder = new File(sim.getExportPath()); for (File child : exportFolder.listFiles()) { if (!child.delete()) { JOptionPane.showMessageDialog(null, "Unable to empty simulation export folder. The operation was cancelled.", "Error", JOptionPane.ERROR_MESSAGE); return; } } } else { return; } // Try to export the road network try { ExportNet(project.getRoadNetwork(), sim.getExportPath(), sim.getName(), sim.isRoadNetworkSpeedInKMH()); } catch (Exception e) { JOptionPane.showMessageDialog(null, "Error while exporting road network", "Error", JOptionPane.ERROR_MESSAGE); e.printStackTrace(); return; } // Export polygons for traffic definition elements if (sim.getExportPolygons()) { try { ExportPolygons(layersToExport, sim.getExportPath(), sim.getName()); } catch (Exception e) { JOptionPane.showMessageDialog(null, "Error while exporting element geometry", "Error", JOptionPane.ERROR_MESSAGE); e.printStackTrace(); return; } } // Create a list that will hold all the generated trips SUMOInstructionList<Trip> tripsList = new SUMOInstructionList<Trip>(); // Create a string builder that will hold all the generated routes SUMOInstructionList<Route> routesList = new SUMOInstructionList<Route>(); // Create a string builder that will hold all the generated routes for // accidents SUMOInstructionList<Route> accidentRoutesList = new SUMOInstructionList<Route>(); try { // List of statistical traffic definition elements (areas and schools) List<TrafficDefinitionElement> statisticalDefinitionElements = new ArrayList<TrafficDefinitionElement>(); // Loop through each selected traffic definition layer for (TrafficDefinitionLayer selectedLayer : layersToExport) { if(selectedLayer instanceof UserDefinedTrafficDefinitionLayer){ TrafficGenerator.GenerateUserDefinedLayerTraffic(project.getRoadNetwork(), (UserDefinedTrafficDefinitionLayer) selectedLayer, tripsList, accidentRoutesList); } else if (selectedLayer instanceof RandomTrafficDefinitionLayer){ TrafficGenerator.GenerateRandomLayerTraffic(project.getRoadNetwork(),(RandomTrafficDefinitionLayer)selectedLayer, tripsList); } else if(selectedLayer instanceof ActivityBasedTrafficDefinitionLayer){ //Group together all enabled activity based elements for(TrafficDefinitionElement e:selectedLayer.getElements()){ if(e.isEnabled()){ statisticalDefinitionElements.add(e); } } } } // Generate traffic for statistical elements TrafficGenerator.GenerateActivityBasedTraffic(project.getRoadNetwork(), project.getJobTypes(), project.getActivityBasedTrafficVehicleSelection(), statisticalDefinitionElements, tripsList, routesList); } catch (Exception e) { JOptionPane.showMessageDialog(null, "Error while creating traffic for selected layers"); e.printStackTrace(); return; } // Check to see if any trips or routes were generated if (tripsList.isEmpty() && routesList.isEmpty() && accidentRoutesList.isEmpty()) { JOptionPane.showMessageDialog(null, "No trips or routes were generated"); } //Sort the generated lists by vehicle departure time Collections.sort(tripsList, new CustomComparator()); Collections.sort(routesList, new CustomComparator()); Collections.sort(accidentRoutesList, new CustomComparator()); // Write the trips to the trip file if (!tripsList.isEmpty()) { try { BufferedWriter tripout = new BufferedWriter(new FileWriter(sim.getExportPath() + File.separator + sim.getName() + ".generated-trips.xml")); tripout.write("<tripdefs>\n"); // Write the project's vehicle types for (VehicleType vehicleType : project.getVehicleTypes()) { tripout.write(vehicleType.toXML()); } // Write the generated trips tripout.write(tripsList.toString()); tripout.write("</tripdefs>"); tripout.close(); } catch (Exception e) { JOptionPane.showMessageDialog(null, "Error while writing trip file", "Error", JOptionPane.ERROR_MESSAGE); e.printStackTrace(); return; } } // Write the routes to the route file if (!routesList.isEmpty()) { try { BufferedWriter routeout = new BufferedWriter(new FileWriter(sim.getExportPath() + File.separator + sim.getName() + ".generated-routes.xml")); routeout.write("<routes>\n"); // Write the project's vehicle types for (VehicleType vehicleType : project.getVehicleTypes()) { routeout.write(vehicleType.toXML()); } // Write the generated routes routeout.write(routesList.toString()); routeout.write("</routes>"); routeout.close(); } catch (Exception e) { JOptionPane.showMessageDialog(null, "Error while writing route file", "Error", JOptionPane.ERROR_MESSAGE); e.printStackTrace(); return; } } // Write the accident routes to the additional route file if (!accidentRoutesList.isEmpty()) { try { BufferedWriter accidentRouteout = new BufferedWriter(new FileWriter(sim.getExportPath() + File.separator + sim.getName() + ".accidents.xml")); accidentRouteout.write("<routes>\n"); // If the vehicle types were not already written in another file if (routesList.isEmpty() && tripsList.isEmpty()) { // Write the project's vehicle types for (VehicleType vehicleType : project.getVehicleTypes()) { accidentRouteout.write(vehicleType.toXML()); } } // Write the generated routes accidentRouteout.write(accidentRoutesList.toString()); accidentRouteout.write("</routes>"); accidentRouteout.close(); } catch (Exception e) { JOptionPane.showMessageDialog(null, "Error while writing accident routes file", "Error", JOptionPane.ERROR_MESSAGE); e.printStackTrace(); return; } } if ((!tripsList.isEmpty()) || (!routesList.isEmpty())) { // Run dua router utility to convert the trips to routes List<String> args = new ArrayList<String>(); args.add("\"" + ApplicationSettings.getDUARouterPath() + "\""); if (!tripsList.isEmpty()) { args.add("-t=" + sim.getName() + "\".generated-trips.xml\""); } if (!routesList.isEmpty()) { args.add("-s=" + sim.getName() + "\".generated-routes.xml\""); } args.add("-n=" + sim.getName() + "\".net.xml\""); args.add("-o=" + sim.getName() + "\".rou.xml\""); args.add("--continue-on-unbuild"); try { ProcessBuilder pb = new ProcessBuilder(args); pb.directory(new File(sim.getExportPath())); Process dua = pb.start(); StreamGobbler gi = new StreamGobbler(dua.getInputStream()); StreamGobbler ge = new StreamGobbler(dua.getErrorStream()); gi.start(); ge.start(); int exitvalue = dua.waitFor(); gi.stop(); ge.stop(); List<String> gir = gi.getReadLines(); List<String> ger = ge.getReadLines(); for (String s : ger) { System.out.println(s); } } catch (Exception e) { JOptionPane.showMessageDialog(null, "Error while generating routes from trips", "Error", JOptionPane.ERROR_MESSAGE); e.printStackTrace(); return; } } // Export the simulation configuration file try { BufferedWriter out = new BufferedWriter(new FileWriter(sim.getExportPath() + File.separator + sim.getName() + ".sumo.cfg")); StringBuilder cfgBuilder = new StringBuilder(); cfgBuilder.append("<configuration>\n"); cfgBuilder.append("<input-files>\n"); cfgBuilder.append("<net-file>" + sim.getName() + ".net.xml</net-file>\n"); if ((!tripsList.isEmpty()) || (!routesList.isEmpty()) || (!accidentRoutesList.isEmpty())) { if (((!tripsList.isEmpty()) || (!routesList.isEmpty())) && (accidentRoutesList.isEmpty())) { cfgBuilder.append("<route-files>"); cfgBuilder.append(sim.getName() + ".rou.xml"); cfgBuilder.append("</route-files>\n"); } else if ((tripsList.isEmpty()&& routesList.isEmpty()) && (!accidentRoutesList.isEmpty())) { cfgBuilder.append("<route-files>"); cfgBuilder.append(sim.getName() + ".accidents.xml"); cfgBuilder.append("</route-files>\n"); } else { cfgBuilder.append("<route-files>"); cfgBuilder.append(sim.getName() + ".rou.xml" + ";" + sim.getName() + ".accidents.xml"); cfgBuilder.append("</route-files>\n"); } } if (sim.getExportPolygons()) { cfgBuilder.append("<additional-files>" + sim.getName() + ".geometry.xml</additional-files>\n"); } cfgBuilder.append("</input-files>\n"); cfgBuilder.append("<netstate-dump>" + sim.getName() + ".netdmp.xml</netstate-dump>\n"); cfgBuilder.append("<simulation>\n"); cfgBuilder.append("<begin>" + sim.getBeginTime() + "</begin>\n"); cfgBuilder.append("<end>" + sim.getEndTime() + "</end>\n"); cfgBuilder.append("</simulation>\n"); cfgBuilder.append("</configuration>\n"); out.write(cfgBuilder.toString()); out.close(); } catch (Exception e) { JOptionPane.showMessageDialog(null, "Error while writing simulation file", "Error", JOptionPane.ERROR_MESSAGE); e.printStackTrace(); return; } } >>>>>>> origin/abdalla }