PlaceFacade.java
3.91 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
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();
}
}