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

import java.util.Calendar;

import javax.annotation.security.DeclareRoles;
import javax.annotation.security.RolesAllowed;
import javax.ejb.EJB;
import javax.ejb.Stateless;

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

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
@DeclareRoles("GAME/EXECUTE")
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;
	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(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, PermissionDeniedException {

		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(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
	@RolesAllowed("GAME/EXECUTE")
	public ReaderEvent merge(ReaderEvent e) {
		return readerEventFacade.merge(e);
	}
}