    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 }