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

import java.math.BigDecimal;
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 org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import fi.insomnia.bortal.model.EventMap;
import fi.insomnia.bortal.model.Place;
import fi.insomnia.bortal.model.Product;
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);
    }

    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() {
        TypedQuery<Place> q = em.createQuery("SELECT p from Place p where p.releaseTime < CURRENT_TIMESTAMP", Place.class);
        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;
        }
        TypedQuery<Place> q = em.createQuery("SELECT p from Place p where p.map = :map and p.releaseTime is null", Place.class);
        q.setParameter("map", map);
        long count = 0;
        for (Place p : q.getResultList()) {
            if (p.getGroup() == null) {
                ++count;
            }
        }
        return count;
    }

    public boolean releasePlace(User user, Place place) {
        boolean ret = place.release(user);
        merge(place);
        return ret;
    }

    public List<Place> findUsersReservations(EventMap map, User user) {
        TypedQuery<Place> q = em.createQuery("select p from Place p where p.map = :map and p.currentUser = :user and p.releaseTime is not null", Place.class);
        q.setParameter("map", map);
        q.setParameter("user", user);
        return q.getResultList();
    }

    public void releasePlaces(User user) {
        TypedQuery<Place> q = em.createQuery("SELECT p from Place p where p.releaseTime < CURRENT_TIMESTAMP and currentUser = :user", Place.class);
        q.setParameter("user", user);
        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();
        
    }

    

}