Java tutorial
/** * 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 dfaut */ public AuditsSizeMaker() { mDataSet = new DefaultCategoryDataset(); } /** * cl pour le titre du diagramme par dfaut */ private static final String DEFAULT_TITLE_KEY = "stats.size.title"; /** * cl pour l'axe des abscisses du diagramme par dfaut */ private static final String DEFAULT_XAXIS_LABEL_KEY = "stats.size.xlabel"; /** * cl pour l'axe des ordonnes du diagramme par dfaut */ private static final String DEFAULT_YAXIS_LABEL_KEY = "stats.size.ylabel"; /** * Constructeur avec les paramtres servant pour le graph cliquable * * @param pRequest la requete pour avoir des cls internationaliss */ 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 diffrents 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(); // dfinit des units entires 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 dfaut 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 donnes ncessaires 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 sries nbSeries = list.size(); } /** * Effectue les pr-traitements ncessaires l'affichage 1)efface les doublons en ne rcuprant 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 * premire la date (String) la deuxime la taille max du FS sur les audits de la journe). */ 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 journe, 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 stocke est null, on insre de toute facon la nouvelle // Si la nouvelle est null, a ne change rien sinon on insre une bonne valeur if (currentStoredSize == null) { ((Object[]) result.get(j))[1] = size; } else { // La valeur actuelle n'est pas null, on doit grer 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 stocke } // coupe la boucle j = result.size() + 1; } } // on ne l'a pas trouve, nouvelle valeur on insre le tableau tel quel if (j == result.size()) { result.add(combo); } } return result; } }