Commit d2001e8d by Tuukka Kivilahti

added biggest first and fixed possibly array bug

1 parent 36f285a2
......@@ -51,6 +51,10 @@ public interface QueueBeanLocal {
MapReservationQueueEntry getEntry(EventUser u);
boolean isBiggestFirst();
void setBiggestFirst(boolean biggestFirst);
}
void forceAddToReserving(EventMap map, EventUser u, Date time);
......
......@@ -426,10 +426,16 @@ public class BootstrapBean implements BootstrapBeanLocal {
});
dbUpdates.add(new String[] {
"CREATE TABLE map_queue_rules (id SERIAL NOT NULL, meta json, reserving_size INTEGER, default_timeout_min INTEGER, minium_slots_in_queue INTEGER, map_id INTEGER NOT NULL, PRIMARY KEY (id))",
"CREATE TABLE map_queue_rules (id SERIAL NOT NULL, meta json, reserving_size INTEGER, default_timeout_min INTEGER, minium_slots_in_queue INTEGER, map_id INTEGER NOT NULL , PRIMARY KEY (id))",
"ALTER TABLE map_queue_rules ADD CONSTRAINT FK_map_queue_rules_map_id FOREIGN KEY (map_id) REFERENCES maps (id)",
});
dbUpdates.add(new String[] {
"ALTER TABLE map_queue_rules ADD COLUMN biggest_first BOOLEAN default false",
});
}
......
......@@ -19,11 +19,12 @@ public class MapQueue implements MapQueueI {
private int defaultTimeoutMin = 10;
private int minimumSlotsInQueue = 1;
private int reservingSize = 5;
private boolean biggestFirst = false;
// private final Set<MapReservationQueueEntry> reserving = new HashSet<>();
private final Set<EventUser> reserving = Collections.newSetFromMap(new ConcurrentHashMap<>());
//private final PriorityQueue<MapReservationQueueEntry> queue = new PriorityQueue<>();
private final List<MapReservationQueueEntry> queue = new ArrayList<>();
private final List<MapReservationQueueEntry> queue = Collections.synchronizedList(new ArrayList<>());
private final ConcurrentMap<EventUser, MapReservationQueueEntry> queEntries = new ConcurrentHashMap<>();
private final Integer mapId;
//private final Object reservingLock = new Object();
......@@ -41,6 +42,7 @@ public class MapQueue implements MapQueueI {
this.defaultTimeoutMin = rules.getDefaultTimeoutMin();
this.minimumSlotsInQueue = rules.getMinimumSlotsInQueue();
this.reservingSize = rules.getReservingSize();
this.biggestFirst = rules.getBiggestFirst();
}
}
......@@ -101,7 +103,8 @@ public class MapQueue implements MapQueueI {
MapReservationQueueEntry queEntry = queue.get(0);
queue.remove(0);
Collections.sort(queue);
sortQueue();
if (queEntry != null) {
reserving.add(queEntry.getUser());
queEntry.setReservationTimeout(new Date(System.currentTimeMillis() + getDefaultTimeoutMin() * 60 * 1000));
......@@ -126,19 +129,24 @@ public class MapQueue implements MapQueueI {
while (queue.remove(entry)) {
}
}
Collections.sort(queue);
sortQueue();
checkReservingEntry();
return ret;
}
public void sortQueue() {
if(this.biggestFirst)
Collections.sort(queue);
}
public MapReservationQueueEntry enter(EventUser user, List<PlaceSlot> slots) {
MapReservationQueueEntry ret = initEntry(user, slots);
if (!reserving.contains(user) && !queue.contains(ret)) {
queue.add(ret);
Collections.sort(queue);
sortQueue();
// Check if the user can be put to reservation queue immediately
checkReservingEntry();
......@@ -169,6 +177,7 @@ public class MapQueue implements MapQueueI {
ret.setUser(user);
ret.setSeenTime(new Date());
ret.setPlaceslotcount(slots.size());
MapReservationQueueEntry old = queEntries.putIfAbsent(user, ret);
if (old != null) {
ret = old;
......@@ -208,6 +217,16 @@ public class MapQueue implements MapQueueI {
return queEntries.get(user);
}
@Override
public boolean isBiggestFirst() {
return this.biggestFirst;
}
@Override
public void setBiggestFirst(boolean biggestFirst) {
this.biggestFirst = biggestFirst;
}
public Collection<EventUser> getReserving() {
return reserving;
}
......@@ -241,4 +260,5 @@ public class MapQueue implements MapQueueI {
this.reservingSize = reservingSize;
}
}
......@@ -247,6 +247,7 @@ public class QueueBean implements QueueBeanLocal {
rules.setDefaultTimeoutMin(queue.getDefaultTimeoutMin());
rules.setMinimumSlotsInQueue(queue.getMinimumSlotsInQueue());
rules.setReservingSize(queue.getReservingSize());
rules.setBiggestFirst(queue.isBiggestFirst());
mapQueueRulesFacade.merge(rules);
}
......
......@@ -45,6 +45,10 @@ public class MapQueueRules extends GenericEntity {
@Column(name = "minium_slots_in_queue")
private Integer minimumSlotsInQueue = 1;
@Column(name = "biggest_first")
private Boolean biggestFirst = false;
@JoinColumn(name = "map_id", referencedColumnName = "id")
@ManyToOne
private EventMap map;
......@@ -86,4 +90,11 @@ public class MapQueueRules extends GenericEntity {
this.map = map;
}
public Boolean getBiggestFirst() {
return biggestFirst;
}
public void setBiggestFirst(Boolean biggestFirst) {
this.biggestFirst = biggestFirst;
}
}
......@@ -14,7 +14,6 @@
<ui:define name="content">
<h2>Queue properties</h2>
<h:form>
<h3><h:outputText value="#{i18n['queuemgmt.biggestIsFirst']}" /> </h3>
<p:panelGrid columns="3" id="queueGrid">
<p:outputLabel for="minslots" value="#{i18n['queuemgmt.minimumSlotsInQueue']}" />
<p:inputText id="minslots" value="#{queueManageView.queue.minimumSlotsInQueue}" />
......@@ -28,6 +27,10 @@
<p:inputText id="defaultTimeout" value="#{queueManageView.queue.defaultTimeoutMin}" />
<h:outputText value="#{i18n['queuemgmt.inDatabase']}: #{queueManageView.defaultValues.defaultTimeoutMin}" />
<p:outputLabel for="biggestFirst" value="#{i18n['queuemgmt.biggestFirst']}" />
<p:selectBooleanCheckbox id="biggestFirst" value="#{queueManageView.queue.biggestFirst}" />
<h:outputText value="#{i18n['queuemgmt.inDatabase']}: #{queueManageView.defaultValues.biggestFirst}" />
</p:panelGrid>
<p:commandButton value="#{i18n['queuemgmt.saveProperties']}" actionListener="#{queueManageView.saveToDatabase}" update="queueGrid" ></p:commandButton>
</h:form>
......
......@@ -85,7 +85,7 @@
<ui:fragment rendered="#{ajaxMapView.queueEnabled and not ajaxMapView.reserving}">
<h3><h:outputText value="#{i18n['mapView.youAreInQueue']}"/></h3>
<h4><h:outputText value="#{i18n['queuemgmt.biggestIsFirst']}" /> </h4>
<h4><h:outputText rendered="#{ajaxMapView.biggestFirst}" value="#{i18n['queuemgmt.biggestIsFirst']}" /> </h4>
<div style="margin: 1em;">
<h:outputText value="#{i18n['mapView.queuePosition']}: "/>
......
......@@ -329,4 +329,8 @@ public class AjaxMapView extends GenericCDIView {
this.slotcount = slotcount;
}
public boolean isBiggestFirst() {
return isQueueEnabled() && quebean.getMapQueue(initMap()).isBiggestFirst();
}
}
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!