1 /***
2 *
3 * Copyright 2004 Protique Ltd
4 *
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 *
17 **/
18 package org.codehaus.activemq.management;
19
20 import javax.management.j2ee.statistics.TimeStatistic;
21
22 /***
23 * A time statistic implementation
24 *
25 * @version $Revision: 1.7 $
26 */
27 public class TimeStatisticImpl extends StatisticImpl implements TimeStatistic {
28 private long count;
29 private long maxTime;
30 private long minTime;
31 private long totalTime;
32 private TimeStatisticImpl parent;
33
34 public TimeStatisticImpl(String name, String description) {
35 this(name, "millis", description);
36 }
37
38 public TimeStatisticImpl(TimeStatisticImpl parent, String name, String description) {
39 this(name, description);
40 this.parent = parent;
41 }
42
43 public TimeStatisticImpl(String name, String unit, String description) {
44 super(name, unit, description);
45 }
46
47 public synchronized void reset() {
48 super.reset();
49 count = 0;
50 maxTime = 0;
51 minTime = 0;
52 totalTime = 0;
53 }
54
55 public synchronized long getCount() {
56 return count;
57 }
58
59 public synchronized void addTime(long time) {
60 count++;
61 totalTime += time;
62 if (time > maxTime) {
63 maxTime = time;
64 }
65 if (time < minTime || minTime == 0) {
66 minTime = time;
67 }
68 updateSampleTime();
69 if (parent != null) {
70 parent.addTime(time);
71 }
72 }
73
74 /***
75 * @return the maximum time of any step
76 */
77 public long getMaxTime() {
78 return maxTime;
79 }
80
81 /***
82 * @return the minimum time of any step
83 */
84 public synchronized long getMinTime() {
85 return minTime;
86 }
87
88 /***
89 * @return the total time of all the steps added together
90 */
91 public synchronized long getTotalTime() {
92 return totalTime;
93 }
94
95 /***
96 * @return the average time calculated by dividing the
97 * total time by the number of counts
98 */
99 public synchronized double getAverageTime() {
100 if (count == 0) {
101 return 0;
102 }
103 double d = totalTime;
104 return d / count;
105 }
106
107
108 /***
109 * @return the average time calculated by dividing the
110 * total time by the number of counts but excluding the
111 * minimum and maximum times.
112 */
113 public synchronized double getAverageTimeExcludingMinMax() {
114 if (count <= 2) {
115 return 0;
116 }
117 double d = totalTime - minTime - maxTime;
118 return d / (count - 2);
119 }
120
121
122 /***
123 * @return the average number of steps per second
124 */
125 public double getAveragePerSecond() {
126 double d = 1000;
127 double averageTime = getAverageTime();
128 if (averageTime == 0) {
129 return 0;
130 }
131 return d / averageTime;
132 }
133
134 /***
135 * @return the average number of steps per second excluding the min & max values
136 */
137 public double getAveragePerSecondExcludingMinMax() {
138 double d = 1000;
139 double average = getAverageTimeExcludingMinMax();
140 if (average == 0) {
141 return 0;
142 }
143 return d / average;
144 }
145
146 public TimeStatisticImpl getParent() {
147 return parent;
148 }
149
150 public void setParent(TimeStatisticImpl parent) {
151 this.parent = parent;
152 }
153
154 protected synchronized void appendFieldDescription(StringBuffer buffer) {
155 buffer.append(" count: ");
156 buffer.append(Long.toString(count));
157 buffer.append(" maxTime: ");
158 buffer.append(Long.toString(maxTime));
159 buffer.append(" minTime: ");
160 buffer.append(Long.toString(minTime));
161 buffer.append(" totalTime: ");
162 buffer.append(Long.toString(totalTime));
163 buffer.append(" averageTime: ");
164 buffer.append(Double.toString(getAverageTime()));
165 buffer.append(" averageTimeExMinMax: ");
166 buffer.append(Double.toString(getAverageTimeExcludingMinMax()));
167 buffer.append(" averagePerSecond: ");
168 buffer.append(Double.toString(getAveragePerSecond()));
169 buffer.append(" averagePerSecondExMinMax: ");
170 buffer.append(Double.toString(getAveragePerSecondExcludingMinMax()));
171 super.appendFieldDescription(buffer);
172 }
173
174 }