EventUserFacade.java 6.97 KB
package fi.insomnia.bortal.facade;

import java.util.ArrayList;
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.From;
import javax.persistence.criteria.Root;

import fi.insomnia.bortal.beans.EventBeanLocal;
import fi.insomnia.bortal.enums.DatabaseHasCompare;
import fi.insomnia.bortal.enums.DatabaseValueCompare;
import fi.insomnia.bortal.facade.callbacks.EventLimiter;
import fi.insomnia.bortal.facade.callbacks.EventUserAccountSaldoPredicate;
import fi.insomnia.bortal.facade.callbacks.EventUserPlacegroupPredicate;
import fi.insomnia.bortal.facade.callbacks.EventUserRolefilter;
import fi.insomnia.bortal.facade.callbacks.EventUserSearchPredicate;
import fi.insomnia.bortal.facade.callbacks.FacadeCallback;
import fi.insomnia.bortal.facade.callbacks.OrderCallback;
import fi.insomnia.bortal.model.EventUser;
import fi.insomnia.bortal.model.EventUser_;
import fi.insomnia.bortal.model.PrintedCard;
import fi.insomnia.bortal.model.PrintedCard_;
import fi.insomnia.bortal.model.User;
import fi.insomnia.bortal.model.User_;
import fi.insomnia.bortal.util.UserSearchQuery;
import fi.insomnia.bortal.utilities.SearchResult;

/**
 * Session Bean implementation class EventUserFacade
 */
@Stateless
@LocalBean
public class EventUserFacade extends IntegerPkGenericFacade<EventUser> {

	@EJB
	private EventBeanLocal eventBean;

	public EventUserFacade() {
		super(EventUser.class);
	}

	public EventUser findByLogin(String login) {
		CriteriaBuilder cb = getEm().getCriteriaBuilder();
		CriteriaQuery<EventUser> cq = cb.createQuery(EventUser.class);
		Root<EventUser> root = cq.from(EventUser.class);
		cq.where(
				cb.equal(root.get(EventUser_.user).get(User_.login), login),
				cb.equal(root.get(EventUser_.event),
						eventBean.getCurrentEvent()));

		return getSingleNullableResult(getEm().createQuery(cq));
	}

	public EventUser find(User user) {
		CriteriaBuilder cb = getEm().getCriteriaBuilder();
		CriteriaQuery<EventUser> cq = cb.createQuery(EventUser.class);
		Root<EventUser> root = cq.from(EventUser.class);
		cq.where(
				cb.equal(root.get(EventUser_.user), user),
				cb.equal(root.get(EventUser_.event),
						eventBean.getCurrentEvent()));

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

	}

	public List<EventUser> findAll() {
		CriteriaBuilder cb = getEm().getCriteriaBuilder();
		CriteriaQuery<EventUser> cq = cb.createQuery(EventUser.class);
		Root<EventUser> root = cq.from(EventUser.class);
		cq.where(cb.equal(root.get(EventUser_.event),
				eventBean.getCurrentEvent()));
		return getEm().createQuery(cq).getResultList();
	}

	public EventUser findByBarcode(String barcode) {
		CriteriaBuilder cb = getEm().getCriteriaBuilder();
		CriteriaQuery<EventUser> cq = cb.createQuery(EventUser.class);
		Root<PrintedCard> root = cq.from(PrintedCard.class);
		cq.select(root.get(PrintedCard_.user));
		cq.where(
				cb.equal(root.get(PrintedCard_.barcode), barcode),
				cb.equal(root.get(PrintedCard_.event), eventBean.getCurrentEvent())
				);
		return getSingleNullableResult(getEm().createQuery(cq));

	}

	public SearchResult<EventUser> searchEventUsers(UserSearchQuery query) {
		ArrayList<FacadeCallback<EventUser>> callbacks = new ArrayList<FacadeCallback<EventUser>>();
		callbacks.add(new OrderCallback<EventUser>(false, EventUser_.id));
		callbacks.add(new EventLimiter(eventBean.getCurrentEvent()));
		if (query.getSearch() != null && !query.getSearch().isEmpty())
		{
			callbacks.add(new EventUserSearchPredicate(query.getSearch(), UserFacade.getAttrlist()));
		}
		if (query.isPlaceAssoc())
		{
			callbacks.add(new EventUserPlacegroupPredicate());
		}
		if (query.getFilterRoles() != null && !query.getFilterRoles().isEmpty()) {
			callbacks.add(new EventUserRolefilter(query.getFilterRoles()));
		}
		if (query.getAccountSaldo() != null &&
				query.getAccountSaldoCompare() != null &&
				!DatabaseValueCompare.NONE.equals(query.getAccountSaldoCompare()))
		{
			callbacks.add(new EventUserAccountSaldoPredicate(query.getAccountSaldo(), query.getAccountSaldoCompare()));
		}
		if (query.getRequireImage() != null && !query.getRequireImage().equals(DatabaseHasCompare.NONE))
		{

		}

		CriteriaBuilder cb = getEm().getCriteriaBuilder();

		CriteriaQuery<EventUser> listCQuery = cb.createQuery(EventUser.class);
		CriteriaQuery<Long> countCQuery = cb.createQuery(Long.class);

		From<?, EventUser> listRoot = searchCallbacks(listCQuery, callbacks, EventUser.class);
		From<?, EventUser> countRoot = searchCallbacks(countCQuery, callbacks, EventUser.class);

		listCQuery.select(listRoot);
		countCQuery.select(cb.count(countRoot));

		TypedQuery<Long> countQ = getEm().createQuery(countCQuery);
		TypedQuery<EventUser> listQ = getEm().createQuery(listCQuery);

		if (query.getPagesize() > 0) {
			listQ.setFirstResult(query.getPage() * query.getPagesize());
			listQ.setMaxResults(query.getPagesize());
		}
		return new SearchResult<EventUser>(listQ.getResultList(), countQ.getSingleResult());

	}

	// private Predicate addAcPredicate(CriteriaBuilder cb, UserSearchQuery
	// query, Root<AccountEvent> root) {
	// Expression<BigDecimal> sum =
	// cb.sum(cb.prod(root.get(AccountEvent_.unitPrice),
	// root.get(AccountEvent_.quantity)));
	// Predicate ret = null;
	// switch (query.getAccountSaldoCompare())
	// {
	// case EQ:
	// ret = cb.equal(sum, query.getAccountSaldo());
	// break;
	// case GE:
	// ret = cb.ge(sum, query.getAccountSaldo());
	// break;
	// case GT:
	// ret = cb.gt(sum, query.getAccountSaldo());
	// break;
	// case LE:
	// ret = cb.le(sum, query.getAccountSaldo());
	// break;
	// case LT:
	// ret = cb.lt(sum, query.getAccountSaldo());
	// break;
	// default:
	// throw new EJBException("Unknown account saldo comparer: " +
	// query.getAccountSaldoCompare());
	//
	// }
	// return ret;
	// }
	// public SearchResult<EventUser> searchUser(int page, int pagesize, String
	// sort, String search) {
	//
	// List<FacadeCallback<EventUser>> callbacks = new
	// ArrayList<FacadeCallback<EventUser>>();
	// if (sort == null || sort.isEmpty()) {
	// callbacks.add(new OrderCallback<EventUser>(false, EventUser_.id));
	// } else {
	// callbacks.add(new OrderCallback<EventUser>(false, sort));
	// }
	//
	// if (search == null || search.isEmpty()) {
	// callbacks.add(new EventUserEventlimiter(eventBean.getCurrentEvent()));
	// }
	// callbacks.add(new EventUserSearchCreator(search,
	// UserFacade.getAttrlist()));
	// return super.searcher(page, pagesize, callbacks);
	//
	// // return this.search(page, pagesize, query, NAMEFIELDS, sort);
	// }
	//
	// public class EventUserEventlimiter implements FacadeCallback<EventUser> {
	//
	// private LanEvent ev;
	//
	// public EventUserEventlimiter(LanEvent currentEvent) {
	// ev = currentEvent;
	// }
	//
	// @Override
	// public void exec(CriteriaBuilder cb, CriteriaQuery<?> cq, Path<EventUser>
	// root, List<Predicate> predicates) {
	// predicates.add(cb.equal(root.get(EventUser), ev));
	// }
	// }

}