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

Revision 38, 32.9 KB checked in by bmcguffin, 9 years ago (diff)

Removed the newLine at the end of each openTag method.

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    /**
239     * Constructor. Initializes incident map.
240     */
241    public MyScriptHandler(SimulationScript s)
242    {
243        script = s;
244        incidentMap = new TreeMap<Integer, ScriptIncident>();
245        eventMap = new TreeMap<ELEMENT, I_ScriptEvent>();
246        unitMap = new TreeMap<String, Unit>();
247        pcData = new TreeMap<ELEMENT, String>();
248        docPosition = new Stack<ELEMENT>();
249    }
250
251    /**
252     * Get the list of incidents that have been parsed from the script file.
253     *
254     * @returns Vector of Incident objects.
255     */
256    public Vector<ScriptIncident> getIncidents()
257    {
258        return new Vector<ScriptIncident>(incidentMap.values());
259    }
260   
261    /**
262     * Get the list of units that have been parsed from the script file.
263     *
264     * @returns Vector of Unit objects.
265     */
266    public Vector<Unit> getUnits()
267    {
268        return new Vector<Unit>(unitMap.values());
269    }
270
271    /**
272     * SAX Handler method. Clear incident map and reset the error flag.
273     */
274    @Override
275    public void startDocument()
276    {
277        //System.out.println("STUB: Start the document");
278       
279    }
280
281    /**
282     * Clear all existing events, thereby resetting the script.
283     */
284    public void reset()
285    {
286        incidentMap.clear();
287        System.out.println("STUB: Restart the document");
288    }
289
290    /**
291     * SAX Handler method. Executes at the beginning of each XML element.
292     */
293    @Override
294    public void startElement(String uri, String localName, String qName, Attributes attributes)
295    {
296        /*System.out.println("Start_element;");
297         String t = "";
298         for (int i = 0; i < sublevels; i++)
299         {
300         t += "\t";
301         }
302         System.out.println(t + "New element " + qName);
303         if (attributes.getLength() > 0)
304         {
305         System.out.println(t + "Attributes:");
306         for (int i = 0; i < attributes.getLength(); i++)
307         {
308         System.out.print(t + "" + (i + 1) + ". " + attributes.getQName(i));
309         System.out.println(": '" + attributes.getValue(i) + "\'");
310         }
311         }
312         sublevels++;*/
313        docPosition.push(ELEMENT.byName(qName));
314
315        try
316        {
317            if (qName.equals(ELEMENT.ACTIVITY_LOG_EVALUATION.tag))
318            {
319                eventMap.put(docPosition.peek(), ScriptEvent.factoryByType(ScriptEvent.ScriptEventType.ACTIVITY_LOG_EVAL_EVENT));
320                trackedEvent = eventMap.get(docPosition.peek());
321            }
322            else if (qName.equals(ELEMENT.ATMS_EVALUATION.tag))
323            {
324                eventMap.put(docPosition.peek(), ScriptEvent.factoryByType(ScriptEvent.ScriptEventType.ATMS_EVAL_EVENT));
325                trackedEvent = eventMap.get(docPosition.peek());
326            }
327            else if (qName.equals(ELEMENT.AUDIO.tag))
328            {
329                foundSubEvents = true;
330                eventMap.put(docPosition.peek(), ScriptEvent.factoryByType(ScriptEvent.ScriptEventType.AUDIO_EVENT));
331                try
332                {
333                    audioLength = Integer.parseInt(attributes.getValue("Length"));
334                    audioPath = attributes.getValue("Path");
335                }
336                catch (Exception e)
337                {
338                    audioLength = 0;
339                    audioPath = "";
340                }
341            }
342            else if (qName.equals(ELEMENT.CARDFILE.tag))
343            {
344                try
345                {
346                    cardfileCategory = attributes.getValue("Category");
347                }
348                catch (Exception e)
349                {
350                    cardfileCategory = "";
351                }
352            }
353            else if (qName.equals(ELEMENT.CAD_EVALUATION.tag))
354            {
355                eventMap.put(docPosition.peek(), ScriptEvent.factoryByType(ScriptEvent.ScriptEventType.CAD_EVAL_EVENT));
356                trackedEvent = eventMap.get(docPosition.peek());
357            }
358            else if (qName.equals(ELEMENT.CAD_INCIDENT_EVENT.tag))
359            {
360                eventMap.put(docPosition.peek(), ScriptEvent.factoryByType(ScriptEvent.ScriptEventType.CAD_EVENT));
361            }
362            else if (qName.equals(ELEMENT.CCTV_INFO.tag))
363            {
364                foundSubEvents = true;
365                eventMap.put(docPosition.peek(), ScriptEvent.factoryByType(ScriptEvent.ScriptEventType.CCTV_EVENT));
366            }
367            else if (qName.equals(ELEMENT.CHP_RADIO.tag))
368            {
369                eventMap.put(docPosition.peek(), ScriptEvent.factoryByType(ScriptEvent.ScriptEventType.CHP_RADIO_EVENT));
370                trackedEvent = eventMap.get(docPosition.peek());
371                try
372                {
373                    CHPRadiofile = attributes.getValue("RadioFile");
374                }
375                catch (Exception e)
376                {
377                    CHPRadiofile = "";
378                }
379            }
380            else if (qName.equals(ELEMENT.CMS_EVALUATION.tag))
381            {
382                eventMap.put(docPosition.peek(), ScriptEvent.factoryByType(ScriptEvent.ScriptEventType.CMS_EVAL_EVENT));
383                trackedEvent = eventMap.get(docPosition.peek());
384                try
385                {
386                    CMSID = attributes.getValue("cmsID");
387                    CMSType = attributes.getValue("type");
388                }
389                catch (Exception e)
390                {
391                    CMSID = "";
392                    CMSType = "";
393                }
394            }
395            else if (qName.equals(ELEMENT.FACILITATOR_EVALUATION.tag))
396            {
397                eventMap.put(docPosition.peek(), ScriptEvent.factoryByType(ScriptEvent.ScriptEventType.FACILITATOR_EVAL_EVENT));
398                trackedEvent = eventMap.get(docPosition.peek());
399            }
400            else if (qName.equals(ELEMENT.INSTRUCTOR.tag))
401            {
402                try
403                {
404                    InstructorRole = attributes.getValue("Role");
405                }
406                catch (Exception e)
407                {
408                    System.out.println("SERIOUS PARSING ERROR IN \'Role\'");
409                    InstructorRole = "";
410                }
411            }
412            else if (qName.equals(ELEMENT.LINE.tag))
413            {
414                try
415                {
416                    LineRole = attributes.getValue("Role");
417                }
418                catch (Exception e)
419                {
420                    LineRole = "";
421                }
422            }
423            else if (qName.equals(ELEMENT.LOCATION_INFO.tag))
424            {
425                try
426                {
427                    LocationInfoID = attributes.getValue("ID");
428                }
429                catch (Exception e)
430                {
431                    LocationInfoID = "";
432                }
433            }
434            else if (qName.equals(ELEMENT.MAINTENANCE_RADIO.tag))
435            {
436                eventMap.put(docPosition.peek(), ScriptEvent.factoryByType(ScriptEvent.ScriptEventType.MAINTENANCE_RADIO_EVENT));
437            }
438            else if (qName.equals(ELEMENT.NEW_UNIT.tag))
439            {
440                try
441                {
442                    NewUnitNum = attributes.getValue("UnitNum");
443                }
444                catch (Exception e)
445                {
446                    NewUnitNum = "";
447                }
448            }
449            else if (qName.equals(ELEMENT.PARAMICS.tag))
450            {
451                foundSubEvents = true;
452                eventMap.put(docPosition.peek(), ScriptEvent.factoryByType(ScriptEvent.ScriptEventType.PARAMICS_EVENT));
453                trackedEvent = eventMap.get(docPosition.peek());
454                try
455                {
456                    ParamicsID = attributes.getValue("LocationID");
457                }
458                catch (Exception e)
459                {
460                    ParamicsID = "";
461                }
462            }
463            else if (qName.equals(ELEMENT.RADIO_EVALUATION.tag))
464            {
465                eventMap.put(docPosition.peek(), ScriptEvent.factoryByType(ScriptEvent.ScriptEventType.RADIO_EVAL_EVENT));
466                trackedEvent = eventMap.get(docPosition.peek());
467            }
468            else if (qName.equals(ELEMENT.TMC_SCRIPT.tag))
469            {
470                try
471                {
472                    TMCTitle = attributes.getValue("title");
473                }
474                catch (Exception e)
475                {
476                    TMCTitle = "";
477                }
478                script.title = TMCTitle;
479               
480            }
481            else if (qName.equals(ELEMENT.TMT_RADIO.tag))
482            {
483                eventMap.put(docPosition.peek(), ScriptEvent.factoryByType(ScriptEvent.ScriptEventType.TMT_RADIO_EVENT));
484            }
485            else if (qName.equals(ELEMENT.TOW.tag))
486            {
487                foundSubEvents = true;
488                eventMap.put(docPosition.peek(), ScriptEvent.factoryByType(ScriptEvent.ScriptEventType.TOW_EVENT));
489                try
490                {
491                    TowBeat = attributes.getValue("Beat");
492                    TowCompany = attributes.getValue("Company");
493                    TowConfNum = attributes.getValue("ConfNum");
494                    TowPubNum = attributes.getValue("PubNum");
495                }
496                catch (Exception e)
497                {
498                    TowBeat = "";
499                    TowCompany = "";
500                    TowConfNum = "";
501                    TowPubNum = "";
502                }
503            }
504            else if (qName.equals(ELEMENT.TELEPHONE.tag))
505            {
506                eventMap.put(docPosition.peek(), ScriptEvent.factoryByType(ScriptEvent.ScriptEventType.TELEPHONE_EVENT));
507                trackedEvent = eventMap.get(docPosition.peek());
508            }
509            else if (qName.equals(ELEMENT.UNIT.tag))
510            {
511                foundSubEvents = true;
512                eventMap.put(docPosition.peek(), ScriptEvent.factoryByType(ScriptEvent.ScriptEventType.UNIT_EVENT));
513                try
514                {
515                    UnitActive = attributes.getValue("Active");
516                    UnitPrimary = attributes.getValue("Primary");
517                    UnitStatus = attributes.getValue("Status");
518                    UnitNum = attributes.getValue("UnitNum");
519                }
520                catch (Exception e)
521                {
522                    UnitActive = "";
523                    UnitPrimary = "";
524                    UnitStatus = "";
525                    UnitNum = "0-0";
526                }
527            }
528            else if (qName.equals(ELEMENT.WITNESS.tag))
529            {
530                foundSubEvents = true;
531                eventMap.put(docPosition.peek(), ScriptEvent.factoryByType(ScriptEvent.ScriptEventType.WITNESS_EVENT));
532                try
533                {
534                    WitnessAddress = attributes.getValue("Address");
535                    WitnessName = attributes.getValue("Name");
536                    WitnessNum = attributes.getValue("PhoneNum");
537                }
538                catch (Exception e)
539                {
540                    WitnessAddress = "";
541                    WitnessName = "";
542                    WitnessNum = "";
543                }
544            }
545            else if (qName.equals(ELEMENT.INCIDENT.tag))
546            {
547                try
548                {
549                    incidentLogNumber = Integer.parseInt(attributes.getValue(
550                            "LogNum"));
551                }
552                catch (Exception e)
553                {
554                    myScriptLogger.logp(Level.SEVERE, "ScriptHandler", "startElement",
555                            "Invalid LogNumber " + attributes.getValue(
556                                    "LogNum"), e);
557                    incidentLogNumber = 0;
558                }
559            }
560            else if (qName.equals(ELEMENT.UNIT.tag))
561            {
562                try
563                {
564                    UnitNum = attributes.getValue("UnitNum");
565                }
566                catch (Exception e)
567                {
568                    myScriptLogger.logp(Level.SEVERE, "ScriptHandler", "startElement",
569                            "Invalid Unit Number " + attributes.getValue(
570                                    "UnitNum"), e);
571                    UnitNum = "0-0";
572                }
573            }
574        }
575        catch (Exception e)
576        {
577            myScriptLogger.logp(Level.SEVERE, "ScriptHandler", "startElement",
578                    "Exception in starting element <" + qName + ">.", e);
579        }
580    }
581
582    /**
583     * SAX Handler method. Append read characters to local buffer.
584     */
585    @Override
586    public void characters(char[] ch, int start, int length)
587    {
588        String str = new String(ch, start, length).trim();
589        str = str.replace("\t ", "");
590        str = str.replace("\t", "");
591        str = str.replace("\n ", "\n");
592
593        parsedValue.append(str);
594        if (pcData.get(docPosition.peek()) == null || pcData.get(docPosition.peek()).equals(""))
595        {
596            pcData.put(docPosition.peek(), str);
597        }
598        else
599        {
600            pcData.put(docPosition.peek(), "" + (pcData.get(docPosition.peek())
601                    + "\n" + str));
602        }
603    }
604
605    /**
606     * SAX Handler method. Executes at the close of each XML element.
607     */
608    @Override
609    public void endElement(String uri, String localName, String qName)
610    {
611        currentElement = docPosition.pop();
612        I_ScriptEvent newEvent = null;
613        try
614        {
615            if (currentElement == ELEMENT.ATMS_EVALUATION)
616            {
617                newEvent = eventMap.remove(currentElement);
618
619                currInc.addNewEvent(newEvent, (int) currentEventTime);
620            }
621            else if (currentElement == ELEMENT.ACTIVITY_LOG_EVALUATION)
622            {
623                newEvent = eventMap.remove(currentElement);
624
625                currInc.addNewEvent(newEvent, (int) currentEventTime);
626            }
627            else if (currentElement == ELEMENT.AUDIO)
628            {
629                newEvent = eventMap.remove(currentElement);
630                ((AudioEvent) newEvent).audioLength = audioLength;
631                ((AudioEvent) newEvent).audioPath = audioPath;
632                ((AudioEvent) newEvent).length = audioLength;
633                currInc.addNewEvent(newEvent, (int) currentEventTime);
634            }
635            else if (currentElement == ELEMENT.CAD_EVALUATION)
636            {
637                newEvent = eventMap.remove(currentElement);
638
639                currInc.addNewEvent(newEvent, (int) currentEventTime);
640            }
641            else if (currentElement == ELEMENT.CAD_INCIDENT_EVENT)
642            {
643                newEvent = eventMap.remove(currentElement);
644                ((CADEvent) newEvent).detail = pcData.remove(ELEMENT.DETAIL);
645                ((CADEvent) newEvent).hasSubEvents = foundSubEvents;
646                if (null != ((CADEvent) newEvent).detail)
647                {
648                    if (!(((CADEvent) newEvent).detail.equals("")))
649                    {
650                        currInc.addNewEvent(newEvent, (int) currentEventTime);
651                    }
652                }
653                foundSubEvents = false;
654            }
655            else if (currentElement == ELEMENT.CCTV_INFO)
656            {
657                newEvent = eventMap.remove(currentElement);
658                ((CCTVEvent) newEvent).message = pcData.remove(ELEMENT.CCTV_INFO);
659                currInc.addNewEvent(newEvent, (int) currentEventTime);
660            }
661            else if (currentElement == ELEMENT.CHP_RADIO)
662            {
663                newEvent = eventMap.remove(currentElement);
664                ((CHPRadioEvent) newEvent).radioFile = CHPRadiofile;
665                currInc.addNewEvent(newEvent, (int) currentEventTime);
666            }
667
668            else if (currentElement == ELEMENT.CMS_EVALUATION)
669            {
670                newEvent = eventMap.remove(currentElement);
671                ((CMSEvaluationEvent) newEvent).cmsID = CMSID;
672                ((CMSEvaluationEvent) newEvent).cmsType = CMSType;
673                if (pcData.get(ELEMENT.LOCATION) != null)
674                {
675                    ((CMSEvaluationEvent) newEvent).location = pcData.remove(ELEMENT.LOCATION);
676                }
677
678                currInc.addNewEvent(newEvent, (int) currentEventTime);
679            }
680            else if (currentElement == ELEMENT.CMS_LINE)
681            {
682                if (trackedEvent instanceof CMSEvaluationEvent)
683                {
684                    ((CMSEvaluationEvent) trackedEvent).message.add(pcData.remove(ELEMENT.CMS_LINE));
685                }
686            }
687            else if (currentElement == ELEMENT.EXPECTED_ACTION)
688            {
689                if (trackedEvent instanceof I_EvaluationEvent)
690                {
691                    ((I_EvaluationEvent) trackedEvent).addAction(pcData.remove(ELEMENT.EXPECTED_ACTION));
692                }
693            }
694            else if (currentElement == ELEMENT.FACILITATOR_EVALUATION)
695            {
696                newEvent = eventMap.remove(currentElement);
697
698                currInc.addNewEvent(newEvent, (int) currentEventTime);
699            }
700            else if (currentElement == ELEMENT.INSTRUCTOR)
701            {
702                if (trackedEvent instanceof TelephoneEvent)
703                {
704                    ((TelephoneEvent) trackedEvent).lines.add(pcData.remove(ELEMENT.INSTRUCTOR));
705                    ((TelephoneEvent) trackedEvent).roles.add(InstructorRole);
706                }
707            }
708            else if (currentElement == ELEMENT.Lane_number)
709            {
710                if (trackedEvent instanceof ParamicsEvent)
711                {
712                    ((ParamicsEvent) trackedEvent).laneNums.add(Integer.parseInt(pcData.remove(ELEMENT.Lane_number)));
713                }
714            }
715            else if (currentElement == ELEMENT.LINE)
716            {
717                if (trackedEvent instanceof CHPRadioEvent)
718                {
719                    ((CHPRadioEvent) trackedEvent).lines.add(pcData.remove(ELEMENT.LINE));
720                    ((CHPRadioEvent) trackedEvent).roles.add(LineRole);
721                }
722            }
723            else if (currentElement == ELEMENT.MAINTENANCE_RADIO)
724            {
725                newEvent = eventMap.remove(currentElement);
726                ((MaintenanceRadioEvent) newEvent).message = pcData.remove(ELEMENT.MAINTENANCE_RADIO);
727                currInc.addNewEvent(newEvent, (int) currentEventTime);
728            }
729            else if (currentElement == ELEMENT.PARAMICS)
730            {
731                newEvent = eventMap.remove(currentElement);
732                ((ParamicsEvent) newEvent).locationID = ParamicsID;
733
734                if (pcData.get(ELEMENT.Status) != null)
735                {
736                    ((ParamicsEvent) newEvent).status = pcData.remove(ELEMENT.Status);
737                }
738                if (pcData.get(ELEMENT.Incident_type) != null)
739                {
740                    ((ParamicsEvent) newEvent).type = pcData.remove(ELEMENT.Incident_type);
741                }
742                currInc.addNewEvent(newEvent, (int) currentEventTime);
743            }
744            else if (currentElement == ELEMENT.RADIO_EVALUATION)
745            {
746                newEvent = eventMap.remove(currentElement);
747
748                currInc.addNewEvent(newEvent, (int) currentEventTime);
749            }
750            else if (currentElement == ELEMENT.STUDENT)
751            {
752                if (trackedEvent instanceof TelephoneEvent)
753                {
754                    ((TelephoneEvent) trackedEvent).lines.add(pcData.remove(ELEMENT.STUDENT));
755                    ((TelephoneEvent) trackedEvent).roles.add("Student");
756                }
757            }
758            else if (currentElement == ELEMENT.TEXT && docPosition.peek() == ELEMENT.GENERAL_INFO)
759            {
760                currInc.description = pcData.remove(ELEMENT.TEXT);
761            }
762            else if (currentElement == ELEMENT.TMT_RADIO)
763            {
764                newEvent = eventMap.remove(currentElement);
765                ((TMTRadioEvent) newEvent).message = pcData.remove(ELEMENT.TMT_RADIO);
766                currInc.addNewEvent(newEvent, (int) currentEventTime);
767            }
768            else if (currentElement == ELEMENT.TELEPHONE)
769            {
770                newEvent = eventMap.remove(currentElement);
771                currInc.addNewEvent(newEvent, (int) currentEventTime);
772            }
773            else if (currentElement == ELEMENT.TOW)
774            {
775                newEvent = eventMap.remove(currentElement);
776                ((TowEvent) newEvent).towBeat = TowBeat;
777                ((TowEvent) newEvent).towCompany = TowCompany;
778                ((TowEvent) newEvent).towConfNum = TowConfNum;
779                ((TowEvent) newEvent).towPubNum = TowPubNum;
780                currInc.addNewEvent(newEvent, (int) currentEventTime);
781            }
782            else if (currentElement == ELEMENT.UNIT)
783            {
784                newEvent = eventMap.remove(currentElement);
785                ((UnitEvent) newEvent).unitActive = UnitActive;
786                ((UnitEvent) newEvent).unitPrimary = UnitPrimary;
787                ((UnitEvent) newEvent).unitStatus = UnitStatus;
788                ((UnitEvent) newEvent).unitNum = UnitNum;
789                currInc.addNewEvent(newEvent, (int) currentEventTime);
790            }
791            else if (currentElement == ELEMENT.WITNESS)
792            {
793                newEvent = eventMap.remove(currentElement);
794                ((WitnessEvent) newEvent).witnessAddress = WitnessAddress;
795                ((WitnessEvent) newEvent).witnessName = WitnessName;
796                ((WitnessEvent) newEvent).witnessNum = WitnessNum;
797                currInc.addNewEvent(newEvent, (int) currentEventTime);
798            }
799
800            else if (currentElement == ELEMENT.INCIDENT)
801            {
802                currentIncName = parsedValue.toString();
803
804                if (incidentMap.get(incidentLogNumber) == null)
805                {
806                    incidentMap.put(incidentLogNumber,
807                            new ScriptIncident(SimulationScript.incidentColors[Math.abs(new Random().nextInt()) % SimulationScript.incidentColors.length],
808                                    incidentLogNumber, currentIncName, currentIncidentDesc,
809                                    script, (int) currentEventTime));
810                }
811                currInc = incidentMap.get(incidentLogNumber);
812
813            }
814            else if (currentElement == ELEMENT.NEW_UNIT)
815            {
816                if (unitMap.get(NewUnitNum) == null)
817                {
818                    Unit unit = new Unit();
819                    unit.UnitNum = NewUnitNum;
820                    if (pcData.containsKey(ELEMENT.AGY))
821                    {
822                        unit.Agy = pcData.remove(ELEMENT.AGY);
823                    }
824                    if (pcData.containsKey(ELEMENT.ALIAS))
825                    {
826                        unit.Alias = pcData.remove(ELEMENT.ALIAS);
827                    }
828                    if (pcData.containsKey(ELEMENT.AREA))
829                    {
830                        unit.Area = pcData.remove(ELEMENT.AREA);
831                    }
832                    if (pcData.containsKey(ELEMENT.BADGE_NUM))
833                    {
834                        unit.Badge_Num = pcData.remove(ELEMENT.BADGE_NUM);
835                    }
836                    if (pcData.containsKey(ELEMENT.CURR_LOC))
837                    {
838                        unit.Curr_Loc = pcData.remove(ELEMENT.CURR_LOC);
839                    }
840                    if (pcData.containsKey(ELEMENT.DESTINATION))
841                    {
842                        unit.Destination = pcData.remove(ELEMENT.DESTINATION);
843                    }
844                    if (pcData.containsKey(ELEMENT.ID))
845                    {
846                        unit.ID = pcData.remove(ELEMENT.ID);
847                    }
848                    if (pcData.containsKey(ELEMENT.MASTER_INC_NUM))
849                    {
850                        unit.Master_Inc_Num = pcData.remove(ELEMENT.MASTER_INC_NUM);
851                    }
852                    if (pcData.containsKey(ELEMENT.MISC_INFO))
853                    {
854                        unit.Misc_Info = pcData.remove(ELEMENT.MISC_INFO);
855                    }
856                    if (pcData.containsKey(ELEMENT.OOS))
857                    {
858                        unit.OOS = pcData.remove(ELEMENT.OOS);
859                    }
860                    if (pcData.containsKey(ELEMENT.OFFICE))
861                    {
862                        unit.Office = pcData.remove(ELEMENT.OFFICE);
863                    }
864                    if (pcData.containsKey(ELEMENT.OFFICER))
865                    {
866                        unit.Officer = pcData.remove(ELEMENT.OFFICER);
867                    }
868                    if (pcData.containsKey(ELEMENT.P))
869                    {
870                        unit.P = pcData.remove(ELEMENT.P);
871                    }
872                    if (pcData.containsKey(ELEMENT.PRIMARY))
873                    {
874                        unit.Primary = pcData.remove(ELEMENT.PRIMARY);
875                    }
876                    if (pcData.containsKey(ELEMENT.STACK))
877                    {
878                        unit.Stack = pcData.remove(ELEMENT.STACK);
879                    }
880                    if (pcData.containsKey(ELEMENT.STATUS))
881                    {
882                        unit.Status = pcData.remove(ELEMENT.STATUS);
883                    }
884                    if (pcData.containsKey(ELEMENT.TIMER))
885                    {
886                        unit.Timer = pcData.remove(ELEMENT.TIMER);
887                    }
888                    unitMap.put(NewUnitNum, unit);
889                }
890            }
891            else if (qName.equals(ELEMENT.TIME_INDEX.tag))
892            {
893                currentEventTime = timeBytesToSeconds(parsedValue.toString().trim());
894            }
895
896            parsedValue.setLength(0);
897            eventMap.put(currentElement, null);
898        }
899        catch (Exception e)
900        {
901            myScriptLogger.logp(Level.SEVERE, "ScriptHandler", "endElement",
902                    "Exception in ending element <" + qName + ">.", e);
903        }
904        /*
905         String t = "";
906         sublevels--;
907         for (int i = 0; i < sublevels; i++)
908         {
909         t += "\t";
910         }
911         System.out.println(t + "End of element " + qName);*/
912
913    }
914
915    /**
916     * SAX Handler method. End the document and close it out.
917     */
918    @Override
919    public void endDocument()
920    {
921        //System.out.println("STUB: End the document");
922    }
923
924    /**
925     * Sax Handler method. Log normal errors.
926     */
927    @Override
928    public void error(SAXParseException e)
929    {
930        myScriptLogger.logp(Level.SEVERE, "ScriptHandler", "error",
931                "SAX Parsing error.", e);
932    }
933
934    /**
935     * SAX Handler method. Log fatal errors.
936     */
937    @Override
938    public void fatalError(SAXParseException e)
939    {
940        myScriptLogger.logp(Level.SEVERE, "ScriptHandler", "fatalError",
941                "SAX Parsing fatal error.", e);
942    }
943
944    /**
945     * SAX Handler method. Log warnings.
946     */
947    @Override
948    public void warning(SAXParseException e)
949    {
950        myScriptLogger.logp(Level.SEVERE, "ScriptHandler", "warning",
951                "SAX Parsing warning.", e);
952    }
953
954    /**
955     * Private method to convert a time object from format HH:MM:SS to a long
956     * value of the corresponding number of seconds.
957     *
958     * @param time String time representation of format HH:MM:SS
959     * @return long Number of seconds
960     * @throws StringIndexOutOfBoundsException if the input parameter is not
961     * valid
962     */
963    private long timeBytesToSeconds(String time)
964            throws StringIndexOutOfBoundsException
965    {
966        long seconds = 0;
967
968        seconds = ((long) Character.digit(time.charAt(0), 10) * 36000
969                + Character.digit(time.charAt(1), 10) * 3600
970                + Character.digit(time.charAt(3), 10) * 600
971                + Character.digit(time.charAt(4), 10) * 60
972                + Character.digit(time.charAt(6), 10) * 10
973                + Character.digit(time.charAt(7), 10));
974
975        return seconds;
976    }
977}
Note: See TracBrowser for help on using the repository browser.