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

Revision 145, 37.1 KB checked in by sdanthin, 6 years ago (diff)

Move from Git to Svn (LARGE COMMIT)

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    //todo: interpret this function better so that what is loaded from the XML file is easier to know.
615    @Override
616    public void endElement(String uri, String localName, String qName)
617    {
618        currentElement = docPosition.pop();
619        I_ScriptEvent newEvent = null;
620        try
621        {
622            if (currentElement == ELEMENT.ATMS_EVALUATION)
623            {
624                newEvent = eventMap.remove(currentElement);
625
626                currInc.addNewEvent(newEvent, (int) currentEventTime);
627            }
628            else if (currentElement == ELEMENT.ACTIVITY_LOG_EVALUATION)
629            {
630                newEvent = eventMap.remove(currentElement);
631
632                currInc.addNewEvent(newEvent, (int) currentEventTime);
633            }
634            else if (currentElement == ELEMENT.AGY && docPosition.peek() == ELEMENT.GENERAL)
635            {
636                cad.Agy = pcData.remove(currentElement);
637            }
638            else if (currentElement == ELEMENT.ADDRESS && docPosition.peek() == ELEMENT.LOCATION)
639            {
640                cad.Location_Address = pcData.remove(currentElement);
641            }
642            else if (currentElement == ELEMENT.AREA && docPosition.peek() == ELEMENT.LOCATION)
643            {
644                cad.Location_Area = pcData.remove(currentElement);
645            }
646            else if (currentElement == ELEMENT.BEAT && docPosition.peek() == ELEMENT.LOCATION)
647            {
648                cad.Location_Beat = pcData.remove(currentElement);
649            }
650            else if (currentElement == ELEMENT.CITY && docPosition.peek() == ELEMENT.LOCATION)
651            {
652                cad.Location_City = pcData.remove(currentElement);
653            }
654            else if (currentElement == ELEMENT.EMS && docPosition.peek() == ELEMENT.LOCATION)
655            {
656                cad.Location_Ems = pcData.remove(currentElement);
657            }
658            else if (currentElement == ELEMENT.FIRE && docPosition.peek() == ELEMENT.LOCATION)
659            {
660                cad.Location_Fire = pcData.remove(currentElement);
661            }
662            else if (currentElement == ELEMENT.LAW && docPosition.peek() == ELEMENT.LOCATION)
663            {
664                cad.Location_Law = pcData.remove(currentElement);
665            }
666            else if (currentElement == ELEMENT.LOC && docPosition.peek() == ELEMENT.LOCATION)
667            {
668                cad.Location_Loc = pcData.remove(currentElement);
669            }
670            else if (currentElement == ELEMENT.Type && docPosition.peek() == ELEMENT.HEADER_INFO)
671            {
672                cad.Header_Type = pcData.remove(currentElement);
673//                //change where the data is loaded in here
674//                currInc.insertCadData((int) currentEventTime, cad);
675            }
676            else if (currentElement == ELEMENT.Beat && docPosition.peek() == ELEMENT.HEADER_INFO)
677            {
678                cad.Header_Beat = pcData.remove(currentElement);
679            }
680            else if (currentElement == ELEMENT.TruncLoc && docPosition.peek() == ELEMENT.HEADER_INFO)
681            {
682                cad.Header_TruncLoc = pcData.remove(currentElement);
683            }
684            else if (currentElement == ELEMENT.FullLoc && docPosition.peek() == ELEMENT.HEADER_INFO)
685            {
686                cad.Header_FullLoc = pcData.remove(currentElement);
687            }
688
689            else if (currentElement == ELEMENT.AUDIO)
690            {
691                newEvent = eventMap.remove(currentElement);
692                ((AudioEvent) newEvent).audioLength = audioLength;
693                ((AudioEvent) newEvent).audioPath = audioPath;
694                ((AudioEvent) newEvent).length = audioLength;
695                currInc.addNewEvent(newEvent, (int) currentEventTime);
696            }
697            else if (currentElement == ELEMENT.CAD_EVALUATION)
698            {
699                newEvent = eventMap.remove(currentElement);
700
701                currInc.addNewEvent(newEvent, (int) currentEventTime);
702            }
703            else if (currentElement == ELEMENT.CAD_INCIDENT_EVENT)
704            {
705                newEvent = eventMap.remove(currentElement);
706                ((CADEvent) newEvent).detail = pcData.remove(ELEMENT.DETAIL);
707                ((CADEvent) newEvent).hasSubEvents = foundSubEvents;
708                if (null != ((CADEvent) newEvent).detail)
709                {
710                    if (!(((CADEvent) newEvent).detail.equals("")))
711                    {
712                        currInc.addNewEvent(newEvent, (int) currentEventTime);
713                    }
714                }
715                foundSubEvents = false;
716            }
717            else if (currentElement == ELEMENT.CCTV_INFO)
718            {
719                newEvent = eventMap.remove(currentElement);
720                ((CCTVEvent) newEvent).message = pcData.remove(ELEMENT.CCTV_INFO);
721                currInc.addNewEvent(newEvent, (int) currentEventTime);
722            }
723            else if (currentElement == ELEMENT.CHP_RADIO)
724            {
725                newEvent = eventMap.remove(currentElement);
726                ((CHPRadioEvent) newEvent).radioFile = CHPRadiofile;
727                currInc.addNewEvent(newEvent, (int) currentEventTime);
728            }
729
730            else if (currentElement == ELEMENT.CMS_EVALUATION)
731            {
732                newEvent = eventMap.remove(currentElement);
733                ((CMSEvaluationEvent) newEvent).cmsID = CMSID;
734                ((CMSEvaluationEvent) newEvent).cmsType = CMSType;
735                if (pcData.get(ELEMENT.LOCATION) != null)
736                {
737                    ((CMSEvaluationEvent) newEvent).location = pcData.remove(ELEMENT.LOCATION);
738                }
739
740                currInc.addNewEvent(newEvent, (int) currentEventTime);
741            }
742            else if (currentElement == ELEMENT.CMS_LINE)
743            {
744                if (trackedEvent instanceof CMSEvaluationEvent)
745                {
746                    ((CMSEvaluationEvent) trackedEvent).message.add(pcData.remove(ELEMENT.CMS_LINE));
747                }
748            }
749            else if (currentElement == ELEMENT.COLOR)
750            {
751                currInc.color = incColor;
752            }
753            else if (currentElement == ELEMENT.EXPECTED_ACTION)
754            {
755                if (trackedEvent instanceof I_EvaluationEvent)
756                {
757                    ((I_EvaluationEvent) trackedEvent).addAction(pcData.remove(ELEMENT.EXPECTED_ACTION));
758                }
759            }
760            else if (currentElement == ELEMENT.FACILITATOR_EVALUATION)
761            {
762                newEvent = eventMap.remove(currentElement);
763
764                currInc.addNewEvent(newEvent, (int) currentEventTime);
765            }
766            else if (currentElement == ELEMENT.INSTRUCTOR)
767            {
768                if (trackedEvent instanceof TelephoneEvent)
769                {
770                    ((TelephoneEvent) trackedEvent).lines.add(pcData.remove(ELEMENT.INSTRUCTOR));
771                    ((TelephoneEvent) trackedEvent).roles.add(InstructorRole);
772                }
773            }
774            else if (currentElement == ELEMENT.Lane_number)
775            {
776                if (trackedEvent instanceof ParamicsEvent)
777                {
778                    ((ParamicsEvent) trackedEvent).laneNums.add(Integer.parseInt(pcData.remove(ELEMENT.Lane_number)));
779                }
780            }
781            else if (currentElement == ELEMENT.LINE)
782            {
783                if (trackedEvent instanceof CHPRadioEvent)
784                {
785                    ((CHPRadioEvent) trackedEvent).lines.add(pcData.remove(ELEMENT.LINE));
786                    ((CHPRadioEvent) trackedEvent).roles.add(LineRole);
787                }
788            }
789            else if (currentElement == ELEMENT.LOCATION_INFO)
790            {
791                Location_Info locInfo = new Location_Info();
792
793                locInfo.Location_ID = LocationInfoID;
794                locInfo.Direction = pcData.remove(ELEMENT.Direction);
795                locInfo.Location_type = pcData.remove(ELEMENT.Location_type);
796                locInfo.Route = pcData.remove(ELEMENT.Route);
797                locInfo.Postmile = pcData.remove(ELEMENT.Postmile);
798                cad.locInfo.add(locInfo);
799            }
800            else if (currentElement == ELEMENT.MAINTENANCE_RADIO)
801            {
802                newEvent = eventMap.remove(currentElement);
803                ((MaintenanceRadioEvent) newEvent).message = pcData.remove(ELEMENT.MAINTENANCE_RADIO);
804                currInc.addNewEvent(newEvent, (int) currentEventTime);
805            }
806            else if (currentElement == ELEMENT.MASTER_INC_NUM)
807            {
808                cad.Master_Inc_Num = pcData.remove(currentElement);
809            }
810            else if (currentElement == ELEMENT.P)
811            {
812                cad.P = pcData.remove(currentElement);
813            }
814            else if (currentElement == ELEMENT.PARAMICS)
815            {
816                newEvent = eventMap.remove(currentElement);
817                ((ParamicsEvent) newEvent).locationID = ParamicsID;
818
819                if (pcData.get(ELEMENT.Status) != null)
820                {
821                    ((ParamicsEvent) newEvent).status = pcData.remove(ELEMENT.Status);
822                }
823                if (pcData.get(ELEMENT.Incident_type) != null)
824                {
825                    ((ParamicsEvent) newEvent).type = pcData.remove(ELEMENT.Incident_type);
826                }
827                currInc.addNewEvent(newEvent, (int) currentEventTime);
828            }
829            else if (currentElement == ELEMENT.RADIO_EVALUATION)
830            {
831                newEvent = eventMap.remove(currentElement);
832
833                currInc.addNewEvent(newEvent, (int) currentEventTime);
834            }
835            else if (currentElement == ELEMENT.SCRIPT_EVENT)
836            {
837                currInc.insertCadData(currentEventTime, cad);
838            }
839            else if (currentElement == ELEMENT.STUDENT)
840            {
841                if (trackedEvent instanceof TelephoneEvent)
842                {
843                    ((TelephoneEvent) trackedEvent).lines.add(pcData.remove(ELEMENT.STUDENT));
844                    ((TelephoneEvent) trackedEvent).roles.add("Student");
845                }
846            }
847            else if (currentElement == ELEMENT.TEXT && docPosition.peek() == ELEMENT.GENERAL_INFO)
848            {
849                currInc.description = pcData.remove(ELEMENT.TEXT);
850                cad.General_Text = currInc.description;
851            }
852            else if (currentElement == ELEMENT.TITLE && docPosition.peek() == ELEMENT.GENERAL_INFO)
853            {
854                cad.General_Title = pcData.remove(ELEMENT.TITLE);
855            }
856            else if (currentElement == ELEMENT.TMT_RADIO)
857            {
858                newEvent = eventMap.remove(currentElement);
859                ((TMTRadioEvent) newEvent).message = pcData.remove(ELEMENT.TMT_RADIO);
860                currInc.addNewEvent(newEvent, (int) currentEventTime);
861            }
862            else if (currentElement == ELEMENT.TELEPHONE)
863            {
864                newEvent = eventMap.remove(currentElement);
865                currInc.addNewEvent(newEvent, (int) currentEventTime);
866            }
867            else if (currentElement == ELEMENT.TOW)
868            {
869                newEvent = eventMap.remove(currentElement);
870                ((TowEvent) newEvent).towBeat = TowBeat;
871                ((TowEvent) newEvent).towCompany = TowCompany;
872                ((TowEvent) newEvent).towConfNum = TowConfNum;
873                ((TowEvent) newEvent).towPubNum = TowPubNum;
874                currInc.addNewEvent(newEvent, (int) currentEventTime);
875            }
876            else if (currentElement == ELEMENT.TYPE && docPosition.peek() == ELEMENT.ADDITIONAL_INFO)
877            {
878                cad.Info_Type = pcData.remove(currentElement);
879            }
880            else if (currentElement == ELEMENT.TYPE_CODE && docPosition.peek() == ELEMENT.ADDITIONAL_INFO)
881            {
882                cad.Info_Type_Code = pcData.remove(currentElement);
883            }
884            else if (currentElement == ELEMENT.UNIT)
885            {
886                newEvent = eventMap.remove(currentElement);
887                ((UnitEvent) newEvent).unitActive = UnitActive;
888                ((UnitEvent) newEvent).unitPrimary = UnitPrimary;
889                ((UnitEvent) newEvent).unitStatus = UnitStatus;
890                ((UnitEvent) newEvent).unitNum = UnitNum;
891                currInc.addNewEvent(newEvent, (int) currentEventTime);
892            }
893            else if (currentElement == ELEMENT.WITNESS)
894            {
895                newEvent = eventMap.remove(currentElement);
896                ((WitnessEvent) newEvent).witnessAddress = WitnessAddress;
897                ((WitnessEvent) newEvent).witnessName = WitnessName;
898                ((WitnessEvent) newEvent).witnessNum = WitnessNum;
899                currInc.addNewEvent(newEvent, (int) currentEventTime);
900            }
901
902            else if (currentElement == ELEMENT.INCIDENT)
903            {
904                currentIncName = parsedValue.toString();
905
906                if (incidentMap.get(incidentLogNumber) == null)
907                {
908                    Color newColor = SimulationScript.incidentColors[Math.abs(new Random().nextInt())
909                            % SimulationScript.incidentColors.length];
910
911                    incidentMap.put(incidentLogNumber,
912                            new ScriptIncident(newColor,
913                                    incidentLogNumber, currentIncName, currentIncidentDesc,
914                                    script, (int) currentEventTime));
915                }
916                currInc = incidentMap.get(incidentLogNumber);
917
918            }
919            else if (currentElement == ELEMENT.NEW_UNIT)
920            {
921                Unit unit = new Unit();
922                unit.UnitNum = NewUnitNum;
923                if (pcData.containsKey(ELEMENT.AGY))
924                {
925                    unit.Agy = pcData.remove(ELEMENT.AGY);
926                }
927                if (pcData.containsKey(ELEMENT.ALIAS))
928                {
929                    unit.Alias = pcData.remove(ELEMENT.ALIAS);
930                }
931                if (pcData.containsKey(ELEMENT.AREA))
932                {
933                    unit.Area = pcData.remove(ELEMENT.AREA);
934                }
935                if (pcData.containsKey(ELEMENT.BADGE_NUM))
936                {
937                    unit.Badge_Num = pcData.remove(ELEMENT.BADGE_NUM);
938                }
939                if (pcData.containsKey(ELEMENT.CURR_LOC))
940                {
941                    unit.Curr_Loc = pcData.remove(ELEMENT.CURR_LOC);
942                }
943                if (pcData.containsKey(ELEMENT.DESTINATION))   
944                {
945                    unit.Destination = pcData.remove(ELEMENT.DESTINATION);
946                }
947                if (pcData.containsKey(ELEMENT.ID))
948                {
949                    unit.ID = pcData.remove(ELEMENT.ID);
950                }
951                if (pcData.containsKey(ELEMENT.MASTER_INC_NUM))
952                {
953                    unit.Master_Inc_Num = pcData.remove(ELEMENT.MASTER_INC_NUM);
954                }
955                if (pcData.containsKey(ELEMENT.MISC_INFO))
956                {
957                    unit.Misc_Info = pcData.remove(ELEMENT.MISC_INFO);
958                }
959                if (pcData.containsKey(ELEMENT.OOS))
960                {
961                    unit.OOS = pcData.remove(ELEMENT.OOS);
962                }
963                if (pcData.containsKey(ELEMENT.OFFICE))
964                {
965                    unit.Office = pcData.remove(ELEMENT.OFFICE);
966                }
967                if (pcData.containsKey(ELEMENT.OFFICER))
968                {
969                    unit.Officer = pcData.remove(ELEMENT.OFFICER);
970                }
971                if (pcData.containsKey(ELEMENT.P))
972                {
973                    unit.P = pcData.remove(ELEMENT.P);
974                }
975                if (pcData.containsKey(ELEMENT.PRIMARY))
976                {
977                    unit.Primary = pcData.remove(ELEMENT.PRIMARY);
978                }
979                if (pcData.containsKey(ELEMENT.STACK))
980                {
981                    unit.Stack = pcData.remove(ELEMENT.STACK);
982                }
983                if (pcData.containsKey(ELEMENT.STATUS))
984                {
985                    unit.Status = pcData.remove(ELEMENT.STATUS);
986                }
987                if (pcData.containsKey(ELEMENT.TIMER))
988                {
989                    unit.Timer = pcData.remove(ELEMENT.TIMER);
990                }
991                units.add(unit);
992            }
993
994            else if (qName.equals(ELEMENT.TIME_INDEX.tag))
995            {
996                currentEventTime = timeBytesToSeconds(parsedValue.toString().trim());
997            }
998
999            parsedValue.setLength(0);
1000            eventMap.put(currentElement, null);
1001        }
1002        catch (Exception e)
1003        {
1004            myScriptLogger.logp(Level.SEVERE, "ScriptHandler", "endElement",
1005                    "Exception in ending element <" + qName + ">.", e);
1006        }
1007        /*
1008         String t = "";
1009         sublevels--;
1010         for (int i = 0; i < sublevels; i++)
1011         {
1012         t += "\t";
1013         }
1014         System.out.println(t + "End of element " + qName);*/
1015
1016    }
1017
1018    /**
1019     * SAX Handler method. End the document and close it out.
1020     */
1021    @Override
1022    public void endDocument()
1023    {
1024        //System.out.println("STUB: End the document");
1025    }
1026
1027    /**
1028     * Sax Handler method. Log normal errors.
1029     */
1030    @Override
1031    public void error(SAXParseException e)
1032    {
1033        myScriptLogger.logp(Level.SEVERE, "ScriptHandler", "error",
1034                "SAX Parsing error.", e);
1035    }
1036
1037    /**
1038     * SAX Handler method. Log fatal errors.
1039     */
1040    @Override
1041    public void fatalError(SAXParseException e)
1042    {
1043        myScriptLogger.logp(Level.SEVERE, "ScriptHandler", "fatalError",
1044                "SAX Parsing fatal error.", e);
1045    }
1046
1047    /**
1048     * SAX Handler method. Log warnings.
1049     */
1050    @Override
1051    public void warning(SAXParseException e)
1052    {
1053        myScriptLogger.logp(Level.SEVERE, "ScriptHandler", "warning",
1054                "SAX Parsing warning.", e);
1055    }
1056
1057    /**
1058     * Private method to convert a time object from format HH:MM:SS to a long
1059     * value of the corresponding number of seconds.
1060     *
1061     * @param time String time representation of format HH:MM:SS
1062     * @return long Number of seconds
1063     * @throws StringIndexOutOfBoundsException if the input parameter is not
1064     * valid
1065     */
1066    private long timeBytesToSeconds(String time)
1067            throws StringIndexOutOfBoundsException
1068    {
1069        long seconds = 0;
1070
1071        seconds = ((long) Character.digit(time.charAt(0), 10) * 36000
1072                + Character.digit(time.charAt(1), 10) * 3600
1073                + Character.digit(time.charAt(3), 10) * 600
1074                + Character.digit(time.charAt(4), 10) * 60
1075                + Character.digit(time.charAt(6), 10) * 10
1076                + Character.digit(time.charAt(7), 10));
1077
1078        return seconds;
1079    }
1080}
Note: See TracBrowser for help on using the repository browser.