1 /* 2 * Copyright (c) 2009, 2013, 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.Map; 31 import java.lang.reflect.*; 32 import com.sun.org.glassfish.external.statistics.AverageRangeStatistic; 33 34 /** 35 * An implementation of AverageRangeStatistic that provides ways to change the 36 * state externally through mutators. Convenience class that is useful for 37 * components that gather the statistical data. 38 * By merely changing the count (which is a mandatory measurement), rest of the statistical 39 * information could be deduced. 40 */ 41 42 public final class AverageRangeStatisticImpl extends StatisticImpl implements 43 AverageRangeStatistic, InvocationHandler { 44 45 private long currentVal = 0L; 46 private long highWaterMark = Long.MIN_VALUE; 47 private long lowWaterMark = Long.MAX_VALUE; 48 private long numberOfSamples = 0L; 49 private long runningTotal = 0L; 50 51 private final long initCurrentVal; 52 private final long initHighWaterMark; 53 private final long initLowWaterMark; 54 private final long initNumberOfSamples; 55 private final long initRunningTotal; 56 57 private final AverageRangeStatistic as = 58 (AverageRangeStatistic) Proxy.newProxyInstance( 59 AverageRangeStatistic.class.getClassLoader(), 60 new Class[] { AverageRangeStatistic.class }, 61 this); 62 63 public AverageRangeStatisticImpl(long curVal, long highMark, long lowMark, 64 String name, String unit, String desc, 65 long startTime, long sampleTime) { 66 super(name, unit, desc, startTime, sampleTime); 67 currentVal = curVal; 68 initCurrentVal = curVal; 69 highWaterMark = highMark; 70 initHighWaterMark = highMark; 71 lowWaterMark = lowMark; 72 initLowWaterMark = lowMark; 73 numberOfSamples = 0L; 74 initNumberOfSamples = numberOfSamples; 75 runningTotal = 0L; 76 initRunningTotal = runningTotal; 77 } 78 79 public synchronized AverageRangeStatistic getStatistic() { 80 return as; 81 } 82 83 public synchronized String toString() { 84 return super.toString() + NEWLINE + 85 "Current: " + getCurrent() + NEWLINE + 86 "LowWaterMark: " + getLowWaterMark() + NEWLINE + 87 "HighWaterMark: " + getHighWaterMark() + NEWLINE + 88 "Average:" + getAverage(); 89 } 90 91 public synchronized Map getStaticAsMap() { 92 Map m = super.getStaticAsMap(); 93 m.put("current", getCurrent()); 94 m.put("lowwatermark", getLowWaterMark()); 95 m.put("highwatermark", getHighWaterMark()); 96 m.put("average", getAverage()); 97 return m; 98 } 99 100 public synchronized void reset() { 101 super.reset(); 102 currentVal = initCurrentVal; 103 highWaterMark = initHighWaterMark; 104 lowWaterMark = initLowWaterMark; 105 numberOfSamples = initNumberOfSamples; 106 runningTotal = initRunningTotal; 107 sampleTime = -1L; 108 } 109 110 public synchronized long getAverage() { 111 if(numberOfSamples == 0) { 112 return -1; 113 } else { 114 return runningTotal / numberOfSamples; 115 } 116 } 117 118 public synchronized long getCurrent() { 119 return currentVal; 120 } 121 122 public synchronized void setCurrent(long curVal) { 123 currentVal = curVal; 124 lowWaterMark = (curVal >= lowWaterMark ? lowWaterMark : curVal); 125 highWaterMark = (curVal >= highWaterMark ? curVal : highWaterMark); 126 numberOfSamples++; 127 runningTotal += curVal; 128 sampleTime = System.currentTimeMillis(); 129 } 130 131 public synchronized long getHighWaterMark() { 132 return highWaterMark; 133 } 134 135 public synchronized long getLowWaterMark() { 136 return lowWaterMark; 137 } 138 139 // todo: equals implementation 140 public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { 141 checkMethod(method); 142 143 Object result; 144 try { 145 result = method.invoke(this, args); 146 } catch (InvocationTargetException e) { 147 throw e.getTargetException(); 148 } catch (Exception e) { 149 throw new RuntimeException("unexpected invocation exception: " + 150 e.getMessage()); 151 } 152 return result; 153 } 154 155 }