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.activeio.stats; 19 20 import javax.management.j2ee.statistics.TimeStatistic; 21 22 /*** 23 * Shamelessly taken from the ActiveMQ project ( http://activemq.com ) 24 * A time statistic implementation 25 * 26 * @version $Revision: 1.1 $ 27 */ 28 public class TimeStatisticImpl extends StatisticImpl implements TimeStatistic { 29 private long count; 30 private long maxTime; 31 private long minTime; 32 private long totalTime; 33 private TimeStatisticImpl parent; 34 35 public TimeStatisticImpl(String name, String description) { 36 this(name, "millis", description); 37 } 38 39 public TimeStatisticImpl(TimeStatisticImpl parent, String name, String description) { 40 this(name, description); 41 this.parent = parent; 42 } 43 44 public TimeStatisticImpl(String name, String unit, String description) { 45 super(name, unit, description); 46 } 47 48 public synchronized void reset() { 49 super.reset(); 50 count = 0; 51 maxTime = 0; 52 minTime = 0; 53 totalTime = 0; 54 } 55 56 public synchronized long getCount() { 57 return count; 58 } 59 60 public synchronized void addTime(long time) { 61 count++; 62 totalTime += time; 63 if (time > maxTime) { 64 maxTime = time; 65 } 66 if (time < minTime || minTime == 0) { 67 minTime = time; 68 } 69 updateSampleTime(); 70 if (parent != null) { 71 parent.addTime(time); 72 } 73 } 74 75 /*** 76 * @return the maximum time of any step 77 */ 78 public long getMaxTime() { 79 return maxTime; 80 } 81 82 /*** 83 * @return the minimum time of any step 84 */ 85 public synchronized long getMinTime() { 86 return minTime; 87 } 88 89 /*** 90 * @return the total time of all the steps added together 91 */ 92 public synchronized long getTotalTime() { 93 return totalTime; 94 } 95 96 /*** 97 * @return the average time calculated by dividing the 98 * total time by the number of counts 99 */ 100 public synchronized double getAverageTime() { 101 if (count == 0) { 102 return 0; 103 } 104 double d = totalTime; 105 return d / count; 106 } 107 108 109 /*** 110 * @return the average time calculated by dividing the 111 * total time by the number of counts but excluding the 112 * minimum and maximum times. 113 */ 114 public synchronized double getAverageTimeExcludingMinMax() { 115 if (count <= 2) { 116 return 0; 117 } 118 double d = totalTime - minTime - maxTime; 119 return d / (count - 2); 120 } 121 122 123 /*** 124 * @return the average number of steps per second 125 */ 126 public double getAveragePerSecond() { 127 double d = 1000; 128 double averageTime = getAverageTime(); 129 if (averageTime == 0) { 130 return 0; 131 } 132 return d / averageTime; 133 } 134 135 /*** 136 * @return the average number of steps per second excluding the min & max values 137 */ 138 public double getAveragePerSecondExcludingMinMax() { 139 double d = 1000; 140 double average = getAverageTimeExcludingMinMax(); 141 if (average == 0) { 142 return 0; 143 } 144 return d / average; 145 } 146 147 public TimeStatisticImpl getParent() { 148 return parent; 149 } 150 151 public void setParent(TimeStatisticImpl parent) { 152 this.parent = parent; 153 } 154 155 protected synchronized void appendFieldDescription(StringBuffer buffer) { 156 buffer.append(" count: "); 157 buffer.append(Long.toString(count)); 158 buffer.append(" maxTime: "); 159 buffer.append(Long.toString(maxTime)); 160 buffer.append(" minTime: "); 161 buffer.append(Long.toString(minTime)); 162 buffer.append(" totalTime: "); 163 buffer.append(Long.toString(totalTime)); 164 buffer.append(" averageTime: "); 165 buffer.append(Double.toString(getAverageTime())); 166 buffer.append(" averageTimeExMinMax: "); 167 buffer.append(Double.toString(getAverageTimeExcludingMinMax())); 168 buffer.append(" averagePerSecond: "); 169 buffer.append(Double.toString(getAveragePerSecond())); 170 buffer.append(" averagePerSecondExMinMax: "); 171 buffer.append(Double.toString(getAveragePerSecondExcludingMinMax())); 172 super.appendFieldDescription(buffer); 173 } 174 175 }