/*
* Copyright (C) 2008 Digital Sundhed (SDSD)
*
* All source code and information supplied as part of chronos
* is copyright to its contributers.
*
* The source code has been released under a dual license - meaning you can
* use either licensed version of the library with your code.
*
* It is released under the Common Public License 1.0, a copy of which can
* be found at the link below.
* http://www.opensource.org/licenses/cpl.php
*
* It is released under the LGPL (GNU Lesser General Public License), either
* version 2.1 of the License, or (at your option) any later version. A copy
* of which can be found at the link below.
* http://www.gnu.org/copyleft/lesser.html
*/
package org.codehaus.mojo.chronos.history;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import org.codehaus.mojo.chronos.Utils;
import org.jfree.data.time.Millisecond;
import org.jfree.data.time.TimeSeries;
/**
* Holder to handle historic results and calculate statistics.
*
* @author ksr@lakeside.dk
*/
public final class HistoricSamples {
private List groupNames = new ArrayList();
private List samples = new ArrayList();
public void load(File dataDirectory) throws IOException {
File[] historyFiles = dataDirectory.listFiles();
if(historyFiles != null) {
Arrays.sort(historyFiles);
for (int i = 0; i < historyFiles.length; i++) {
if(historyFiles[i].isFile() && historyFiles[i].getName().startsWith("history-")
&& historyFiles[i].getName().endsWith(".ser")) {
HistoricSample sample = (HistoricSample)Utils.readObject(historyFiles[i]);
addHistoricSample(sample);
}
}
}
}
void addHistoricSample(HistoricSample sample) {
samples.add(sample);
for (Iterator it = sample.getGroupNames().iterator(); it.hasNext();) {
String name = (String)it.next();
if(!groupNames.contains(name)) {
groupNames.add(name);
}
}
}
public String[] getGroupNames() {
return (String[])groupNames.toArray(new String[groupNames.size()]);
}
public TimeSeries getAverageTime(String name) {
return visitAll(name, new HistoricSampleExtractor() {
public double extract(HistoricSample sample) {
return sample.getResponsetimeAverage();
}
public boolean accept(HistoricSample sample) {
return true;
}
});
}
public TimeSeries getAverageTime(String name, final String groupName) {
return visitAll(name, new HistoricSampleExtractor() {
public double extract(HistoricSample sample) {
return sample.getResponsetimeAverage(groupName);
}
public boolean accept(HistoricSample sample) {
return sample.getGroupNames().contains(groupName);
}
});
}
public TimeSeries getpercentile95(String name) {
return visitAll(name, new HistoricSampleExtractor() {
public double extract(HistoricSample sample) {
return sample.getResponsetime95Percentile();
}
public boolean accept(HistoricSample sample) {
return true;
}
});
}
public TimeSeries getPercentile95(String name, final String groupName) {
return visitAll(name, new HistoricSampleExtractor() {
public double extract(HistoricSample sample) {
return sample.getResponsetimePercentiles(groupName);
}
public boolean accept(HistoricSample sample) {
return sample.getGroupNames().contains(groupName);
}
});
}
public TimeSeries getThroughput(String name) {
return visitAll(name, new HistoricSampleExtractor() {
public double extract(HistoricSample sample) {
return sample.getMaxAverageThroughput();
}
public boolean accept(HistoricSample sample) {
return true;
}
});
}
public TimeSeries getGcRatio(String name) {
return visitAll(name, new HistoricSampleExtractor() {
public double extract(HistoricSample sample) {
return sample.getGcRatio();
}
public boolean accept(HistoricSample sample) {
return true;
}
});
}
public TimeSeries getKbCollectedPrSecond(String name) {
return visitAll(name, new HistoricSampleExtractor() {
public double extract(HistoricSample sample) {
return sample.getCollectedPrSecond();
}
public boolean accept(HistoricSample sample) {
return true;
}
});
}
private TimeSeries visitAll(String name, HistoricSampleExtractor visitor) {
TimeSeries series = new TimeSeries(name);
Iterator it = samples.iterator();
while (it.hasNext()) {
HistoricSample sample = (HistoricSample)it.next();
if(visitor.accept(sample)) {
Millisecond timestamp = new Millisecond(new Date(sample.getTimestamp()));
double value = visitor.extract(sample);
series.addOrUpdate(timestamp, value);
}
}
return series;
}
/**
* Base interface for extracting statistics from historic results.
*
* @author kent (creator)
* @author $LastChangedBy$ $LastChangedDate$
* @version $Revision$
*/
interface HistoricSampleExtractor {
double extract(HistoricSample sample);
boolean accept(HistoricSample sample);
}
}