aboutsummaryrefslogtreecommitdiffstats
path: root/trunk/etherpad/src/etherpad/usage_stats/usage_stats.js
diff options
context:
space:
mode:
Diffstat (limited to 'trunk/etherpad/src/etherpad/usage_stats/usage_stats.js')
-rw-r--r--trunk/etherpad/src/etherpad/usage_stats/usage_stats.js162
1 files changed, 162 insertions, 0 deletions
diff --git a/trunk/etherpad/src/etherpad/usage_stats/usage_stats.js b/trunk/etherpad/src/etherpad/usage_stats/usage_stats.js
new file mode 100644
index 0000000..59074ed
--- /dev/null
+++ b/trunk/etherpad/src/etherpad/usage_stats/usage_stats.js
@@ -0,0 +1,162 @@
+/**
+ * Copyright 2009 Google Inc.
+ *
+ * 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.
+ */
+
+import("execution");
+import("sqlbase.sqlobj");
+import("sqlbase.sqlcommon");
+import("jsutils.*");
+import("fastJSON");
+
+import("etherpad.log");
+import("etherpad.log.frontendLogFileName");
+import("etherpad.statistics.statistics");
+import("fileutils.eachFileLine");
+
+jimport("java.lang.System.out.println");
+jimport("java.io.BufferedReader");
+jimport("java.io.FileReader");
+jimport("java.io.File");
+jimport("java.awt.Color");
+
+jimport("org.jfree.chart.ChartFactory");
+jimport("org.jfree.chart.ChartUtilities");
+jimport("org.jfree.chart.JFreeChart");
+jimport("org.jfree.chart.axis.DateAxis");
+jimport("org.jfree.chart.axis.NumberAxis");
+jimport("org.jfree.chart.plot.XYPlot");
+jimport("org.jfree.chart.renderer.xy.XYLineAndShapeRenderer");
+jimport("org.jfree.data.time.Day");
+jimport("org.jfree.data.time.TimeSeries");
+jimport("org.jfree.data.time.TimeSeriesCollection");
+
+//----------------------------------------------------------------
+// Database reading/writing
+//----------------------------------------------------------------
+
+
+function _listStats(statName) {
+ return sqlobj.selectMulti('statistics', {name: statName}, {orderBy: '-timestamp'});
+}
+
+// public accessor
+function getStatData(statName) {
+ return _listStats(statName);
+}
+
+//----------------------------------------------------------------
+// HTML & Graph generating
+//----------------------------------------------------------------
+
+function respondWithGraph(statName) {
+ var width = 500;
+ var height = 300;
+ if (request.params.size) {
+ var parts = request.params.size.split('x');
+ width = +parts[0];
+ height = +parts[1];
+ }
+
+ var dataset = new TimeSeriesCollection();
+ var hideLegend = true;
+
+ switch (statistics.getStatData(statName).plotType) {
+ case 'line':
+ var ts = new TimeSeries(statName);
+
+ _listStats(statName).forEach(function(stat) {
+ var day = new Day(new java.util.Date(stat.timestamp * 1000));
+ ts.addOrUpdate(day, fastJSON.parse(stat.value).value);
+ });
+ dataset.addSeries(ts);
+ break;
+ case 'topValues':
+ hideLegend = false;
+ var stats = _listStats(statName);
+ if (stats.length == 0) break;
+ var latestStat = fastJSON.parse(stats[0].value);
+ var valuesToWatch = [];
+ var series = {};
+ var nLines = 5;
+ function forEachFirstN(n, stat, f) {
+ for (var i = 0; i < Math.min(n, stat.topValues.length); i++) {
+ f(stat.topValues[i].value, stat.topValues[i].count);
+ }
+ }
+ forEachFirstN(nLines, latestStat, function(value, count) {
+ valuesToWatch.push(value);
+ series[value] = new TimeSeries(value);
+ });
+ stats.forEach(function(stat) {
+ var day = new Day(new java.util.Date(stat.timestamp*1000));
+ var statData = fastJSON.parse(stat.value);
+ valuesToWatch.forEach(function(value) { series[value].addOrUpdate(day, 0); })
+ forEachFirstN(nLines, statData, function(value, count) {
+ if (series[value]) {
+ series[value].addOrUpdate(day, count);
+ }
+ });
+ });
+ valuesToWatch.forEach(function(value) {
+ dataset.addSeries(series[value]);
+ });
+ break;
+ case 'histogram':
+ hideLegend = false;
+ var stats = _listStats(statName);
+ percentagesToGraph = ["50", "90", "100"];
+ series = {};
+ percentagesToGraph.forEach(function(pct) {
+ series[pct] = new TimeSeries(pct+"%");
+ dataset.addSeries(series[pct]);
+ });
+ if (stats.length == 0) break;
+ stats.forEach(function(stat) {
+ var day = new Day(new java.util.Date(stat.timestamp*1000));
+ var statData = fastJSON.parse(stat.value);
+ eachProperty(series, function(pct, timeseries) {
+ timeseries.addOrUpdate(day, statData[pct] || 0);
+ });
+ });
+ break;
+ }
+
+ var domainAxis = new DateAxis("");
+ var rangeAxis = new NumberAxis();
+ var renderer = new XYLineAndShapeRenderer();
+
+ var numSeries = dataset.getSeriesCount();
+ var colors = [Color.blue, Color.red, Color.green, Color.orange, Color.pink, Color.magenta];
+ for (var i = 0; i < numSeries; ++i) {
+ renderer.setSeriesPaint(i, colors[i]);
+ renderer.setSeriesShapesVisible(i, false);
+ }
+
+ var plot = new XYPlot(dataset, domainAxis, rangeAxis, renderer);
+
+ var chart = new JFreeChart(plot);
+ chart.setTitle(statName);
+ if (hideLegend) {
+ chart.removeLegend();
+ }
+
+ var jos = new java.io.ByteArrayOutputStream();
+ ChartUtilities.writeChartAsJPEG(
+ jos, 1.0, chart, width, height);
+
+ response.setContentType('image/jpeg');
+ response.writeBytes(jos.toByteArray());
+}
+