Commit cea82251 by Tuukka Kivilahti

no longer place timeout

1 parent 55325248
......@@ -145,4 +145,6 @@ public interface PlaceBeanLocal {
*/
List<Place> findAllForEvent();
boolean isUnlockedPlaces(EventUser user);
}
......@@ -52,4 +52,6 @@ public interface QueueBeanLocal {
void forceRemove(EventMap e, EventUser u);
void removeFromAll(EventUser user);
}
......@@ -395,6 +395,13 @@ public class BootstrapBean implements BootstrapBeanLocal {
"ALTER TABLE help_texts DROP COLUMN title;"
});
// we do rename magic, so we do not lose reserve -information. We don't really care about this time maybe being 1hour offsync
dbUpdates.add(new String[] {
"ALTER TABLE places RENAME release_time TO reserve_time;"
});
}
public BootstrapBean() {
......
......@@ -78,14 +78,13 @@ import fi.codecrew.moya.utilities.moyamessage.MoyaEventType;
MapPermission.S_MANAGE_OTHERS,
})
public class PlaceBean implements PlaceBeanLocal {
private static final String PLACE_RESERVE_TIMEOUTER = "Map reserve timeouter";
private static final Logger logger = LoggerFactory.getLogger(PlaceBean.class);
public static final int RESERVE_MINUTES = 20;
@EJB
private GroupMembershipFacade gmemfacade;
@Resource
private TimerService ts;
//@Resource
//private TimerService ts;
@EJB
private PlaceFacade placeFacade;
......@@ -262,47 +261,16 @@ public class PlaceBean implements PlaceBeanLocal {
}
place.setCurrentUser(user);
place.setReleaseTime(Calendar.getInstance());
place.getReleaseTime().add(Calendar.MINUTE, RESERVE_MINUTES);
// Create timeout service to timeout the reserved place in
// RESERVE_MINUTES
boolean foundTimeout = false;
for (Timer t : ts.getTimers()) {
if (t.getInfo().equals(PLACE_RESERVE_TIMEOUTER)) {
foundTimeout = true;
break;
}
}
if (!foundTimeout) {
logger.info("Place timeout calculator not started. Starting new.");
ts.createTimer(new Date(), 1000 * 60, PLACE_RESERVE_TIMEOUTER);
}
place.setReserveTime(Calendar.getInstance());
ret = true;
}
}
return ret;
}
@Timeout
public void checkTimedOutPlaces(Timer timer) {
// logger.debug("Checking Timed out places at {}", new Date());
placeFacade.timeoutPlaces();
}
//
// @Override
// public void releaseUsersPlaces(User user) throws
// PermissionDeniedException {
// if (user == null) {
// user = permbean.getCurrentUser();
// } else if (!permbean.isCurrentUser(user)) {
// permbean.fatalPermission(MapPermission.MANAGE_OTHERS,
// "Not enough rights to release users ", user, " places");
// }
// logger.debug("timeouting places");
// placeFacade.releasePlaces(permbean.getCurrentUser());
// }
@Override
@RolesAllowed({ MapPermission.S_BUY_PLACES, MapPermission.S_MANAGE_OTHERS })
public PlaceGroup buySelectedPlaces(EventUser user) throws BortalCatchableException {
......@@ -490,7 +458,7 @@ public class PlaceBean implements PlaceBeanLocal {
private GroupMembership buy(Place p, PlaceGroup pg) {
p.setGroup(pg);
p.setReleaseTime(null);
// Current user temporarily used at place reservation. When buying
// release field for its original use ( show who is sitting here ).
p.setCurrentUser(null);
......@@ -530,7 +498,9 @@ public class PlaceBean implements PlaceBeanLocal {
return false;
}
place.setCurrentUser(null);
place.setReleaseTime(null);
place.setReserveTime(null);
PlaceSlot slot = placeSlotFacade.findSlotForPlace(place);
if (slot != null) {
slot.setPlace(null);
......@@ -848,4 +818,19 @@ public class PlaceBean implements PlaceBeanLocal {
List<Place> ret = placeFacade.findAllForEvent(event);
return ret;
}
@Override
public boolean isUnlockedPlaces(EventUser user) {
List<Place> places = placeFacade.findUsersReservations(user.getEvent(), user);
for(Place p : places) {
if(p.isReservedFor(user)) {
return true;
}
}
return false;
}
}
......@@ -5,6 +5,7 @@ import java.util.List;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicLong;
import javax.annotation.OverridingMethodsMustInvokeSuper;
import javax.annotation.security.DeclareRoles;
import javax.annotation.security.RolesAllowed;
import javax.ejb.Asynchronous;
......@@ -214,6 +215,13 @@ public class QueueBean implements QueueBeanLocal {
}
@Override
public void removeFromAll(EventUser user) {
for(MapQueue m : mapqueues.values()) {
m.remove(user);
}
}
@Lock(LockType.READ)
@RolesAllowed({ MapPermission.S_MANAGE_MAPS, MapPermission.S_BUY_PLACES })
@Override
......
......@@ -57,38 +57,6 @@ public class PlaceFacade extends IntegerPkGenericFacade<Place> {
super(Place.class);
}
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);
final EventUser cu = p.getCurrentUser();
if (p.checkReleased()) {
PlaceSlot slot = placeslotfacade.findSlotForPlace(p);
if (slot != null) {
slot.setPlace(null);
slot.setUsed(null);
}
logbean.sendMessage(MoyaEventType.PLACE_ERROR, cu, "Automatically release unlocked place ", p.getName());
++updated;
}
}
if (updated > 0) {
logger.info("{} places released for sale after release time exceeded.", updated);
}
}
public List<Place> findUsersReservations(LanEvent event, EventUser user) {
CriteriaBuilder cb = getEm().getCriteriaBuilder();
......@@ -191,7 +159,7 @@ public class PlaceFacade extends IntegerPkGenericFacade<Place> {
cq.where(
cb.equal(root.get(Place_.product), product),
cb.isNull(root.get(Place_.releaseTime)),
cb.isNull(root.get(Place_.reserveTime)),
cb.isNull(root.get(Place_.group)),
cb.isFalse(root.get(Place_.disabled)),
cb.isTrue(root.get(Place_.buyable))
......@@ -247,7 +215,7 @@ public class PlaceFacade extends IntegerPkGenericFacade<Place> {
cq.where(
cb.equal(root.get(Place_.map), map),
cb.isNull(root.get(Place_.releaseTime)),
cb.isNull(root.get(Place_.reserveTime)),
cb.isNull(root.get(Place_.group)),
cb.isFalse(root.get(Place_.disabled)),
// TKwtf lisäsi:
......
......@@ -18,24 +18,12 @@
*/
package fi.codecrew.moya.model;
import java.util.Calendar;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.JoinColumn;
import javax.persistence.Lob;
import javax.persistence.ManyToOne;
import javax.persistence.OneToOne;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.persistence.Transient;
import fi.codecrew.moya.utilities.NumericStringComparator;
import org.eclipse.persistence.annotations.BatchFetch;
import org.eclipse.persistence.annotations.BatchFetchType;
import fi.codecrew.moya.utilities.NumericStringComparator;
import javax.persistence.*;
import java.util.Calendar;
/**
*
......@@ -62,9 +50,9 @@ public class Place extends GenericEntity implements Comparable<Place> {
private int width = 0;
@Column(name = "height")
private int height = 0;
@Column(name = "release_time")
@Column(name = "reserve_time")
@Temporal(TemporalType.TIMESTAMP)
private Calendar releaseTime;
private Calendar reserveTime;
@Column(name = "place_details")
@Lob
private String details = "";
......@@ -293,7 +281,7 @@ public class Place extends GenericEntity implements Comparable<Place> {
public boolean isTaken() {
return (getReleaseTime() != null || getGroup() != null);
return (getReserveTime() != null || getGroup() != null);
}
/**
......@@ -304,22 +292,6 @@ public class Place extends GenericEntity implements Comparable<Place> {
return (u.equals(getCurrentUser()) && getGroup() == null);
}
/**
* Check if the places releasetime has expired and it should be released for
* shopping
*
* @return If the status of thie entity changed and it should be merged.
*/
public boolean checkReleased() {
boolean ret = false;
if (getGroup() == null && getReleaseTime() != null && Calendar.getInstance().after(getReleaseTime())) {
setCurrentUser(null);
setReleaseTime(null);
ret = true;
}
return ret;
}
public void setBuyable(boolean buyable) {
this.buyable = buyable;
}
......@@ -341,14 +313,6 @@ public class Place extends GenericEntity implements Comparable<Place> {
this.reserverSlot = reserverSlot;
}
public void setReleaseTime(Calendar releaseTime) {
this.releaseTime = releaseTime;
}
public Calendar getReleaseTime() {
return releaseTime;
}
public void setProvidesRole(Role providesRole) {
this.providesRole = providesRole;
}
......@@ -396,4 +360,13 @@ public class Place extends GenericEntity implements Comparable<Place> {
return NumericStringComparator.numericCompare(this.getName(), o.getName());
}
public Calendar getReserveTime() {
return reserveTime;
}
public void setReserveTime(Calendar reserveTime) {
this.reserveTime = reserveTime;
}
}
......@@ -95,7 +95,7 @@
<p:outputPanel rendered="#{placeGroupView.useEticket}">
<p>
<p:button outcome="/place/myEtickets" value="#{i18n['placegroup.showEticket']}" />
<p:button outcome="/place/myGroups" value="#{i18n['placegroup.showEticket']}" />
</p>
</p:outputPanel>
......
......@@ -16,6 +16,15 @@
<ui:define name="content">
<h:outputText rendered="#{placeGroupView.groupMemberships.rowCount == 0}" value="#{i18n['placegroupview.noMemberships']}" />
<p:outputPanel rendered="#{placeGroupView.unlockedPlaces}">
<span class="error"><h:outputText value="#{i18n['placegroupview.unlockedPlacesNotification']}" /></span><br /><br />
<p:commandButton value="#{i18n['placegroupview.lockPlaces']}" actionListener="#{placeGroupView.buySelectedPlaces}" /><br /><br /><br />
</p:outputPanel>
<h:form rendered="#{placeGroupView.groupMemberships.rowCount > 0}" id="placelistform" styleClass="moya_datatable2">
<p:dataTable value="#{placeGroupView.groupMemberships}" var="member" id="placestable">
......@@ -90,7 +99,7 @@
<p:outputPanel rendered="#{placeGroupView.useEticket}">
<p>
<p:button outcome="/place/myEtickets" value="#{i18n['placegroup.showEticket']}" />
<p:button rendered="#{not placeGroupView.unlockedPlaces}" outcome="/place/myEtickets" value="#{i18n['placegroup.showEticket']}" />
</p>
</p:outputPanel>
......
......@@ -30,8 +30,7 @@
<h:form>
<p:dataTable var="pc" value="#{unlockedPlaceView.places}">
<p:column>
<h:outputText
value="#{pc.user.user.login} #{pc.user.user.wholeName}" />
<h:outputText value="#{pc.user.user.login} #{pc.user.user.wholeName}" />
</p:column>
<p:column>
<p:dataTable var="p" value="#{pc.places}">
......@@ -46,8 +45,7 @@
</p:dataTable>
</p:column>
<p:column>
<p:commandButton ajax="false" value="#{i18n['placegroup.lock']}"
action="#{unlockedPlaceView.lockUser()}" />
<p:commandButton ajax="false" value="#{i18n['placegroup.lock']}" action="#{unlockedPlaceView.lockUser()}" />
</p:column>
</p:dataTable>
</h:form>
......
......@@ -404,7 +404,7 @@ function placemap(opts)
.header("Content-Type", "application/json")
.post(
JSON.stringify({}),
function(err, rawData){
function(err, rawData) {
console.log(rawData);
var data = JSON.parse(rawData.response);
draw_places(data.places);
......
......@@ -2,6 +2,7 @@ package fi.codecrew.moya.rest;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import fi.codecrew.moya.model.*;
......@@ -94,8 +95,22 @@ public class PojoUtils {
ret.setWidth(place.getWidth());
ret.setTaken(place.isTaken());
ret.setBuyable(place.isBuyable());
ret.setReleaseTime(place.getReleaseTime());
ret.setDisabled(place.isDisabled());
// I cannot change REST -api without making new version, so let's simulate this ReleaseTime -feature from reserveTime
Calendar relTime = Calendar.getInstance();
relTime.add(relTime.HOUR, 4);
if(place.getReserveTime() != null)
ret.setReleaseTime(relTime);
else
ret.setReleaseTime(null);
if (place.getMap() != null) {
ret.setMapId(place.getMap().getId());
}
......
......@@ -217,7 +217,7 @@ public class MapManageView extends GenericCDIView {
List<Place> mapplaces = map.getPlaces();
if (mapplaces == null || mapplaces.isEmpty()) {
mapplaces = new ArrayList<Place>();
mapplaces = new ArrayList<>();
map.setPlaces(mapplaces);
}
for (int tableI = 0; tableI < tableCount; ++tableI) {
......@@ -235,8 +235,8 @@ public class MapManageView extends GenericCDIView {
Place place = new Place(map);
place.setHeight(Math.abs(height));
place.setWidth(Math.abs(width));
int xpos = startX + rowXStart + (tablesHorizontal ? placeI * width : 0);
int ypos = startY + rowYStart + (tablesHorizontal ? 0 : placeI * height);
int xpos = startX + rowXStart + (tablesHorizontal ? (placeI -1) * width : 0);
int ypos = startY + rowYStart + (tablesHorizontal ? 0 : (placeI -1) * height);
logger.debug("Creating map in {} {}", xpos, ypos);
place.setMapX(xpos);
place.setMapY(ypos);
......
......@@ -18,10 +18,7 @@
*/
package fi.codecrew.moya.web.cdiview.map;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.*;
import javax.ejb.EJB;
import javax.enterprise.context.ConversationScoped;
......@@ -30,6 +27,7 @@ import javax.inject.Inject;
import javax.inject.Named;
import fi.codecrew.moya.beans.*;
import fi.codecrew.moya.beans.map.QueueBeanLocal;
import fi.codecrew.moya.enums.apps.MapPermission;
import fi.codecrew.moya.model.*;
import fi.codecrew.moya.web.annotations.SelectedUser;
......@@ -62,6 +60,12 @@ public class PlacegroupView extends GenericCDIView {
@EJB
private EventBeanLocal eventBean;
@EJB
private PlaceBeanLocal placeBean;
@EJB
private QueueBeanLocal queueBean;
@Inject
private InviteView inviteView;
......@@ -341,6 +345,21 @@ public class PlacegroupView extends GenericCDIView {
public boolean isUnlockedPlaces() {
return placeBean.isUnlockedPlaces(user);
}
public void buySelectedPlaces() {
placeBean.buySelectedPlaces(user);
queueBean.removeFromAll(user);
// lost of stuff changed, reload page
super.navihandler.forward("/place/myGroups?faces-redirect=true");
}
}
......@@ -93,7 +93,7 @@ public class UnlockedPlaceView extends GenericCDIView {
mapId = map.getId();
for (Place p : map.getPlaces()) {
if (p.getReleaseTime() != null) {
if (p.getReserveTime() != null) {
UnlockedPlaceContainer uc = usermap.get(p.getCurrentUser());
if (uc == null) {
uc = new UnlockedPlaceContainer(p.getCurrentUser());
......
......@@ -762,6 +762,7 @@ placegroupView.editplace = Edit place
placegroupview.groupCreator = Orderer
placegroupview.header = My places
placegroupview.lockPlaces=Lock places
placegroupview.noMemberships = No places
placegroupview.owner = Owner
placegroupview.placeReleaseFailed = Releasing place failed!
......@@ -774,6 +775,7 @@ placegroupview.reserveForSelf = Select the place for yourself
placegroupview.token = Place token / user
placegroupview.toptext = \
placegroupview.unlockedPlacesNotification=You have unlocked places, you must lock them before you can see your tickets\!
placeslot.add = Add place slot
placeslot.bill = Bill
placeslot.id = ID
......
......@@ -1021,6 +1021,7 @@ placegroupView.editplace = Edit place
placegroupview.groupCreator = Orderer
placegroupview.header = My places
placegroupview.lockPlaces=Lock places
placegroupview.noMemberships = No places
placegroupview.owner = Owner
placegroupview.placeReleaseFailed = Releasing place failed!
......@@ -1032,6 +1033,7 @@ placegroupview.reservationProduct = Ticket
placegroupview.reserveForSelf = Select the place for yourself
placegroupview.token = Place token / user
placegroupview.unlockedPlacesNotification=You have unlocked places, you must lock them before you can see your tickets\!
placeslot.add = Add place slot
placeslot.bill = Bill
placeslot.id = ID
......
......@@ -1008,6 +1008,7 @@ placegroupView.editplace = Muokkaa paikkaa
placegroupview.groupCreator = Tilaaja
placegroupview.header = Omat paikat
placegroupview.lockPlaces=Lukitse paikat
placegroupview.noMemberships = Ei omia paikkoja
placegroupview.owner = Omistaja
placegroupview.placeReleaseFailed = Paikan vapauttaminen ep\u00E4onnistui!
......@@ -1019,6 +1020,7 @@ placegroupview.reservationProduct = Lippu
placegroupview.reserveForSelf = Valitse paikka itsellesi
placegroupview.token = Paikkakoodi / k\u00E4ytt\u00E4j\u00E4
placegroupview.unlockedPlacesNotification=Sinulla on lukitsemattomia paikkoja, sinun tulee lukita ne ennenkuin voit tarkastella lippuasi\!
placeslot.add = Lis\u00E4\u00E4 paikkaslotti
placeslot.bill = Lasku
placeslot.id = ID
......
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!