From 56ae5b5536cd437278fe50339f02993fcadf6980 Mon Sep 17 00:00:00 2001 From: Phil Harvey Date: Wed, 30 Jan 2013 09:15:18 +0000 Subject: QPID-4533: Modified perftests to support writing results to a database, and enhanced visualisation-jfc to allow it to read these results. Previously only CSV output/input was supported by these modules respectively. Also modified files in perftests/etc/ to allow convenient running of perftests. git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk@1440312 13f79535-47bb-0310-9956-ffa450edef68 --- .../qpid/disttest/charting/ChartingUtil.java | 57 ++++++-- .../CategoryDataSetBasedChartBuilder.java | 15 +- .../chartbuilder/StatisticalBarCharBuilder.java | 15 +- .../chartbuilder/XYDataSetBasedChartBuilder.java | 14 +- .../seriesbuilder/JdbcCsvSeriesBuilder.java | 141 ------------------- .../charting/seriesbuilder/JdbcSeriesBuilder.java | 151 +++++++++++++++++++++ .../charting/seriesbuilder/SeriesBuilder.java | 7 + .../seriesbuilder/SeriesBuilderCallback.java | 5 +- .../disttest/charting/seriesbuilder/SeriesRow.java | 92 +++++++++++++ .../qpid/disttest/charting/writer/ChartWriter.java | 1 + .../charting/chartbuilder/ChartProductionTest.java | 21 +-- .../seriesbuilder/JdbcCsvSeriesBuilderTest.java | 96 ------------- .../seriesbuilder/JdbcSeriesBuilderTest.java | 107 +++++++++++++++ .../charting/seriesbuilder/SeriesRowTest.java | 64 +++++++++ 14 files changed, 511 insertions(+), 275 deletions(-) delete mode 100644 qpid/java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/seriesbuilder/JdbcCsvSeriesBuilder.java create mode 100644 qpid/java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/seriesbuilder/JdbcSeriesBuilder.java create mode 100644 qpid/java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/seriesbuilder/SeriesRow.java delete mode 100644 qpid/java/perftests/visualisation-jfc/src/test/java/org/apache/qpid/disttest/charting/seriesbuilder/JdbcCsvSeriesBuilderTest.java create mode 100644 qpid/java/perftests/visualisation-jfc/src/test/java/org/apache/qpid/disttest/charting/seriesbuilder/JdbcSeriesBuilderTest.java create mode 100644 qpid/java/perftests/visualisation-jfc/src/test/java/org/apache/qpid/disttest/charting/seriesbuilder/SeriesRowTest.java (limited to 'qpid/java/perftests/visualisation-jfc/src') diff --git a/qpid/java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/ChartingUtil.java b/qpid/java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/ChartingUtil.java index a329f33b00..e1403be397 100644 --- a/qpid/java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/ChartingUtil.java +++ b/qpid/java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/ChartingUtil.java @@ -30,7 +30,7 @@ import org.apache.qpid.disttest.charting.chartbuilder.ChartBuilder; import org.apache.qpid.disttest.charting.chartbuilder.ChartBuilderFactory; import org.apache.qpid.disttest.charting.definition.ChartingDefinition; import org.apache.qpid.disttest.charting.definition.ChartingDefinitionCreator; -import org.apache.qpid.disttest.charting.seriesbuilder.JdbcCsvSeriesBuilder; +import org.apache.qpid.disttest.charting.seriesbuilder.JdbcSeriesBuilder; import org.apache.qpid.disttest.charting.seriesbuilder.SeriesBuilder; import org.apache.qpid.disttest.charting.writer.ChartWriter; import org.jfree.chart.JFreeChart; @@ -44,28 +44,46 @@ import org.slf4j.LoggerFactory; * The following arguments are understood: *

*
    - *
  1. chart-defs=directory contain chartdef file(s)
  2. - *
  3. output-dir=directory in which to produce the PNGs
  4. + *
  5. {@link #OUTPUT_DIR_PROP}
  6. + *
  7. {@link #CHART_DEFINITIONS_PROP}
  8. + *
  9. {@link #SUMMARY_TITLE_PROP}
  10. + *
  11. {@link #JDBC_DRIVER_NAME_PROP}
  12. + *
  13. {@link #JDBC_URL_PROP}
  14. *
+ * Default values are indicated by the similarly named constants in this class. */ public class ChartingUtil { private static final Logger LOGGER = LoggerFactory.getLogger(ChartingUtil.class); + /** directory in which to produce the PNGs */ public static final String OUTPUT_DIR_PROP = "outputdir"; public static final String OUTPUT_DIR_DEFAULT = "."; + /** the path to the directory containing the chart definition files */ public static final String CHART_DEFINITIONS_PROP = "chart-defs"; public static final String CHART_DEFINITIONS_DEFAULT = "."; public static final String SUMMARY_TITLE_PROP = "summary-title"; public static final String SUMMARY_TITLE_DEFAULT = "Performance Charts"; + /** the class name of the JDBC driver to use for reading the chart data */ + public static final String JDBC_DRIVER_NAME_PROP = "jdbcDriverClass"; + public static final String JDBC_DRIVER_NAME_DEFAULT = JdbcSeriesBuilder.DEFAULT_JDBC_DRIVER_NAME; + + /** the JDBC URL of the data to be charted */ + public static final String JDBC_URL_PROP = "jdbcUrl"; + public static final String JDBC_URL_DEFAULT = JdbcSeriesBuilder.DEFAULT_JDBC_URL; + + private Map _cliOptions = new HashMap(); + { _cliOptions.put(OUTPUT_DIR_PROP, OUTPUT_DIR_DEFAULT); _cliOptions.put(CHART_DEFINITIONS_PROP, CHART_DEFINITIONS_DEFAULT); _cliOptions.put(SUMMARY_TITLE_PROP, SUMMARY_TITLE_DEFAULT); + _cliOptions.put(JDBC_DRIVER_NAME_PROP, JDBC_DRIVER_NAME_DEFAULT); + _cliOptions.put(JDBC_URL_PROP, JDBC_URL_DEFAULT); } public static void main(String[] args) throws Exception @@ -86,21 +104,20 @@ public class ChartingUtil private void produceAllCharts() { - final String chartingDefsDir = _cliOptions.get(CHART_DEFINITIONS_PROP); - final File chartDirectory = new File(_cliOptions.get(OUTPUT_DIR_PROP)); - LOGGER.info("Chart chartdef directory/file: {} output directory : {}", chartingDefsDir, chartDirectory); - - List definitions = loadChartDefinitions(chartingDefsDir); - - LOGGER.info("There are {} chart(s) to produce", definitions.size()); final ChartWriter writer = new ChartWriter(); - writer.setOutputDirectory(chartDirectory); + writer.setOutputDirectory(new File(_cliOptions.get(OUTPUT_DIR_PROP))); + + SeriesBuilder seriesBuilder = new JdbcSeriesBuilder( + _cliOptions.get(JDBC_DRIVER_NAME_PROP), + _cliOptions.get(JDBC_URL_PROP)); - final SeriesBuilder seriesBuilder = new JdbcCsvSeriesBuilder(); - for (ChartingDefinition chartingDefinition : definitions) + for (ChartingDefinition chartingDefinition : loadChartDefinitions()) { - ChartBuilder chartBuilder = ChartBuilderFactory.createChartBuilder(chartingDefinition.getChartType(), seriesBuilder); + ChartBuilder chartBuilder = ChartBuilderFactory.createChartBuilder( + chartingDefinition.getChartType(), + seriesBuilder); + JFreeChart chart = chartBuilder.buildChart(chartingDefinition); writer.writeChartToFileSystem(chart, chartingDefinition); } @@ -109,6 +126,18 @@ public class ChartingUtil writer.writeHtmlSummaryToFileSystem(summaryChartTitle); } + private List loadChartDefinitions() + { + final String chartingDefsDir = _cliOptions.get(CHART_DEFINITIONS_PROP); + + LOGGER.info("Chart chartdef directory/file: {}", chartingDefsDir); + + List definitions = loadChartDefinitions(chartingDefsDir); + + LOGGER.info("There are {} chart(s) to produce", definitions.size()); + return definitions; + } + private List loadChartDefinitions(String chartingDefsDir) { ChartingDefinitionCreator chartingDefinitionLoader = new ChartingDefinitionCreator(); diff --git a/qpid/java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/chartbuilder/CategoryDataSetBasedChartBuilder.java b/qpid/java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/chartbuilder/CategoryDataSetBasedChartBuilder.java index ba027d9d93..ffa85d5c50 100644 --- a/qpid/java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/chartbuilder/CategoryDataSetBasedChartBuilder.java +++ b/qpid/java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/chartbuilder/CategoryDataSetBasedChartBuilder.java @@ -27,6 +27,7 @@ import org.apache.qpid.disttest.charting.definition.ChartingDefinition; import org.apache.qpid.disttest.charting.definition.SeriesDefinition; import org.apache.qpid.disttest.charting.seriesbuilder.SeriesBuilderCallback; import org.apache.qpid.disttest.charting.seriesbuilder.SeriesBuilder; +import org.apache.qpid.disttest.charting.seriesbuilder.SeriesRow; import org.jfree.chart.JFreeChart; import org.jfree.chart.axis.CategoryLabelPositions; import org.jfree.data.category.DefaultCategoryDataset; @@ -52,11 +53,11 @@ public abstract class CategoryDataSetBasedChartBuilder extends BaseChartBuilder _seriesBuilder.setSeriesBuilderCallback(new SeriesBuilderCallback() { @Override - public void addDataPointToSeries(SeriesDefinition seriesDefinition, Object[] row) + public void addDataPointToSeries(SeriesDefinition seriesDefinition, SeriesRow row) { - String x = String.valueOf(row[0]); - double y = Double.parseDouble(row[1].toString()); - dataset.addValue( y, seriesDefinition.getSeriesLegend(), x); + String x = row.dimensionAsString(0); + double y = row.dimensionAsDouble(1); + dataset.addValue(y, seriesDefinition.getSeriesLegend(), x); } @Override @@ -71,6 +72,12 @@ public abstract class CategoryDataSetBasedChartBuilder extends BaseChartBuilder // unused } + @Override + public int getNumberOfDimensions() + { + return 2; + } + }); _seriesBuilder.build(chartingDefinition.getSeries()); diff --git a/qpid/java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/chartbuilder/StatisticalBarCharBuilder.java b/qpid/java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/chartbuilder/StatisticalBarCharBuilder.java index 1669ee1bb2..61acc8cfdf 100644 --- a/qpid/java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/chartbuilder/StatisticalBarCharBuilder.java +++ b/qpid/java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/chartbuilder/StatisticalBarCharBuilder.java @@ -28,6 +28,7 @@ import org.apache.qpid.disttest.charting.definition.ChartingDefinition; import org.apache.qpid.disttest.charting.definition.SeriesDefinition; import org.apache.qpid.disttest.charting.seriesbuilder.SeriesBuilder; import org.apache.qpid.disttest.charting.seriesbuilder.SeriesBuilderCallback; +import org.apache.qpid.disttest.charting.seriesbuilder.SeriesRow; import org.jfree.chart.JFreeChart; import org.jfree.chart.axis.CategoryAxis; import org.jfree.chart.axis.CategoryLabelPositions; @@ -62,11 +63,11 @@ public class StatisticalBarCharBuilder extends BaseChartBuilder _seriesBuilder.setSeriesBuilderCallback(new SeriesBuilderCallback() { @Override - public void addDataPointToSeries(SeriesDefinition seriesDefinition, Object[] row) + public void addDataPointToSeries(SeriesDefinition seriesDefinition, SeriesRow row) { - String x = String.valueOf(row[0]); - double mean = Double.parseDouble(row[1].toString()); - double stdDev = Double.parseDouble(row[2].toString()); + String x = row.dimensionAsString(0); + double mean = row.dimensionAsDouble(1); + double stdDev = row.dimensionAsDouble(2); dataset.add(mean, stdDev, seriesDefinition.getSeriesLegend(), x); } @@ -82,6 +83,12 @@ public class StatisticalBarCharBuilder extends BaseChartBuilder // unused } + @Override + public int getNumberOfDimensions() + { + return 3; + } + }); _seriesBuilder.build(chartingDefinition.getSeries()); diff --git a/qpid/java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/chartbuilder/XYDataSetBasedChartBuilder.java b/qpid/java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/chartbuilder/XYDataSetBasedChartBuilder.java index 168794be50..46b6ac6fab 100644 --- a/qpid/java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/chartbuilder/XYDataSetBasedChartBuilder.java +++ b/qpid/java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/chartbuilder/XYDataSetBasedChartBuilder.java @@ -29,6 +29,7 @@ import org.apache.qpid.disttest.charting.definition.ChartingDefinition; import org.apache.qpid.disttest.charting.definition.SeriesDefinition; import org.apache.qpid.disttest.charting.seriesbuilder.SeriesBuilderCallback; import org.apache.qpid.disttest.charting.seriesbuilder.SeriesBuilder; +import org.apache.qpid.disttest.charting.seriesbuilder.SeriesRow; import org.jfree.chart.JFreeChart; import org.jfree.data.xy.DefaultXYDataset; @@ -61,11 +62,10 @@ public abstract class XYDataSetBasedChartBuilder extends BaseChartBuilder } @Override - public void addDataPointToSeries(SeriesDefinition seriesDefinition, - Object[] row) + public void addDataPointToSeries(SeriesDefinition seriesDefinition, SeriesRow row) { - double x = Double.parseDouble(row[0].toString()); - double y = Double.parseDouble(row[1].toString()); + double x = row.dimensionAsDouble(0); + double y = row.dimensionAsDouble(1); _xyPairs.add(new Double[] {x, y}); } @@ -77,6 +77,12 @@ public abstract class XYDataSetBasedChartBuilder extends BaseChartBuilder dataset.addSeries(seriesDefinition.getSeriesLegend(), seriesData); } + @Override + public int getNumberOfDimensions() + { + return 2; + } + private double[][] listToSeriesDataArray() { double[][] seriesData = new double[2][_xyPairs.size()]; diff --git a/qpid/java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/seriesbuilder/JdbcCsvSeriesBuilder.java b/qpid/java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/seriesbuilder/JdbcCsvSeriesBuilder.java deleted file mode 100644 index a9adce0afc..0000000000 --- a/qpid/java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/seriesbuilder/JdbcCsvSeriesBuilder.java +++ /dev/null @@ -1,141 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - * - */ -package org.apache.qpid.disttest.charting.seriesbuilder; - -import java.io.File; -import java.sql.Connection; -import java.sql.DriverManager; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.sql.Statement; -import java.util.Iterator; -import java.util.List; - -import org.apache.qpid.disttest.charting.ChartingException; -import org.apache.qpid.disttest.charting.definition.SeriesDefinition; - -public class JdbcCsvSeriesBuilder implements SeriesBuilder -{ - - static - { - registerCsvDriver(); - } - - private SeriesBuilderCallback _callback; - - @Override - public void setSeriesBuilderCallback(SeriesBuilderCallback callback) - { - this._callback = callback; - } - - @Override - public void build(List seriesDefinitions) - { - for (Iterator iterator = seriesDefinitions.iterator(); iterator.hasNext();) - { - SeriesDefinition series = iterator.next(); - buildDataSetForSingleSeries(series); - } - } - - private void buildDataSetForSingleSeries(SeriesDefinition seriesDefinition) - { - Connection conn = null; - Statement stmt = null; - try - { - File seriesDir = getValidatedSeriesDirectory(seriesDefinition); - - conn = DriverManager.getConnection("jdbc:relique:csv:" + seriesDir.getAbsolutePath()); - - final String seriesStatement = seriesDefinition.getSeriesStatement(); - - stmt = conn.createStatement(); - ResultSet results = stmt.executeQuery(seriesStatement); - int columnCount = results.getMetaData().getColumnCount(); - _callback.beginSeries(seriesDefinition); - while (results.next()) - { - Object[] row = new Object[columnCount]; - for (int i = 0; i < row.length; i++) - { - row[i] = results.getObject(i+1); - } - - _callback.addDataPointToSeries(seriesDefinition, row); - } - _callback.endSeries(seriesDefinition); - } - catch (SQLException e) - { - throw new ChartingException("Failed to create chart dataset", e); - } - finally - { - if (stmt != null) - { - try - { - stmt.close(); - } - catch (SQLException e) - { - throw new RuntimeException("Failed to close statement", e); - } - } - if (conn != null) - { - try - { - conn.close(); - } - catch (SQLException e) - { - throw new RuntimeException("Failed to close connection", e); - } - } - } - } - - private File getValidatedSeriesDirectory(SeriesDefinition series) - { - File seriesDir = new File(series.getSeriesDirectory()); - if (!seriesDir.isDirectory()) - { - throw new ChartingException("seriesDirectory must be a directory : " + seriesDir); - } - return seriesDir; - } - - private static void registerCsvDriver() throws ExceptionInInitializerError - { - try - { - Class.forName("org.relique.jdbc.csv.CsvDriver"); - } - catch (ClassNotFoundException e) - { - throw new RuntimeException("Could not load CSV/JDBC driver", e); - } - } - -} diff --git a/qpid/java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/seriesbuilder/JdbcSeriesBuilder.java b/qpid/java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/seriesbuilder/JdbcSeriesBuilder.java new file mode 100644 index 0000000000..2cd8d9951f --- /dev/null +++ b/qpid/java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/seriesbuilder/JdbcSeriesBuilder.java @@ -0,0 +1,151 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * + */ +package org.apache.qpid.disttest.charting.seriesbuilder; + +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Statement; +import java.util.Iterator; +import java.util.List; + +import org.apache.commons.lang.builder.ToStringBuilder; +import org.apache.commons.lang.builder.ToStringStyle; +import org.apache.qpid.disttest.charting.ChartingException; +import org.apache.qpid.disttest.charting.definition.SeriesDefinition; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * A {@link SeriesBuilder} that uses JDBC to read series data + */ +public class JdbcSeriesBuilder implements SeriesBuilder +{ + private static final Logger LOGGER = LoggerFactory.getLogger(JdbcSeriesBuilder.class); + + public static final String DEFAULT_JDBC_DRIVER_NAME = "org.relique.jdbc.csv.CsvDriver"; + + /** the dot at the end denotes the current directory */ + public static final String DEFAULT_JDBC_URL = "jdbc:relique:csv:."; + + private final String _jdbcUrl; + private SeriesBuilderCallback _callback; + + public JdbcSeriesBuilder(String jdbcDriverClass, String jdbcUrl) + { + registerDriver(jdbcDriverClass); + _jdbcUrl = jdbcUrl; + LOGGER.info("Created: " + this); + } + + @Override + public void setSeriesBuilderCallback(SeriesBuilderCallback callback) + { + this._callback = callback; + } + + @Override + public void build(List seriesDefinitions) + { + for (Iterator iterator = seriesDefinitions.iterator(); iterator.hasNext();) + { + SeriesDefinition series = iterator.next(); + buildDataSetForSingleSeries(series); + } + } + + private void buildDataSetForSingleSeries(SeriesDefinition seriesDefinition) + { + Connection conn = null; + Statement stmt = null; + try + { + conn = DriverManager.getConnection(_jdbcUrl); + + final String seriesStatement = seriesDefinition.getSeriesStatement(); + + stmt = conn.createStatement(); + ResultSet results = stmt.executeQuery(seriesStatement); + int columnCount = results.getMetaData().getColumnCount(); + _callback.beginSeries(seriesDefinition); + while (results.next()) + { + Object[] row = new Object[columnCount]; + for (int i = 0; i < row.length; i++) + { + row[i] = results.getObject(i+1); + } + + SeriesRow seriesRow = SeriesRow.createValidSeriesRow(_callback.getNumberOfDimensions(), row); + _callback.addDataPointToSeries(seriesDefinition, seriesRow); + } + _callback.endSeries(seriesDefinition); + } + catch (SQLException e) + { + throw new ChartingException("Failed to create chart dataset", e); + } + finally + { + if (stmt != null) + { + try + { + stmt.close(); + } + catch (SQLException e) + { + throw new RuntimeException("Failed to close statement", e); + } + } + if (conn != null) + { + try + { + conn.close(); + } + catch (SQLException e) + { + throw new RuntimeException("Failed to close connection", e); + } + } + } + } + + private void registerDriver(String driverClassName) throws ExceptionInInitializerError + { + try + { + Class.forName(driverClassName); + LOGGER.info("Loaded JDBC driver class " + driverClassName); + } + catch (ClassNotFoundException e) + { + throw new RuntimeException("Could not load JDBC driver " + driverClassName, e); + } + } + + @Override + public String toString() + { + return new ToStringBuilder(this, ToStringStyle.SHORT_PREFIX_STYLE).append("jdbcUrl", _jdbcUrl).toString(); + } +} diff --git a/qpid/java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/seriesbuilder/SeriesBuilder.java b/qpid/java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/seriesbuilder/SeriesBuilder.java index 86e471efaf..0dfba304a9 100644 --- a/qpid/java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/seriesbuilder/SeriesBuilder.java +++ b/qpid/java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/seriesbuilder/SeriesBuilder.java @@ -25,8 +25,15 @@ import org.apache.qpid.disttest.charting.definition.SeriesDefinition; public interface SeriesBuilder { + /** + * Uses the supplied {@link SeriesDefinition}s to read the series data + * and pass it to the callback set up in {@link #setSeriesBuilderCallback(SeriesBuilderCallback)}. + */ void build(List seriesDefinitions); + /** + * Stores the supplied callback so it can be used in {@link #build(List)}. + */ void setSeriesBuilderCallback(SeriesBuilderCallback seriesBuilderCallback); } \ No newline at end of file diff --git a/qpid/java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/seriesbuilder/SeriesBuilderCallback.java b/qpid/java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/seriesbuilder/SeriesBuilderCallback.java index 7e23953fdb..c9c35d26b4 100644 --- a/qpid/java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/seriesbuilder/SeriesBuilderCallback.java +++ b/qpid/java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/seriesbuilder/SeriesBuilderCallback.java @@ -24,7 +24,8 @@ import org.apache.qpid.disttest.charting.definition.SeriesDefinition; public interface SeriesBuilderCallback { public void beginSeries(SeriesDefinition seriesDefinition); - public void addDataPointToSeries(SeriesDefinition seriesDefinition, Object[] row); - public void endSeries(SeriesDefinition seriesDefinition); + public int getNumberOfDimensions(); + public void addDataPointToSeries(SeriesDefinition seriesDefinition, SeriesRow row); + public void endSeries(SeriesDefinition seriesDefinition); } diff --git a/qpid/java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/seriesbuilder/SeriesRow.java b/qpid/java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/seriesbuilder/SeriesRow.java new file mode 100644 index 0000000000..6c87b88c45 --- /dev/null +++ b/qpid/java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/seriesbuilder/SeriesRow.java @@ -0,0 +1,92 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.qpid.disttest.charting.seriesbuilder; + +import java.util.Arrays; + +import org.apache.commons.lang.builder.EqualsBuilder; +import org.apache.commons.lang.builder.HashCodeBuilder; + +/** + * A data point in a chart. Thinly wraps an array to provide a convenient place to validate the number of dimensions, + * and to access dimensions in a typesafe manner. + */ +public class SeriesRow +{ + private final Object[] _dimensions; + + public static SeriesRow createValidSeriesRow(int expectedNumberOfDimensions, Object[] dimensions) + { + int actualNumberOfDimensions = dimensions.length; + if(expectedNumberOfDimensions != actualNumberOfDimensions) + { + throw new IllegalArgumentException("Expected " + expectedNumberOfDimensions + + " dimensions but found " + actualNumberOfDimensions + + " in: " + Arrays.asList(dimensions)); + } + return new SeriesRow(dimensions); + } + + public SeriesRow(Object... dimensions) + { + _dimensions = dimensions; + } + + public Object dimension(int dimension) + { + return _dimensions[dimension]; + } + + public String dimensionAsString(int dimension) + { + return String.valueOf(dimension(dimension)); + } + + public double dimensionAsDouble(int dimension) + { + return Double.parseDouble(dimensionAsString(dimension)); + } + + @Override + public int hashCode() + { + return new HashCodeBuilder().append(_dimensions).toHashCode(); + } + + @Override + public boolean equals(Object obj) + { + if (obj == null) + { + return false; + } + if (obj == this) + { + return true; + } + if (obj.getClass() != getClass()) + { + return false; + } + SeriesRow rhs = (SeriesRow) obj; + return new EqualsBuilder().append(_dimensions, rhs._dimensions).isEquals(); + } + + +} \ No newline at end of file diff --git a/qpid/java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/writer/ChartWriter.java b/qpid/java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/writer/ChartWriter.java index 888d7dc3d7..341f01ccd1 100644 --- a/qpid/java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/writer/ChartWriter.java +++ b/qpid/java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/writer/ChartWriter.java @@ -153,5 +153,6 @@ public class ChartWriter public void setOutputDirectory(final File chartDirectory) { _chartDirectory = chartDirectory; + LOGGER.info("Set chart directory: {}", chartDirectory); } } diff --git a/qpid/java/perftests/visualisation-jfc/src/test/java/org/apache/qpid/disttest/charting/chartbuilder/ChartProductionTest.java b/qpid/java/perftests/visualisation-jfc/src/test/java/org/apache/qpid/disttest/charting/chartbuilder/ChartProductionTest.java index 96ec917932..fe9cb2aefe 100644 --- a/qpid/java/perftests/visualisation-jfc/src/test/java/org/apache/qpid/disttest/charting/chartbuilder/ChartProductionTest.java +++ b/qpid/java/perftests/visualisation-jfc/src/test/java/org/apache/qpid/disttest/charting/chartbuilder/ChartProductionTest.java @@ -31,6 +31,7 @@ import org.apache.qpid.disttest.charting.definition.ChartingDefinition; import org.apache.qpid.disttest.charting.definition.SeriesDefinition; import org.apache.qpid.disttest.charting.seriesbuilder.SeriesBuilderCallback; import org.apache.qpid.disttest.charting.seriesbuilder.SeriesBuilder; +import org.apache.qpid.disttest.charting.seriesbuilder.SeriesRow; import org.apache.qpid.disttest.charting.writer.ChartWriter; import org.apache.qpid.test.utils.TestFileUtils; import org.jfree.chart.JFreeChart; @@ -143,11 +144,11 @@ public class ChartProductionTest extends TestCase { SeriesDefinition seriesDefinition = iterator.next(); _dataPointCallback.beginSeries(seriesDefinition); - _dataPointCallback.addDataPointToSeries(seriesDefinition, new Object[]{1d, 1d, 0.5d}); - _dataPointCallback.addDataPointToSeries(seriesDefinition, new Object[]{2d, 2d, 0.4d}); - _dataPointCallback.addDataPointToSeries(seriesDefinition, new Object[]{4d, 4d, 0.3d}); - _dataPointCallback.addDataPointToSeries(seriesDefinition, new Object[]{5d, 5d, 0.2d}); - _dataPointCallback.addDataPointToSeries(seriesDefinition, new Object[]{6d, 3d, 0.1d}); + _dataPointCallback.addDataPointToSeries(seriesDefinition, new SeriesRow(1d, 1d, 0.5d)); + _dataPointCallback.addDataPointToSeries(seriesDefinition, new SeriesRow(2d, 2d, 0.4d)); + _dataPointCallback.addDataPointToSeries(seriesDefinition, new SeriesRow(4d, 4d, 0.3d)); + _dataPointCallback.addDataPointToSeries(seriesDefinition, new SeriesRow(5d, 5d, 0.2d)); + _dataPointCallback.addDataPointToSeries(seriesDefinition, new SeriesRow(6d, 3d, 0.1d)); _dataPointCallback.endSeries(seriesDefinition); } } @@ -192,11 +193,11 @@ public class ChartProductionTest extends TestCase { SeriesDefinition seriesDefinition = iterator.next(); _dataPointCallback.beginSeries(seriesDefinition); - _dataPointCallback.addDataPointToSeries(seriesDefinition, new Object[]{1d, 1d}); - _dataPointCallback.addDataPointToSeries(seriesDefinition, new Object[]{2d, 2d}); - _dataPointCallback.addDataPointToSeries(seriesDefinition, new Object[]{4d, 4d}); - _dataPointCallback.addDataPointToSeries(seriesDefinition, new Object[]{5d, 5d}); - _dataPointCallback.addDataPointToSeries(seriesDefinition, new Object[]{6d, 3d}); + _dataPointCallback.addDataPointToSeries(seriesDefinition, new SeriesRow(1d, 1d)); + _dataPointCallback.addDataPointToSeries(seriesDefinition, new SeriesRow(2d, 2d)); + _dataPointCallback.addDataPointToSeries(seriesDefinition, new SeriesRow(4d, 4d)); + _dataPointCallback.addDataPointToSeries(seriesDefinition, new SeriesRow(5d, 5d)); + _dataPointCallback.addDataPointToSeries(seriesDefinition, new SeriesRow(6d, 3d)); _dataPointCallback.endSeries(seriesDefinition); } } diff --git a/qpid/java/perftests/visualisation-jfc/src/test/java/org/apache/qpid/disttest/charting/seriesbuilder/JdbcCsvSeriesBuilderTest.java b/qpid/java/perftests/visualisation-jfc/src/test/java/org/apache/qpid/disttest/charting/seriesbuilder/JdbcCsvSeriesBuilderTest.java deleted file mode 100644 index dfe35ee199..0000000000 --- a/qpid/java/perftests/visualisation-jfc/src/test/java/org/apache/qpid/disttest/charting/seriesbuilder/JdbcCsvSeriesBuilderTest.java +++ /dev/null @@ -1,96 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - * - */ -package org.apache.qpid.disttest.charting.seriesbuilder; - -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.verify; - -import java.io.BufferedWriter; -import java.io.File; -import java.io.FileWriter; -import java.io.PrintWriter; -import java.util.Collections; - -import junit.framework.TestCase; - -import org.apache.qpid.disttest.charting.definition.SeriesDefinition; -import org.apache.qpid.disttest.charting.seriesbuilder.JdbcCsvSeriesBuilder; - -public class JdbcCsvSeriesBuilderTest extends TestCase -{ - private static final String TEST_SERIES_1_SELECT_STATEMENT = "SELECT A, B FROM test"; - private static final String TEST_SERIES_1_LEGEND = "SERIES_1_LEGEND"; - private static final String TEST_SERIES1_COLOUR_NAME = "blue"; - private static final Integer TEST_SERIES1_STROKE_WIDTH = 3; - - private SeriesBuilderCallback _seriesWalkerCallback = mock(SeriesBuilderCallback.class); - private JdbcCsvSeriesBuilder _seriesBuilder = new JdbcCsvSeriesBuilder(); - - private File _testTempDir; - - @Override - protected void setUp() throws Exception - { - super.setUp(); - _seriesBuilder.setSeriesBuilderCallback(_seriesWalkerCallback); - _testTempDir = createTestTemporaryDirectory(); - } - - public void testBuildOneSeries() throws Exception - { - createTestCsvIn(_testTempDir); - SeriesDefinition seriesDefinition = createTestSeriesDefinition(); - - _seriesBuilder.build(Collections.singletonList(seriesDefinition)); - - verify(_seriesWalkerCallback).beginSeries(seriesDefinition); - verify(_seriesWalkerCallback).addDataPointToSeries(seriesDefinition, new Object[]{"elephant", "2"}); - verify(_seriesWalkerCallback).addDataPointToSeries(seriesDefinition, new Object[]{"lion", "3"}); - verify(_seriesWalkerCallback).addDataPointToSeries(seriesDefinition, new Object[]{"tiger", "4"}); - verify(_seriesWalkerCallback).endSeries(seriesDefinition); - } - - private void createTestCsvIn(File testDir) throws Exception - { - File csv = new File(_testTempDir, "test.csv"); - - PrintWriter csvWriter = new PrintWriter(new BufferedWriter(new FileWriter(csv))); - csvWriter.println("A,B"); - csvWriter.println("elephant,2"); - csvWriter.println("lion,3"); - csvWriter.println("tiger,4"); - csvWriter.close(); - } - - private SeriesDefinition createTestSeriesDefinition() - { - SeriesDefinition definition = new SeriesDefinition(TEST_SERIES_1_SELECT_STATEMENT, TEST_SERIES_1_LEGEND, _testTempDir.getAbsolutePath(), TEST_SERIES1_COLOUR_NAME, TEST_SERIES1_STROKE_WIDTH); - return definition; - } - - private File createTestTemporaryDirectory() throws Exception - { - File tmpDir = new File(System.getProperty("java.io.tmpdir"), "testdef" + System.nanoTime()); - tmpDir.mkdirs(); - tmpDir.deleteOnExit(); - return tmpDir; - } - -} diff --git a/qpid/java/perftests/visualisation-jfc/src/test/java/org/apache/qpid/disttest/charting/seriesbuilder/JdbcSeriesBuilderTest.java b/qpid/java/perftests/visualisation-jfc/src/test/java/org/apache/qpid/disttest/charting/seriesbuilder/JdbcSeriesBuilderTest.java new file mode 100644 index 0000000000..bd66e8e888 --- /dev/null +++ b/qpid/java/perftests/visualisation-jfc/src/test/java/org/apache/qpid/disttest/charting/seriesbuilder/JdbcSeriesBuilderTest.java @@ -0,0 +1,107 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * + */ +package org.apache.qpid.disttest.charting.seriesbuilder; + +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import java.io.BufferedWriter; +import java.io.File; +import java.io.FileWriter; +import java.io.PrintWriter; +import java.util.Collections; + +import junit.framework.TestCase; + +import org.apache.qpid.disttest.charting.definition.SeriesDefinition; +import org.apache.qpid.disttest.charting.seriesbuilder.JdbcSeriesBuilder; + +public class JdbcSeriesBuilderTest extends TestCase +{ + private static final String TEST_SERIES_1_SELECT_STATEMENT = "SELECT A, B FROM test"; + private static final String TEST_SERIES_1_LEGEND = "SERIES_1_LEGEND"; + private static final String TEST_SERIES1_COLOUR_NAME = "blue"; + private static final Integer TEST_SERIES1_STROKE_WIDTH = 3; + + private SeriesBuilderCallback _seriesWalkerCallback = mock(SeriesBuilderCallback.class); + + private File _testTempDir; + + @Override + protected void setUp() throws Exception + { + super.setUp(); + when(_seriesWalkerCallback.getNumberOfDimensions()).thenReturn(2); + _testTempDir = createTestTemporaryDirectory(); + createTestCsvIn(_testTempDir); + } + + public void testBuildOneSeries() throws Exception + { + SeriesDefinition seriesDefinition = createTestSeriesDefinition(); + + JdbcSeriesBuilder seriesBuilder = new JdbcSeriesBuilder( + "org.relique.jdbc.csv.CsvDriver", + "jdbc:relique:csv:" + _testTempDir.getAbsolutePath()); + + seriesBuilder.setSeriesBuilderCallback(_seriesWalkerCallback); + + seriesBuilder.build(Collections.singletonList(seriesDefinition)); + + verify(_seriesWalkerCallback).beginSeries(seriesDefinition); + verify(_seriesWalkerCallback).addDataPointToSeries(seriesDefinition, new SeriesRow("elephant", "2")); + verify(_seriesWalkerCallback).addDataPointToSeries(seriesDefinition, new SeriesRow("lion", "3")); + verify(_seriesWalkerCallback).addDataPointToSeries(seriesDefinition, new SeriesRow("tiger", "4")); + verify(_seriesWalkerCallback).endSeries(seriesDefinition); + } + + private void createTestCsvIn(File testDir) throws Exception + { + File csv = new File(_testTempDir, "test.csv"); + + PrintWriter csvWriter = new PrintWriter(new BufferedWriter(new FileWriter(csv))); + csvWriter.println("A,B"); + csvWriter.println("elephant,2"); + csvWriter.println("lion,3"); + csvWriter.println("tiger,4"); + csvWriter.close(); + } + + private SeriesDefinition createTestSeriesDefinition() + { + SeriesDefinition definition = new SeriesDefinition( + TEST_SERIES_1_SELECT_STATEMENT, + TEST_SERIES_1_LEGEND, + _testTempDir.getAbsolutePath(), + TEST_SERIES1_COLOUR_NAME, + TEST_SERIES1_STROKE_WIDTH); + return definition; + } + + private File createTestTemporaryDirectory() throws Exception + { + File tmpDir = new File(System.getProperty("java.io.tmpdir"), "testdef" + System.nanoTime()); + tmpDir.mkdirs(); + tmpDir.deleteOnExit(); + return tmpDir; + } + +} diff --git a/qpid/java/perftests/visualisation-jfc/src/test/java/org/apache/qpid/disttest/charting/seriesbuilder/SeriesRowTest.java b/qpid/java/perftests/visualisation-jfc/src/test/java/org/apache/qpid/disttest/charting/seriesbuilder/SeriesRowTest.java new file mode 100644 index 0000000000..645d443f13 --- /dev/null +++ b/qpid/java/perftests/visualisation-jfc/src/test/java/org/apache/qpid/disttest/charting/seriesbuilder/SeriesRowTest.java @@ -0,0 +1,64 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.qpid.disttest.charting.seriesbuilder; + +import junit.framework.TestCase; + +public class SeriesRowTest extends TestCase +{ + private static final Integer[] PAIR = new Integer[] {10, 11}; + + public void testValidSeriesRow() + { + assertEquals(11, SeriesRow.createValidSeriesRow(2, PAIR).dimension(1)); + } + + public void testValidSeriesRowThrowsExceptionIfArrayTooSmall() + { + try + { + SeriesRow.createValidSeriesRow(1, PAIR); + fail("Expected exception not thrown"); + } + catch(IllegalArgumentException e) + { + // pass + } + } + + public void testDimension() + { + SeriesRow seriesRow = new SeriesRow(10, 11); + assertEquals(10, seriesRow.dimension(0)); + assertEquals(11, seriesRow.dimension(1)); + } + + public void testDimensionAsString() + { + SeriesRow seriesRow = new SeriesRow(10); + assertEquals("10", seriesRow.dimensionAsString(0)); + } + + public void testDimensionAsDouble() + { + SeriesRow seriesRow = new SeriesRow(10.1); + assertEquals(10.1, seriesRow.dimensionAsDouble(0), 0.0); + } + +} -- cgit v1.2.1