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

import java.util.Calendar;
import java.util.List;

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

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

import fi.insomnia.bortal.facade.PrintedCardFacade;
import fi.insomnia.bortal.facade.ReaderEventFacade;
import fi.insomnia.bortal.facade.ReaderFacade;
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 PrintedCardFacade cardfacade;
	@EJB
	private CardTemplateBeanLocal cardtemplatebean;
	@EJB
	private ReaderEventFacade readerEventFacade;

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

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

		PrintedCard card = cardfacade.findByRfid(tag);
		Reader reader = readerfacade.findOrCreateByIdent(readerIdent);

		// RfidEvent revent = reventcontainer.foundTag(reader, tag);
		List<ReaderEvent> lastevents = readerEventFacade.findLastEvents(reader, 1);
		ReaderEvent ret = null;
		if (!lastevents.isEmpty())
		{
			ReaderEvent lastevent = lastevents.get(0);
			if (card == null)
			{
				if (lastevent.getPrintedCard() == null && tag.equals(lastevent.getValue()))
				{
					ret = lastevent;
				}

			} else if (card.equals(lastevent.getPrintedCard())) {
				ret = lastevent;
			}

		}

		if (ret == null)
		{
			ret = createReaderEvent(reader, card);
		} else {
			ret.setUpdatetime(Calendar.getInstance());
		}
		if (card == null)
		{
			ret.setValue(tag);
		}
		return ret;
		//
		// if (revent.getEvent() != null) {
		// ret = readerEventFacade.find(revent.getEvent().getId());
		// revent.setEvent(ret);
		// }
		// else if (card != null) {
		//
		// revent.setEvent(ret);
		// }
		//
		// 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());
	//
	// Reader reader = readerfacade.findOrCreateByIdent(readerIdent);
	//
	// return createReaderEvent(reader, card);
	//
	// }

	private ReaderEvent createReaderEvent(Reader reader, PrintedCard card) {

		ReaderEvent ret = new ReaderEvent(Calendar.getInstance(), card, reader);

		Integer gamepoints = reader.getGamepoints();

		if (gamepoints > 0 && card != null) {
			int awardedCount = 0;

			for (ReaderEvent oldRe : reader.getEvents()) {
				if (oldRe.getGamePoint() > 0)
				{
					++awardedCount;

					// User has been already awarded points from this reader.
					// Not awarding again...
					if (oldRe.getPrintedCard().equals(card)) {
						gamepoints = 0;
						break;
					}
				}
			}
			// if points can be awarded only limited times...
			if (reader.getMaxEvents() > 0 && reader.getMaxEvents() > awardedCount) {
				gamepoints = 0;
			}

		}

		ret.setGamePoint(gamepoints);

		reader.getEvents().add(ret);
		if (card != null)
		{
			card.getReaderEvents().add(ret);
		}

		return ret;
	}

	@Override
	public ReaderEvent assocTagToCard(String tag, String readerIdent, PrintedCard card) {

		Reader reader = readerfacade.findOrCreateByIdent(readerIdent);

		card = cardtemplatebean.setRfidUid(tag, card);

		return createReaderEvent(reader, card);
	}

	@Override
	public List<Reader> getReaders() {
		return readerfacade.findAllForEvent();
	}

	@Override
	public List<ReaderEvent> getReaderEvents(Integer readerId) {
		Reader reader = readerfacade.find(readerId);
		return readerEventFacade.findLastEvents(reader, 20);
	}

}