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