001 /** 002 * Copyright 2010 The Kuali Foundation Licensed under the 003 * Educational Community License, Version 2.0 (the "License"); you may 004 * not use this file except in compliance with the License. You may 005 * obtain a copy of the License at 006 * 007 * http://www.osedu.org/licenses/ECL-2.0 008 * 009 * Unless required by applicable law or agreed to in writing, 010 * software distributed under the License is distributed on an "AS IS" 011 * BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express 012 * or implied. See the License for the specific language governing 013 * permissions and limitations under the License. 014 */ 015 016 package org.kuali.student.common.ui.client.mvc; 017 018 /** 019 * @author Kuali Student Team 020 */ 021 import java.util.LinkedList; 022 023 public class WorkQueue { 024 public static abstract class WorkItem { 025 private boolean canceled = false; 026 027 public abstract void exec(final Callback<Boolean> onCompleteCallback); 028 029 public boolean isCanceled() { 030 return this.canceled; 031 } 032 033 protected void setCanceled(final boolean canceled) { 034 this.canceled = canceled; 035 } 036 } 037 038 private boolean running = false; 039 private final LinkedList<WorkItem> queue = new LinkedList<WorkItem>(); 040 041 private final Callback<Boolean> onCompleteCallback = new Callback<Boolean>() { 042 @Override 043 public void exec(final Boolean value) { 044 processNext(); 045 } 046 }; 047 048 public void clear() { 049 for (final WorkItem item : queue) { 050 item.setCanceled(true); 051 } 052 queue.clear(); 053 } 054 055 public boolean isRunning() { 056 return this.running; 057 } 058 059 private void processNext() { 060 WorkItem item = null; 061 while (!queue.isEmpty() && (item = queue.removeFirst()) != null) { 062 if (item.isCanceled()) { 063 item = null; 064 } else { 065 break; 066 } 067 } 068 if (item == null) { 069 running = false; 070 } else { 071 item.exec(onCompleteCallback); 072 } 073 } 074 075 public void submit(final WorkItem item) { 076 queue.add(item); 077 if (!running) { 078 running = true; 079 processNext(); 080 } 081 } 082 }