1 /* 2 * Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. Oracle designates this 8 * particular file as subject to the "Classpath" exception as provided 9 * by Oracle in the LICENSE file that accompanied this code. 10 * 11 * This code is distributed in the hope that it will be useful, but WITHOUT 12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14 * version 2 for more details (a copy is included in the LICENSE file that 15 * accompanied this code). 16 * 17 * You should have received a copy of the GNU General Public License version 18 * 2 along with this work; if not, write to the Free Software Foundation, 19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 20 * 21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 22 * or visit www.oracle.com if you need additional information or have any 23 * questions. 24 */ 25 26 27 28 package com.sun.org.glassfish.external.statistics.impl; 29 30 import java.util.concurrent.atomic.AtomicLong; 31 import java.util.Map; 32 import java.lang.reflect.*; 33 import com.sun.org.glassfish.external.statistics.AverageRangeStatistic; 34 35 /** 36 * An implementation of AverageRangeStatistic that provides ways to change the 37 * state externally through mutators. Convenience class that is useful for 38 * components that gather the statistical data. 39 * By merely changing the count (which is a mandatory measurement), rest of the statistical 40 * information could be deduced. 41 */ 42 43 public final class AverageRangeStatisticImpl extends StatisticImpl implements 44 AverageRangeStatistic, InvocationHandler { 45 46 private long currentVal = 0L; 47 private long highWaterMark = Long.MIN_VALUE; 48 private long lowWaterMark = Long.MAX_VALUE; 49 private long numberOfSamples = 0L; 50 private long runningTotal = 0L; 51 52 private final long initCurrentVal; 53 private final long initHighWaterMark; 54 private final long initLowWaterMark; 55 private final long initNumberOfSamples; 56 private final long initRunningTotal; 57 58 private final AverageRangeStatistic as = 59 (AverageRangeStatistic) Proxy.newProxyInstance( 60 AverageRangeStatistic.class.getClassLoader(), 61 new Class[] { AverageRangeStatistic.class }, 62 this); 63 64 public AverageRangeStatisticImpl(long curVal, long highMark, long lowMark, 65 String name, String unit, String desc, 66 long startTime, long sampleTime) { 67 super(name, unit, desc, startTime, sampleTime); 68 currentVal = curVal; 69 initCurrentVal = curVal; 70 highWaterMark = highMark; 71 initHighWaterMark = highMark; 72 lowWaterMark = lowMark; 73 initLowWaterMark = lowMark; 74 numberOfSamples = 0L; 75 initNumberOfSamples = numberOfSamples; 76 runningTotal = 0L; 77 initRunningTotal = runningTotal; 78 } 79 80 public synchronized AverageRangeStatistic getStatistic() { 81 return as; 82 } 83 84 public synchronized String toString() { 85 return super.toString() + NEWLINE + 86 "Current: " + getCurrent() + NEWLINE + 87 "LowWaterMark: " + getLowWaterMark() + NEWLINE + 88 "HighWaterMark: " + getHighWaterMark() + NEWLINE + 89 "Average:" + getAverage(); 90 } 91 92 public synchronized Map getStaticAsMap() { 93 Map m = super.getStaticAsMap(); 94 m.put("current", getCurrent()); 95 m.put("lowwatermark", getLowWaterMark()); 96 m.put("highwatermark", getHighWaterMark()); 97 m.put("average", getAverage()); 98 return m; 99 } 100 101 public synchronized void reset() { 102 super.reset(); 103 currentVal = initCurrentVal; 104 highWaterMark = initHighWaterMark; 105 lowWaterMark = initLowWaterMark; 106 numberOfSamples = initNumberOfSamples; 107 runningTotal = initRunningTotal; 108 sampleTime = -1L; 109 } 110 111 public synchronized long getAverage() { 112 if(numberOfSamples == 0) { 113 return -1; 114 } else { 115 return runningTotal / numberOfSamples; 116 } 117 } 118 119 public synchronized long getCurrent() { 120 return currentVal; 121 } 122 123 public synchronized void setCurrent(long curVal) { 124 currentVal = curVal; 125 lowWaterMark = (curVal >= lowWaterMark ? lowWaterMark : curVal); 126 highWaterMark = (curVal >= highWaterMark ? curVal : highWaterMark); 127 numberOfSamples++; 128 runningTotal += curVal; 129 sampleTime = System.currentTimeMillis(); 130 } 131 132 public synchronized long getHighWaterMark() { 133 return highWaterMark; 134 } 135 136 public synchronized long getLowWaterMark() { 137 return lowWaterMark; 138 } 139 140 // todo: equals implementation 141 public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { 142 Object result; 143 try { 144 result = method.invoke(this, args); 145 } catch (InvocationTargetException e) { 146 throw e.getTargetException(); 147 } catch (Exception e) { 148 throw new RuntimeException("unexpected invocation exception: " + 149 e.getMessage()); 150 } finally { 151 } 152 return result; 153 } 154 155 }