001 /* 002 * Sonar, open source software quality management tool. 003 * Copyright (C) 2008-2011 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 org.apache.commons.io.IOUtils; 023 import org.jfree.chart.encoders.KeypointPNGEncoderAdapter; 024 import org.slf4j.Logger; 025 import org.slf4j.LoggerFactory; 026 import org.sonar.api.charts.Chart; 027 import org.sonar.api.charts.ChartParameters; 028 import org.sonar.server.charts.deprecated.*; 029 import org.sonar.server.platform.Platform; 030 031 import javax.servlet.ServletException; 032 import javax.servlet.http.HttpServlet; 033 import javax.servlet.http.HttpServletRequest; 034 import javax.servlet.http.HttpServletResponse; 035 import java.awt.image.BufferedImage; 036 import java.io.IOException; 037 import java.io.OutputStream; 038 import java.util.Enumeration; 039 import java.util.HashMap; 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) 049 throws ServletException, IOException { 050 if (isDeprecatedChart(request)) { 051 deprecatedDoGet(request, response); 052 053 } else { 054 ChartFactory chartFactory = Platform.getInstance().getContainer().getComponentByType(ChartFactory.class); 055 Chart chart = chartFactory.getChart(request.getParameter("ck")); 056 if (chart != null) { 057 BufferedImage image = chart.generateImage(getParams(request)); 058 OutputStream out = response.getOutputStream(); 059 try { 060 response.setContentType("image/png"); 061 exportAsPNG(image, out); 062 063 } catch (Exception e) { 064 LOG.error("Generating chart " + chart.getClass().getName(), e); 065 066 } finally { 067 out.close(); 068 } 069 } 070 } 071 } 072 073 private ChartParameters getParams(HttpServletRequest request) { 074 Map<String, String> map = new HashMap<String, String>(); 075 Enumeration keys = request.getParameterNames(); 076 while (keys.hasMoreElements()) { 077 String key = (String) keys.nextElement(); 078 String value = request.getParameter(key); 079 map.put(key, value); 080 } 081 return new ChartParameters(map); 082 } 083 084 private void exportAsPNG(BufferedImage image, OutputStream out) throws IOException { 085 KeypointPNGEncoderAdapter encoder = new KeypointPNGEncoderAdapter(); 086 encoder.setEncodingAlpha(true); 087 encoder.encode(image, out); 088 } 089 090 public boolean isDeprecatedChart(HttpServletRequest request) { 091 String chartType = request.getParameter(BaseChartWeb.CHART_PARAM_TYPE); 092 if (BaseChartWeb.BAR_CHART_HORIZONTAL.equals(chartType) || BaseChartWeb.BAR_CHART_VERTICAL.equals(chartType) || BaseChartWeb.STACKED_BAR_CHART.equals(chartType)) { 093 return true; 094 } 095 if (BaseChartWeb.BAR_CHART_VERTICAL_CUSTOM.equals(chartType)) { 096 return true; 097 } 098 if (BaseChartWeb.PIE_CHART.equals(chartType)) { 099 return true; 100 } 101 if (BaseChartWeb.SPARKLINES_CHART.equals(chartType)) { 102 return true; 103 } 104 return false; 105 } 106 107 public void deprecatedDoGet(HttpServletRequest request, HttpServletResponse response) 108 throws ServletException, IOException { 109 110 Map<String, String> params = new HashMap<String, String>(); 111 params.put(BaseChartWeb.CHART_PARAM_TYPE, request.getParameter(BaseChartWeb.CHART_PARAM_TYPE)); 112 params.put(BaseChartWeb.CHART_PARAM_VALUES, request.getParameter(BaseChartWeb.CHART_PARAM_VALUES)); 113 params.put(BaseChartWeb.CHART_PARAM_COLORS, request.getParameter(BaseChartWeb.CHART_PARAM_COLORS)); 114 params.put(BaseChartWeb.CHART_PARAM_RANGEMAX, request.getParameter(BaseChartWeb.CHART_PARAM_RANGEMAX)); 115 params.put(BaseChartWeb.CHART_PARAM_TITLE, request.getParameter(BaseChartWeb.CHART_PARAM_TITLE)); 116 params.put(BaseChartWeb.CHART_PARAM_DIMENSIONS, request.getParameter(BaseChartWeb.CHART_PARAM_DIMENSIONS)); 117 params.put(BaseChartWeb.CHART_PARAM_CATEGORIES_AXISMARGIN_VISIBLE, request.getParameter(BaseChartWeb.CHART_PARAM_CATEGORIES_AXISMARGIN_VISIBLE)); 118 params.put(BaseChartWeb.CHART_PARAM_RANGEAXIS_VISIBLE, request.getParameter(BaseChartWeb.CHART_PARAM_RANGEAXIS_VISIBLE)); 119 params.put(BaseChartWeb.CHART_PARAM_SERIES, request.getParameter(BaseChartWeb.CHART_PARAM_SERIES)); 120 params.put(BaseChartWeb.CHART_PARAM_CATEGORIES, request.getParameter(BaseChartWeb.CHART_PARAM_CATEGORIES)); 121 params.put(BaseChartWeb.CHART_PARAM_CATEGORIES_AXISMARGIN_LOWER, request.getParameter(BaseChartWeb.CHART_PARAM_CATEGORIES_AXISMARGIN_LOWER)); 122 params.put(BaseChartWeb.CHART_PARAM_CATEGORIES_AXISMARGIN_UPPER, request.getParameter(BaseChartWeb.CHART_PARAM_CATEGORIES_AXISMARGIN_UPPER)); 123 params.put(BaseChartWeb.CHART_PARAM_SERIES_AXISMARGIN_LOWER, request.getParameter(BaseChartWeb.CHART_PARAM_SERIES_AXISMARGIN_LOWER)); 124 params.put(BaseChartWeb.CHART_PARAM_SERIES_AXISMARGIN_UPPER, request.getParameter(BaseChartWeb.CHART_PARAM_SERIES_AXISMARGIN_UPPER)); 125 params.put(BaseChartWeb.CHART_PARAM_SERIES_AXISMARGIN_TICKUNIT, request.getParameter(BaseChartWeb.CHART_PARAM_SERIES_AXISMARGIN_TICKUNIT)); 126 params.put(BaseChartWeb.CHART_PARAM_INSETS, request.getParameter(BaseChartWeb.CHART_PARAM_INSETS)); 127 params.put(BaseChartWeb.CHART_PARAM_OUTLINE_RANGEGRIDLINES_VISIBLE, request.getParameter(BaseChartWeb.CHART_PARAM_OUTLINE_RANGEGRIDLINES_VISIBLE)); 128 params.put(BaseChartWeb.CHART_PARAM_OUTLINE_VISIBLE, request.getParameter(BaseChartWeb.CHART_PARAM_OUTLINE_VISIBLE)); 129 130 String chartType = params.get(BaseChartWeb.CHART_PARAM_TYPE); 131 132 DeprecatedChart chart = null; 133 134 if (BaseChartWeb.BAR_CHART_HORIZONTAL.equals(chartType) || BaseChartWeb.BAR_CHART_VERTICAL.equals(chartType) || BaseChartWeb.STACKED_BAR_CHART.equals(chartType)) { 135 chart = new BarChart(params); 136 } else if (BaseChartWeb.BAR_CHART_VERTICAL_CUSTOM.equals(chartType)) { 137 chart = new CustomBarChart(params); 138 } else if (BaseChartWeb.PIE_CHART.equals(chartType)) { 139 chart = new PieChart(params); 140 } else if (BaseChartWeb.SPARKLINES_CHART.equals(chartType)) { 141 chart = new SparkLinesChart(params); 142 } 143 144 OutputStream out = null; 145 try { 146 if (chart != null) { 147 out = response.getOutputStream(); 148 response.setContentType("image/png"); 149 chart.exportChartAsPNG(out); 150 } 151 152 } catch (Exception e) { 153 LOG.error("Generating chart " + chart.getClass().getName(), e); 154 155 } finally { 156 IOUtils.closeQuietly(out); 157 } 158 } 159 160 }