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

Revision 37, 32.7 KB checked in by bmcguffin, 9 years ago (diff)

Updated XML methods to more accurately export data.

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