/**
* Copyright (C) 2008-2010, Squale Project - http://www.squale.org
*
* This file is part of Squale.
*
* Squale is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or any later version.
*
* Squale is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Squale. If not, see <http://www.gnu.org/licenses/>.
*/
package org.squale.squaleweb.util.graph;
import java.awt.Color;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.CategoryAxis;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.renderer.category.BarRenderer;
import org.jfree.data.category.DefaultCategoryDataset;
import org.squale.squaleweb.resources.WebMessages;
/**
*/
public class AuditsSizeMaker
extends AbstractStatsMaker
{
/**
* Constructeur par d�faut
*/
public AuditsSizeMaker()
{
mDataSet = new DefaultCategoryDataset();
}
/**
* cl� pour le titre du diagramme par d�faut
*/
private static final String DEFAULT_TITLE_KEY = "stats.size.title";
/**
* cl� pour l'axe des abscisses du diagramme par d�faut
*/
private static final String DEFAULT_XAXIS_LABEL_KEY = "stats.size.xlabel";
/**
* cl� pour l'axe des ordonn�es du diagramme par d�faut
*/
private static final String DEFAULT_YAXIS_LABEL_KEY = "stats.size.ylabel";
/**
* Constructeur avec les param�tres servant pour le graph cliquable
*
* @param pRequest la requete pour avoir des cl�s internationalis�s
*/
public AuditsSizeMaker( HttpServletRequest pRequest )
{
this( WebMessages.getString( pRequest, DEFAULT_TITLE_KEY ), WebMessages.getString( pRequest,
DEFAULT_XAXIS_LABEL_KEY ),
WebMessages.getString( pRequest, DEFAULT_YAXIS_LABEL_KEY ) );
}
/**
* Constructeur avec les diff�rents labels
*
* @param pYAxisLabel le label sur l'axe des Y
* @param pTitle le titre
* @param pXAxisLabel le label sur l'axe des X
*/
public AuditsSizeMaker( String pTitle, String pXAxisLabel, String pYAxisLabel )
{
this();
mYLabel = pYAxisLabel;
mXLabel = pXAxisLabel;
mTitle = pTitle;
}
/**
* @return le diagramme JFreeChart
*/
public JFreeChart getChart()
{
JFreeChart retChart = super.getChart();
if ( null == retChart )
{
retChart =
ChartFactory.createBarChart( mTitle, mXLabel, mYLabel, mDataSet, PlotOrientation.VERTICAL, true, false,
false );
final CategoryPlot plot = retChart.getCategoryPlot();
// Formate l'axe des X
final CategoryAxis axis = (CategoryAxis) plot.getDomainAxis();
// d�finit des unit�s enti�res pour l'axe de gauche
plot.getRangeAxis().setStandardTickUnits( NumberAxis.createIntegerTickUnits() );
// gere les couleurs du graph
BarRenderer renderer = (BarRenderer) plot.getRenderer();
// la panel au dimension par d�faut
final ChartPanel chartPanel = new ChartPanel( retChart );
chartPanel.setPreferredSize( new java.awt.Dimension( getDefaultHeight(), getDefaultWidth() ) );
retChart.setBackgroundPaint( Color.WHITE );
super.setChart( retChart );
}
return retChart;
}
/**
* Sert � savoir combien on a de series, afin de les mettre toutes � la meme couleur pour �viter des graphiques avec
* des couleurs excentriques
*/
private int nbSeries = 0;
/**
* Ajoute les valeurs d'une courbe
*
* @param pValues liste des tableaux des donn�es n�cessaires pour la construction du graphe Les tableaux sont de la
* forme : {date de l'audit, valeur max du file system, nom de l'application}
*/
public void addCurve( List pValues )
{
List list = getSortedList( pValues );
for ( int i = 0; i < list.size(); i++ )
{
Object[] combo = (Object[]) list.get( i );
String date = (String) combo[0];
Number size = (Number) combo[1];
Integer counterObject = new Integer( i );
( (DefaultCategoryDataset) mDataSet ).addValue( size, (String) combo[2], date );
}
// Met � jour la valeur du nombre de s�ries
nbSeries = list.size();
}
/**
* Effectue les pr�-traitements n�cessaires � l'affichage 1)efface les doublons en ne r�cup�rant que le maximum 2)
* tri par ordre chronologique
*
* @param pValues le tableau des valeurs
* @return la list tri� sans doublons avec la valeur maximum (sous forme d'un tableau d'objets � 2 cases, la
* premi�re la date (String) la deuxi�me la taille max du FS sur les audits de la journ�e).
*/
private List getSortedList( List pValues )
{
List result = new ArrayList( 0 );
for ( int i = 0; i < pValues.size(); i++ )
{
Object[] combo = (Object[]) pValues.get( i );
String date = (String) combo[0];
Number size = (Number) combo[1];
int j;
for ( j = 0; j < result.size(); j++ )
{
// on est sur la meme journ�e, on prend le maximum
if ( ( (String) ( (Object[]) result.get( j ) )[0] ).equals( date ) )
{
Long currentStoredSize = (Long) ( (Object[]) result.get( j ) )[1];
// Si la valeur actuellement stock�e est null, on ins�re de toute facon la nouvelle
// Si la nouvelle est null, �a ne change rien sinon on ins�re une bonne valeur
if ( currentStoredSize == null )
{
( (Object[]) result.get( j ) )[1] = size;
}
else
{ // La valeur actuelle n'est pas null, on doit g�rer l'ajout �ventuel
if ( size != null )
{ // 2 valeurs, on prend le maximum
( (Object[]) result.get( j ) )[1] =
new Long( Math.max( currentStoredSize.longValue(), size.longValue() ) );
} // sinon on garde la valeur actuellement stock�e
}
// coupe la boucle
j = result.size() + 1;
}
}
// on ne l'a pas trouv�e, nouvelle valeur on ins�re le tableau tel quel
if ( j == result.size() )
{
result.add( combo );
}
}
return result;
}
}