1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 package org.gscg.common.interactionlayer.timecontrol;
16
17 import java.io.IOException;
18 import java.io.ObjectOutputStream;
19 import java.io.Serializable;
20 import java.rmi.RemoteException;
21 import java.text.DateFormat;
22 import java.util.ArrayList;
23 import java.util.Calendar;
24 import java.util.HashMap;
25
26 import nl.tudelft.simulation.dsol.experiment.TimeUnit;
27 import nl.tudelft.simulation.dsol.experiment.TimeUnitInterface;
28 import nl.tudelft.simulation.dsol.simulators.SimulatorInterface;
29 import nl.tudelft.simulation.event.Event;
30 import nl.tudelft.simulation.event.EventInterface;
31 import nl.tudelft.simulation.event.EventListenerInterface;
32 import nl.tudelft.simulation.event.EventProducer;
33 import nl.tudelft.simulation.event.EventType;
34 import nl.tudelft.simulation.logger.Logger;
35
36 import org.gscg.singleuser.interactionlayer.dataobjects.CurrentRowOrColumnData;
37
38 /***
39 * The RowOrColumnNumber calculates the row or column which should be selected
40 * according to the time in the simulation. Implementing row or column control
41 * in this way makes sure that not every actor in a game is going to perform
42 * this expensive code every time for itself, instead we use a 'global'
43 * approach, and thus increase our performance.
44 * <p>
45 *
46 * Copyright (c) 2003-2005 Delft University of Technology, Jaffalaan 5, 2628 BX
47 * Delft, the Netherlands. All rights reserved.
48 *
49 * See for project information <a href="http://www.simulation.tudelft.nl/">
50 * www.simulation.tudelft.nl </a>.
51 *
52 * The source code and binary code of this software is proprietary information
53 * of Delft University of Technology.
54 *
55 * @author <a
56 * href="http://www.tbm.tudelft.nl/webstaf/stijnh/index.htm">Stijn-Pieter
57 * van Houten </a>
58 * @version $Revision: 1.2 $ $Date: 2005/08/09 20:49:45 $
59 * @since 1.1.1
60 */
61 public class GlobalRowOrColumnNumber implements Serializable
62 {
63 /*** the serial version uid */
64 private static final long serialVersionUID = 11L;
65
66 /***
67 * fired when the current row or column must be updated according to the
68 * simulation time
69 */
70 public static final EventType UPDATE_CURRENT_DAY = new EventType(
71 "UPDATE_CURRENT_DAY");
72
73 /***
74 * fired when the current row or column must be updated according to the
75 * simulation time
76 */
77 public static final EventType UPDATE_CURRENT_WEEK = new EventType(
78 "UPDATE_CURRENT_WEEK");
79
80 /***
81 * fired when the current row or column must be updated according to the
82 * simulation time
83 */
84 public static final EventType UPDATE_CURRENT_MONTH = new EventType(
85 "UPDATE_CURRENT_MONTH");
86
87 /*** fired when the date in the game has changed */
88 public static final EventType UPDATE_CURRENT_DATE = new EventType(
89 "UPDATE_CURRENT_DATE");
90
91 /***
92 * fired when the all the columns and rows must be updated according to the
93 * simulation time
94 */
95 public static final EventType UPDATE_CURRENT_DATES = new EventType(
96 "UPDATE_CURRENT_DATES");
97
98 /*** fired to indicate the total number of days in the simulation */
99 public static final EventType TOTAL_NUMBER_OF_DAYS = new EventType(
100 "TOTAL_NUMBER_OF_DAYS");
101
102 /*** the current number */
103 private static int currentNumberDay = 0;
104
105 /*** the current number */
106 private static int currentNumberWeek = 0;
107
108 /*** the current number */
109 private static int currentNumberMonth = 0;
110
111 /*** the number of days */
112 private static int numberOfDays = 0;
113
114 /*** links a week number to a table row number */
115 private static HashMap dayNumberTableRowNumber = new HashMap();
116
117 /*** links a week number to a table row number */
118 private static HashMap weekNumberTableRowNumber = new HashMap();
119
120 /*** links a week number to a table row number */
121 private static HashMap monthNumberTableRowNumber = new HashMap();
122
123 /*** the progress calendar */
124 private static Calendar progressCalendar = Calendar.getInstance();
125
126 /*** the static progress data and time instance */
127 private static GlobalRowOrColumnNumber globalRowOrColumnNumber = null;
128
129 /*** the day header values */
130 private static ArrayList dayHeaderValues = new ArrayList();
131
132 /*** the week header values */
133 private static ArrayList weekHeaderValues = new ArrayList();
134
135 /*** the month header values */
136 private static ArrayList monthHeaderValues = new ArrayList();
137
138 /*** the runlength determines the length of the simulation */
139 private static int runLength = 0;
140
141 /*** the start time in milliseconds */
142 private static long startTime = 0L;
143
144 /*** the time unit of the simulation */
145 private static TimeUnitInterface simulatorTimeUnit = null;
146
147 /*** the current day */
148 private static int currentDay = 0;
149
150 /*** the current week */
151 private static int currentWeek = 0;
152
153 /*** the current month */
154 private static int currentMonth = 0;
155
156 /*** the event producer */
157 private CustomEventProducer customEventProducer = null;
158
159 /*** the event listener */
160 private CustomEventListener customEventListener = null;
161
162 /*** the simulator */
163 private SimulatorInterface simulator = null;
164
165 /***
166 * constructs a new GlobalRowOrColumnNumber
167 *
168 * @param simulator the simulator
169 */
170 public GlobalRowOrColumnNumber(final SimulatorInterface simulator)
171 {
172 super();
173 GlobalRowOrColumnNumber.globalRowOrColumnNumber = this;
174 this.simulator = simulator;
175 this.customEventListener = new CustomEventListener();
176 this.customEventProducer = new CustomEventProducer();
177
178 try
179 {
180 this.simulator.addListener(this.customEventListener,
181 SimulatorInterface.TIME_CHANGED_EVENT);
182
183
184 GlobalRowOrColumnNumber.runLength = (int) this.simulator
185 .getReplication().getRunControl().getRunLength();
186
187 GlobalRowOrColumnNumber.startTime = this.simulator.getReplication()
188 .getRunControl().getTreatment().getStartTime();
189
190 GlobalRowOrColumnNumber.simulatorTimeUnit = this.simulator
191 .getReplication().getRunControl().getTreatment()
192 .getTimeUnit();
193
194 long time = (long) TimeUnit.convert(this.simulator
195 .getSimulatorTime(),
196 GlobalRowOrColumnNumber.simulatorTimeUnit,
197 TimeUnitInterface.MILLISECOND);
198 GlobalRowOrColumnNumber.progressCalendar
199 .setTimeInMillis(GlobalRowOrColumnNumber.startTime + time);
200
201
202 GlobalRowOrColumnNumber.calculateNumberOfDays();
203 GlobalRowOrColumnNumber.calculateNumberOfWeeks();
204 GlobalRowOrColumnNumber.calculateNumberOfMonths();
205
206
207
208 GlobalRowOrColumnNumber.currentDay = GlobalRowOrColumnNumber.progressCalendar
209 .get(Calendar.DAY_OF_YEAR);
210 GlobalRowOrColumnNumber.currentWeek = GlobalRowOrColumnNumber.progressCalendar
211 .get(Calendar.WEEK_OF_YEAR);
212 GlobalRowOrColumnNumber.currentMonth = GlobalRowOrColumnNumber.progressCalendar
213 .get(Calendar.MONTH);
214 } catch (Exception exception)
215 {
216 exception.printStackTrace();
217 Logger.severe(this, "Economics", exception);
218 }
219 }
220
221 /***
222 * Method calculateNumberOfColumns.
223 */
224 private static void calculateNumberOfDays()
225 {
226 if (GlobalRowOrColumnNumber.runLength != 0)
227 {
228 Calendar calendar = Calendar.getInstance();
229 calendar.setTimeInMillis(GlobalRowOrColumnNumber.startTime);
230 try
231 {
232 GlobalRowOrColumnNumber.numberOfDays = (int) TimeUnit
233 .convert(
234 GlobalRowOrColumnNumber.runLength,
235 GlobalRowOrColumnNumber.globalRowOrColumnNumber.simulator
236 .getReplication().getRunControl()
237 .getTreatment().getTimeUnit(),
238 TimeUnitInterface.DAY);
239
240
241
242 GlobalRowOrColumnNumber.numberOfDays++;
243 GlobalRowOrColumnNumber.currentDay = calendar
244 .get(Calendar.DAY_OF_YEAR);
245
246
247
248 int additionalDays = 0;
249
250 for (int i = 0; i < GlobalRowOrColumnNumber.numberOfDays; i++)
251 {
252 int year = calendar.get(Calendar.YEAR);
253 calendar.setTimeInMillis(GlobalRowOrColumnNumber.startTime
254 + (TimeUnitInterface.DAY.getValue() * i));
255
256
257 if (calendar.get(Calendar.YEAR) > year)
258 {
259 calendar
260 .setTimeInMillis(GlobalRowOrColumnNumber.startTime
261 + (TimeUnitInterface.DAY.getValue() * i - 1));
262
263 additionalDays += calendar
264 .getActualMaximum(Calendar.DAY_OF_YEAR);
265
266 calendar
267 .setTimeInMillis(GlobalRowOrColumnNumber.startTime
268 + (TimeUnitInterface.DAY.getValue() * i));
269 }
270
271
272 if (GlobalRowOrColumnNumber.dayNumberTableRowNumber
273 .get(new Integer(
274 (calendar.get(Calendar.DAY_OF_YEAR) + additionalDays))) == null)
275 {
276 GlobalRowOrColumnNumber.dayHeaderValues.add(DateFormat
277 .getDateInstance().format(calendar.getTime()));
278
279 GlobalRowOrColumnNumber.dayNumberTableRowNumber
280 .put(
281 new Integer(
282 (calendar
283 .get(Calendar.DAY_OF_YEAR) + additionalDays)),
284 new Integer(i));
285 }
286 }
287
288
289 if (GlobalRowOrColumnNumber.numberOfDays < 13)
290 {
291 for (int i = 0; i < 10 - GlobalRowOrColumnNumber.numberOfDays; i++)
292 {
293 GlobalRowOrColumnNumber.dayHeaderValues.add("");
294 }
295 }
296 } catch (RemoteException remoteException)
297 {
298 Logger.severe(GlobalRowOrColumnNumber.class,
299 "CalculateNumberOfColumns", remoteException);
300 }
301 } else
302 {
303 Logger.severe(GlobalRowOrColumnNumber.class,
304 "calculateNumberOfCoumns", "Number of columns is 0");
305 }
306 }
307
308 /***
309 * Method calculateNumberOfWeeks.
310 */
311 private static synchronized void calculateNumberOfWeeks()
312 {
313 Calendar calendar = Calendar.getInstance();
314 calendar.setTimeInMillis(GlobalRowOrColumnNumber.startTime);
315
316 int weekResidu = calendar.getActualMaximum(Calendar.DAY_OF_WEEK)
317 - calendar.get(Calendar.DAY_OF_WEEK);
318
319 int daysLeft = GlobalRowOrColumnNumber.numberOfDays - weekResidu;
320 int weekCounter = 0;
321 int lastValue = 0;
322
323 Calendar weekCalendar = Calendar.getInstance();
324 weekCalendar.setTime(calendar.getTime());
325
326 GlobalRowOrColumnNumber.weekHeaderValues.add(DateFormat
327 .getDateInstance().format(weekCalendar.getTime()));
328 GlobalRowOrColumnNumber.currentWeek = weekCalendar
329 .get(Calendar.WEEK_OF_YEAR);
330 lastValue = GlobalRowOrColumnNumber.currentWeek;
331
332
333 int additionalWeeks = 0;
334
335 if (GlobalRowOrColumnNumber.currentWeek == 52)
336 {
337 additionalWeeks += 52;
338 }
339
340 GlobalRowOrColumnNumber.weekNumberTableRowNumber.put(new Integer(
341 GlobalRowOrColumnNumber.currentWeek), new Integer(weekCounter));
342
343 weekCalendar.setTimeInMillis(weekCalendar.getTimeInMillis()
344 + ((weekResidu + 1) * TimeUnitInterface.DAY.getValue()));
345
346 while (daysLeft >= weekCalendar.getActualMaximum(Calendar.DAY_OF_WEEK))
347 {
348 weekCounter++;
349 int daysInWeek = weekCalendar
350 .getActualMaximum(Calendar.DAY_OF_WEEK);
351 daysLeft -= daysInWeek;
352
353
354 if (weekCalendar.get(Calendar.WEEK_OF_YEAR) == 53)
355 {
356 additionalWeeks -= 52;
357 GlobalRowOrColumnNumber.currentWeek = weekCalendar
358 .get(Calendar.WEEK_OF_YEAR)
359 + additionalWeeks;
360 additionalWeeks += 52;
361 } else
362 {
363 GlobalRowOrColumnNumber.currentWeek = weekCalendar
364 .get(Calendar.WEEK_OF_YEAR)
365 + additionalWeeks;
366
367
368
369
370
371
372 if (lastValue == 52
373 && GlobalRowOrColumnNumber.currentWeek == 104)
374 {
375 GlobalRowOrColumnNumber.currentWeek = 52;
376 additionalWeeks -= 52;
377 }
378 }
379
380
381 if (GlobalRowOrColumnNumber.weekNumberTableRowNumber
382 .get(new Integer(GlobalRowOrColumnNumber.currentWeek)) != null)
383 {
384 weekCounter += 1;
385 }
386 GlobalRowOrColumnNumber.weekNumberTableRowNumber.put(new Integer(
387 GlobalRowOrColumnNumber.currentWeek), new Integer(
388 weekCounter));
389 GlobalRowOrColumnNumber.weekHeaderValues.add(DateFormat
390 .getDateInstance().format(weekCalendar.getTime()));
391
392 if ((GlobalRowOrColumnNumber.currentWeek % 52) == 0)
393 {
394 additionalWeeks += 52;
395 }
396
397 weekCalendar.setTimeInMillis(weekCalendar.getTimeInMillis()
398 + (daysInWeek * TimeUnitInterface.DAY.getValue()));
399
400 lastValue = GlobalRowOrColumnNumber.currentWeek;
401 }
402
403 if (daysLeft > 0)
404 {
405 weekCounter++;
406 GlobalRowOrColumnNumber.weekHeaderValues.add(DateFormat
407 .getDateInstance().format(weekCalendar.getTime()));
408 }
409
410
411 if (weekCounter < 13)
412 {
413 for (int i = 0; i < 10 - weekCounter; i++)
414 {
415 GlobalRowOrColumnNumber.weekHeaderValues.add("");
416 }
417 }
418 }
419
420 /***
421 * Method calculateNumberOfMonths.
422 */
423 private static void calculateNumberOfMonths()
424 {
425 Calendar calendar = Calendar.getInstance();
426 calendar.setTimeInMillis(GlobalRowOrColumnNumber.startTime);
427
428 int monthResidu = calendar.getActualMaximum(Calendar.DAY_OF_MONTH)
429 - calendar.get(Calendar.DAY_OF_MONTH);
430
431 int daysLeft = GlobalRowOrColumnNumber.numberOfDays - monthResidu;
432
433 int monthCounter = 0;
434
435 Calendar monthCalendar = Calendar.getInstance();
436 monthCalendar.setTime(calendar.getTime());
437
438 GlobalRowOrColumnNumber.monthHeaderValues.add(DateFormat
439 .getDateInstance().format(monthCalendar.getTime()));
440 GlobalRowOrColumnNumber.currentMonth = monthCalendar
441 .get(Calendar.MONTH);
442
443
444
445 int additionalMonths = 0;
446
447
448 if (GlobalRowOrColumnNumber.currentMonth == 11)
449 {
450 additionalMonths += 12;
451 }
452
453 GlobalRowOrColumnNumber.monthNumberTableRowNumber.put(new Integer(
454 GlobalRowOrColumnNumber.currentMonth),
455 new Integer(monthCounter));
456
457 monthCalendar.setTimeInMillis(monthCalendar.getTimeInMillis()
458 + ((monthResidu + 1) * TimeUnitInterface.DAY.getValue()));
459
460 while (daysLeft >= monthCalendar
461 .getActualMaximum(Calendar.DAY_OF_MONTH))
462 {
463 monthCounter++;
464 int daysInMonth = monthCalendar
465 .getActualMaximum(Calendar.DAY_OF_MONTH);
466 daysLeft -= daysInMonth;
467
468 GlobalRowOrColumnNumber.monthHeaderValues.add(DateFormat
469 .getDateInstance().format(monthCalendar.getTime()));
470 GlobalRowOrColumnNumber.currentMonth = monthCalendar
471 .get(Calendar.MONTH)
472 + additionalMonths;
473 GlobalRowOrColumnNumber.monthNumberTableRowNumber.put(new Integer(
474 GlobalRowOrColumnNumber.currentMonth), new Integer(
475 monthCounter));
476
477 if (monthCalendar.get(Calendar.MONTH) == 11)
478 {
479 additionalMonths += 12;
480 }
481 monthCalendar.set(Calendar.MONTH,
482 monthCalendar.get(Calendar.MONTH) + 1);
483 }
484
485 if (daysLeft > 0)
486 {
487 monthCounter++;
488 GlobalRowOrColumnNumber.monthHeaderValues.add(DateFormat
489 .getDateInstance().format(monthCalendar.getTime()));
490 }
491
492
493 if (monthCounter < 13)
494 {
495 for (int i = 0; i < 10 - monthCounter; i++)
496 {
497 GlobalRowOrColumnNumber.monthHeaderValues.add("");
498 }
499 }
500 }
501
502
503
504
505 /***
506 * writes a serializable method to stream
507 *
508 * @param out the outputstream
509 * @throws IOException on IOException
510 */
511 private synchronized void writeObject(final ObjectOutputStream out)
512 throws IOException
513 {
514 out.defaultWriteObject();
515 out.writeObject(new Integer(GlobalRowOrColumnNumber.currentNumberDay));
516 out.writeObject(new Integer(GlobalRowOrColumnNumber.currentNumberWeek));
517 out
518 .writeObject(new Integer(
519 GlobalRowOrColumnNumber.currentNumberMonth));
520 out.writeObject(GlobalRowOrColumnNumber.progressCalendar);
521 out.writeObject(new Integer(GlobalRowOrColumnNumber.numberOfDays));
522 out.writeObject(new Integer(GlobalRowOrColumnNumber.runLength));
523 out.writeObject(new Long(GlobalRowOrColumnNumber.startTime));
524 out.writeObject(GlobalRowOrColumnNumber.simulatorTimeUnit);
525 out.writeObject(new Integer(GlobalRowOrColumnNumber.currentDay));
526 out.writeObject(new Integer(GlobalRowOrColumnNumber.currentWeek));
527 out.writeObject(new Integer(GlobalRowOrColumnNumber.currentMonth));
528 out.writeObject(GlobalRowOrColumnNumber.dayHeaderValues);
529 out.writeObject(GlobalRowOrColumnNumber.weekHeaderValues);
530 out.writeObject(GlobalRowOrColumnNumber.monthHeaderValues);
531 out.writeObject(GlobalRowOrColumnNumber.dayNumberTableRowNumber);
532 out.writeObject(GlobalRowOrColumnNumber.weekNumberTableRowNumber);
533 out.writeObject(GlobalRowOrColumnNumber.monthNumberTableRowNumber);
534 }
535
536 /***
537 * reads a serializable method from stream
538 *
539 * @param in the inputstream
540 */
541 private synchronized void readObject(final java.io.ObjectInputStream in)
542 {
543 try
544 {
545 in.defaultReadObject();
546
547
548 GlobalRowOrColumnNumber.globalRowOrColumnNumber = this;
549 GlobalRowOrColumnNumber.currentNumberDay = ((Integer) in
550 .readObject()).intValue();
551 GlobalRowOrColumnNumber.currentNumberWeek = ((Integer) in
552 .readObject()).intValue();
553 GlobalRowOrColumnNumber.currentNumberMonth = ((Integer) in
554 .readObject()).intValue();
555 GlobalRowOrColumnNumber.progressCalendar = (Calendar) in
556 .readObject();
557 GlobalRowOrColumnNumber.numberOfDays = ((Integer) in.readObject())
558 .intValue();
559 GlobalRowOrColumnNumber.runLength = ((Integer) in.readObject())
560 .intValue();
561 GlobalRowOrColumnNumber.startTime = ((Long) in.readObject())
562 .longValue();
563 GlobalRowOrColumnNumber.simulatorTimeUnit = (TimeUnitInterface) in
564 .readObject();
565 GlobalRowOrColumnNumber.currentDay = ((Integer) in.readObject())
566 .intValue();
567 GlobalRowOrColumnNumber.currentWeek = ((Integer) in.readObject())
568 .intValue();
569 GlobalRowOrColumnNumber.currentMonth = ((Integer) in.readObject())
570 .intValue();
571 GlobalRowOrColumnNumber.dayHeaderValues = (ArrayList) in
572 .readObject();
573 GlobalRowOrColumnNumber.weekHeaderValues = (ArrayList) in
574 .readObject();
575 GlobalRowOrColumnNumber.monthHeaderValues = (ArrayList) in
576 .readObject();
577 GlobalRowOrColumnNumber.dayNumberTableRowNumber = (HashMap) in
578 .readObject();
579 GlobalRowOrColumnNumber.weekNumberTableRowNumber = (HashMap) in
580 .readObject();
581 GlobalRowOrColumnNumber.monthNumberTableRowNumber = (HashMap) in
582 .readObject();
583 } catch (Exception exception)
584 {
585 exception.printStackTrace();
586 }
587 }
588
589
590
591
592 /***
593 * @return Retuns the current number day
594 */
595 public static int getCurrentNumberDay()
596 {
597 return GlobalRowOrColumnNumber.currentNumberDay;
598 }
599
600 /***
601 * @return Retuns the current number month
602 */
603 public static int getCurrentNumberMonth()
604 {
605 return GlobalRowOrColumnNumber.currentNumberMonth;
606 }
607
608 /***
609 * @return Retuns the current number week
610 */
611 public static int getCurrentNumberWeek()
612 {
613 return GlobalRowOrColumnNumber.currentNumberWeek;
614 }
615
616 /***
617 * @return Retuns the day header values
618 */
619 public static ArrayList getDayHeaderValues()
620 {
621 return GlobalRowOrColumnNumber.dayHeaderValues;
622 }
623
624 /***
625 * @return Retuns the week header values
626 */
627 public static ArrayList getWeekHeaderValues()
628 {
629 return GlobalRowOrColumnNumber.weekHeaderValues;
630 }
631
632 /***
633 * @return Retuns the month header values
634 */
635 public static ArrayList getMonthHeaderValues()
636 {
637 return GlobalRowOrColumnNumber.monthHeaderValues;
638 }
639
640 /***
641 * @return Retuns the GlobalRowOrColumnNumber instance
642 */
643 public static GlobalRowOrColumnNumber getGlobalRowOrColumnNumber()
644 {
645 return GlobalRowOrColumnNumber.globalRowOrColumnNumber;
646 }
647
648 /***
649 * @return Retuns the day number table row number
650 */
651 public static HashMap getDayNumberTableRowNumber()
652 {
653 return GlobalRowOrColumnNumber.dayNumberTableRowNumber;
654 }
655
656 /***
657 * @return Retuns the week number table row number
658 */
659 public static HashMap getWeekNumberTableRowNumber()
660 {
661 return GlobalRowOrColumnNumber.weekNumberTableRowNumber;
662 }
663
664 /***
665 * @return Retuns the month number table row number
666 */
667 public static HashMap getMonthNumberTableRowNumber()
668 {
669 return GlobalRowOrColumnNumber.monthNumberTableRowNumber;
670 }
671
672 /***
673 * @return Returns the number of days in the simulation
674 */
675 public static int getNumberOfDays()
676 {
677 return GlobalRowOrColumnNumber.numberOfDays;
678 }
679
680 /***
681 * @return Returns the progress calendar
682 */
683 public static Calendar getProgressCalendar()
684 {
685 return GlobalRowOrColumnNumber.progressCalendar;
686 }
687
688 /***
689 * @return Returns the startTime
690 */
691 public static long getStartTime()
692 {
693 return GlobalRowOrColumnNumber.startTime;
694 }
695
696 /***
697 * @return Retuns the custom event producer
698 */
699 public CustomEventProducer getCustomEventProducer()
700 {
701 return this.customEventProducer;
702 }
703
704 /***
705 * A custom implementation of an event producer.
706 * <p>
707 * (c) copyright 2005 <a href="http://www.simulation.tudelft.nl">Delft
708 * University of Technology </a>, the Netherlands. <br>
709 * See for project information <a
710 * href="http://www.simulation.tudelft.nl">www.simulation.tudelft.nl </a>
711 * <br>
712 *
713 * Copyright (c) 2003-2005 Delft University of Technology, Jaffalaan 5, 2628
714 * BX Delft, the Netherlands. All rights reserved.
715 *
716 * See for project information <a href="http://www.simulation.tudelft.nl/">
717 * www.simulation.tudelft.nl </a>.
718 *
719 * The source code and binary code of this software are proprietary
720 * information of Delft University of Technology.
721 *
722 * @author <a
723 * href="http://www.tbm.tudelft.nl/webstaf/stijnh/index.htm">Stijn-Pieter
724 * van Houten </a>
725 * @version $Revision: 1.2 $ $Date: 2005/08/09 20:49:45 $
726 * @since 1.1.3
727 */
728 public static class CustomEventProducer extends EventProducer implements
729 Serializable
730 {
731 /*** the serial version uid */
732 private static final long serialVersionUID = 11L;
733
734 /***
735 * constructs a new CustomEventProducer
736 */
737 public CustomEventProducer()
738 {
739 super();
740 }
741
742
743 /***
744 * @see nl.tudelft.simulation.event.EventProducer#fireEvent(nl.tudelft.simulation.event.EventInterface)
745 */
746 public synchronized EventInterface fireEvent(final EventInterface event)
747 {
748 return super.fireEvent(event);
749 }
750 }
751
752 /***
753 * A custom implementation of an event listener.
754 * <p>
755 * (c) copyright 2005 <a href="http://www.simulation.tudelft.nl">Delft
756 * University of Technology </a>, the Netherlands. <br>
757 * See for project information <a
758 * href="http://www.simulation.tudelft.nl">www.simulation.tudelft.nl </a>
759 * <br>
760 *
761 * Copyright (c) 2003-2005 Delft University of Technology, Jaffalaan 5, 2628
762 * BX Delft, the Netherlands. All rights reserved.
763 *
764 * See for project information <a href="http://www.simulation.tudelft.nl/">
765 * www.simulation.tudelft.nl </a>.
766 *
767 * The source code and binary code of this software are proprietary
768 * information of Delft University of Technology.
769 *
770 * @author <a
771 * href="http://www.tbm.tudelft.nl/webstaf/stijnh/index.htm">Stijn-Pieter
772 * van Houten </a>
773 * @version $Revision: 1.2 $ $Date: 2005/08/09 20:49:45 $
774 * @since 1.1.3
775 */
776 private static class CustomEventListener implements EventListenerInterface,
777 Serializable
778 {
779 /*** the serial version uid */
780 private static final long serialVersionUID = 11L;
781
782 /***
783 * constructs a new CustomEventListener
784 */
785 public CustomEventListener()
786 {
787 super();
788 }
789
790 /***
791 * @see nl.tudelft.simulation.event.EventListenerInterface#notify(nl.tudelft.simulation.event.EventInterface)
792 */
793 public void notify(final EventInterface event) throws RemoteException
794 {
795 if (event.getType().equals(SimulatorInterface.TIME_CHANGED_EVENT))
796 {
797 long time = (long) TimeUnit.convert(((Double) event
798 .getContent()).doubleValue(),
799 GlobalRowOrColumnNumber.simulatorTimeUnit,
800 TimeUnitInterface.MILLISECOND);
801 GlobalRowOrColumnNumber.progressCalendar
802 .setTimeInMillis(GlobalRowOrColumnNumber.startTime
803 + time);
804 int newDay = GlobalRowOrColumnNumber.progressCalendar
805 .get(Calendar.DAY_OF_YEAR);
806
807 if (GlobalRowOrColumnNumber.currentDay != newDay)
808 {
809 GlobalRowOrColumnNumber.currentDay = newDay;
810 GlobalRowOrColumnNumber.currentNumberDay++;
811
812 GlobalRowOrColumnNumber.globalRowOrColumnNumber.customEventProducer
813 .fireEvent(new Event(
814 GlobalRowOrColumnNumber.UPDATE_CURRENT_DAY,
815 GlobalRowOrColumnNumber.globalRowOrColumnNumber,
816 new Integer(
817 GlobalRowOrColumnNumber.currentNumberDay)));
818
819 int newWeek = GlobalRowOrColumnNumber.progressCalendar
820 .get(Calendar.WEEK_OF_YEAR);
821 if (GlobalRowOrColumnNumber.currentWeek != newWeek)
822 {
823 GlobalRowOrColumnNumber.currentWeek = newWeek;
824 GlobalRowOrColumnNumber.currentNumberWeek++;
825 GlobalRowOrColumnNumber.globalRowOrColumnNumber.customEventProducer
826 .fireEvent(new Event(
827 GlobalRowOrColumnNumber.UPDATE_CURRENT_WEEK,
828 GlobalRowOrColumnNumber.globalRowOrColumnNumber,
829 new Integer(
830 GlobalRowOrColumnNumber.currentNumberWeek)));
831 }
832
833 int newMonth = GlobalRowOrColumnNumber.progressCalendar
834 .get(Calendar.MONTH);
835 if (GlobalRowOrColumnNumber.currentMonth != newMonth)
836 {
837 GlobalRowOrColumnNumber.currentMonth = newMonth;
838 GlobalRowOrColumnNumber.currentNumberMonth++;
839
840 GlobalRowOrColumnNumber.globalRowOrColumnNumber.customEventProducer
841 .fireEvent(new Event(
842 GlobalRowOrColumnNumber.UPDATE_CURRENT_MONTH,
843 GlobalRowOrColumnNumber.globalRowOrColumnNumber,
844 new Integer(
845 GlobalRowOrColumnNumber.currentNumberMonth)));
846 }
847 GlobalRowOrColumnNumber.globalRowOrColumnNumber.customEventProducer
848 .fireEvent(new Event(
849 GlobalRowOrColumnNumber.UPDATE_CURRENT_DATE,
850 GlobalRowOrColumnNumber.globalRowOrColumnNumber,
851 new CurrentRowOrColumnData(
852 GlobalRowOrColumnNumber.progressCalendar
853 .get(Calendar.DAY_OF_MONTH),
854 GlobalRowOrColumnNumber.progressCalendar
855 .get(Calendar.MONTH),
856 GlobalRowOrColumnNumber.progressCalendar
857 .get(Calendar.YEAR))));
858 }
859 }
860 }
861 }
862 }