diff options
author | Scott Jackson <daneren2005@gmail.com> | 2012-07-02 21:24:02 -0700 |
---|---|---|
committer | Scott Jackson <daneren2005@gmail.com> | 2012-07-02 21:24:02 -0700 |
commit | a1a18f77a50804e0127dfa4b0f5240c49c541184 (patch) | |
tree | 19a38880afe505beddb5590379a8134d7730a277 /subsonic-main/src/main/java/net/sourceforge/subsonic/controller/UserChartController.java | |
parent | b61d787706979e7e20f4c3c4f93c1f129d92273f (diff) | |
download | dsub-a1a18f77a50804e0127dfa4b0f5240c49c541184.tar.gz dsub-a1a18f77a50804e0127dfa4b0f5240c49c541184.tar.bz2 dsub-a1a18f77a50804e0127dfa4b0f5240c49c541184.zip |
Initial Commit
Diffstat (limited to 'subsonic-main/src/main/java/net/sourceforge/subsonic/controller/UserChartController.java')
-rw-r--r-- | subsonic-main/src/main/java/net/sourceforge/subsonic/controller/UserChartController.java | 145 |
1 files changed, 145 insertions, 0 deletions
diff --git a/subsonic-main/src/main/java/net/sourceforge/subsonic/controller/UserChartController.java b/subsonic-main/src/main/java/net/sourceforge/subsonic/controller/UserChartController.java new file mode 100644 index 00000000..0428eff8 --- /dev/null +++ b/subsonic-main/src/main/java/net/sourceforge/subsonic/controller/UserChartController.java @@ -0,0 +1,145 @@ +/* + This file is part of Subsonic. + + Subsonic is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + Subsonic is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Subsonic. If not, see <http://www.gnu.org/licenses/>. + + Copyright 2009 (C) Sindre Mehus + */ +package net.sourceforge.subsonic.controller; + +import java.awt.Color; +import java.awt.GradientPaint; +import java.awt.Paint; +import java.util.List; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.jfree.chart.ChartFactory; +import org.jfree.chart.ChartUtilities; +import org.jfree.chart.JFreeChart; +import org.jfree.chart.axis.AxisLocation; +import org.jfree.chart.axis.CategoryAxis; +import org.jfree.chart.axis.CategoryLabelPositions; +import org.jfree.chart.axis.LogarithmicAxis; +import org.jfree.chart.plot.CategoryPlot; +import org.jfree.chart.plot.PlotOrientation; +import org.jfree.chart.renderer.category.BarRenderer; +import org.jfree.data.category.CategoryDataset; +import org.jfree.data.category.DefaultCategoryDataset; +import org.springframework.web.servlet.ModelAndView; + +import net.sourceforge.subsonic.domain.User; +import net.sourceforge.subsonic.service.SecurityService; + +/** + * Controller for generating a chart showing bitrate vs time. + * + * @author Sindre Mehus + */ +public class UserChartController extends AbstractChartController { + + private SecurityService securityService; + + public static final int IMAGE_WIDTH = 400; + public static final int IMAGE_MIN_HEIGHT = 200; + private static final long BYTES_PER_MB = 1024L * 1024L; + + public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception { + String type = request.getParameter("type"); + CategoryDataset dataset = createDataset(type); + JFreeChart chart = createChart(dataset, request); + + int imageHeight = Math.max(IMAGE_MIN_HEIGHT, 15 * dataset.getColumnCount()); + + ChartUtilities.writeChartAsPNG(response.getOutputStream(), chart, IMAGE_WIDTH, imageHeight); + return null; + } + + private CategoryDataset createDataset(String type) { + DefaultCategoryDataset dataset = new DefaultCategoryDataset(); + List<User> users = securityService.getAllUsers(); + for (User user : users) { + double value; + if ("stream".equals(type)) { + value = user.getBytesStreamed(); + } else if ("download".equals(type)) { + value = user.getBytesDownloaded(); + } else if ("upload".equals(type)) { + value = user.getBytesUploaded(); + } else if ("total".equals(type)) { + value = user.getBytesStreamed() + user.getBytesDownloaded() + user.getBytesUploaded(); + } else { + throw new RuntimeException("Illegal chart type: " + type); + } + + value /= BYTES_PER_MB; + dataset.addValue(value, "Series", user.getUsername()); + } + + return dataset; + } + + private JFreeChart createChart(CategoryDataset dataset, HttpServletRequest request) { + JFreeChart chart = ChartFactory.createBarChart(null, null, null, dataset, PlotOrientation.HORIZONTAL, false, false, false); + + CategoryPlot plot = chart.getCategoryPlot(); + Paint background = new GradientPaint(0, 0, Color.lightGray, 0, IMAGE_MIN_HEIGHT, Color.white); + plot.setBackgroundPaint(background); + plot.setDomainGridlinePaint(Color.white); + plot.setDomainGridlinesVisible(true); + plot.setRangeGridlinePaint(Color.white); + plot.setRangeAxisLocation(AxisLocation.BOTTOM_OR_LEFT); + + LogarithmicAxis rangeAxis = new LogarithmicAxis(null); + rangeAxis.setStrictValuesFlag(false); + rangeAxis.setAllowNegativesFlag(true); + plot.setRangeAxis(rangeAxis); + + // Disable bar outlines. + BarRenderer renderer = (BarRenderer) plot.getRenderer(); + renderer.setDrawBarOutline(false); + + // Set up gradient paint for series. + GradientPaint gp0 = new GradientPaint( + 0.0f, 0.0f, Color.blue, + 0.0f, 0.0f, new Color(0, 0, 64) + ); + renderer.setSeriesPaint(0, gp0); + + // Rotate labels. + CategoryAxis domainAxis = plot.getDomainAxis(); + domainAxis.setCategoryLabelPositions(CategoryLabelPositions.createUpRotationLabelPositions(Math.PI / 6.0)); + + // Set theme-specific colors. + Color bgColor = getBackground(request); + Color fgColor = getForeground(request); + + chart.setBackgroundPaint(bgColor); + + domainAxis.setTickLabelPaint(fgColor); + domainAxis.setTickMarkPaint(fgColor); + domainAxis.setAxisLinePaint(fgColor); + + rangeAxis.setTickLabelPaint(fgColor); + rangeAxis.setTickMarkPaint(fgColor); + rangeAxis.setAxisLinePaint(fgColor); + + return chart; + } + + public void setSecurityService(SecurityService securityService) { + this.securityService = securityService; + } +} |