1 package org.djutils.stats.summarizers.event;
2
3 import org.djutils.event.Event;
4 import org.djutils.event.EventListener;
5 import org.djutils.event.EventListenerMap;
6 import org.djutils.event.EventProducer;
7 import org.djutils.event.LocalEventProducer;
8 import org.djutils.exceptions.Throw;
9 import org.djutils.stats.summarizers.Counter;
10
11
12
13
14
15
16
17
18
19
20
21
22
23 public class EventBasedCounter extends Counter implements EventProducer, EventListener
24 {
25
26 private EventProducer eventProducer = null;
27
28
29
30
31
32 public EventBasedCounter(final String description)
33 {
34 this(description, new LocalEventProducer());
35 }
36
37
38
39
40
41
42 public EventBasedCounter(final String description, final EventProducer eventProducer)
43 {
44 super(description);
45 Throw.whenNull(eventProducer, "eventProducer cannot be null");
46 this.eventProducer = eventProducer;
47 }
48
49 @Override
50 public EventListenerMap getEventListenerMap()
51 {
52 return this.eventProducer.getEventListenerMap();
53 }
54
55 @Override
56 public void initialize()
57 {
58 super.initialize();
59 if (this.eventProducer != null)
60 {
61 this.eventProducer.fireEvent(StatisticsEvents.INITIALIZED_EVENT);
62 }
63 }
64
65 @Override
66 public void notify(final Event event)
67 {
68 long value = 1;
69 if (event.getContent() instanceof Number)
70 {
71 value = Math.round(((Number) event.getContent()).doubleValue());
72 }
73 else
74 {
75 throw new IllegalArgumentException("event content for counter not a number but of type " + event.getClass());
76 }
77 register(value);
78 }
79
80 @Override
81 public long register(final long value)
82 {
83 super.register(value);
84 if (hasListeners())
85 {
86 this.eventProducer.fireEvent(StatisticsEvents.OBSERVATION_ADDED_EVENT, value);
87 fireEvents();
88 }
89 return value;
90 }
91
92
93
94
95 protected void fireEvents()
96 {
97 this.eventProducer.fireEvent(StatisticsEvents.N_EVENT, getN());
98 this.eventProducer.fireEvent(StatisticsEvents.COUNT_EVENT, getCount());
99 }
100
101 }