PlaceFacade.java 3.57 KB
package fi.insomnia.bortal.facade;

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

import javax.ejb.LocalBean;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.TypedQuery;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Path;
import javax.persistence.criteria.Root;

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

import fi.insomnia.bortal.model.EventMap;
import fi.insomnia.bortal.model.EventMap_;
import fi.insomnia.bortal.model.LanEvent;
import fi.insomnia.bortal.model.Place;
import fi.insomnia.bortal.model.Place_;
import fi.insomnia.bortal.model.User;

@Stateless
@LocalBean
public class PlaceFacade extends IntegerPkGenericFacade<Place> {

	private static final Logger logger = LoggerFactory.getLogger(PlaceFacade.class);
	@PersistenceContext
	private EntityManager em;

	public PlaceFacade() {
		super(Place.class);
	}

	@Override
	protected EntityManager getEm() {
		return em;
	}

	public void timeoutPlaces() {
		CriteriaBuilder cb = getEm().getCriteriaBuilder();
		CriteriaQuery<Place> cq = cb.createQuery(Place.class);

		Root<Place> root = cq.from(Place.class);

		cq.select(root);
		cq.where(cb.lessThan(root.get(Place_.releaseTime), Calendar.getInstance()),
				cb.isNull(root.get(Place_.group)));

		TypedQuery<Place> q = getEm().createQuery(cq);

		int updated = 0;
		for (Place p : q.getResultList()) {
			logger.debug("Releasing place {} at automagic timed place check.", p);
			if (p.checkReleased()) {
				++updated;
			}
		}

		if (updated > 0) {
			logger.info("{} places released for sale after release time exceeded.", updated);
		}
	}

	public List<Place> findUsersReservations(LanEvent event, User user) {
		CriteriaBuilder cb = getEm().getCriteriaBuilder();
		CriteriaQuery<Place> cq = cb.createQuery(Place.class);

		Root<Place> root = cq.from(Place.class);

		cq.select(root);
		cq.where(
				cb.and(
						cb.equal(root.get(Place_.map).get(EventMap_.event), event),
						cb.equal(root.get(Place_.currentUser), user)
						));
		TypedQuery<Place> q = getEm().createQuery(cq);

		return q.getResultList();
	}

	public int setBuyable(EventMap map, String like, boolean b) {
		CriteriaBuilder cb = em.getCriteriaBuilder();
		CriteriaQuery<Place> cq = cb.createQuery(Place.class);
		Root<Place> root = cq.from(Place.class);
		cq.where(
				cb.like(root.get(Place_.name), like),
				cb.equal(root.get(Place_.map), map)
				);

		List<Place> list = em.createQuery(cq).getResultList();
		for (Place p : list) {
			p.setBuyable(b);
		}

		// Query q =
		// em.createQuery("UPDATE Place p set p.buyable = :b where p.name like :like");
		// q.setParameter("b", b);
		// q.setParameter("like", like);
		return list.size();

	}

	// public boolean isCoordinateInPlace(int x, int y) {
	// if (x > mapX
	// && x < (mapX + width)
	// && y > mapY
	// && y < (mapY + height)) {
	// return true;
	// }
	//
	// return false;
	// }
	public Place find(EventMap map, int x, int y) {
		CriteriaBuilder cb = em.getCriteriaBuilder();
		CriteriaQuery<Place> cq = cb.createQuery(Place.class);
		Root<Place> root = cq.from(Place.class);
		Path<Integer> xObj = root.get(Place_.mapX);
		Path<Integer> yObj = root.get(Place_.mapY);

		cq.where(cb.equal(root.get(Place_.map), map),
				cb.lessThan(xObj, x),
				cb.greaterThan(cb.sum(xObj, root.get(Place_.width)), x),
				cb.lessThan(yObj, y),
				cb.greaterThan(cb.sum(yObj, root.get(Place_.height)), y),
				cb.isFalse(root.get(Place_.disabled))
				);
		return getSingleNullableResult(em.createQuery(cq));
	}
}