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 }