CardTemplateBean.java 7.04 KB
package fi.insomnia.bortal.beans;

import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import javax.annotation.security.DeclareRoles;
import javax.annotation.security.RolesAllowed;
import javax.ejb.EJB;
import javax.ejb.LocalBean;
import javax.ejb.Stateless;
import javax.imageio.ImageIO;

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

import fi.insomnia.bortal.enums.apps.UserPermission;
import fi.insomnia.bortal.facade.CardTemplateFacade;
import fi.insomnia.bortal.facade.EventUserFacade;
import fi.insomnia.bortal.facade.GroupMembershipFacade;
import fi.insomnia.bortal.facade.LanEventPropertyFacade;
import fi.insomnia.bortal.facade.PrintedCardFacade;
import fi.insomnia.bortal.model.CardTemplate;
import fi.insomnia.bortal.model.EventUser;
import fi.insomnia.bortal.model.LanEvent;
import fi.insomnia.bortal.model.LanEventProperty;
import fi.insomnia.bortal.model.LanEventPropertyKey;
import fi.insomnia.bortal.model.PrintedCard;
import fi.insomnia.bortal.model.Role;
import fi.insomnia.bortal.util.MailMessage;

/**
 * Session Bean implementation class CardTemplateBean
 */
@Stateless
@LocalBean
@DeclareRoles({ UserPermission.S_WRITE_ROLES })
public class CardTemplateBean implements CardTemplateBeanLocal {

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

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

	@EJB
	private CardTemplateFacade cdFacade;

	@EJB
	private EventBeanLocal eventBean;
	// @EJB
	// private UserBeanLocal userbean;
	@EJB
	private PrintedCardFacade printedcardfacade;
	@EJB
	private UtilBeanLocal mailbean;

	@EJB
	private EventUserFacade eventUserFacade;

	@EJB
	private UserBeanLocal userbean;

	@EJB
	private LanEventPropertyFacade eventPropertyFacade;
	@EJB
	private GroupMembershipFacade gmFacade;

	// @Override
	// @RolesAllowed("USER_MANAGEMENT/WRITE")
	// public List<CardTemplate> findAll() {
	// return cdFacade.findAll(eventBean.getCurrentEvent());
	// }

	@Override
	@RolesAllowed(UserPermission.S_WRITE_ROLES)
	public void create(CardTemplate card) {

		LanEvent currEv = eventBean.getCurrentEvent();
		if (currEv.getCardTemplates() == null)
		{
			currEv.setCardTemplates(new ArrayList<CardTemplate>());
		}
		card.setEvent(currEv);
		currEv.getCardTemplates().add(card);
	}

	@Override
	@RolesAllowed(UserPermission.S_WRITE_ROLES)
	public CardTemplate find(Integer id) {
		return cdFacade.find(id);
	}

	@Override
	public void checkAllUsersCardRights() {
		for (EventUser u : eventUserFacade.findAll()) {
			checkPrintedCard(u);
		}
	}

	/**
	 * Checks users printed card roles and return the biggestCard
	 * 
	 * @throws PermissionDeniedException
	 */
	@Override
	public PrintedCard checkPrintedCard(EventUser user) {
		logger.info("Checking printed card");

		user = eventUserFacade.find(user.getId());

		LanEvent currEvent = eventBean.getCurrentEvent();
		List<PrintedCard> myCards = printedcardfacade.getCards(user);

		PrintedCard biggestCard = null;
		PrintedCard smallestCard = null;
		for (PrintedCard card : myCards) {
			logger.info("Checking card {}", card);
			if (card.getEnabled()) {
				if (biggestCard == null || biggestCard.getTemplate().getPower() < card.getTemplate().getPower()) {
					biggestCard = card;
				}
				if (smallestCard == null || smallestCard.getTemplate().getPower() > card.getTemplate().getPower()) {
					smallestCard = card;
				}
			}
		}

		CardTemplate roleCard = getUsersCardtype(user);

		int existingPower = -999;
		int newPower = -999;
		if (roleCard != null) {
			newPower = roleCard.getPower();
		}
		if (biggestCard != null) {
			existingPower = biggestCard.getTemplate().getPower();
		}

		if (existingPower < newPower) {

			if (biggestCard != null) {
				biggestCard.setEnabled(false);
				// biggestCard = printedcardfacade.merge(biggestCard);
			}
			PrintedCard pc = new PrintedCard();
			pc.setEvent(currEvent);
			pc.setTemplate(roleCard);
			pc.setUser(user);

			user.getPrintedCards().add(pc);
			// printedcardfacade.create(pc);
			biggestCard = pc;
			logger.info("User {} has too little power old role {} New role {}", new Object[] { user.getUser().getLogin(), existingPower, newPower });
		} else if (existingPower > newPower) {
			MailMessage msg = new MailMessage();
			LanEventProperty value = eventPropertyFacade.find(eventBean.getCurrentEvent(), LanEventPropertyKey.ADMIN_MAIL);
			if (value != null && value.getTextvalue() != null && !value.getTextvalue().isEmpty())
			{

				msg.setFromAddress(value.getTextvalue());
				msg.setFromName("Lippukauppa");
				msg.setToAddress(value.getTextvalue());
				msg.setSubject("User " + user.getUser().getLogin() + " has too powerful card!");
				msg.setMessage("User ", user.getUser().getLogin(), "has too powerful card!\nCurrent power ", existingPower, ". Should be ", newPower, "\n\n-- \nLippukauppa");
				mailbean.sendMail(msg);
				logger.info("User {} has too much power old role {} New role {}", new Object[] { user.getUser().getLogin(), existingPower, newPower });
			}
		} else {
			logger.info("User {} has power {} and roles has power {}", new Object[] { user.getUser().getLogin(), existingPower, newPower });
		}
		return biggestCard;

	}

	@Override
	@RolesAllowed(UserPermission.S_VIEW_ALL)
	public CardTemplate getUsersCardtype(EventUser user) {

		List<Role> roles = userbean.findUsersRoles(user);

		CardTemplate greatestTemplate = null;
		for (Role listrole : roles) {
			logger.info("Checking role {}", listrole);
			if (greatestTemplate == null || (listrole.getCardTemplate() != null && greatestTemplate.getPower() < listrole.getCardTemplate().getPower())) {
				greatestTemplate = listrole.getCardTemplate();
			}

		}
		return greatestTemplate;

	}

	// @Override
	// public PrintedCard setRfidUid(String tag, EventUser user) {
	// PrintedCard ct = checkPrintedCard(user);
	// return setRfidUid(tag, ct);
	// }

	// @Override
	// public PrintedCard setRfidUid(String tag, PrintedCard card) {
	// card.setRfidUid(tag);
	// return printedcardfacade.merge(card);
	// }

	@Override
	@RolesAllowed(UserPermission.S_WRITE_ROLES)
	public List<PrintedCard> findActiveCards() {
		return this.printedcardfacade.findAllEnabled(eventBean.getCurrentEvent());
	}

	@RolesAllowed(UserPermission.S_WRITE_ROLES)
	@Override
	public CardTemplate save(CardTemplate card) {
		return cdFacade.merge(card);

	}

	@Override
	public PrintedCard getCard(Integer id) {
		return printedcardfacade.find(id);
	}

	@Override
	public List<PrintedCard> getCards(EventUser user) {
		return printedcardfacade.getCards(user);
	}

	@Override
	public CardTemplate saveImage(CardTemplate cardTemplate, byte[] bytes) throws IOException {
		cardTemplate = cdFacade.find(cardTemplate.getId());

		BufferedImage base = ImageIO.read(new ByteArrayInputStream(bytes));
		ByteArrayOutputStream ostr = new ByteArrayOutputStream();
		ImageIO.write(base, "jpeg", ostr);

		cardTemplate.setImage(ostr.toByteArray());
		return cardTemplate;
	}

	@Override
	public List<CardTemplate> findAll() {
		return cdFacade.findAll();
	}
}