public PriorityQueueMasterList(PriorityQueueImpl queue, int priorities) { super(queue, DUMMY_HEAD_CREATOR); _queue = queue; _priorityLists = new PriorityQueueEntrySubList[priorities]; _priorities = priorities; _priorityOffset = 5-((priorities + 1)/2); for(int i = 0; i < priorities; i++) { _priorityLists[i] = new PriorityQueueEntrySubList(queue, i); } }
@Override public PriorityQueueEntry add(ServerMessage message, final MessageEnqueueRecord enqueueRecord) { int index = message.getMessageHeader().getPriority() - _priorityOffset; if(index >= _priorities) { index = _priorities-1; } else if(index < 0) { index = 0; } return (PriorityQueueEntry) _priorityLists[index].add(message, enqueueRecord); }
@Override public PriorityQueueEntry next(QueueEntry node) { PriorityQueueEntry next = (PriorityQueueEntry) node.getNextValidEntry(); if(next == null) { final PriorityQueueList nodeEntryList = (PriorityQueueList) ((PriorityQueueEntry)node).getQueueEntryList(); int index; for(index = _priorityLists.length-1; _priorityLists[index] != nodeEntryList; index--) { // do nothing loop is just to find the index } while(next == null && index != 0) { index--; next = (PriorityQueueEntry) _priorityLists[index].getHead().getNextValidEntry(); } } return next; }
@Override public int compareTo(final QueueEntry o) { PriorityQueueEntry other = (PriorityQueueEntry)o; PriorityQueueEntrySubList pqel = (PriorityQueueEntrySubList)other.getQueueEntryList(); int otherPriority = pqel.getListPriority(); int thisPriority = ((PriorityQueueEntrySubList) getQueueEntryList()).getListPriority(); if(thisPriority != otherPriority) { /* * Different priorities, so answer can only be greater than or less than * * A message with higher priority (e.g. 5) is conceptually 'earlier' in the * priority queue than one with a lower priority (e.g. 4). */ return thisPriority > otherPriority ? -1 : 1; } else { return super.compareTo(o); } } }
@Override public QueueEntry getLeastSignificantOldestEntry() { for(PriorityQueueEntrySubList subList : _priorityLists) { QueueEntry subListLast = subList.getLeastSignificantOldestEntry(); if(subListLast != null) { return subListLast; } } return null; } }
@Override public QueueEntry getOldestEntry() { QueueEntry oldest = null; for(PriorityQueueEntrySubList subList : _priorityLists) { QueueEntry subListOldest = subList.getOldestEntry(); if(oldest == null || (subListOldest != null && subListOldest.getMessage().getMessageNumber() < oldest.getMessage().getMessageNumber())) { oldest = subListOldest; } } return oldest; }
@Override public QueueEntry getLeastSignificantOldestEntry() { return getOldestEntry(); } }
@Override public PriorityQueueEntry getTail() { return (PriorityQueueEntry) _priorityLists[0].getTail(); }
@Override public PriorityQueueEntry getHead() { return (PriorityQueueEntry) _priorityLists[_priorities-1].getHead(); }
PriorityQueueEntryListIterator() { for(int i = 0; i < _priorityLists.length; i++) { _iterators[i] = _priorityLists[i].iterator(); } _lastNode = (PriorityQueueEntry) _iterators[_iterators.length - 1].getNode(); }