View Javadoc

1   package com.github.triceo.splitlog.api;
2   
3   /**
4    * Implementors of this interface provide users with means of measuring various
5    * properties of {@link Message}s that pass through them.
6    *
7    * @param <P>
8    *            Where this is getting its {@link Message}s from.
9    */
10  public interface MessageProducer<P extends MessageProducer<P>> {
11  
12      /**
13       * Return the number of consumers that have been
14       * {@link #startConsuming(MessageListener)}'d and not
15       * {@link #stopConsuming(MessageConsumer)}'d.
16       *
17       * @return Always >= 0.
18       */
19      int countConsumers();
20  
21      /**
22       * Return the number of metrics that have been
23       * {@link #startMeasuring(MessageMeasure, String)}'d and not
24       * {@link #stopMeasuring(String)}'d.
25       *
26       * @return Always >= 0.
27       */
28      int countMetrics();
29  
30      /**
31       * Retrieve the metric for a particular ID.
32       *
33       * @param id
34       *            The ID under which the metric has been requested in
35       *            {@link #startMeasuring(MessageMeasure, String)}.
36       * @return Null if no such metric. Either not
37       *         {@link #startMeasuring(MessageMeasure, String)}'d or already
38       *         {@link #stopMeasuring(MessageMetric)}'d.
39       */
40      MessageMetric<? extends Number, P> getMetric(String id);
41  
42      /**
43       * Retrieve the ID for a particular measure.
44       *
45       * @param measure
46       *            The metric retrieved by
47       *            {@link #startMeasuring(MessageMeasure, String)}.
48       * @return Null if no such metric. Either not
49       *         {@link #startMeasuring(MessageMeasure, String)}'d or already
50       *         {@link #stopMeasuring(MessageMetric)}'d.
51       */
52      String getMetricId(MessageMetric<? extends Number, P> measure);
53  
54      /**
55       * Whether or not the particular message consumer is being notified of new
56       * messages.
57       *
58       * @param consumer
59       *            Consumer in question.
60       * @return True if called between {@link #startConsuming(MessageListener)}
61       *         and {@link #stopConsuming(MessageConsumer)}.
62       */
63      boolean isConsuming(MessageConsumer<P> consumer);
64  
65      /**
66       * Whether or not particular {@link MessageMetric} is active.
67       *
68       * @param metric
69       *            Metric in question.
70       * @return True after {@link #startMeasuring(MessageMeasure, String)} has
71       *         been called and before {@link #stopMeasuring(MessageMetric)}.
72       */
73      boolean isMeasuring(MessageMetric<? extends Number, P> metric);
74  
75      /**
76       * Whether or not particular {@link MessageMetric} is active.
77       *
78       * @param id
79       *            ID of the metric in question.
80       * @return True after {@link #startMeasuring(MessageMeasure, String)} has
81       *         been called and before {@link #stopMeasuring(String)}.
82       */
83      boolean isMeasuring(String id);
84  
85      /**
86       * Register a listener to be notified of new messages in this producer.
87       *
88       * @param listener
89       *            Listener in question.
90       * @return A newly produced consumer in case the listener is submitted for
91       *         the first time, the original consumer instance in case the
92       *         listener is submitted repeatedly.
93       * @throws IllegalArgumentException
94       *             When <code>listener instanceof {@link MessageConsumer}</code>
95       *             .
96       */
97      MessageConsumer<P> startConsuming(MessageListener<P> listener);
98  
99      /**
100      * Request that a message property be tracked from now on.
101      *
102      * @param measure
103      *            The class that measures the given property. It is highly
104      *            recommended that a measure instance be exclusive to each
105      *            metric.
106      * @param id
107      *            Unique identifier by which to locate the metric later.
108      * @return The metric to query for the value of the given property.
109      * @throws IllegalArgumentException
110      *             When a given ID has already been passed to
111      *             {@link #startMeasuring(MessageMeasure, String)} and not to
112      *             {@link #stopMeasuring(String)} or equivalents.
113      */
114     <T extends Number> MessageMetric<T, P> startMeasuring(MessageMeasure<T, P> measure, String id);
115 
116     /**
117      * Tell a consumer to no longer listen to new messages in this producer.
118      *
119      * @param consumer
120      *            Consumer in question.
121      * @return True, unless no longer {@link #isConsuming(MessageConsumer)}.
122      */
123     boolean stopConsuming(MessageConsumer<P> consumer);
124 
125     /**
126      * Will stop the metric from being notified of new {@link Message}s. From
127      * this point on, the ID will become available for taking.
128      *
129      * @param metric
130      *            The metric in question.
131      * @return True if stopped, false if unknown.
132      */
133     boolean stopMeasuring(MessageMetric<? extends Number, P> metric);
134 
135     /**
136      * Will stop the metric from being notified of new {@link Message}s. From
137      * this point on, the ID will become available for taking.
138      *
139      * @param id
140      *            ID of the metric in question.
141      * @return True if stopped, false if unknown.
142      */
143     boolean stopMeasuring(String id);
144 
145 }