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

import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.regex.Pattern;

import javax.ejb.EJB;
import javax.ejb.EJBAccessException;
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.AccountEvent;
import fi.insomnia.bortal.model.CardTemplate;
import fi.insomnia.bortal.model.EventUser;
import fi.insomnia.bortal.model.PrintedCard;
import fi.insomnia.bortal.model.Reader;
import fi.insomnia.bortal.model.ReaderEvent;
import fi.insomnia.bortal.model.User;

/**
 * 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;
	@EJB
	private EventBeanLocal eventbean;
	@EJB
	private UserBeanLocal userbean;
	@EJB
	private CardTemplateBean cardTemplateBean;
	@EJB
	private ProductPBean productPBean;

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

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

		tag = tag.replace("\"\b", "");
		if (Pattern.matches("^.*000000$", tag))
		{
			tag = tag.replace("000000", "");
		}
		StringBuilder sb = new StringBuilder(tag);
		while (sb.length() < 16)
		{
			sb.insert(0, "0");
		}
		tag = sb.toString();

		PrintedCard card = cardfacade.findByRfid(tag);
		Reader reader = readerfacade.findOrCreateByIdent(readerIdent);
		logger.info("reader {}, card {}", reader, card);
		// RfidEvent revent = reventcontainer.foundTag(reader, tag);

		List<ReaderEvent> lastevents = readerEventFacade.findLastEvents(reader, 1);
		ReaderEvent ret = null;

		if (!lastevents.isEmpty() && !reader.isAutoproduct())
		{
			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);
			logger.debug("Got reader autoproduct {} with count {}", reader.getAutomaticProduct(), reader.getAutomaticProductCount());
			logger.debug("ret {}, card, {} autoproduct {}", new Object[] { ret, card, reader.isAutoproduct() });
			if (ret != null && card != null && reader.isAutoproduct()) {
				EventUser eu = userbean.getEventUser(card.getUser().getUser());
				AccountEvent createAc = productPBean.createAccountEvent(reader.getAutomaticProduct(), reader.getAutomaticProductCount(), eu, Calendar.getInstance());
				readerfacade.flush();
				logger.info("Creating new accountevent from autoproduct {}", createAc);
				ret.setNotes("Created automatic account event from reader. " + createAc);
			}

		} else {
			ret.setUpdatetime(new Date());
		}
		if (card == null)
		{
			ret.setValue(tag);
		}
		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 = cardfacade.reload(card);
		card.setRfidUid(tag);
		// 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);
	}

	@Override
	public ReaderEvent getEvent(Integer eventid) {
		ReaderEvent ret = readerEventFacade.find(eventid);
		if (!ret.getReader().getEvent().equals(eventbean.getCurrentEvent()))
		{
			ret = null;
		}
		return ret;
	}

	@Override
	public User findTagFromAnyEvent(String value) {
		PrintedCard card = cardfacade.findLatestByRfidFromAny(value);
		User ret = null;
		if (card != null && card.getUser() != null) {
			ret = card.getUser().getUser();
		}

		return ret;
	}

	@Override
	public ReaderEvent createCard(ReaderEvent event, EventUser user) {
		ReaderEvent ret = null;
		logger.info("Trying to create card for event {} with printed card {}", event, event.getPrintedCard());

		if (event.getPrintedCard() == null)
		{
			CardTemplate ct = cardTemplateBean.getUsersCardtype(user);
			logger.info("Card template {}", ct);
			if (ct == null)
			{
				return null;
			}
			PrintedCard card = new PrintedCard(user, ct, null, true);
			card.setRfidUid(event.getValue());
			cardfacade.create(card);

			ret = new ReaderEvent(Calendar.getInstance(), card, event.getReader());
			card.getReaderEvents().add(event);
			ret.setNotes("User associated to a card");

		}
		return ret;
	}

	@Override
	public Reader getReader(Integer readerid) {
		return readerfacade.findReader(readerid);
	}

	@Override
	public Reader saveReader(Reader reader) {
		if (!eventbean.getCurrentEvent().equals(reader.getEvent())) {
			throw new EJBAccessException("Trying to save reader from wrong event");
		}
		return readerfacade.merge(reader);
	}
}