source: tmcsimulator-scriptbuilder/trunk/src/scriptbuilder/structures/SimulationScript.java @ 59

Revision 59, 6.8 KB checked in by bmcguffin, 9 years ago (diff)

Created new method incidentCount() for testing purposes. Added call to ScriptIncident?.updateLength() in absoluteLength() method.

Line 
1package scriptbuilder.structures;
2
3import java.awt.Color;
4import java.io.BufferedWriter;
5import java.io.File;
6import java.io.FileWriter;
7import java.io.OutputStream;
8import java.io.OutputStreamWriter;
9import java.util.ArrayList;
10import java.util.List;
11import java.util.Observable;
12import java.util.Random;
13import java.util.Vector;
14import java.util.logging.Level;
15import java.util.logging.Logger;
16import javax.xml.parsers.ParserConfigurationException;
17import javax.xml.parsers.SAXParserFactory;
18import scriptbuilder.structures.ScriptEvent.ScriptEventType;
19import scriptbuilder.structures.ScriptIncident.IncidentFocusedEvent;
20import scriptbuilder.structures.ScriptIncident.SliceChangedEvent;
21import scriptbuilder.structures.units.Unit;
22
23/**
24 * Representation of the script to be run by the TMC Simulator. Holds a list of
25 * incidents, which have start and end times and contain events.
26 *
27 * @author Greg Eddington <geddingt@calpoly.edu>
28 *
29 * @author Bryan McGuffin <bmcguffi@calpoly.edu>
30 * @version 2017/06/22
31 */
32public class SimulationScript extends Observable implements I_XML_Writable
33{
34
35    /**
36     * All default options for GUI colorings of incidents.
37     */
38    public static final Color[] incidentColors =
39    {
40        Color.BLACK,
41        Color.BLUE,
42        Color.RED,
43        new Color(0x38, 0x5E, 0x0F),
44        new Color(128, 0, 128),
45        Color.MAGENTA,
46        new Color(0x23, 0x6B, 0x8E),
47        Color.ORANGE,
48        new Color(0x60, 0x33, 0x11),
49        Color.GRAY
50    };
51
52    public File saveFile = null;
53
54    public String title = "";
55
56    /**
57     * The incidents displayed by the GUI.
58     */
59    public List<ScriptIncident> incidents;
60
61    /**
62     * The units which participate in Unit events.
63     */
64    public List<Unit> units;
65
66    //Somewhere in the code, something assumes that the list of incidents
67    //contains exactly 10 items. Until I can find and un-break that, this will do.
68    private final int INCIDENT_FILL_COUNT = 10;
69
70    /**
71     * Number of incidents currently displayed.
72     */
73    private int numberOfIncidents;
74
75    /**
76     * Script handler for parsing incoming XML files.
77     */
78    private MyScriptHandler sh;
79
80    //TODO: Pretty much everything in this constructor is dummy data.
81    //Replace all of it.
82    /**
83     * Constructor. Backfill incident list with null objects, to be replaced
84     * later.
85     */
86    public SimulationScript()
87    {
88        sh = new MyScriptHandler(this);
89        incidents = new ArrayList<ScriptIncident>();
90        units = new ArrayList<Unit>();
91        numberOfIncidents = 0;
92
93        //Backfill with null incidents
94        for (int i = numberOfIncidents; i < INCIDENT_FILL_COUNT; i++)
95        {
96            incidents.add(null);
97        }
98    }
99
100    /**
101     * Update the script's observers.
102     *
103     */
104    public void update()
105    {
106        // The script has changed, notify observers
107        setChanged();
108        notifyObservers(this);
109    }
110
111    /**
112     * Tell this script's observers that there is a new slice event.
113     *
114     * @param e the slice focus event
115     */
116    public void broadcastEvent(SliceChangedEvent e)
117    {
118        // The slice focus has changed; pass the message
119        setChanged();
120        notifyObservers(e);
121    }
122
123    /**
124     * Tell this script's observers that there is a new slice event.
125     *
126     * @param e the incident focus event
127     */
128    public void broadcastEvent(IncidentFocusedEvent e)
129    {
130        // The slice focus has changed; pass the message
131        setChanged();
132        notifyObservers(e);
133    }
134
135    /**
136     * Load in an existing script from an XML file.
137     *
138     * @param f the file containing the script
139     */
140    public void loadScriptFromFile(File f)
141    {
142        try
143        {
144
145            SAXParserFactory.newInstance().newSAXParser().parse(f, sh);
146
147            Vector<ScriptIncident> inc = sh.getIncidents();
148            units = sh.getUnits();
149            for (ScriptIncident sci : inc)
150            {
151                if (numberOfIncidents < INCIDENT_FILL_COUNT)
152                {
153                    incidents.set(numberOfIncidents++, sci);
154                }
155            }
156        }
157        catch (Exception ex)
158        {
159            System.out.println("ERROR LOADING SCRIPT");
160            ex.printStackTrace();
161        }
162        this.update();
163    }
164
165    public void saveScriptToFile(File f)
166    {
167        try
168        {
169            f.createNewFile();
170
171            BufferedWriter bw = new BufferedWriter(new FileWriter(f));
172            bw.write(this.toXML());
173            bw.flush();
174            bw.close();
175
176        }
177        catch (Exception ex)
178        {
179            System.out.println("ERROR SAVING SCRIPT");
180            ex.printStackTrace();
181        }
182    }
183
184    @Override
185    public String toXML()
186    {
187        ArrayList<TimeSlice> slices = allSlices();
188        String output = "<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>\n";
189        output += "<!DOCTYPE TMC_SCRIPT SYSTEM \"script.dtd\">\n";
190        output += XMLWriter.openTag(ELEMENT.TMC_SCRIPT.tag + " title=\"" + this.title + "\"");
191
192        if (units.size() > 0)
193        {
194            output += XMLWriter.openTag(ELEMENT.SCRIPT_DATA.tag);
195            for (Unit unit : units)
196            {
197                output += unit.toXML();
198            }
199            output += XMLWriter.closeTag(ELEMENT.SCRIPT_DATA.tag);
200        }
201        for (TimeSlice slice : slices)
202        {
203            output += slice.toXML();
204        }
205        output += XMLWriter.closeTag(ELEMENT.TMC_SCRIPT.tag);
206        return output;
207    }
208
209    /**
210     * Arranges all timeslices in this script in chronological order, then by
211     * incident number.
212     *
213     * @return a list of all timeslices in the simulation script
214     */
215    public ArrayList<TimeSlice> allSlices()
216    {
217        ArrayList<TimeSlice> list = new ArrayList<TimeSlice>();
218        int length = absoluteLength();
219
220        for (int i = 0; i < length; i++)
221        {
222            for (ScriptIncident inc : incidents)
223            {
224
225                if (inc != null && inc.slices.get(i) != null)
226                {
227                    list.add(inc.slices.get(i));
228                }
229            }
230        }
231        return list;
232    }
233
234    /**
235     * Gets the total length of the simulation in seconds.
236     *
237     * @return
238     */
239    public int absoluteLength()
240    {
241        int length = 0;
242        for (ScriptIncident inc : incidents)
243        {
244            if (inc != null)
245            {
246                inc.updateLength();
247                int currentLength = inc.length + inc.offset;
248                if (currentLength > length)
249                {
250                    length = currentLength;
251                }
252            }
253        }
254        return length;
255    }
256
257    public int incidentCount()
258    {
259        int count = 0;
260        for (ScriptIncident inc : incidents)
261        {
262            if (inc != null)
263            {
264                count++;
265            }
266        }
267        return count;
268    }
269
270}
Note: See TracBrowser for help on using the repository browser.