001 /* 002 * Sonar, open source software quality management tool. 003 * Copyright (C) 2008-2012 SonarSource 004 * mailto:contact AT sonarsource DOT com 005 * 006 * Sonar is free software; you can redistribute it and/or 007 * modify it under the terms of the GNU Lesser General Public 008 * License as published by the Free Software Foundation; either 009 * version 3 of the License, or (at your option) any later version. 010 * 011 * Sonar is distributed in the hope that it will be useful, 012 * but WITHOUT ANY WARRANTY; without even the implied warranty of 013 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 014 * Lesser General Public License for more details. 015 * 016 * You should have received a copy of the GNU Lesser General Public 017 * License along with Sonar; if not, write to the Free Software 018 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 019 */ 020 package org.sonar.server.charts; 021 022 import com.google.common.collect.Maps; 023 import org.apache.commons.io.IOUtils; 024 import org.jfree.chart.encoders.KeypointPNGEncoderAdapter; 025 import org.slf4j.Logger; 026 import org.slf4j.LoggerFactory; 027 import org.sonar.api.charts.Chart; 028 import org.sonar.api.charts.ChartParameters; 029 import org.sonar.server.charts.deprecated.*; 030 import org.sonar.server.platform.Platform; 031 032 import javax.servlet.ServletException; 033 import javax.servlet.http.HttpServlet; 034 import javax.servlet.http.HttpServletRequest; 035 import javax.servlet.http.HttpServletResponse; 036 import java.awt.image.BufferedImage; 037 import java.io.IOException; 038 import java.io.OutputStream; 039 import java.util.Enumeration; 040 import java.util.Map; 041 042 public class ChartsServlet extends HttpServlet { 043 044 private static final Logger LOG = LoggerFactory.getLogger(ChartsServlet.class); 045 private static final long serialVersionUID = 669857447198433893L; 046 047 @Override 048 public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 049 if (isDeprecatedChart(request)) { 050 deprecatedDoGet(request, response); 051 052 } else { 053 ChartFactory chartFactory = Platform.getInstance().getContainer().getComponentByType(ChartFactory.class); 054 Chart chart = chartFactory.getChart(request.getParameter("ck")); 055 if (chart != null) { 056 BufferedImage image = chart.generateImage(getParams(request)); 057 OutputStream out = response.getOutputStream(); 058 try { 059 response.setContentType("image/png"); 060 exportAsPNG(image, out); 061 062 } catch (Exception e) { 063 LOG.error("Generating chart " + chart.getClass().getName(), e); 064 065 } finally { 066 out.close(); 067 } 068 } 069 } 070 } 071 072 private ChartParameters getParams(HttpServletRequest request) { 073 Map<String, String> map = Maps.newHashMap(); 074 Enumeration keys = request.getParameterNames(); 075 while (keys.hasMoreElements()) { 076 String key = (String) keys.nextElement(); 077 String value = request.getParameter(key); 078 map.put(key, value); 079 } 080 return new ChartParameters(map); 081 } 082 083 private void exportAsPNG(BufferedImage image, OutputStream out) throws IOException { 084 KeypointPNGEncoderAdapter encoder = new KeypointPNGEncoderAdapter(); 085 encoder.setEncodingAlpha(true); 086 encoder.encode(image, out); 087 } 088 089 public boolean isDeprecatedChart(HttpServletRequest request) { 090 String chartType = request.getParameter(BaseChartWeb.CHART_PARAM_TYPE); 091 if (BaseChartWeb.BAR_CHART_HORIZONTAL.equals(chartType) || BaseChartWeb.BAR_CHART_VERTICAL.equals(chartType) || BaseChartWeb.STACKED_BAR_CHART.equals(chartType)) { 092 return true; 093 } 094 if (BaseChartWeb.BAR_CHART_VERTICAL_CUSTOM.equals(chartType)) { 095 return true; 096 } 097 if (BaseChartWeb.PIE_CHART.equals(chartType)) { 098 return true; 099 } 100 if (BaseChartWeb.SPARKLINES_CHART.equals(chartType)) { 101 return true; 102 } 103 return false; 104 } 105 106 public void deprecatedDoGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 107 Map<String, String> params = Maps.newHashMap(); 108 params.put(BaseChartWeb.CHART_PARAM_TYPE, request.getParameter(BaseChartWeb.CHART_PARAM_TYPE)); 109 params.put(BaseChartWeb.CHART_PARAM_VALUES, request.getParameter(BaseChartWeb.CHART_PARAM_VALUES)); 110 params.put(BaseChartWeb.CHART_PARAM_COLORS, request.getParameter(BaseChartWeb.CHART_PARAM_COLORS)); 111 params.put(BaseChartWeb.CHART_PARAM_RANGEMAX, request.getParameter(BaseChartWeb.CHART_PARAM_RANGEMAX)); 112 params.put(BaseChartWeb.CHART_PARAM_TITLE, request.getParameter(BaseChartWeb.CHART_PARAM_TITLE)); 113 params.put(BaseChartWeb.CHART_PARAM_DIMENSIONS, request.getParameter(BaseChartWeb.CHART_PARAM_DIMENSIONS)); 114 params.put(BaseChartWeb.CHART_PARAM_CATEGORIES_AXISMARGIN_VISIBLE, request.getParameter(BaseChartWeb.CHART_PARAM_CATEGORIES_AXISMARGIN_VISIBLE)); 115 params.put(BaseChartWeb.CHART_PARAM_RANGEAXIS_VISIBLE, request.getParameter(BaseChartWeb.CHART_PARAM_RANGEAXIS_VISIBLE)); 116 params.put(BaseChartWeb.CHART_PARAM_SERIES, request.getParameter(BaseChartWeb.CHART_PARAM_SERIES)); 117 params.put(BaseChartWeb.CHART_PARAM_CATEGORIES, request.getParameter(BaseChartWeb.CHART_PARAM_CATEGORIES)); 118 params.put(BaseChartWeb.CHART_PARAM_CATEGORIES_AXISMARGIN_LOWER, request.getParameter(BaseChartWeb.CHART_PARAM_CATEGORIES_AXISMARGIN_LOWER)); 119 params.put(BaseChartWeb.CHART_PARAM_CATEGORIES_AXISMARGIN_UPPER, request.getParameter(BaseChartWeb.CHART_PARAM_CATEGORIES_AXISMARGIN_UPPER)); 120 params.put(BaseChartWeb.CHART_PARAM_SERIES_AXISMARGIN_LOWER, request.getParameter(BaseChartWeb.CHART_PARAM_SERIES_AXISMARGIN_LOWER)); 121 params.put(BaseChartWeb.CHART_PARAM_SERIES_AXISMARGIN_UPPER, request.getParameter(BaseChartWeb.CHART_PARAM_SERIES_AXISMARGIN_UPPER)); 122 params.put(BaseChartWeb.CHART_PARAM_SERIES_AXISMARGIN_TICKUNIT, request.getParameter(BaseChartWeb.CHART_PARAM_SERIES_AXISMARGIN_TICKUNIT)); 123 params.put(BaseChartWeb.CHART_PARAM_INSETS, request.getParameter(BaseChartWeb.CHART_PARAM_INSETS)); 124 params.put(BaseChartWeb.CHART_PARAM_OUTLINE_RANGEGRIDLINES_VISIBLE, request.getParameter(BaseChartWeb.CHART_PARAM_OUTLINE_RANGEGRIDLINES_VISIBLE)); 125 params.put(BaseChartWeb.CHART_PARAM_OUTLINE_VISIBLE, request.getParameter(BaseChartWeb.CHART_PARAM_OUTLINE_VISIBLE)); 126 127 String chartType = params.get(BaseChartWeb.CHART_PARAM_TYPE); 128 129 DeprecatedChart chart = null; 130 131 if (BaseChartWeb.BAR_CHART_HORIZONTAL.equals(chartType) || BaseChartWeb.BAR_CHART_VERTICAL.equals(chartType) || BaseChartWeb.STACKED_BAR_CHART.equals(chartType)) { 132 chart = new BarChart(params); 133 } else if (BaseChartWeb.BAR_CHART_VERTICAL_CUSTOM.equals(chartType)) { 134 chart = new CustomBarChart(params); 135 } else if (BaseChartWeb.PIE_CHART.equals(chartType)) { 136 chart = new PieChart(params); 137 } else if (BaseChartWeb.SPARKLINES_CHART.equals(chartType)) { 138 chart = new SparkLinesChart(params); 139 } 140 141 OutputStream out = null; 142 try { 143 if (chart != null) { 144 out = response.getOutputStream(); 145 response.setContentType("image/png"); 146 chart.exportChartAsPNG(out); 147 } 148 149 } catch (Exception e) { 150 LOG.error("Generating chart " + chart.getClass().getName(), e); 151 152 } finally { 153 IOUtils.closeQuietly(out); 154 } 155 } 156 157 }