PrintedCardFacade.java 4.5 KB
/*
 * Copyright Codecrew Ry
 * 
 * All rights reserved.
 * 
 * This license applies to any software containing a notice placed by the 
 * copyright holder. Such software is herein referred to as the Software. 
 * This license covers modification, distribution and use of the Software. 
 * 
 * Any distribution and use in source and binary forms, with or without 
 * modification is not permitted without explicit written permission from the 
 * copyright owner. 
 * 
 * A non-exclusive royalty-free right is granted to the copyright owner of the 
 * Software to use, modify and distribute all modifications to the Software in 
 * future versions of the Software. 
 * 
 */
package fi.codecrew.moya.facade;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;

import javax.ejb.EJB;
import javax.ejb.LocalBean;
import javax.ejb.Stateless;
import javax.persistence.TypedQuery;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;

import fi.codecrew.moya.beans.EventBeanLocal;
import fi.codecrew.moya.enums.CardState;
import fi.codecrew.moya.model.CardCode;
import fi.codecrew.moya.model.CardCode_;
import fi.codecrew.moya.model.CardTemplate_;
import fi.codecrew.moya.model.EventUser;
import fi.codecrew.moya.model.LanEvent;
import fi.codecrew.moya.model.PrintedCard;
import fi.codecrew.moya.model.PrintedCard_;

@Stateless
@LocalBean
public class PrintedCardFacade extends IntegerPkGenericFacade<PrintedCard> {

	public PrintedCardFacade() {

		super(PrintedCard.class);
	}

	@EJB
	private EventBeanLocal eventbean;

	public PrintedCard findByCode(String code) {

		CriteriaBuilder cb = getEm().getCriteriaBuilder();
		CriteriaQuery<CardCode> cq = cb.createQuery(CardCode.class);
		Root<CardCode> root = cq.from(CardCode.class);

		cq.where(cb.equal(root.get(CardCode_.code), code),
				cb.equal(root.get(CardCode_.event), eventbean.getCurrentEvent()));

		CardCode cardcode = getSingleNullableResult(getEm().createQuery(cq));

		return (cardcode == null) ? null : cardcode.getPrintedCard();
	}

	public List<PrintedCard> findAllEnabled(LanEvent currentEvent) {

		CriteriaBuilder cb = getEm().getCriteriaBuilder();
		CriteriaQuery<PrintedCard> cq = cb.createQuery(PrintedCard.class);
		Root<PrintedCard> root = cq.from(PrintedCard.class);
		cq.where(cb.isTrue(root.get(PrintedCard_.enabled)),
				cb.equal(root.get(PrintedCard_.event), eventbean.getCurrentEvent()));

		return getEm().createQuery(cq).getResultList();

	}

	public List<PrintedCard> getCards(EventUser user) {
		CriteriaBuilder cb = getEm().getCriteriaBuilder();
		CriteriaQuery<PrintedCard> cq = cb.createQuery(PrintedCard.class);
		Root<PrintedCard> root = cq.from(PrintedCard.class);
		cq.where(cb.equal(root.get(PrintedCard_.user), user),
				cb.equal(root.get(PrintedCard_.event), eventbean.getCurrentEvent()));

		cq.orderBy(cb.asc(root.get(PrintedCard_.template).get(CardTemplate_.power)));
		return getEm().createQuery(cq).getResultList();

	}

	public PrintedCard findLatestByCodeFromAny(String code) {

		CriteriaBuilder cb = getEm().getCriteriaBuilder();
		CriteriaQuery<PrintedCard> cq = cb.createQuery(PrintedCard.class);
		Root<CardCode> root = cq.from(CardCode.class);
		cq.select(root.get(CardCode_.printedCard));

		cq.where(cb.equal(root.get(CardCode_.code), code));

		cq.orderBy(cb.desc(root.get(CardCode_.printedCard).get(PrintedCard_.printTime)));
		TypedQuery<PrintedCard> q = getEm().createQuery(cq);
		q.setMaxResults(1);

		return getSingleNullableResult(q);

	}

	public List<PrintedCard> findByState(CardState... state) {
		CriteriaBuilder cb = getEm().getCriteriaBuilder();
		CriteriaQuery<PrintedCard> cq = cb.createQuery(PrintedCard.class);
		Root<PrintedCard> root = cq.from(PrintedCard.class);

		List<Predicate> preds = new ArrayList<Predicate>();

		preds.add(cb.equal(root.get(PrintedCard_.event), eventbean.getCurrentEvent()));

		if (state.length > 0) {
			preds.add(root.get(PrintedCard_.cardState).in(Arrays.asList(state)));
		}

		preds.add(cb.equal(root.get(PrintedCard_.enabled), true));

		cq.where(preds.toArray(new Predicate[preds.size()]));
		cq.orderBy(cb.asc(root.get(PrintedCard_.user)), cb.asc(root.get(PrintedCard_.template).get(CardTemplate_.power)));

		List<PrintedCard> pcl = getEm().createQuery(cq).getResultList();

		HashMap<Integer, PrintedCard> pch = new HashMap<>();
		for (PrintedCard pc : pcl) {
			pch.put(pc.getUser().getId(), pc);
		}

		return new ArrayList<PrintedCard>(pch.values());

	}
}