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

Revision 41, 36.4 KB checked in by bmcguffin, 9 years ago (diff)

Added parsing support for CAD data elements.

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