source: tmcsimulator-scriptbuilder/trunk/src/scriptbuilder/structures/MyScriptHandler.java @ 138

Revision 138, 36.9 KB checked in by bmcguffin, 8 years ago (diff)

Added support for incident color. Color is now read from the xml file; if no color field exists, it picks a random one. Upon saving the file, color is written out in RGB format. The DTD now contains a new field, COLOR, with three attributes: r, g, b.

Line 
1/*
2 * To change this license header, choose License Headers in Project Properties.
3 * To change this template file, choose Tools | Templates
4 * and open the template in the editor.
5 */
6package scriptbuilder.structures;
7
8import java.awt.Color;
9import java.util.ArrayList;
10import java.util.Random;
11import java.util.Stack;
12import java.util.TreeMap;
13import java.util.Vector;
14import java.util.logging.Level;
15import java.util.logging.Logger;
16import org.xml.sax.Attributes;
17import org.xml.sax.SAXParseException;
18import org.xml.sax.helpers.DefaultHandler;
19import scriptbuilder.structures.events.*;
20import scriptbuilder.structures.units.Unit;
21
22/**
23 * Script Handler class for the ScriptBuilder. Adapted from the TMCSim script
24 * handler written by Matthew Cechini.
25 *
26 * @author Bryan McGuffin
27 * @version 2017/07/03
28 */
29public class MyScriptHandler extends DefaultHandler
30{
31
32    /**
33     * Error Logger.
34     */
35    private Logger myScriptLogger = Logger.getLogger("scriptbuilder.structures");
36
37    /**
38     * The script which XML entities will be entered into.
39     */
40    private SimulationScript script;
41
42    /**
43     * Map containing all parsed values. Keys = XML Element. Values = parsed
44     * character data from XML file.
45     */
46    private TreeMap<ELEMENT, String> pcData;
47
48    /**
49     * Current element that we're in.
50     */
51    private ELEMENT currentElement;
52
53    /**
54     * Ordering of elements that we're within.
55     */
56    private Stack<ELEMENT> docPosition;
57
58    /**
59     * Map containing all parsed Incidents. Keys = Incident Log Number. Values =
60     * Incident object.
61     */
62    private TreeMap<Integer, ScriptIncident> incidentMap;
63
64    /**
65     * Map containing all Units. Keys = Unit number. Values = Unit object.
66     */
67    private ArrayList<Unit> units;
68
69    /**
70     * Map containing all parsed script events. Keys = XML file level. Values =
71     * Event object.
72     */
73    private TreeMap<ELEMENT, I_ScriptEvent> eventMap;
74
75    /**
76     * Buffer used to hold parsed tag content.
77     */
78    private StringBuffer parsedValue = new StringBuffer();
79
80    /**
81     * *************************************************
82     * ~~~~~~~~Element attribute data.~~~~~~~~
83     * **************************************************
84     */
85    /**
86     * Log number for the current ScriptEvent being parsed.
87     */
88    private Integer incidentLogNumber = 0;
89
90    /**
91     * File path for the current audio file.
92     */
93    private String audioPath = "";
94
95    /**
96     * Length in seconds of the current audio file.
97     */
98    private Integer audioLength = 0;
99
100    /**
101     * Category name for the current cardfile.
102     */
103    private String cardfileCategory = "";
104
105    /**
106     * File path for the current CHP radio file.
107     */
108    private String CHPRadiofile = "";
109
110    /**
111     * ID number for the current CMS data.
112     */
113    private String CMSID = "";
114
115    /**
116     * Type for the current CMS data.
117     */
118    private String CMSType = "";
119
120    /**
121     * Role played by the instructor for the current dialog line.
122     */
123    private String InstructorRole = "";
124
125    /**
126     * Role played by the speaker for the current dialog line.
127     */
128    private String LineRole = "";
129
130    /**
131     * ID number for the current location info.
132     */
133    private String LocationInfoID = "";
134
135    /**
136     * ID number for the current unit.
137     */
138    private String NewUnitNum = "";
139
140    /**
141     * ID number for the current Paramics data.
142     */
143    private String ParamicsID = "";
144
145    /**
146     * Title of the script.
147     */
148    private String TMCTitle = "";
149
150    /**
151     * Beat for the current Tow data.
152     */
153    private String TowBeat = "";
154
155    /**
156     * Company name for the current Tow data.
157     */
158    private String TowCompany = "";
159
160    /**
161     * Confirmation phone number for the current Tow data.
162     */
163    private String TowConfNum = "";
164
165    /**
166     * Public telephone number for the current Tow data.
167     */
168    private String TowPubNum = "";
169
170    /**
171     * True/false value for whether the current unit is active.
172     */
173    private String UnitActive = "";
174
175    /**
176     * True/false value for whether the current unit is the primary unit.
177     */
178    private String UnitPrimary = "";
179
180    /**
181     * Status of the current unit.
182     */
183    private String UnitStatus = "";
184
185    /**
186     * ID number for the current unit.
187     */
188    private String UnitNum = "";
189
190    /**
191     * Street address of the current witness.
192     */
193    private String WitnessAddress = "";
194
195    /**
196     * Name of the current witness.
197     */
198    private String WitnessName = "";
199
200    /**
201     * Phone number of the current witness.
202     */
203    private String WitnessNum = "";
204
205    /**
206     * If true, the current CAD event is not empty.
207     */
208    private boolean foundSubEvents = false;
209
210    /**
211     * The most recent element which contains dialog or other sub-elements.
212     */
213    private I_ScriptEvent trackedEvent = null;
214
215    /**
216     * Incident description for the current ScriptEvent being parsed.
217     */
218    private String currentIncidentDesc = "";
219
220    /**
221     * Name of the current incident.
222     */
223    private String currentIncName = "";
224
225    /**
226     * Time index value (in seconds) for the current ScriptEvent being parsed.
227     */
228    private long currentEventTime = 0;
229
230    /**
231     * Number of levels deep we are. Used for debugging.
232     */
233    private int sublevels = 0;
234
235    /**
236     * The incident we are currently editing.
237     */
238    private ScriptIncident currInc = null;
239
240    private CadData cad = null;
241
242    private Color incColor = null;
243
244    /**
245     * Constructor. Initializes incident map.
246     *
247     * @param scr the script into which the XML file is being read
248     */
249    public MyScriptHandler(SimulationScript scr)
250    {
251        script = scr;
252        incidentMap = new TreeMap<Integer, ScriptIncident>();
253        eventMap = new TreeMap<ELEMENT, I_ScriptEvent>();
254        units = new ArrayList<Unit>();
255        pcData = new TreeMap<ELEMENT, String>();
256        docPosition = new Stack<ELEMENT>();
257    }
258
259    /**
260     * Get the list of incidents that have been parsed from the script file.
261     *
262     * @return Vector of Incident objects.
263     */
264    public Vector<ScriptIncident> getIncidents()
265    {
266        return new Vector<ScriptIncident>(incidentMap.values());
267    }
268
269    /**
270     * Get the list of units that have been parsed from the script file.
271     *
272     * @return Vector of Unit objects.
273     */
274    public ArrayList<Unit> getUnits()
275    {
276        return units;
277    }
278
279    /**
280     * SAX Handler method. Clear incident map and reset the error flag.
281     */
282    @Override
283    public void startDocument()
284    {
285        //System.out.println("STUB: Start the document");
286
287    }
288
289    /**
290     * Clear all existing events, thereby resetting the script.
291     */
292    public void reset()
293    {
294        incidentMap.clear();
295        System.out.println("STUB: Restart the document");
296    }
297
298    /**
299     * SAX Handler method. Executes at the beginning of each XML element.
300     */
301    @Override
302    public void startElement(String uri, String localName, String qName, Attributes attributes)
303    {
304
305        docPosition.push(ELEMENT.byName(qName));
306
307        try
308        {
309            if (qName.equals(ELEMENT.ACTIVITY_LOG_EVALUATION.tag))
310            {
311                eventMap.put(docPosition.peek(), ScriptEvent.factoryByType(ScriptEvent.ScriptEventType.ACTIVITY_LOG_EVAL_EVENT));
312                trackedEvent = eventMap.get(docPosition.peek());
313            }
314            else if (qName.equals(ELEMENT.ATMS_EVALUATION.tag))
315            {
316                eventMap.put(docPosition.peek(), ScriptEvent.factoryByType(ScriptEvent.ScriptEventType.ATMS_EVAL_EVENT));
317                trackedEvent = eventMap.get(docPosition.peek());
318            }
319            else if (qName.equals(ELEMENT.AUDIO.tag))
320            {
321                foundSubEvents = true;
322                eventMap.put(docPosition.peek(), ScriptEvent.factoryByType(ScriptEvent.ScriptEventType.AUDIO_EVENT));
323                try
324                {
325                    audioLength = Integer.parseInt(attributes.getValue("Length"));
326                    audioPath = attributes.getValue("Path");
327                }
328                catch (Exception e)
329                {
330                    audioLength = 0;
331                    audioPath = "";
332                }
333            }
334            else if (qName.equals(ELEMENT.CARDFILE.tag))
335            {
336                try
337                {
338                    cardfileCategory = attributes.getValue("Category");
339                }
340                catch (Exception e)
341                {
342                    cardfileCategory = "";
343                }
344            }
345            else if (qName.equals(ELEMENT.CAD_EVALUATION.tag))
346            {
347                eventMap.put(docPosition.peek(), ScriptEvent.factoryByType(ScriptEvent.ScriptEventType.CAD_EVAL_EVENT));
348                trackedEvent = eventMap.get(docPosition.peek());
349            }
350            else if (qName.equals(ELEMENT.CAD_INCIDENT_EVENT.tag))
351            {
352                eventMap.put(docPosition.peek(), ScriptEvent.factoryByType(ScriptEvent.ScriptEventType.CAD_EVENT));
353            }
354            else if (qName.equals(ELEMENT.CCTV_INFO.tag))
355            {
356                foundSubEvents = true;
357                eventMap.put(docPosition.peek(), ScriptEvent.factoryByType(ScriptEvent.ScriptEventType.CCTV_EVENT));
358            }
359            else if (qName.equals(ELEMENT.CHP_RADIO.tag))
360            {
361                eventMap.put(docPosition.peek(), ScriptEvent.factoryByType(ScriptEvent.ScriptEventType.CHP_RADIO_EVENT));
362                trackedEvent = eventMap.get(docPosition.peek());
363                try
364                {
365                    CHPRadiofile = attributes.getValue("RadioFile");
366                }
367                catch (Exception e)
368                {
369                    CHPRadiofile = "";
370                }
371            }
372            else if (qName.equals(ELEMENT.CMS_EVALUATION.tag))
373            {
374                eventMap.put(docPosition.peek(), ScriptEvent.factoryByType(ScriptEvent.ScriptEventType.CMS_EVAL_EVENT));
375                trackedEvent = eventMap.get(docPosition.peek());
376                try
377                {
378                    CMSID = attributes.getValue("cmsID");
379                    CMSType = attributes.getValue("type");
380                }
381                catch (Exception e)
382                {
383                    CMSID = "";
384                    CMSType = "";
385                }
386            }
387            else if (qName.equals(ELEMENT.COLOR.tag))
388            {
389                incColor = new Color(Integer.parseInt(attributes.getValue("r")),
390                        Integer.parseInt(attributes.getValue("g")),
391                        Integer.parseInt(attributes.getValue("b")));
392            }
393            else if (qName.equals(ELEMENT.FACILITATOR_EVALUATION.tag))
394            {
395                eventMap.put(docPosition.peek(), ScriptEvent.factoryByType(ScriptEvent.ScriptEventType.FACILITATOR_EVAL_EVENT));
396                trackedEvent = eventMap.get(docPosition.peek());
397            }
398            else if (qName.equals(ELEMENT.INSTRUCTOR.tag))
399            {
400                try
401                {
402                    InstructorRole = attributes.getValue("Role");
403                }
404                catch (Exception e)
405                {
406                    System.out.println("SERIOUS PARSING ERROR IN \'Role\'");
407                    InstructorRole = "";
408                }
409            }
410            else if (qName.equals(ELEMENT.LINE.tag))
411            {
412                try
413                {
414                    LineRole = attributes.getValue("Role");
415                }
416                catch (Exception e)
417                {
418                    LineRole = "";
419                }
420            }
421            else if (qName.equals(ELEMENT.LOCATION_INFO.tag))
422            {
423                try
424                {
425                    LocationInfoID = attributes.getValue("ID");
426                }
427                catch (Exception e)
428                {
429                    LocationInfoID = "";
430                }
431            }
432            else if (qName.equals(ELEMENT.MAINTENANCE_RADIO.tag))
433            {
434                eventMap.put(docPosition.peek(), ScriptEvent.factoryByType(ScriptEvent.ScriptEventType.MAINTENANCE_RADIO_EVENT));
435            }
436            else if (qName.equals(ELEMENT.NEW_UNIT.tag))
437            {
438                try
439                {
440                    NewUnitNum = attributes.getValue("UnitNum");
441                }
442                catch (Exception e)
443                {
444                    NewUnitNum = "";
445                }
446            }
447            else if (qName.equals(ELEMENT.PARAMICS.tag))
448            {
449                foundSubEvents = true;
450                eventMap.put(docPosition.peek(), ScriptEvent.factoryByType(ScriptEvent.ScriptEventType.PARAMICS_EVENT));
451                trackedEvent = eventMap.get(docPosition.peek());
452                try
453                {
454                    ParamicsID = attributes.getValue("LocationID");
455                }
456                catch (Exception e)
457                {
458                    ParamicsID = "";
459                }
460            }
461            else if (qName.equals(ELEMENT.RADIO_EVALUATION.tag))
462            {
463                eventMap.put(docPosition.peek(), ScriptEvent.factoryByType(ScriptEvent.ScriptEventType.RADIO_EVAL_EVENT));
464                trackedEvent = eventMap.get(docPosition.peek());
465            }
466            else if (qName.equals(ELEMENT.SCRIPT_EVENT.tag))
467            {
468                cad = new CadData();
469                //Nullify color
470                //This gets overwritten if color tag exists
471                incColor = null;
472            }
473
474            else if (qName.equals(ELEMENT.TMC_SCRIPT.tag))
475            {
476                try
477                {
478                    TMCTitle = attributes.getValue("title");
479                }
480                catch (Exception e)
481                {
482                    TMCTitle = "";
483                }
484                script.title = TMCTitle;
485
486            }
487            else if (qName.equals(ELEMENT.TMT_RADIO.tag))
488            {
489                eventMap.put(docPosition.peek(), ScriptEvent.factoryByType(ScriptEvent.ScriptEventType.TMT_RADIO_EVENT));
490            }
491            else if (qName.equals(ELEMENT.TOW.tag))
492            {
493                foundSubEvents = true;
494                eventMap.put(docPosition.peek(), ScriptEvent.factoryByType(ScriptEvent.ScriptEventType.TOW_EVENT));
495                try
496                {
497                    TowBeat = attributes.getValue("Beat");
498                    TowCompany = attributes.getValue("Company");
499                    TowConfNum = attributes.getValue("ConfNum");
500                    TowPubNum = attributes.getValue("PubNum");
501                }
502                catch (Exception e)
503                {
504                    TowBeat = "";
505                    TowCompany = "";
506                    TowConfNum = "";
507                    TowPubNum = "";
508                }
509            }
510            else if (qName.equals(ELEMENT.TELEPHONE.tag))
511            {
512                eventMap.put(docPosition.peek(), ScriptEvent.factoryByType(ScriptEvent.ScriptEventType.TELEPHONE_EVENT));
513                trackedEvent = eventMap.get(docPosition.peek());
514            }
515            else if (qName.equals(ELEMENT.UNIT.tag))
516            {
517                foundSubEvents = true;
518                eventMap.put(docPosition.peek(), ScriptEvent.factoryByType(ScriptEvent.ScriptEventType.UNIT_EVENT));
519                try
520                {
521                    UnitActive = attributes.getValue("Active");
522                    UnitPrimary = attributes.getValue("Primary");
523                    UnitStatus = attributes.getValue("Status");
524                    UnitNum = attributes.getValue("UnitNum");
525                }
526                catch (Exception e)
527                {
528                    UnitActive = "";
529                    UnitPrimary = "";
530                    UnitStatus = "";
531                    UnitNum = "0-0";
532                }
533            }
534            else if (qName.equals(ELEMENT.WITNESS.tag))
535            {
536                foundSubEvents = true;
537                eventMap.put(docPosition.peek(), ScriptEvent.factoryByType(ScriptEvent.ScriptEventType.WITNESS_EVENT));
538                try
539                {
540                    WitnessAddress = attributes.getValue("Address");
541                    WitnessName = attributes.getValue("Name");
542                    WitnessNum = attributes.getValue("PhoneNum");
543                }
544                catch (Exception e)
545                {
546                    WitnessAddress = "";
547                    WitnessName = "";
548                    WitnessNum = "";
549                }
550            }
551            else if (qName.equals(ELEMENT.INCIDENT.tag))
552            {
553                try
554                {
555                    incidentLogNumber = Integer.parseInt(attributes.getValue(
556                            "LogNum"));
557                }
558                catch (Exception e)
559                {
560                    myScriptLogger.logp(Level.SEVERE, "ScriptHandler", "startElement",
561                            "Invalid LogNumber " + attributes.getValue(
562                                    "LogNum"), e);
563                    incidentLogNumber = 0;
564                }
565            }
566            else if (qName.equals(ELEMENT.UNIT.tag))
567            {
568                try
569                {
570                    UnitNum = attributes.getValue("UnitNum");
571                }
572                catch (Exception e)
573                {
574                    myScriptLogger.logp(Level.SEVERE, "ScriptHandler", "startElement",
575                            "Invalid Unit Number " + attributes.getValue(
576                                    "UnitNum"), e);
577                    UnitNum = "0-0";
578                }
579            }
580        }
581        catch (Exception e)
582        {
583            myScriptLogger.logp(Level.SEVERE, "ScriptHandler", "startElement",
584                    "Exception in starting element <" + qName + ">.", e);
585        }
586    }
587
588    /**
589     * SAX Handler method. Append read characters to local buffer.
590     */
591    @Override
592    public void characters(char[] ch, int start, int length)
593    {
594        String str = new String(ch, start, length).trim();
595        str = str.replace("\t ", "");
596        str = str.replace("\t", "");
597        str = str.replace("\n ", "\n");
598
599        parsedValue.append(str);
600        if (pcData.get(docPosition.peek()) == null || pcData.get(docPosition.peek()).equals(""))
601        {
602            pcData.put(docPosition.peek(), str);
603        }
604        else
605        {
606            pcData.put(docPosition.peek(), "" + (pcData.get(docPosition.peek())
607                    + "\n" + str));
608        }
609    }
610
611    /**
612     * SAX Handler method. Executes at the close of each XML element.
613     */
614    @Override
615    public void endElement(String uri, String localName, String qName)
616    {
617        currentElement = docPosition.pop();
618        I_ScriptEvent newEvent = null;
619        try
620        {
621            if (currentElement == ELEMENT.ATMS_EVALUATION)
622            {
623                newEvent = eventMap.remove(currentElement);
624
625                currInc.addNewEvent(newEvent, (int) currentEventTime);
626            }
627            else if (currentElement == ELEMENT.ACTIVITY_LOG_EVALUATION)
628            {
629                newEvent = eventMap.remove(currentElement);
630
631                currInc.addNewEvent(newEvent, (int) currentEventTime);
632            }
633            else if (currentElement == ELEMENT.AGY && docPosition.peek() == ELEMENT.GENERAL)
634            {
635                cad.Agy = pcData.remove(currentElement);
636            }
637            else if (currentElement == ELEMENT.ADDRESS && docPosition.peek() == ELEMENT.LOCATION)
638            {
639                cad.Location_Address = pcData.remove(currentElement);
640            }
641            else if (currentElement == ELEMENT.AREA && docPosition.peek() == ELEMENT.LOCATION)
642            {
643                cad.Location_Area = pcData.remove(currentElement);
644            }
645            else if (currentElement == ELEMENT.BEAT && docPosition.peek() == ELEMENT.LOCATION)
646            {
647                cad.Location_Beat = pcData.remove(currentElement);
648            }
649            else if (currentElement == ELEMENT.CITY && docPosition.peek() == ELEMENT.LOCATION)
650            {
651                cad.Location_City = pcData.remove(currentElement);
652            }
653            else if (currentElement == ELEMENT.EMS && docPosition.peek() == ELEMENT.LOCATION)
654            {
655                cad.Location_Ems = pcData.remove(currentElement);
656            }
657            else if (currentElement == ELEMENT.FIRE && docPosition.peek() == ELEMENT.LOCATION)
658            {
659                cad.Location_Fire = pcData.remove(currentElement);
660            }
661            else if (currentElement == ELEMENT.LAW && docPosition.peek() == ELEMENT.LOCATION)
662            {
663                cad.Location_Law = pcData.remove(currentElement);
664            }
665            else if (currentElement == ELEMENT.LOC && docPosition.peek() == ELEMENT.LOCATION)
666            {
667                cad.Location_Loc = pcData.remove(currentElement);
668            }
669            else if (currentElement == ELEMENT.Type && docPosition.peek() == ELEMENT.HEADER_INFO)
670            {
671                cad.Header_Type = pcData.remove(currentElement);
672            }
673            else if (currentElement == ELEMENT.Beat && docPosition.peek() == ELEMENT.HEADER_INFO)
674            {
675                cad.Header_Beat = pcData.remove(currentElement);
676            }
677            else if (currentElement == ELEMENT.TruncLoc && docPosition.peek() == ELEMENT.HEADER_INFO)
678            {
679                cad.Header_TruncLoc = pcData.remove(currentElement);
680            }
681            else if (currentElement == ELEMENT.FullLoc && docPosition.peek() == ELEMENT.HEADER_INFO)
682            {
683                cad.Header_FullLoc = pcData.remove(currentElement);
684            }
685
686            else if (currentElement == ELEMENT.AUDIO)
687            {
688                newEvent = eventMap.remove(currentElement);
689                ((AudioEvent) newEvent).audioLength = audioLength;
690                ((AudioEvent) newEvent).audioPath = audioPath;
691                ((AudioEvent) newEvent).length = audioLength;
692                currInc.addNewEvent(newEvent, (int) currentEventTime);
693            }
694            else if (currentElement == ELEMENT.CAD_EVALUATION)
695            {
696                newEvent = eventMap.remove(currentElement);
697
698                currInc.addNewEvent(newEvent, (int) currentEventTime);
699            }
700            else if (currentElement == ELEMENT.CAD_INCIDENT_EVENT)
701            {
702                newEvent = eventMap.remove(currentElement);
703                ((CADEvent) newEvent).detail = pcData.remove(ELEMENT.DETAIL);
704                ((CADEvent) newEvent).hasSubEvents = foundSubEvents;
705                if (null != ((CADEvent) newEvent).detail)
706                {
707                    if (!(((CADEvent) newEvent).detail.equals("")))
708                    {
709                        currInc.addNewEvent(newEvent, (int) currentEventTime);
710                    }
711                }
712                foundSubEvents = false;
713            }
714            else if (currentElement == ELEMENT.CCTV_INFO)
715            {
716                newEvent = eventMap.remove(currentElement);
717                ((CCTVEvent) newEvent).message = pcData.remove(ELEMENT.CCTV_INFO);
718                currInc.addNewEvent(newEvent, (int) currentEventTime);
719            }
720            else if (currentElement == ELEMENT.CHP_RADIO)
721            {
722                newEvent = eventMap.remove(currentElement);
723                ((CHPRadioEvent) newEvent).radioFile = CHPRadiofile;
724                currInc.addNewEvent(newEvent, (int) currentEventTime);
725            }
726
727            else if (currentElement == ELEMENT.CMS_EVALUATION)
728            {
729                newEvent = eventMap.remove(currentElement);
730                ((CMSEvaluationEvent) newEvent).cmsID = CMSID;
731                ((CMSEvaluationEvent) newEvent).cmsType = CMSType;
732                if (pcData.get(ELEMENT.LOCATION) != null)
733                {
734                    ((CMSEvaluationEvent) newEvent).location = pcData.remove(ELEMENT.LOCATION);
735                }
736
737                currInc.addNewEvent(newEvent, (int) currentEventTime);
738            }
739            else if (currentElement == ELEMENT.CMS_LINE)
740            {
741                if (trackedEvent instanceof CMSEvaluationEvent)
742                {
743                    ((CMSEvaluationEvent) trackedEvent).message.add(pcData.remove(ELEMENT.CMS_LINE));
744                }
745            }
746            else if (currentElement == ELEMENT.COLOR)
747            {
748                currInc.color = incColor;
749            }
750            else if (currentElement == ELEMENT.EXPECTED_ACTION)
751            {
752                if (trackedEvent instanceof I_EvaluationEvent)
753                {
754                    ((I_EvaluationEvent) trackedEvent).addAction(pcData.remove(ELEMENT.EXPECTED_ACTION));
755                }
756            }
757            else if (currentElement == ELEMENT.FACILITATOR_EVALUATION)
758            {
759                newEvent = eventMap.remove(currentElement);
760
761                currInc.addNewEvent(newEvent, (int) currentEventTime);
762            }
763            else if (currentElement == ELEMENT.INSTRUCTOR)
764            {
765                if (trackedEvent instanceof TelephoneEvent)
766                {
767                    ((TelephoneEvent) trackedEvent).lines.add(pcData.remove(ELEMENT.INSTRUCTOR));
768                    ((TelephoneEvent) trackedEvent).roles.add(InstructorRole);
769                }
770            }
771            else if (currentElement == ELEMENT.Lane_number)
772            {
773                if (trackedEvent instanceof ParamicsEvent)
774                {
775                    ((ParamicsEvent) trackedEvent).laneNums.add(Integer.parseInt(pcData.remove(ELEMENT.Lane_number)));
776                }
777            }
778            else if (currentElement == ELEMENT.LINE)
779            {
780                if (trackedEvent instanceof CHPRadioEvent)
781                {
782                    ((CHPRadioEvent) trackedEvent).lines.add(pcData.remove(ELEMENT.LINE));
783                    ((CHPRadioEvent) trackedEvent).roles.add(LineRole);
784                }
785            }
786            else if (currentElement == ELEMENT.LOCATION_INFO)
787            {
788                Location_Info locInfo = new Location_Info();
789
790                locInfo.Location_ID = LocationInfoID;
791                locInfo.Direction = pcData.remove(ELEMENT.Direction);
792                locInfo.Location_type = pcData.remove(ELEMENT.Location_type);
793                locInfo.Route = pcData.remove(ELEMENT.Route);
794                locInfo.Postmile = pcData.remove(ELEMENT.Postmile);
795                cad.locInfo.add(locInfo);
796            }
797            else if (currentElement == ELEMENT.MAINTENANCE_RADIO)
798            {
799                newEvent = eventMap.remove(currentElement);
800                ((MaintenanceRadioEvent) newEvent).message = pcData.remove(ELEMENT.MAINTENANCE_RADIO);
801                currInc.addNewEvent(newEvent, (int) currentEventTime);
802            }
803            else if (currentElement == ELEMENT.MASTER_INC_NUM)
804            {
805                cad.Master_Inc_Num = pcData.remove(currentElement);
806            }
807            else if (currentElement == ELEMENT.P)
808            {
809                cad.P = pcData.remove(currentElement);
810            }
811            else if (currentElement == ELEMENT.PARAMICS)
812            {
813                newEvent = eventMap.remove(currentElement);
814                ((ParamicsEvent) newEvent).locationID = ParamicsID;
815
816                if (pcData.get(ELEMENT.Status) != null)
817                {
818                    ((ParamicsEvent) newEvent).status = pcData.remove(ELEMENT.Status);
819                }
820                if (pcData.get(ELEMENT.Incident_type) != null)
821                {
822                    ((ParamicsEvent) newEvent).type = pcData.remove(ELEMENT.Incident_type);
823                }
824                currInc.addNewEvent(newEvent, (int) currentEventTime);
825            }
826            else if (currentElement == ELEMENT.RADIO_EVALUATION)
827            {
828                newEvent = eventMap.remove(currentElement);
829
830                currInc.addNewEvent(newEvent, (int) currentEventTime);
831            }
832            else if (currentElement == ELEMENT.SCRIPT_EVENT)
833            {
834                currInc.insertCadData(currentEventTime, cad);
835            }
836            else if (currentElement == ELEMENT.STUDENT)
837            {
838                if (trackedEvent instanceof TelephoneEvent)
839                {
840                    ((TelephoneEvent) trackedEvent).lines.add(pcData.remove(ELEMENT.STUDENT));
841                    ((TelephoneEvent) trackedEvent).roles.add("Student");
842                }
843            }
844            else if (currentElement == ELEMENT.TEXT && docPosition.peek() == ELEMENT.GENERAL_INFO)
845            {
846                currInc.description = pcData.remove(ELEMENT.TEXT);
847                cad.General_Text = currInc.description;
848            }
849            else if (currentElement == ELEMENT.TITLE && docPosition.peek() == ELEMENT.GENERAL_INFO)
850            {
851                cad.General_Title = pcData.remove(ELEMENT.TITLE);
852            }
853            else if (currentElement == ELEMENT.TMT_RADIO)
854            {
855                newEvent = eventMap.remove(currentElement);
856                ((TMTRadioEvent) newEvent).message = pcData.remove(ELEMENT.TMT_RADIO);
857                currInc.addNewEvent(newEvent, (int) currentEventTime);
858            }
859            else if (currentElement == ELEMENT.TELEPHONE)
860            {
861                newEvent = eventMap.remove(currentElement);
862                currInc.addNewEvent(newEvent, (int) currentEventTime);
863            }
864            else if (currentElement == ELEMENT.TOW)
865            {
866                newEvent = eventMap.remove(currentElement);
867                ((TowEvent) newEvent).towBeat = TowBeat;
868                ((TowEvent) newEvent).towCompany = TowCompany;
869                ((TowEvent) newEvent).towConfNum = TowConfNum;
870                ((TowEvent) newEvent).towPubNum = TowPubNum;
871                currInc.addNewEvent(newEvent, (int) currentEventTime);
872            }
873            else if (currentElement == ELEMENT.TYPE && docPosition.peek() == ELEMENT.ADDITIONAL_INFO)
874            {
875                cad.Info_Type = pcData.remove(currentElement);
876            }
877            else if (currentElement == ELEMENT.TYPE_CODE && docPosition.peek() == ELEMENT.ADDITIONAL_INFO)
878            {
879                cad.Info_Type_Code = pcData.remove(currentElement);
880            }
881            else if (currentElement == ELEMENT.UNIT)
882            {
883                newEvent = eventMap.remove(currentElement);
884                ((UnitEvent) newEvent).unitActive = UnitActive;
885                ((UnitEvent) newEvent).unitPrimary = UnitPrimary;
886                ((UnitEvent) newEvent).unitStatus = UnitStatus;
887                ((UnitEvent) newEvent).unitNum = UnitNum;
888                currInc.addNewEvent(newEvent, (int) currentEventTime);
889            }
890            else if (currentElement == ELEMENT.WITNESS)
891            {
892                newEvent = eventMap.remove(currentElement);
893                ((WitnessEvent) newEvent).witnessAddress = WitnessAddress;
894                ((WitnessEvent) newEvent).witnessName = WitnessName;
895                ((WitnessEvent) newEvent).witnessNum = WitnessNum;
896                currInc.addNewEvent(newEvent, (int) currentEventTime);
897            }
898
899            else if (currentElement == ELEMENT.INCIDENT)
900            {
901                currentIncName = parsedValue.toString();
902
903                if (incidentMap.get(incidentLogNumber) == null)
904                {
905                    Color newColor = SimulationScript.incidentColors[Math.abs(new Random().nextInt())
906                            % SimulationScript.incidentColors.length];
907
908                    incidentMap.put(incidentLogNumber,
909                            new ScriptIncident(newColor,
910                                    incidentLogNumber, currentIncName, currentIncidentDesc,
911                                    script, (int) currentEventTime));
912                }
913                currInc = incidentMap.get(incidentLogNumber);
914
915            }
916            else if (currentElement == ELEMENT.NEW_UNIT)
917            {
918                Unit unit = new Unit();
919                unit.UnitNum = NewUnitNum;
920                if (pcData.containsKey(ELEMENT.AGY))
921                {
922                    unit.Agy = pcData.remove(ELEMENT.AGY);
923                }
924                if (pcData.containsKey(ELEMENT.ALIAS))
925                {
926                    unit.Alias = pcData.remove(ELEMENT.ALIAS);
927                }
928                if (pcData.containsKey(ELEMENT.AREA))
929                {
930                    unit.Area = pcData.remove(ELEMENT.AREA);
931                }
932                if (pcData.containsKey(ELEMENT.BADGE_NUM))
933                {
934                    unit.Badge_Num = pcData.remove(ELEMENT.BADGE_NUM);
935                }
936                if (pcData.containsKey(ELEMENT.CURR_LOC))
937                {
938                    unit.Curr_Loc = pcData.remove(ELEMENT.CURR_LOC);
939                }
940                if (pcData.containsKey(ELEMENT.DESTINATION))   
941                {
942                    unit.Destination = pcData.remove(ELEMENT.DESTINATION);
943                }
944                if (pcData.containsKey(ELEMENT.ID))
945                {
946                    unit.ID = pcData.remove(ELEMENT.ID);
947                }
948                if (pcData.containsKey(ELEMENT.MASTER_INC_NUM))
949                {
950                    unit.Master_Inc_Num = pcData.remove(ELEMENT.MASTER_INC_NUM);
951                }
952                if (pcData.containsKey(ELEMENT.MISC_INFO))
953                {
954                    unit.Misc_Info = pcData.remove(ELEMENT.MISC_INFO);
955                }
956                if (pcData.containsKey(ELEMENT.OOS))
957                {
958                    unit.OOS = pcData.remove(ELEMENT.OOS);
959                }
960                if (pcData.containsKey(ELEMENT.OFFICE))
961                {
962                    unit.Office = pcData.remove(ELEMENT.OFFICE);
963                }
964                if (pcData.containsKey(ELEMENT.OFFICER))
965                {
966                    unit.Officer = pcData.remove(ELEMENT.OFFICER);
967                }
968                if (pcData.containsKey(ELEMENT.P))
969                {
970                    unit.P = pcData.remove(ELEMENT.P);
971                }
972                if (pcData.containsKey(ELEMENT.PRIMARY))
973                {
974                    unit.Primary = pcData.remove(ELEMENT.PRIMARY);
975                }
976                if (pcData.containsKey(ELEMENT.STACK))
977                {
978                    unit.Stack = pcData.remove(ELEMENT.STACK);
979                }
980                if (pcData.containsKey(ELEMENT.STATUS))
981                {
982                    unit.Status = pcData.remove(ELEMENT.STATUS);
983                }
984                if (pcData.containsKey(ELEMENT.TIMER))
985                {
986                    unit.Timer = pcData.remove(ELEMENT.TIMER);
987                }
988                units.add(unit);
989            }
990
991            else if (qName.equals(ELEMENT.TIME_INDEX.tag))
992            {
993                currentEventTime = timeBytesToSeconds(parsedValue.toString().trim());
994            }
995
996            parsedValue.setLength(0);
997            eventMap.put(currentElement, null);
998        }
999        catch (Exception e)
1000        {
1001            myScriptLogger.logp(Level.SEVERE, "ScriptHandler", "endElement",
1002                    "Exception in ending element <" + qName + ">.", e);
1003        }
1004        /*
1005         String t = "";
1006         sublevels--;
1007         for (int i = 0; i < sublevels; i++)
1008         {
1009         t += "\t";
1010         }
1011         System.out.println(t + "End of element " + qName);*/
1012
1013    }
1014
1015    /**
1016     * SAX Handler method. End the document and close it out.
1017     */
1018    @Override
1019    public void endDocument()
1020    {
1021        //System.out.println("STUB: End the document");
1022    }
1023
1024    /**
1025     * Sax Handler method. Log normal errors.
1026     */
1027    @Override
1028    public void error(SAXParseException e)
1029    {
1030        myScriptLogger.logp(Level.SEVERE, "ScriptHandler", "error",
1031                "SAX Parsing error.", e);
1032    }
1033
1034    /**
1035     * SAX Handler method. Log fatal errors.
1036     */
1037    @Override
1038    public void fatalError(SAXParseException e)
1039    {
1040        myScriptLogger.logp(Level.SEVERE, "ScriptHandler", "fatalError",
1041                "SAX Parsing fatal error.", e);
1042    }
1043
1044    /**
1045     * SAX Handler method. Log warnings.
1046     */
1047    @Override
1048    public void warning(SAXParseException e)
1049    {
1050        myScriptLogger.logp(Level.SEVERE, "ScriptHandler", "warning",
1051                "SAX Parsing warning.", e);
1052    }
1053
1054    /**
1055     * Private method to convert a time object from format HH:MM:SS to a long
1056     * value of the corresponding number of seconds.
1057     *
1058     * @param time String time representation of format HH:MM:SS
1059     * @return long Number of seconds
1060     * @throws StringIndexOutOfBoundsException if the input parameter is not
1061     * valid
1062     */
1063    private long timeBytesToSeconds(String time)
1064            throws StringIndexOutOfBoundsException
1065    {
1066        long seconds = 0;
1067
1068        seconds = ((long) Character.digit(time.charAt(0), 10) * 36000
1069                + Character.digit(time.charAt(1), 10) * 3600
1070                + Character.digit(time.charAt(3), 10) * 600
1071                + Character.digit(time.charAt(4), 10) * 60
1072                + Character.digit(time.charAt(6), 10) * 10
1073                + Character.digit(time.charAt(7), 10));
1074
1075        return seconds;
1076    }
1077}
Note: See TracBrowser for help on using the repository browser.