package org.activityinfo.server.endpoint.gwtrpc;
/*
* #%L
* ActivityInfo Server
* %%
* Copyright (C) 2009 - 2013 UNICEF
* %%
* This program 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.
*
* This program 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 this program. If not, see
* <http://www.gnu.org/licenses/gpl-3.0.html>.
* #L%
*/
import com.google.code.appengine.awt.Color;
import com.google.code.appengine.awt.Graphics2D;
import com.google.code.appengine.awt.image.BufferedImage;
import com.google.code.appengine.imageio.ImageIO;
import com.google.inject.Inject;
import com.google.inject.Singleton;
import org.activityinfo.legacy.shared.reports.content.PieMapMarker;
import org.activityinfo.legacy.shared.reports.content.PieMapMarker.SliceValue;
import org.activityinfo.server.report.renderer.image.ImageMapRenderer;
import org.activityinfo.server.report.util.ColorUtil;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* Servlet that generates map icons for use in a Google Maps
* {@link com.google.gwt.maps.client.overlay.Icon}
* <p/>
* The query parameter "t" indicates the type of icon to be generated:
* <p/>
* <b>t=bubble</b>: Generates a semi-transparent circle
* <p/>
* TODO: security checks. Manual parsing of arguments just screams for some sec
* flaws.
*
* @param r Radius, in pixels, of the bubble
* @param c Color, as an RGB integer, of the bubble
* @author Alex Bertram
*/
@Singleton
public class MapIconServlet extends HttpServlet {
private ImageMapRenderer renderer;
@Inject
public MapIconServlet(ImageMapRenderer renderer) {
this.renderer = renderer;
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// Cache forever
resp.setHeader("Cache-Control", "max-age=31556926, public");
if (req.getParameter("t").equals("bubble")) {
int radius = Integer.parseInt(req.getParameter("r"));
Color color = ColorUtil.colorFromString(req.getParameter("c"));
BufferedImage icon = new BufferedImage(radius * 2, radius * 2, BufferedImage.TYPE_INT_ARGB);
Graphics2D g2d = icon.createGraphics();
g2d.setPaint(new Color(255, 255, 255, 0));
g2d.fillRect(0, 0, radius * 2, radius * 2);
renderer.drawBubble(g2d, color, radius, radius, radius);
resp.setContentType("image/png");
ImageIO.write(icon, "PNG", resp.getOutputStream());
} else {
if (req.getParameter("t").equals("piechart")) {
int radius = Integer.parseInt(req.getParameter("r"));
BufferedImage icon = new BufferedImage(radius * 2, radius * 2, BufferedImage.TYPE_INT_ARGB);
Graphics2D g2d = icon.createGraphics();
PieMapMarker pmm = new PieMapMarker();
pmm.setRadius(radius);
pmm.setX(radius);
pmm.setY(radius);
String[] values = req.getParameterValues("value");
String[] colors = req.getParameterValues("color");
if (colors.length != values.length) {
String error = "Expected same amount of colors & values. Amount of Colors: [{0}]. Amount of " +
"values: [{1}].";
error = String.format(error, colors.length, values.length);
throw new ServletException(error);
}
for (int i = 0; i < colors.length; i++) {
String color;
double value = 0.0;
color = colors[i];
try {
value = Double.parseDouble(values[i]);
} catch (NumberFormatException e) {
// color = Color.decode(colors[i]).getRGB();
}
SliceValue slice = new SliceValue();
slice.setColor(color);
slice.setValue(value);
pmm.getSlices().add(slice);
}
g2d.setPaint(new Color(255, 255, 255, 0));
g2d.fillRect(0, 0, radius * 2, radius * 2);
renderer.drawPieMarker(g2d, pmm);
resp.setContentType("image/png");
ImageIO.write(icon, "PNG", resp.getOutputStream());
}
}
}
}