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 }