package com.cfinkel.reports.charts; import org.jfree.chart.JFreeChart; import org.jfree.chart.ChartFactory; import org.jfree.chart.renderer.xy.XYBarRenderer; import org.jfree.chart.plot.PlotOrientation; import org.jfree.chart.plot.XYPlot; import org.jfree.data.xy.IntervalXYDataset; import org.jfree.data.xy.XYSeries; import org.jfree.data.xy.XYSeriesCollection; import org.apache.log4j.Logger; import java.util.List; import java.util.Map; import java.util.Iterator; import java.io.PrintWriter; import com.cfinkel.reports.exceptions.BadDataForChartException; import com.cfinkel.reports.wrappers.Output; import com.cfinkel.reports.generatedbeans.OutputElement; import javax.servlet.http.HttpSession; /** * $Author:charles $ * $Revision:10429 $ * $Date:2006-07-26 18:00:43 -0400 (Wed, 26 Jul 2006) $ * <p/> * created: * User: charles * Date: May 18, 2006 * Time: 11:51:04 AM */ public class XYChartGenerator extends ChartGenerator { private static final Logger log = Logger.getLogger(XYChartGenerator.class); /** * Creates a chart. * * * @return The file name. */ public static String generateChart(List data, Output output, HttpSession session, PrintWriter printWriter) throws BadDataForChartException { OutputElement outputElement = output.getOutputElement(); IntervalXYDataset dataset = createDataset(data); JFreeChart chart = ChartFactory.createXYBarChart( outputElement.getName(), "X", false, "Y", dataset, PlotOrientation.VERTICAL, true, true, false ); XYPlot plot = (XYPlot) chart.getPlot(); plot.setForegroundAlpha(0.85f); XYBarRenderer renderer = (XYBarRenderer) plot.getRenderer(); renderer.setDrawBarOutline(false); return writeImageMap(chart, outputElement, session, printWriter); } /** * Creates a sample dataset. * * @return A sample dataset. */ private static IntervalXYDataset createDataset(List data) throws BadDataForChartException { XYSeries series = new XYSeries("Data"); for (Object obj : data) { Map result = (Map)obj; if (result.values().size() < 2) throw new BadDataForChartException("For chart, must have at least two columns of data"); Iterator iterator = result.entrySet().iterator(); Object column1Value = ((Map.Entry)iterator.next()).getValue(); Object column2Value = ((Map.Entry)iterator.next()).getValue(); if (!(column1Value instanceof Number) || !(column2Value instanceof Number)) throw new BadDataForChartException("Data must be decimal or integer. Can't plot otherwise."); series.add((Number)column1Value, (Number)column2Value); } return new XYSeriesCollection(series); } }