PlaceFacade.java 4.26 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.Query;
import javax.persistence.TypedQuery;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Root;

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

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 EventChildGenericFacade<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 boolean reservePlace(Place p, User reserver) {
	// boolean ret = p.reserve(reserver);
	// merge(p);
	// return ret;
	// }

	//
	// public List<Place> find(LanEvent event, List<Integer> placeIds) {
	// if (placeIds == null || placeIds.size() <= 0) {
	// return new ArrayList<Place>();
	// }
	//
	// TypedQuery<Place> q =
	// em.createQuery("Select p from Place p where p.id.eventId = :eventid and p.id.id IN :places",
	// Place.class);
	// q.setParameter("eventid", event.getId());
	// q.setParameter("places", placeIds);
	// return q.getResultList();
	// }

	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()));

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

		int updated = timeoutPlaces(q.getResultList(), true);

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

	private int timeoutPlaces(List<Place> places, boolean checkFromEntity) {
		int updated = 0;
		for (Place p : places) {
			logger.debug("Releasing place {} at automagic timed place check.", p);
			if (!checkFromEntity || p.checkReleased()) {
				++updated;
				merge(p);
			}
		}
		// logger.debug("Checking timeouted places took: {} ms",
		// Calendar.getInstance().getTimeInMillis()-begin.getTimeInMillis());
		return updated;
	}

	public Long countSelectable(EventMap map) {

		if (map == null) {
			return null;
		}

		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), map),
						cb.isNull(root.get(Place_.releaseTime))
						));
		TypedQuery<Place> q = getEm().createQuery(cq);

		long count = 0;
		for (Place p : q.getResultList()) {
			if (p.getGroup() == null) {
				++count;
			}
		}
		return count;
	}

	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_.event), event),
						cb.equal(root.get(Place_.currentUser), user)
						));
		TypedQuery<Place> q = getEm().createQuery(cq);

		return q.getResultList();
	}

	public void releasePlaces(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.lessThan(root.get(Place_.releaseTime), Calendar.getInstance()),
						cb.equal(root.get(Place_.currentUser), user)
						));
		TypedQuery<Place> q = getEm().createQuery(cq);

		int updated = timeoutPlaces(q.getResultList(), false);
		logger.debug("Released {} places from user {}", updated, user);
	}

	public int setBuyable(EventMap map, String like, boolean 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 q.executeUpdate();

	}

}