package com.jsonde.gui.reports; import com.jsonde.client.dao.DaoException; import com.jsonde.client.dao.DaoFactory; import com.jsonde.gui.Main; import com.jsonde.gui.components.composite.CompositeComponentProvider; import com.jsonde.gui.components.timeChart.PannableTimeChartPanel; import com.jsonde.gui.reports.custom.ReportGenerator; import com.jsonde.util.db.DbUtils; import org.jfree.chart.ChartFactory; import org.jfree.chart.ChartPanel; import org.jfree.chart.JFreeChart; import org.jfree.chart.axis.DateAxis; import org.jfree.chart.plot.PlotOrientation; import org.jfree.chart.plot.XYPlot; import org.jfree.data.general.DefaultPieDataset; import org.jfree.data.time.Millisecond; import org.jfree.data.time.RegularTimePeriod; import org.jfree.data.time.TimeSeries; import org.jfree.data.time.TimeSeriesCollection; import javax.swing.*; import java.awt.*; import java.sql.*; import java.util.*; import java.util.Date; import java.util.List; public class ReportCompositeComponentProvider implements CompositeComponentProvider { private Report report; public ReportCompositeComponentProvider(Report report) { this.report = report; } public Icon getLargeIcon() { return new ImageIcon( getClass().getClassLoader().getResource(report.getLargeIconUrl()) ); } public Icon getSmallIcon() { return new ImageIcon( getClass().getClassLoader().getResource(report.getSmallIconUrl()) ); } public String getTitle() { return report.getTitle(); } public JComponent createCompositeComponent() { switch (report.getChartType()) { case PIE: return createPieChart(); case TIME: return createTimeChart(); case CUSTOM: return createCustomChart(); } return new JLabel("Unknown chart type"); } private JComponent createCustomChart() { String reportGeneratorClassName = report.getReportGenerator(); try { Class reportGeneratorClass = Class.forName(reportGeneratorClassName); ReportGenerator reportGenerator = (ReportGenerator) reportGeneratorClass.newInstance(); return reportGenerator.generateReport(); } catch (ClassNotFoundException e) { Main.getInstance().processException(e); return new JLabel("Failed to create report"); } catch (InstantiationException e) { Main.getInstance().processException(e); return new JLabel("Failed to create report"); } catch (IllegalAccessException e) { Main.getInstance().processException(e); return new JLabel("Failed to create report"); } } private JComponent createTimeChart() { String sql = report.getSql(); Connection connection = null; PreparedStatement preparedStatement = null; ResultSet resultSet = null; try { connection = DaoFactory.getConnection(); preparedStatement = connection.prepareStatement(sql); preparedStatement.execute(); resultSet = preparedStatement.getResultSet(); // TimeSeriesCollection dataset = new TimeSeriesCollection(); ResultSetMetaData resultSetMetaData = resultSet.getMetaData(); int columnCount = resultSetMetaData.getColumnCount(); List<TimeSeries> timeSeriesList = new ArrayList<TimeSeries>(columnCount); for (int i = 2; i <= columnCount; i++) { String columnName = resultSetMetaData.getColumnName(i); TimeSeries timeSeries = new TimeSeries(columnName); timeSeriesList.add(timeSeries); dataset.addSeries(timeSeries); } long startTime = 0; long endTime = 0; while (resultSet.next()) { long time = resultSet.getLong(1); if (0 == startTime) { startTime = time; } endTime = time; RegularTimePeriod timePeriod = new Millisecond(new java.util.Date(time)); for (int i = 0; i < timeSeriesList.size(); i++) { TimeSeries timeSeries = timeSeriesList.get(i); double value = resultSet.getDouble(i + 2); timeSeries.add(timePeriod, value); } } return new PannableTimeChartPanel(startTime, endTime, dataset); } catch (DaoException e) { Main.getInstance().processException(e); return new JLabel("Failed to create report"); } catch (SQLException e) { Main.getInstance().processException(e); return new JLabel("Failed to create report"); } finally { DbUtils.close(resultSet); DbUtils.close(preparedStatement); DbUtils.close(connection); } } private JComponent createPieChart() { String sql = report.getSql(); Connection connection = null; PreparedStatement preparedStatement = null; ResultSet resultSet = null; try { connection = DaoFactory.getConnection(); preparedStatement = connection.prepareStatement(sql); preparedStatement.execute(); resultSet = preparedStatement.getResultSet(); DefaultPieDataset dataSet = new DefaultPieDataset(); while (resultSet.next()) { dataSet.setValue(resultSet.getString(1), resultSet.getLong(2)); } JFreeChart pieChart = ChartFactory.createPieChart3D( getTitle(), dataSet, true, true, false); JScrollPane scrollPane = new JScrollPane(); scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); scrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); scrollPane.setViewportView(new ChartPanel(pieChart)); return scrollPane; } catch (DaoException e) { Main.getInstance().processException(e); return new JLabel("Failed to create report"); } catch (SQLException e) { Main.getInstance().processException(e); return new JLabel("Failed to create report"); } finally { DbUtils.close(resultSet); DbUtils.close(preparedStatement); DbUtils.close(connection); } } }