/** * Queue maintenance. * * <p>Move projects between {@link #waitingList}, {@link #blockedProjects}, and {@link * #buildables} appropriately. */ public synchronized void maintain() { if (LOGGER.isLoggable(Level.FINE)) LOGGER.fine("Queue maintenance started " + this); Iterator<BlockedItem> itr = blockedProjects.values().iterator(); while (itr.hasNext()) { BlockedItem p = itr.next(); if (!isBuildBlocked(p.task)) { // ready to be executed LOGGER.fine(p.task.getFullDisplayName() + " no longer blocked"); itr.remove(); makeBuildable(new BuildableItem(p)); } } while (!waitingList.isEmpty()) { WaitingItem top = peek(); if (!top.timestamp.before(new GregorianCalendar())) return; // finished moving all ready items from queue waitingList.remove(top); Task p = top.task; if (!isBuildBlocked(p)) { // ready to be executed immediately LOGGER.fine(p.getFullDisplayName() + " ready to build"); makeBuildable(new BuildableItem(top)); } else { // this can't be built now because another build is in progress // set this project aside. LOGGER.fine(p.getFullDisplayName() + " is blocked"); blockedProjects.put(p, new BlockedItem(top)); } } if (sortingHandler != null) sortingHandler.sortBuildableItems(buildables); }