/**
* 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.BasicStroke;
import java.awt.Color;
import java.util.Iterator;
import java.util.Set;
import java.util.SortedMap;
import java.util.StringTokenizer;
import javax.servlet.http.HttpServletRequest;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.plot.SpiderWebPlot;
import org.jfree.chart.title.LegendTitle;
import org.jfree.chart.title.TextTitle;
import org.jfree.data.category.DefaultCategoryDataset;
import org.jfree.ui.RectangleEdge;
import org.squale.squaleweb.resources.WebMessages;
/**
* Classe responsable de la cr�ation d'un kiviat
*
* @author M400843
* @see AbstractGraphMaker {@inheritDoc}
*/
public class KiviatMaker
extends AbstractGraphMaker
{
/**
* Hauteur du diagramme par d�faut
*/
public static final int DEFAULT_HEIGHT = 300;
/**
* Hauteur du diagramme par d�faut
*/
public static final int DEFAULT_WIDTH = 600;
/**
* Valeur maximale sur les axes
*/
private static final double SCALE_MAX_VALUE = 3.0;
/**
* Remplissage des zone du radar
*/
private static final boolean FILL_RADAR = true;
/**
* Valeurs � mettre dans le diagramme
*/
private DefaultCategoryDataset mDataset = new DefaultCategoryDataset();
/**
* The default gap for the plot. it's the gap between the border of the plot and what is draw in it. It's near same
* than padding
*/
public static final double DEFAULT_GAP = 0.3;
/**
* Constructeur par d�faur
*/
public KiviatMaker()
{
}
/**
* Constructeur avec le titre du diagramme
*
* @param pTitle titre du diagramme (peut etre <code>null</code>)
*/
public KiviatMaker( String pTitle )
{
mTitle = pTitle;
}
/**
* {@inheritDoc}
*
* @see org.squale.squalecommon.util.graph.AbstractGraphMaker#getDefaultHeight()
*/
protected int getDefaultHeight()
{
return DEFAULT_HEIGHT;
}
/**
* {@inheritDoc}
*
* @see org.squale.squalecommon.util.graph.AbstractGraphMaker#getDefaultWidth()
*/
protected int getDefaultWidth()
{
return DEFAULT_WIDTH;
}
/**
* Ajoute les d'un composant. <br />
* <b>Attention : </b> pour assurer la coh�rences des donn�es, si cette m�thode est appell�e plusieurs fois, pValues
* doit avoir � chaque fois la meme taille et les m�me cl�s.
*
* @param pName nom associ� � la future courbe.
* @param pValues SortedMap contenant en cl� (tri�!) des facteurs sous forme de String et en valeur des nombres
* (Double).
* @param pRequest pour avoir le nom des facteurs internationalis�s
*/
public void addValues( String pName, SortedMap pValues, HttpServletRequest pRequest )
{
Set keys = pValues.keySet();
// Ajoute les donn�es
Iterator it = keys.iterator();
// Pour chaque axe, on cr�e l'axe avec son titre et on ajoute les valeurs
while ( it.hasNext() )
{
// Internationalisation du nom
// On a besoin d'un tokenizer pour ne pas prendre en compte la partie entre ()
String key = (String) it.next();
StringTokenizer st = new StringTokenizer( key, "(" );
String axis = WebMessages.getString( pRequest, ( "factor.internationalise.name." + st.nextToken() ).trim() );
// le facteur peut ne pas avoir de note, dans ce cas il n'y a plus de tokens
// le premier token contient tout
if ( st.hasMoreTokens() )
{
axis += "(" + st.nextToken();
}
mDataset.addValue( 1.0D, "1.0", axis );
mDataset.addValue( 2.0D, "2.0", axis );
final double thirdValue = 3.0D;
mDataset.addValue( thirdValue, "3.0", axis );
Number number = ( (Number) pValues.get( key ) );
if ( number != null && number.doubleValue() >= 0.0 )
{
mDataset.addValue( number.doubleValue(), pName, axis );
}
}
}
/**
* Create the JreeChart object. This method assume that we want display the legend
*
* @return The JreeChart object
*/
public JFreeChart getChart()
{
return getChart( true, true );
}
/**
* Create the JreeChart object
*
* @param showLegend indicate if it should display the legend or not
* @param showBackground indicate if we want showBackground
* @return The JreeChart object
*/
public JFreeChart getChart( boolean showLegend, boolean showBackground )
{
JFreeChart retChart = super.getChart();
// Creation of the graph if it not already exist
if ( null == retChart )
{
// Creation of the plot
SpiderWebPlot plot = new SpiderWebPlot( mDataset );
// Creation of the picture. The plot is inside the picture
retChart = new JFreeChart( mTitle, TextTitle.DEFAULT_FONT, plot, false );
// Display of the legend
if ( showLegend )
{
LegendTitle legendtitle = new LegendTitle( plot );
legendtitle.setPosition( RectangleEdge.BOTTOM );
retChart.addSubtitle( legendtitle );
}
// Definition of the style of the three first draw in the spiderWEbPlot.
// This three first draw represent the scale for the mark 1.0, 2.0 and 3.0 in the plot
// First we define the style
final float miterLimit = 10.0f;
final float[] dashPattern = { 5.0f, 3.0f };
BasicStroke dash = new BasicStroke( 1.0f, BasicStroke.CAP_SQUARE, // End cap
BasicStroke.JOIN_MITER, // Join style
miterLimit, // Miter limit
dashPattern, // Dash pattern
0.0f );
// We associate this style to the draw
plot.setSeriesPaint( 0, new Color( WebMessages.getInt( "kiviat.color.1" ) ) );
plot.setSeriesOutlineStroke( 0, dash );
plot.setSeriesPaint( 1, new Color( WebMessages.getInt( "kiviat.color.2" ) ) );
plot.setSeriesOutlineStroke( 1, dash );
plot.setSeriesPaint( 2, new Color( WebMessages.getInt( "kiviat.color.3" ) ) );
plot.setSeriesOutlineStroke( 2, dash );
// Define the gap what is draw and the border of the plot
plot.setInteriorGap( DEFAULT_GAP );
// Define the style of the line stroke
plot.setBaseSeriesOutlineStroke( new BasicStroke( 2.0f ) );
// The max value put in the plot (for the scale)
plot.setMaxValue( SCALE_MAX_VALUE );
// Indicate if we want fill the inner of the draw
plot.setWebFilled( FILL_RADAR );
if ( !showBackground )
{
// Set the background of the picture to white
retChart.setBackgroundPaint( Color.WHITE );
// Set the border of the plot to white
plot.setOutlinePaint( Color.WHITE );
}
super.setChart( retChart );
}
return retChart;
}
}