From 44bbc4303443cb2122f69545ff85012cc3a94576 Mon Sep 17 00:00:00 2001 From: James Moger Date: Wed, 16 Nov 2011 22:22:07 -0500 Subject: [PATCH] Preliminary charting classes for Google's Visualization API --- .../gitblit/wicket/charting/GoogleChart.java | 101 ++++++++++++++++++ .../gitblit/wicket/charting/GoogleCharts.java | 68 ++++++++++++ .../wicket/charting/GoogleLineChart.java | 60 +++++++++++ .../wicket/charting/GooglePieChart.java | 65 +++++++++++ 4 files changed, 294 insertions(+) create mode 100644 src/com/gitblit/wicket/charting/GoogleChart.java create mode 100644 src/com/gitblit/wicket/charting/GoogleCharts.java create mode 100644 src/com/gitblit/wicket/charting/GoogleLineChart.java create mode 100644 src/com/gitblit/wicket/charting/GooglePieChart.java diff --git a/src/com/gitblit/wicket/charting/GoogleChart.java b/src/com/gitblit/wicket/charting/GoogleChart.java new file mode 100644 index 00000000..b6309ffe --- /dev/null +++ b/src/com/gitblit/wicket/charting/GoogleChart.java @@ -0,0 +1,101 @@ +/* + * Copyright 2011 gitblit.com. + * + * Licensed 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 com.gitblit.wicket.charting; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; + +import com.gitblit.utils.StringUtils; + +/** + * Abstract parent class for Google Charts built with the Visualization API. + * + * @author James Moger + * + */ +public abstract class GoogleChart implements Serializable { + + private static final long serialVersionUID = 1L; + final String tagId; + final String dataName; + final String title; + final String keyName; + final String valueName; + final List values; + int width; + int height; + + public GoogleChart(String tagId, String title, String keyName, String valueName) { + this.tagId = tagId; + this.dataName = StringUtils.getSHA1(title).substring(0, 8); + this.title = title; + this.keyName = keyName; + this.valueName = valueName; + values = new ArrayList(); + } + + public void setWidth(int width) { + this.width = width; + } + + public void setHeight(int height) { + this.height = height; + } + + public void addValue(String name, int value) { + values.add(new ChartValue(name, value)); + } + + public void addValue(String name, float value) { + values.add(new ChartValue(name, value)); + } + + public void addValue(String name, double value) { + values.add(new ChartValue(name, (float) value)); + } + + protected abstract void appendChart(StringBuilder sb); + + protected void line(StringBuilder sb, String line) { + sb.append(line); + sb.append('\n'); + } + + protected class ChartValue implements Serializable, Comparable { + + private static final long serialVersionUID = 1L; + + final String name; + final float value; + + ChartValue(String name, float value) { + this.name = name; + this.value = value; + } + + @Override + public int compareTo(ChartValue o) { + // sorts the dataset by largest value first + if (value > o.value) { + return -1; + } else if (value < o.value) { + return 1; + } + return 0; + } + } +} diff --git a/src/com/gitblit/wicket/charting/GoogleCharts.java b/src/com/gitblit/wicket/charting/GoogleCharts.java new file mode 100644 index 00000000..9e1572ea --- /dev/null +++ b/src/com/gitblit/wicket/charting/GoogleCharts.java @@ -0,0 +1,68 @@ +/* + Copyright 2011 comSysto GmbH + + Licensed 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 com.gitblit.wicket.charting; + +import java.util.ArrayList; +import java.util.List; + +import org.apache.wicket.markup.html.IHeaderContributor; +import org.apache.wicket.markup.html.IHeaderResponse; + +/** + * The Google Visualization API provides interactive JavaScript based charts and + * graphs. This class implements the JavaScript header necessary to display + * complete graphs and charts. + * + * @author James Moger + * + */ +public class GoogleCharts implements IHeaderContributor { + + private static final long serialVersionUID = 1L; + + private List charts = new ArrayList(); + + public void addChart(GoogleChart chart) { + charts.add(chart); + } + + @Override + public void renderHead(IHeaderResponse response) { + // add Google Chart JS API reference + response.renderJavascriptReference("https://www.google.com/jsapi"); + + // prepare draw chart function + StringBuilder sb = new StringBuilder(); + line(sb, "google.load(\"visualization\", \"1\", {packages:[\"corechart\"]});"); + line(sb, "google.setOnLoadCallback(drawChart);"); + line(sb, "function drawChart() {"); + + // add charts to header + for (GoogleChart chart : charts) { + chart.appendChart(sb); + } + + // end draw chart function + line(sb, "}"); + response.renderJavascript(sb.toString(), null); + } + + private void line(StringBuilder sb, String line) { + sb.append(line); + sb.append('\n'); + } +} \ No newline at end of file diff --git a/src/com/gitblit/wicket/charting/GoogleLineChart.java b/src/com/gitblit/wicket/charting/GoogleLineChart.java new file mode 100644 index 00000000..c1becfc5 --- /dev/null +++ b/src/com/gitblit/wicket/charting/GoogleLineChart.java @@ -0,0 +1,60 @@ +/* + * Copyright 2011 gitblit.com. + * + * Licensed 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 com.gitblit.wicket.charting; + +import java.text.MessageFormat; + +/** + * Builds an interactive line chart using the Visualization API. + * + * @author James Moger + * + */ +public class GoogleLineChart extends GoogleChart { + + private static final long serialVersionUID = 1L; + + public GoogleLineChart(String tagId, String title, String keyName, String valueName) { + super(tagId, title, keyName, valueName); + } + + @Override + protected void appendChart(StringBuilder sb) { + String dName = "data_" + dataName; + line(sb, MessageFormat.format("var {0} = new google.visualization.DataTable();", dName)); + line(sb, MessageFormat.format("{0}.addColumn(''string'', ''{1}'');", dName, keyName)); + line(sb, MessageFormat.format("{0}.addColumn(''number'', ''{1}'');", dName, valueName)); + line(sb, MessageFormat.format("{0}.addRows({1,number,0});", dName, values.size())); + + for (int i = 0; i < values.size(); i++) { + ChartValue value = values.get(i); + line(sb, MessageFormat.format("{0}.setValue({1,number,0}, 0, ''{2}'');", dName, i, + value.name)); + line(sb, MessageFormat.format("{0}.setValue({1,number,0}, 1, {2,number,0.0});", dName, + i, value.value)); + } + + String cName = "chart_" + dataName; + line(sb, MessageFormat.format( + "var {0} = new google.visualization.LineChart(document.getElementById(''{1}''));", + cName, tagId)); + line(sb, + MessageFormat + .format("{0}.draw({1}, '{'width: {2,number,0}, height: {3,number,0}, pointSize: 4, chartArea:'{'left:20,top:20'}', legend: ''none'', title: ''{4}'' '}');", + cName, dName, width, height, title)); + line(sb, ""); + } +} \ No newline at end of file diff --git a/src/com/gitblit/wicket/charting/GooglePieChart.java b/src/com/gitblit/wicket/charting/GooglePieChart.java new file mode 100644 index 00000000..8367c423 --- /dev/null +++ b/src/com/gitblit/wicket/charting/GooglePieChart.java @@ -0,0 +1,65 @@ +/* + * Copyright 2011 gitblit.com. + * + * Licensed 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 com.gitblit.wicket.charting; + +import java.text.MessageFormat; +import java.util.Collections; + +/** + * Builds an interactive pie chart using the Visualization API. + * + * @author James Moger + * + */ +public class GooglePieChart extends GoogleChart { + + private static final long serialVersionUID = 1L; + + public GooglePieChart(String tagId, String title, String keyName, String valueName) { + super(tagId, title, keyName, valueName); + } + + @Override + protected void appendChart(StringBuilder sb) { + // create dataset + String dName = "data_" + dataName; + line(sb, MessageFormat.format("var {0} = new google.visualization.DataTable();", dName)); + line(sb, MessageFormat.format("{0}.addColumn(''string'', ''{1}'');", dName, keyName)); + line(sb, MessageFormat.format("{0}.addColumn(''number'', ''{1}'');", dName, valueName)); + line(sb, MessageFormat.format("{0}.addRows({1,number,0});", dName, values.size())); + + Collections.sort(values); + + for (int i = 0; i < values.size(); i++) { + ChartValue value = values.get(i); + line(sb, MessageFormat.format("{0}.setValue({1,number,0}, 0, ''{2}'');", dName, i, + value.name)); + line(sb, MessageFormat.format("{0}.setValue({1,number,0}, 1, {2,number,0.0});", dName, + i, value.value)); + } + + // instantiate chart + String cName = "chart_" + dataName; + line(sb, MessageFormat.format( + "var {0} = new google.visualization.PieChart(document.getElementById(''{1}''));", + cName, tagId)); + line(sb, + MessageFormat + .format("{0}.draw({1}, '{'width: {2,number,0}, height: {3,number,0}, chartArea:'{'left:20,top:20'}', title: ''{4}'' '}');", + cName, dName, width, height, title)); + line(sb, ""); + } +} \ No newline at end of file -- 2.39.5