/************************************************************************************ * Copyright (C) 2008 by Politehnica University of Bucharest and Rutgers University * All rights reserved. * Refer to LICENSE for terms and conditions of use. ***********************************************************************************/ package vnsim.gui.selector; import java.io.EOFException; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.InputStream; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.util.Vector; import java.util.logging.*; import javax.swing.JOptionPane; import vnsim.map.object.Globals; import vnsim.map.object.Map; import vnsim.vehicular.scenarios.*; import vnsim.gui.MapLoader; import vnsim.gui.Utils; import vnsim.gui.Utils.ClassSystemView; public class ScenarioDesigner { /** Logger used by this class */ private static final transient Logger logger = Logger.getLogger("gui.selector.ScenarioDesigner"); public Vector existingScenarios; public ScenarioSelection scenarioSelector; public ScenarioConfiguration scenarioConfigurator; Scenario finalConfiguration; public ScenarioDesigner(String fileIn) { ScenarioMap s; try { existingScenarios = new Vector(); final ClassSystemView f1 = new ClassSystemView(fileIn); String[] files = f1.list(); File f = new File(System.getProperty("user.home") + File.separatorChar + fileIn.replace('/', File.separatorChar).replace('\\', File.separatorChar)); if (f.exists() && f.isDirectory()) { String[] f2 = f.list(); Vector v = new Vector(); if (files != null) { for (int i = 0; i < files.length; i++) { if (!v.contains(files[i])) { v.add(files[i]); } } } if (f2 != null) { for (int i = 0; i < f2.length; i++) { if (!v.contains(f2[i])) { v.add(f2[i]); } } } files = new String[v.size()]; files = v.toArray(files); } final String dir = f.getAbsolutePath(); if (files != null && files.length != 0) { for (int i = 0; i < files.length; i++) { ObjectInputStream ois = null; f = new File(dir + File.separatorChar + files[i]); if (f.isDirectory()) { continue; } if (f.exists() && f.isFile() && f.canRead()) { ois = new ObjectInputStream(new FileInputStream(f)); } else { try { InputStream in = Utils.getInstance().openStream( fileIn + (fileIn.endsWith("/") ? "" : "/") + files[i]); if (in == null) { continue; } ois = new ObjectInputStream(in); } catch (Throwable t) { logger.log(Level.SEVERE, "Error reading " + fileIn + "/" + files[i], t); System.exit(0); } } while (true) { try { s = (ScenarioMap) ois.readObject(); if (s != null) { existingScenarios.add(s); } } catch (EOFException e) { break; } catch (Exception e) { e.printStackTrace(); } } ois.close(); } } } catch (Exception e) { logger.log(Level.SEVERE, "Error reading ScenarioMaps", e); System.exit(0); } } public boolean getScenario() { if (MapLoader.listSmf.getSelectedIndex() == -1) { System.err.println("Selecteaza un scenariu gol!"); return false; } int id = -1; String s = ((String) MapLoader.listSmf.getSelectedValue()); String scenariu = s.substring(0, s.length() - 4); logger.info("Looking for "+scenariu); for (int i = 0; i < existingScenarios.size(); i++) { // System.out.println(existingScenarios.get(i).name+":"+scenariu); if (existingScenarios.get(i).name.equals(scenariu)) { id = i; break; } } logger.info("Found on id="+id); try { ObjectInputStream ois = null; String fn = existingScenarios.get(id).mapFileName; if (fn.startsWith(".")) fn = fn.substring(1); String dir = System.getProperty("user.home") + File.separatorChar + fn.replace('/', File.separatorChar).replace('\\', File.separatorChar); File f = new File(dir); if (f.exists() && f.isFile() && f.canRead()) { ois = new ObjectInputStream(new FileInputStream(f)); } else { ois = new ObjectInputStream(Utils.getInstance().openStream(fn.replace('\\', '/'))); } Globals.map = (Map) ois.readObject(); ois.close(); } catch (Exception ex) { ex.printStackTrace(); } System.err.println("?? " + existingScenarios.elementAt(id).exits.size()); this.scenarioConfigurator = ScenarioConfiguration.getInstance(this, this.existingScenarios.elementAt(id), null); if (this.scenarioConfigurator==null){ JOptionPane.showMessageDialog(null, "Create routes for the scenario first!"); return false; } this.scenarioConfigurator.setVisible(true); this.scenarioConfigurator.repaint(); return true; } public void afterExit() { finalConfiguration = this.scenarioConfigurator.getScenario(); setPreferences(finalConfiguration); this.scenarioConfigurator.dispose(); EntryScenario es; EntryExitScenario ees; int j, i, k; for (i = 0; i < finalConfiguration.entryScenarios.size(); i++) { es = finalConfiguration.entryScenarios.get(i); int sum1 = 0, sum2 = 0, tp = 0; for (j = 0; j < es.percentsDriverTypes.size(); j++) { sum1 = sum1 + es.percentsDriverTypes.get(j).intValue(); } for (j = 0; j < es.percentsDriverTypes.size() - 1; j++) { tp = es.percentsDriverTypes.get(j); if (tp > 0) { sum2 = ((tp * 100) / sum1) + sum2; es.percentsDriverTypes.set(j, new Integer((tp * 100) / sum1)); } } es.percentsDriverTypes.set(j, new Integer(100 - sum2)); sum1 = 0; sum2 = 0; tp = 0; for (j = 0; j < es.entryExits.size(); j++) { sum1 = sum1 + es.entryExits.elementAt(j).percentOfFlow; } for (j = 0; j < es.entryExits.size() - 1; j++) { tp = es.entryExits.elementAt(j).percentOfFlow; if (tp > 0) { sum2 = (int) ((double) (tp * 100) / sum1) + sum2; es.entryExits.elementAt(j).percentOfFlow = (int) ((double) (tp * 100) / sum1); } } if (j > 0) { es.entryExits.elementAt(j).percentOfFlow = 100 - sum2; } for (k = 0; k < es.entryExits.size(); k++) { ees = es.entryExits.elementAt(k); sum1 = 0; sum2 = 0; tp = 0; for (j = 0; j < ees.percentsEachRoute.size(); j++) { sum1 = sum1 + ees.percentsEachRoute.get(j).intValue(); } for (j = 0; j < ees.percentsEachRoute.size() - 1; j++) { tp = ees.percentsEachRoute.get(j); if (tp > 0) { sum2 = ((tp * 100) / sum1) + sum2; ees.percentsEachRoute.set(j, new Integer((tp * 100) / sum1)); } } if (ees.percentsEachRoute.size() > 0) { ees.percentsEachRoute.set((ees.percentsEachRoute.size() - 1), new Integer(100 - sum2)); } } } try { String dir = System.getProperty("user.home") + File.separatorChar + "maps" + File.separatorChar + "fsc"; (new File(dir)).mkdirs(); ObjectOutputStream outStr = new ObjectOutputStream(new FileOutputStream(dir + File.separatorChar + finalConfiguration.name + ".fsc")); outStr.writeObject(finalConfiguration); outStr.close(); /* * ObjectOutputStream outStr = new ObjectOutputStream(new * FileOutputStream(".//maps//fsc//" + finalConfiguration.name + * ".fsc")); outStr.writeObject(finalConfiguration); */ } catch (Exception e) { e.printStackTrace(); } MapLoader.show(true); } public void setPreferences(Scenario s) { } }