/*
* Copyright (C) 2008 Jive Software. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jivesoftware.openfire.reporting.stats;
import org.jivesoftware.openfire.stats.Statistic;
import java.util.Map;
import java.util.HashMap;
import java.util.Random;
/**
*/
public class MockStatsViewer implements StatsViewer {
private StatsEngine engine;
private Map<String, double[][]> dataCache = new HashMap<String, double[][]>();
Random random = new Random();
public MockStatsViewer(StatsEngine engine) {
this.engine = engine;
}
public String [] getAllHighLevelStatKeys() {
return engine.getAllHighLevelNames();
}
public Statistic[] getStatistic(String statKey) {
StatDefinition[] definitions = engine.getDefinition(statKey);
Statistic[] statistics = new Statistic[definitions.length];
int i = 0;
for (StatDefinition def : definitions) {
statistics[i++] = def.getStatistic();
}
return statistics;
}
public long getLastSampleTime(String key) {
return System.currentTimeMillis() / 1000;
}
public double[][] getData(String key, long startTime, long endTime) {
return getData(key, true);
}
public double[][] getData(String key, long startTime, long endTime, int dataPoints) {
return getData(key, true);
}
private double[][] getData(String key, boolean shouldUpdate) {
synchronized (("mock_" + key).intern()) {
double[][] data = dataCache.get(key);
if (data == null) {
Statistic[] stats = getStatistic(key);
data = new double[stats.length][];
for (int i = 0; i < data.length; i++) {
data[i] = new double[60];
for (int j = 0; j < data[i].length; j++) {
data[i][j] = random.nextInt(500);
}
}
dataCache.put(key, data);
}
else if(shouldUpdate) {
for (int i = 0; i < data.length; i++) {
double [] newData = new double[data[i].length];
System.arraycopy(data[i], 1, newData, 0, data[i].length - 1);
newData[newData.length - 1] = random.nextInt(500);
data[i] = newData;
}
}
return data;
}
}
public StatView getData(String key, TimePeriod timePeriod) {
long time = getLastSampleTime(key);
double[][] data = getData(key, timePeriod.getStartTime(time), time);
return new StatView(timePeriod.getStartTime(time), time, data);
}
public double[] getMax(String key, long startTime, long endTime) {
double [][] data = getData(key, false);
double[] toReturn = new double[data.length];
for(int i = 0; i < toReturn.length; i++) {
toReturn[i] = discoverMax(data[i]);
}
return toReturn;
}
public double[] getMax(String key, long startTime, long endTime, int dataPoints) {
return getMax(key, startTime, endTime);
}
public double[] getMax(String key, TimePeriod timePeriod) {
long time = getLastSampleTime(key);
return getMax(key, timePeriod.getStartTime(time), time);
}
private double discoverMax(double[] doubles) {
double max = 0;
for(double d : doubles) {
if(d > max) {
max = d;
}
}
return max;
}
public double[] getMin(String key, long startTime, long endTime) {
double [][] data = getData(key, false);
double[] toReturn = new double[data.length];
for(int i = 0; i < toReturn.length; i++) {
toReturn[i] = discoverMin(data[i]);
}
return toReturn;
}
public double[] getMin(String key, long startTime, long endTime, int dataPoints) {
return getMin(key, startTime, endTime);
}
public double[] getMin(String key, TimePeriod timePeriod) {
long time = getLastSampleTime(key);
return getMin(key, timePeriod.getStartTime(time), time);
}
private double discoverMin(double[] doubles) {
double min = doubles[0];
for(double d : doubles) {
if(d < min) {
min = d;
}
}
return min;
}
public double[] getCurrentValue(String key) {
double [][] data = getData(key, false);
double[] toReturn = new double[data.length];
for(int i = 0; i < toReturn.length; i++) {
toReturn[i] = data[i][data[i].length - 1];
}
return toReturn;
}
}