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 }