PlaceMapBean.java 4.51 KB
package fi.insomnia.bortal.beans;

import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.ejb.EJB;
import javax.ejb.Stateless;
import javax.imageio.ImageIO;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import fi.insomnia.bortal.enums.Permission;
import fi.insomnia.bortal.enums.RolePermission;
import fi.insomnia.bortal.exceptions.PermissionDeniedException;
import fi.insomnia.bortal.facade.EventMapFacade;
import fi.insomnia.bortal.facade.PlaceFacade;
import fi.insomnia.bortal.model.EventMap;
import fi.insomnia.bortal.model.Place;
import fi.insomnia.bortal.model.PlaceGroup;
import fi.insomnia.bortal.model.User;

/**
 * Session Bean implementation class PlaceMapBean
 */
@Stateless
public class PlaceMapBean implements PlaceMapBeanLocal {

    private static final Logger logger = LoggerFactory.getLogger(PlaceMapBean.class);

    /**
     * Default constructor.
     */
    public PlaceMapBean() {
        // TODO Auto-generated constructor stub
    }

    @EJB
    private PlaceFacade placeFacade;
    @EJB
    // private EventMapBean eventmapBean;
    private EventMapFacade eventMapFacade;
    @EJB
    private SecurityBeanLocal secubean;
    @EJB
    private UserBeanLocal userbean;
    @EJB
    private EventBeanLocal eventbean;

    public void printPlaceMapToStream(OutputStream outputStream, String filetype, Integer mapId, List<Integer> placeIds) throws IOException {

        User user = userbean.getCurrentUser();
        userbean.fatalPermission(Permission.TICKET_SALES, RolePermission.READ, "User tried to print the placemap to Stream");

        long begin = new Date().getTime();
        Integer eventId = eventbean.getCurrentEvent().getId();

        List<Place> selectedPlaceList = new ArrayList<Place>();

        EventMap map = null;

        for (Integer id : placeIds) {
            selectedPlaceList.add(placeFacade.find(eventId, id));
        }
        if (logger.isDebugEnabled()) {
            logger.debug("Fetching map for event {}", eventbean.getCurrentEvent());
            logger.debug("Got mapid {}, time {}", mapId, new Date().getTime() - begin);
        }

        logger.debug("SelectedPlaceList: {}, size {}", selectedPlaceList, selectedPlaceList.size());
        if (selectedPlaceList.size() > 0) {
            Place selPlace = selectedPlaceList.get(0);
            logger.debug("Selected place: {}", selPlace);
            map = selPlace.getMap();
        } else {
            logger.debug("Fetching from EventMapFacade with eventid {}, mapid {}", eventId, mapId);
            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();

        logger.info("Places: from map {}, time {}", places.size(), new Date().getTime() - begin);

        BufferedImage image = map.getMapWithPlaces();
        for (PlaceGroup uplacegroup : user.getPlaceGroups()) {
            for (Place uplace : uplacegroup.getPlaces()) {
                if (uplace.getMap().equals(map)) {
                    uplace.drawOwnedPlace(image);
                }
            }
        }

        logger.debug("sometime {}", new Date().getTime() - begin);
        for (Place place : selectedPlaceList) {
            place.drawSelectedPlace(image);
        }

        logger.debug("Prewrite {}", new Date().getTime() - begin);
        ImageIO.write(image, filetype, outputStream);

        logger.debug("postwrite {}", new Date().getTime() - begin);

    }

    public String getSelectPlaceMapUrl(EventMap activeMap, List<Place> selectedPlaces, User user) {

        String parameters = "?";

        if (selectedPlaces != null && selectedPlaces.size() > 0) {
            parameters += "placeid=";

            for (Place place : selectedPlaces) {
                parameters += place.getId().getId() + ",";
            }

            if (parameters.endsWith(",")) {
                parameters.substring(parameters.length() - 1);
            }

        } else {
            parameters += "mapid=" + activeMap.getId().getId();
        }

        if (user != null) {
            parameters += "&userid=" + user.getId();
        }

        return "/PlaceMap" + parameters;
    }

    public long selectablePlaceCount(User user) {
        return placeFacade.count(eventbean.getCurrentEvent());
    }
}