ReaderBean.java 4.12 KB
package fi.insomnia.bortal.beans;

import java.util.Calendar;

import javax.ejb.EJB;
import javax.ejb.Stateless;

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.BortalCatchableException;
import fi.insomnia.bortal.facade.GroupMembershipFacade;
import fi.insomnia.bortal.facade.PrintedCardFacade;
import fi.insomnia.bortal.facade.ReaderEventFacade;
import fi.insomnia.bortal.facade.ReaderFacade;
import fi.insomnia.bortal.model.GroupMembership;
import fi.insomnia.bortal.model.LanEvent;
import fi.insomnia.bortal.model.PrintedCard;
import fi.insomnia.bortal.model.Reader;
import fi.insomnia.bortal.model.ReaderEvent;

/**
 * Session Bean implementation class ReaderBean
 */
@Stateless
public class ReaderBean implements ReaderBeanLocal {

    @EJB
    private ReaderFacade readerfacade;
    @EJB
    private EventBeanLocal eventbean;
    @EJB
    private PrintedCardFacade cardfacade;
    @EJB
    private ReaderEventFacade readerEventFacade;
    @EJB
    private GroupMembershipFacade gmfacade;
    @EJB
    private CardTemplateBeanLocal cardtemplatebean;
    @EJB
    private UserBeanLocal userbean;
    private static final Logger logger = LoggerFactory.getLogger(ReaderBean.class);

    @Override
    public ReaderEvent checkTag(String ident, String tag, String hash) {

        LanEvent ev = eventbean.getCurrentEvent();
        PrintedCard card = cardfacade.findByRfid(ev, tag);
        ReaderEvent ret = null;
        logger.debug("Found card by rfid: {}", card);
        if (card != null) {

            ret = createReaderEvent(ident, card);

        }

        return ret;
    }

    @Override
    public ReaderEvent assocTagToPlacecode(String tag, String readerIdent, String placecode) throws BortalCatchableException {

        GroupMembership gm = gmfacade.findByToken(placecode);
        if (gm == null) {
            throw new BortalCatchableException("Token" + placecode + " not found!", "readerbean.tokenNotFound");
        }
        if (gm.getUser() == null) {
            throw new BortalCatchableException("Token " + placecode + "found but not assoc to user!", "readerbean.userNotAssociateToMembership");
        }

        PrintedCard card = cardtemplatebean.setRfidUid(tag, gm.getUser());

        return createReaderEvent(readerIdent, card);

    }

    private ReaderEvent createReaderEvent(String readerIdent, PrintedCard card) {

        LanEvent ev = eventbean.getCurrentEvent();

        Reader reader = readerfacade.findOrCreateByIdent(ev, readerIdent);
        logger.debug("Creating new readerevent for reader {} and events {}", reader, reader.getMaxEvents());
        logger.debug("maxevents for reder {}. readerevents at the moment {}", reader.getMaxEvents(), reader.getEvents().size());
        if (reader.getMaxEvents() > 0 && reader.getMaxEvents() <= reader.getEvents().size()) {
            logger.debug("Max events {} found. returning null");
            return null;
        }
        if (reader.getGamepoints() > 0 && card.getUser() != null) {
            logger.debug("Checking if user has been here");

            for (ReaderEvent oldRe : card.getReaderEvents()) {

                if (oldRe.getReader().getId().equals(reader.getId())) {
                    logger.debug("Found already an event for user! returning null");
                    return null;
                }
            }
        }
        ReaderEvent ret = new ReaderEvent(ev, Calendar.getInstance(), card, reader);
        ret.setGamePoint(reader.getGamepoints());
        ret.setReader(reader);
        reader.getEvents().add(ret);
        card.getReaderEvents().add(ret);
        cardfacade.merge(card);

        return ret;
    }

    @Override
    public ReaderEvent assocTagToCard(String tag, String readerIdent, PrintedCard card) {
        card = cardtemplatebean.setRfidUid(tag, card);

        return createReaderEvent(readerIdent, card);
    }

    @Override
    public ReaderEvent merge(ReaderEvent e) {
        userbean.fatalPermission(Permission.GAME, RolePermission.EXECUTE, "Tried to change readerevent");
        return readerEventFacade.merge(e);
    }
}