Commit 12e50381 by Tuomas Riihimäki

Add timelapse possibility to legacy placemap image generator

1 parent 3747c7f2
......@@ -35,8 +35,11 @@
<artifactId>primefaces-extensions</artifactId>
<version>${primefaces.extensions}</version>
</dependency>
<dependency>
<groupId>joda-time</groupId>
<artifactId>joda-time</artifactId>
<version>2.3</version>
</dependency>
<dependency>
<groupId>org.primefaces.themes</groupId>
<artifactId>all-themes</artifactId>
......
......@@ -43,6 +43,8 @@ import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import fi.codecrew.moya.enums.apps.UserPermission;
import org.joda.time.format.ISODateTimeFormat;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
......@@ -58,307 +60,317 @@ import fi.codecrew.moya.model.Place;
import fi.codecrew.moya.utilities.moyamessage.MoyaEventType;
/**
*
* @author tuukka
*/
@WebServlet("/PlaceMap")
public class PlaceMapServlet extends HttpServlet {
private static final Logger logger = LoggerFactory.getLogger(PlaceMapServlet.class);
private static final long serialVersionUID = 8769688627918936258L;
@EJB
private transient PlaceBeanLocal placeBean;
@EJB
private transient PermissionBeanLocal permbean;
@EJB
private transient LoggingBeanLocal loggerbean;
@EJB
private UserBeanLocal userBean;
@EJB
private BarcodeBeanLocal barcodeBean;
private static final String PARAMETER_EVENT_MAP_ID = "mapid";
private static final String PARAMETER_USER_ID = "userid";
private static final String PARAMETER_TOKEN = "token";
/**
* Processes requests for both HTTP <code>GET</code> and <code>POST</code>
* methods.
*
* @param request
* servlet request
* @param response
* servlet response
* @throws ServletException
* if a servlet-specific error occurs
* @throws IOException
* if an I/O error occurs
*/
protected void processRequest(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
logger.debug("Begin processing request");
// response.setContentType("text/html;charset=UTF-8");
// PrintWriter out = response.getWriter();
ServletOutputStream ostream = null;
try {
// Integer placeId = getIntegerParameter(request,
// PARAMETER_SELECTED_PLACE_ID);
Integer mapId = getIntegerParameter(request, PARAMETER_EVENT_MAP_ID);
Integer userId = getIntegerParameter(request, PARAMETER_USER_ID);
String userToken = request.getParameter(PARAMETER_TOKEN);
EventMap map = placeBean.findMap(mapId);
logger.debug("Mapid: {}", mapId);
ostream = response.getOutputStream();
if (map == null || map.getMapData() == null) {
logger.warn("Error handling map {}!", map);
response.setStatus(HttpServletResponse.SC_NOT_FOUND);
ostream.print("Map error!");
} else {
String[] splittype = map.getMimeType().split("/");
String type = "png";
if(splittype.length > 0)
type = splittype[splittype.length-1];
response.setContentType(map.getMimeType());
printPlaceMapToStream(ostream, type, map,userId, userToken);
logger.debug("Flushing ostream");
ostream.flush();
}
} catch (EJBException e) {
logger.debug("Permission denied. Returning SC_FORBIDDEN!");
response.setContentType("text/html;charset=UTF-8");
response.setStatus(HttpServletResponse.SC_FORBIDDEN);
ostream = response.getOutputStream();
ostream.print("Error 403 \nPermission denied! Please login before accessing resource");
// e.printStackTrace();
} finally {
if (ostream != null) {
ostream.close();
}
}
}
private void printPlaceMapToStream(OutputStream outputStream, String filetype, EventMap map, Integer userid, String userToken) throws IOException
{
EventUser user = null;
if(userToken != null)
user = barcodeBean.getUserFromLongTextCode(userToken);
if (!permbean.hasPermission(MapPermission.VIEW) && user == null)
{
loggerbean.sendMessage(MoyaEventType.USER_INSUFFICIENT_PERMISSIONS, permbean.getCurrentUser(), "User tried to print the placemap to stream without sufficient permissions");
throw new EJBAccessException("Not enough permissions to print placemap");
}
long begin = new Date().getTime();
// List<Place> selectedPlaceList = placeBean.findPlaces(placeIds);
// logger.debug("SelectedPlaceList: size {}, {} ",
// selectedPlaceList.size(), selectedPlaceList);
// map = eventMapFacade.find(eventId, mapId);
// if (map == null) {
// throw new PermissionDeniedException(secubean, user,
// "Map not found with id: " + mapId + " and event id: " +
// eventbean.getCurrentEvent());
// }
// logger.debug("Got map object {}", map);
List<Place> places = map.getPlaces();
List<Place> userplaces = null;
if(userid != null && userid != 0) {
EventUser placesForUser = userBean.findByUserId(userid, false);
if(user != null) {
userplaces = placeBean.findPlacePrintlistForUser(placesForUser);
}
}
if(user != null) {
userplaces = placeBean.findPlacePrintlistForUser(user);
}
if(user == null)
user = permbean.getCurrentUser();
// List<Place> selectedPlaces = placemapBean.findSelectedPlaces(map);
BufferedImage image = ImageIO.read(new ByteArrayInputStream(map.getMapData()));
Graphics2D g2d = image.createGraphics();
for (Place place : places) {
if(userplaces != null) {
if(userplaces.contains(place)) {
drawPlace(place, g2d, user, true, true);
} else {
drawPlace(place, g2d, user, true, false);
}
} else {
drawPlace(place, g2d, user, false, false);
}
}
// BufferedImage image = map.getMapWithPlaces(, selectedPlaces);
logger.debug("Prewrite {}", new Date().getTime() - begin);
ImageIO.write(image, filetype, outputStream);
logger.debug("postwrite {}", new Date().getTime() - begin);
}
/***
* Convert request parameter into integer
*
* @param request
* @param parameter
* @return
*/
private static Integer getIntegerParameter(HttpServletRequest request,
String parameter) {
try {
String valueString = request.getParameter(parameter);
Integer value = Integer.parseInt(valueString);
return value;
} catch (NumberFormatException nfe) {
}
return null;
}
// <editor-fold defaultstate="collapsed"
// desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
/**
* Handles the HTTP <code>GET</code> method.
*
* @param request
* servlet request
* @param response
* servlet response
* @throws ServletException
* if a servlet-specific error occurs
* @throws IOException
* if an I/O error occurs
*/
@Override
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
processRequest(request, response);
}
/**
* Handles the HTTP <code>POST</code> method.
*
* @param request
* servlet request
* @param response
* servlet response
* @throws ServletException
* if a servlet-specific error occurs
* @throws IOException
* if an I/O error occurs
*/
@Override
protected void doPost(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
processRequest(request, response);
}
/**
* Returns a short description of the servlet.
*
* @return a String containing servlet description
*/
@Override
public String getServletInfo() {
return "Short description";
}// </editor-fold>
private static final Color RESERVED_COLOR = Color.RED;
private static final Color SELECTED_COLOR = Color.BLUE;
private static final Color OWNED_COLOR = Color.GREEN;
private static final Color BORDER_COLOR = Color.BLACK;
private static final Color LOCKED_COLOR = Color.DARK_GRAY;
private static void drawPlace(Place p, Graphics2D g, EventUser user, boolean onlyFrame, boolean hilight) {
if (p.isDisabled()) {
return;
}
Color color = null;
if(!onlyFrame) {
if (!p.isBuyable()) {
logger.debug("Setting color as locked place.");
color = LOCKED_COLOR;
}
if (p.isReservedFor(user)) {
// logger.debug("Setting place selected {}", p);
color = SELECTED_COLOR;
} else if (user.equals(p.getCurrentUser())
|| (p.getGroup() != null && user.equals(p.getGroup().getCreator()))
|| (p.getPlaceReserver() != null && user.equals(p
.getPlaceReserver().getUser()))) {
color = OWNED_COLOR;
// logger.debug("Setting place owned {}", p);
} else if (p.isTaken()) {
color = RESERVED_COLOR;
// logger.debug("Setting place Reserved {}", p);
} else if (p.getProduct() != null && p.getProduct() != null && p.getProduct().getColor() != null && !p.getProduct().getColor().isEmpty()) {
try {
color = Color.decode(p.getProduct().getColor());
} catch (NumberFormatException x) {
logger.error("Cannot convert string {} to color.", p.getProduct().getColor());
}
} else {
// too much debugging -TKjne
// logger.debug("Nothing special for this place. Color should be default.");
}
}
if(hilight) {
color = OWNED_COLOR;
}
if (color != null) {
//logger.debug("Setting fill color: {} for p", color, p);
g.setColor(color);
g.fill(new Rectangle(p.getMapX()+1, p.getMapY()+1, p.getWidth()-1, p.getHeight()-1));
}
g.setColor(BORDER_COLOR);
g.draw(new Rectangle(p.getMapX(), p.getMapY(), p.getWidth(), p.getHeight()));
}
private static final Logger logger = LoggerFactory.getLogger(PlaceMapServlet.class);
private static final long serialVersionUID = 8769688627918936258L;
@EJB
private transient PlaceBeanLocal placeBean;
@EJB
private transient PermissionBeanLocal permbean;
@EJB
private transient LoggingBeanLocal loggerbean;
@EJB
private UserBeanLocal userBean;
@EJB
private BarcodeBeanLocal barcodeBean;
private static final String PARAMETER_EVENT_MAP_ID = "mapid";
private static final String PARAMETER_USER_ID = "userid";
private static final String PARAMETER_TOKEN = "token";
private static final String PARAMETER_DATE = "date";
/**
* Processes requests for both HTTP <code>GET</code> and <code>POST</code>
* methods.
*
* @param request servlet request
* @param response servlet response
* @throws ServletException if a servlet-specific error occurs
* @throws IOException if an I/O error occurs
*/
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
logger.debug("Begin processing request");
// response.setContentType("text/html;charset=UTF-8");
// PrintWriter out = response.getWriter();
ServletOutputStream ostream = null;
try {
// Integer placeId = getIntegerParameter(request,
// PARAMETER_SELECTED_PLACE_ID);
Integer mapId = getIntegerParameter(request, PARAMETER_EVENT_MAP_ID);
String timelapseDate = request.getParameter(PARAMETER_DATE);
EventMap map = placeBean.findMap(mapId);
logger.debug("Mapid: {}", mapId);
ostream = response.getOutputStream();
if (map == null || map.getMapData() == null) {
logger.warn("Error handling map {}!", map);
response.setStatus(HttpServletResponse.SC_NOT_FOUND);
ostream.print("Map error!");
return;
}
String[] splittype = map.getMimeType().split("/");
String type = "png";
if (splittype.length > 0) {
type = splittype[splittype.length - 1];
}
response.setContentType(map.getMimeType());
if (timelapseDate == null || timelapseDate.trim().isEmpty()) {
Integer userId = getIntegerParameter(request, PARAMETER_USER_ID);
String userToken = request.getParameter(PARAMETER_TOKEN);
EventUser user = null;
if (userToken != null) {
user = barcodeBean.getUserFromLongTextCode(userToken);
}
if (!permbean.hasPermission(MapPermission.VIEW) && user == null) {
loggerbean.sendMessage(MoyaEventType.USER_INSUFFICIENT_PERMISSIONS, permbean.getCurrentUser(),
"User tried to print the placemap to stream without sufficient permissions");
throw new EJBAccessException("Not enough permissions to print placemap");
}
// Find for user only with sufficient permissions
if (user != null && userId != 0 && permbean.hasPermission(UserPermission.VIEW_ALL)) {
user = userBean.findByUserId(userId, false);
}
printPlaceMapToStream(ostream, type, map, user);
} else {
Date date = ISODateTimeFormat.dateTime().parseDateTime(timelapseDate).toDate();
printTimelapseToStream(ostream, type, map, date );
}
ostream.flush();
} catch (EJBException e) {
logger.debug("Permission denied. Returning SC_FORBIDDEN!");
response.setContentType("text/html;charset=UTF-8");
response.setStatus(HttpServletResponse.SC_FORBIDDEN);
ostream = response.getOutputStream();
ostream.print("Error 403 \nPermission denied! Please login before accessing resource");
// e.printStackTrace();
} finally {
if (ostream != null) {
ostream.close();
}
}
}
private void printTimelapseToStream(OutputStream ostr, String filetype, EventMap map, Date date) throws IOException {
BufferedImage image = drawMap(map, new TimelapsePicker(date));
ImageIO.write(image, filetype, ostr);
}
private void printPlaceMapToStream(OutputStream outputStream, String filetype, EventMap map, EventUser user) throws IOException {
List<Place> userplaces = null;
if (user != null) {
userplaces = placeBean.findPlacePrintlistForUser(user);
}
// Yes this is is in correct order.
if (user == null) {
user = permbean.getCurrentUser();
}
BufferedImage image = drawMap(map, new LegacyColorPicker(user, userplaces));
ImageIO.write(image, filetype, outputStream);
}
private BufferedImage drawMap(EventMap map, PlaceColorPicker colorPicker) throws IOException {
BufferedImage image = ImageIO.read(new ByteArrayInputStream(map.getMapData()));
Graphics2D g2d = image.createGraphics();
for (Place place : map.getPlaces()) {
drawPlace(place, g2d, colorPicker);
}
return image;
}
/***
* Convert request parameter into integer
*
* @param request
* @param parameter
* @return
*/
private static Integer getIntegerParameter(HttpServletRequest request, String parameter) {
try {
String valueString = request.getParameter(parameter);
Integer value = Integer.parseInt(valueString);
return value;
} catch (NumberFormatException nfe) {
}
return null;
}
// <editor-fold defaultstate="collapsed"
// desc="HttpServlet methods. Click on the + sign on the left to edit the
// code.">
/**
* Handles the HTTP <code>GET</code> method.
*
* @param request servlet request
* @param response servlet response
* @throws ServletException if a servlet-specific error occurs
* @throws IOException if an I/O error occurs
*/
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
processRequest(request, response);
}
/**
* Handles the HTTP <code>POST</code> method.
*
* @param request servlet request
* @param response servlet response
* @throws ServletException if a servlet-specific error occurs
* @throws IOException if an I/O error occurs
*/
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
processRequest(request, response);
}
/**
* Returns a short description of the servlet.
*
* @return a String containing servlet description
*/
@Override
public String getServletInfo() {
return "Short description";
}// </editor-fold>
private static final Color RESERVED_COLOR = Color.RED;
private static final Color SELECTED_COLOR = Color.BLUE;
private static final Color OWNED_COLOR = Color.GREEN;
private static final Color BORDER_COLOR = Color.BLACK;
private static final Color LOCKED_COLOR = Color.DARK_GRAY;
private static interface PlaceColorPicker {
Color getColor(Place p);
}
public static class TimelapsePicker implements PlaceColorPicker {
private final Date date;
public TimelapsePicker(Date date) {
this.date = date;
}
@Override
public Color getColor(Place p) {
if (p.getReserverSlot() != null && date.after(p.getReserverSlot().getUsed())) {
return RESERVED_COLOR;
}
return null;
}
}
public static class LegacyColorPicker implements PlaceColorPicker {
private final EventUser user;
// private final boolean onlyFrame;
// private final boolean hilight;
private final List<Place> userplaces;
// public LegacyColorPicker(EventUser u, boolean onlyFrame, boolean
// hilight) {
// this.user = u;
// this.onlyFrame = onlyFrame;
// this.hilight = hilight;
// }
public LegacyColorPicker(EventUser user2, List<Place> userplaces) {
this.user = user2;
this.userplaces = userplaces;
}
public Color getColor(Place p) {
Color color = null;
// Check if we wan
if (userplaces == null) {
if (!p.isBuyable()) {
logger.debug("Setting color as locked place.");
color = LOCKED_COLOR;
}
if (p.isReservedFor(user)) {
// logger.debug("Setting place selected {}", p);
color = SELECTED_COLOR;
} else if (user.equals(p.getCurrentUser())
|| (p.getGroup() != null && user.equals(p.getGroup().getCreator()))
|| (p.getPlaceReserver() != null && user.equals(p.getPlaceReserver().getUser()))) {
color = OWNED_COLOR;
// logger.debug("Setting place owned {}", p);
} else if (p.isTaken()) {
color = RESERVED_COLOR;
// logger.debug("Setting place Reserved {}", p);
} else if (p.getProduct() != null && p.getProduct() != null && p.getProduct().getColor() != null
&& !p.getProduct().getColor().isEmpty()) {
try {
color = Color.decode(p.getProduct().getColor());
} catch (NumberFormatException x) {
logger.error("Cannot convert string {} to color.", p.getProduct().getColor());
}
} else {
// too much debugging -TKjne
// logger.debug("Nothing special for this place. Color
// should be default.");
}
} else if (userplaces.contains(p)) {
color = OWNED_COLOR;
}
return color;
}
}
;
private static void drawPlace(Place p, Graphics2D g, PlaceColorPicker colorPicker) {
if (p.isDisabled()) {
return;
}
Color color = colorPicker.getColor(p);
if (color != null) {
// logger.debug("Setting fill color: {} for p", color, p);
g.setColor(color);
g.fill(new Rectangle(p.getMapX() + 1, p.getMapY() + 1, p.getWidth() - 1, p.getHeight() - 1));
}
g.setColor(BORDER_COLOR);
g.draw(new Rectangle(p.getMapX(), p.getMapY(), p.getWidth(), p.getHeight()));
}
}
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!