/*
* Software Name : ATK
*
* Copyright (C) 2007 - 2012 France Télécom
*
* 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.
*
* ------------------------------------------------------------------
* File Name : PerformanceGraph.java
*
* Created : 02/03/2009
* Author(s) : Yvain Leyral
*/
package com.orange.atk.graphAnalyser;
import java.awt.Color;
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.text.DecimalFormat;
import org.apache.log4j.Logger;
import org.jfree.chart.axis.AxisLocation;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.renderer.xy.StandardXYItemRenderer;
import org.jfree.data.xy.XYDataItem;
import org.jfree.data.xy.XYDataset;
import org.jfree.data.xy.XYSeries;
import org.jfree.data.xy.XYSeriesCollection;
import com.orange.atk.results.logger.documentGenerator.PlotReader;
import com.orange.atk.results.measurement.PlotList;
/**
*
* @author ywil8421
*/
/**
* @author France Telecom R&D
*(C) France Télécom, 2010.
*/
public class PerformanceGraph {
private XYDataset xydataset = null;
private PlotList plts;
private int graphNumber = 0;
private String fileName = "";
private String serieName = "";
private Color color = null;
private AxisLocation location;
private XYPlot xyplot = null;
private boolean active = false;
private NumberAxis numberaxis = null;
private StandardXYItemRenderer standardxyitemrenderer = null;
private double xvalue=0;
private double nextXvalue = 0;
private double prevousxValue = 0;
private double yvalue = 0;
private double nextyvalue = 0;
private double prevousyValue = 0;
private XYSeriesCollection series=null;
private XYSeries data=null;
private String unit=null;
private int scale=1;
public PerformanceGraph(int graphNumber, String fileName, String serieName, Color color,
String axisName, XYPlot xyplot, String unit, int scale) {
this.graphNumber = graphNumber+1;
this.serieName = serieName;
this.fileName = fileName;
this.color = color;
this.location = AxisLocation.BOTTOM_OR_RIGHT; // Default
this.xyplot = xyplot;
this.unit = unit;
this.scale = scale;
standardxyitemrenderer = new StandardXYItemRenderer();
numberaxis = new NumberAxis(axisName);
numberaxis.setLabelPaint(color);
numberaxis.setTickLabelPaint(color);
numberaxis.setFixedDimension(10D);
numberaxis.setNumberFormatOverride(new DecimalFormat("###,###,##0.###"));
numberaxis.setAutoRange(true);
numberaxis.setAutoRangeIncludesZero(false);
numberaxis.setLabel(serieName);
}
public void setColor(Color color) {
this.color = color;
}
/**
* remove graph
*/
public void removeGraph() {
xyplot.setDataset(graphNumber, null);
//xyplot.setRangeAxis(graphNumber, null);
numberaxis.setVisible(false);
setActive(false);
}
/**
* set if axis need to be display
* @param activeaxis true to display legend
* @param AxisLocation place to display legend (right or left)
*/
public void setAxis(boolean activeAxis, AxisLocation location) {
xyplot.setRangeAxisLocation(graphNumber, location);
numberaxis.setVisible(activeAxis);
}
/**
*Create jfreechart datasetS
*/
public void createPlots() {
try {
plts = PlotReader.read(new BufferedReader(new FileReader(
fileName)));
plts.setScale(scale);
} catch (FileNotFoundException e) {
Logger.getLogger(this.getClass() ).debug("error" + e);
}
}
public void createDataset()
{
Logger.getLogger(this.getClass() ).debug(fileName);
xydataset = createSeries();
}
public long getmintimestamp()
{
long value;
if (plts==null) return -1;
try {
value = plts.getX(0);
} catch (ArrayIndexOutOfBoundsException e) {
return -1;
}
return value;
}
public XYDataset createEmptyDataset() {
series = new XYSeriesCollection();
data = new XYSeries(serieName);
series.addSeries(data);
xydataset= series;
return xydataset;
}
public final synchronized void addDatasetValue(long xval,double yval)
{
double y_scaled = yval/scale;
XYDataItem item =new XYDataItem(xval, y_scaled);
data.add(item);
/*if((numberaxis.getLabel().toLowerCase().contains(cpuLabel))&&active){
Double maxRange;
Double minRange;
if(rangeCPU!=null)
maxRange = rangeCPU.getUpperBound();
else
maxRange = numberaxis.getRange().getUpperBound();
if(rangeCPU!=null)
minRange = rangeCPU.getLowerBound();
else
minRange = numberaxis.getRange().getUpperBound();
Double diff = 0.0;
if(y_scaled>maxRange){
maxRange = y_scaled;
diff = (maxRange-minRange)*0.02;
}
if(y_scaled<minRange){
minRange = y_scaled;
diff = (maxRange-minRange)*0.02;
}
if((maxRange-minRange)<1){
diff = maxRange * 0.0002;
}
rangeCPU = new Range((double)minRange-diff,(double)maxRange+diff);
if (rangeCPU.getLength()==0) rangeCPU = Range.expand(new Range(0.0, 0.5),0.03,0.0);
numberaxis.setRange(rangeCPU);
}
if((numberaxis.getLabel().toLowerCase().contains(memoryLabel))&&active){
Double maxRange;
Double minRange;
if(rangeMEM!=null)
maxRange = rangeMEM.getUpperBound();
else
maxRange = numberaxis.getRange().getUpperBound();
if(rangeMEM!=null)
minRange = rangeMEM.getLowerBound();
else
minRange = numberaxis.getRange().getUpperBound();
Double diff = 0.0;
if(y_scaled>maxRange){
maxRange = y_scaled;
diff = (maxRange-minRange)*0.02;
}
if(y_scaled<minRange){
minRange = y_scaled;
diff = (maxRange-minRange)*0.02;
}
if((maxRange-minRange)<1){
diff = maxRange * 0.0002;
}
rangeMEM = new Range((double)minRange-diff,(double)maxRange+diff);
if (rangeMEM.getLength()==0) rangeMEM = Range.expand(new Range(0.0, 0.5),0.03,0.0);
numberaxis.setRange(rangeMEM);
}*/
}
/**
*Create jfreechart series
*/
private XYDataset createSeries() {
series = new XYSeriesCollection();
data = new XYSeries(serieName);
int size = plts.getSize();
if (size == 0) {
Logger.getLogger(this.getClass() ).warn("Nothing in graph");
return null;
}
for (int i = 0; i < size; i++) {
double xval = ((Long) plts.getX(i)).doubleValue();
double yval = plts.getY(i).doubleValue() / scale;
data.add(xval, yval);
}
series.addSeries(data);
return series;
}
/**
*Draw Graph
*/
public final synchronized void drawGraph() {
//on cree le dataset et on le lie au numero sur le xyplot idem pour range
xyplot.setRangeAxis(graphNumber, numberaxis);
xyplot.setDataset(graphNumber, xydataset);
//on lie ensemble le rangeAxis et le dataset
xyplot.mapDatasetToRangeAxis(graphNumber, graphNumber);
standardxyitemrenderer.setSeriesPaint(0, color);
//lie la couleur a la serie sur le renrerer
xyplot.setRenderer(graphNumber, standardxyitemrenderer);
setActive(true);
setAxis(true, location);
}
public XYDataset getXydataset() {
return xydataset;
}
/**
*check is graph is displayed
*/
public boolean isActive() {
return active;
}
/**
*set boolean to indicate that graph is displayed
* @param active true if graph is display
*/
public void setActive(boolean active) {
this.active = active;
}
/**
*get nearest value for the graph
* @param initial value of cursor position
*/
public void getY(double initvalue) {
resetposition();
//get by dicotomie Initial Value
int upint = xydataset.getItemCount(0)-1;
int downint = 0;
int index =0;
int mvalue=0;
double dicoValue=0;
while ((upint - downint) > 2) {
mvalue = (upint+downint) / 2;
dicoValue = xydataset.getXValue(0, (int) mvalue);
if (initvalue > dicoValue) {
downint =mvalue;
} else if (initvalue < dicoValue) {
upint = mvalue;
} else if (dicoValue == initvalue) {
upint = mvalue;
downint = mvalue;
break;
}
}
if (upint == downint) {
index=upint;
} else if ((xydataset.getXValue(0, upint) - initvalue) > (initvalue - xydataset.getXValue(0, downint))) {
index=downint;
} else {
index=upint;
}
xvalue=xydataset.getXValue(0, index);
yvalue=xydataset.getYValue(0, index);
if(index<xydataset.getItemCount(0)-1)
{
nextXvalue=xydataset.getXValue(0, index+1);
nextyvalue=xydataset.getYValue(0, index+1);
}
if(index>0)
{
prevousxValue=xydataset.getXValue(0, index-1);
prevousyValue=xydataset.getYValue(0, index-1);
}
}
public void resetposition()
{
xvalue=0;
prevousxValue=0;
nextXvalue=0;
yvalue=0;
prevousyValue=0;
nextyvalue=0;
}
/**
*get X value of cursor
*/
public double getXvalue() {
return xvalue;
}
/**
*get next X value of cursor
*/
public double getNextXvalue() {
return nextXvalue;
}
/**
*get previous X value of cursor
*/
public double getPrevousxValue() {
return prevousxValue;
}
/**
*get Y value of cursor
*/
public double getYvalue() {
return yvalue;
}
/**
*get next Y value of cursor
*/
public double getNextyvalue() {
return nextyvalue;
}
/**
*get previous Y value of cursor
*/
public double getPrevousyValue() {
return prevousyValue;
}
public String getSerieName() {
return serieName;
}
public Color getColor() {
return color;
}
public String getUnit() {
return unit;
}
public PlotList getPlts() {
return plts;
}
public void setPlts(PlotList plts) {
this.plts = plts;
}
/*public static void setRangeCPU(Range rangeCPU) {
PerformanceGraph.rangeCPU = rangeCPU;
}
public static void setRangeMEM(Range rangeMEM) {
PerformanceGraph.rangeMEM = rangeMEM;
}*/
}