Commit d2001e8d by Tuukka Kivilahti

added biggest first and fixed possibly array bug

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