/*
* SerializedCommandQueue.java
*
* Copyright (C) 2009-12 by RStudio, Inc.
*
* Unless you have received this program directly from RStudio pursuant
* to the terms of a commercial license agreement with RStudio, then
* this program is licensed to you under the terms of version 3 of the
* GNU Affero General Public License. This program is distributed WITHOUT
* ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,
* MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the
* AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.
*
*/
package org.rstudio.core.client;
import com.google.gwt.user.client.Command;
import java.util.ArrayList;
public class SerializedCommandQueue
{
public SerializedCommandQueue(boolean log)
{
log_ = log;
}
public SerializedCommandQueue()
{
this(false);
}
public void addCommand(SerializedCommand command)
{
addCommand(command, true);
}
public void addCommand(SerializedCommand command, boolean run)
{
if (command != null)
commands_.add(command);
log("addCommand");
if (run)
run();
}
public void addPriorityCommand(SerializedCommand command)
{
addPriorityCommand(command, true);
}
public void addPriorityCommand(SerializedCommand command, boolean run)
{
if (command != null)
commands_.add(0, command);
log("addPriorityCommand");
if (run)
run();
}
public void run()
{
if (running_)
{
log("already running");
return;
}
running_ = true;
executeNextCommand();
}
private void executeNextCommand()
{
log("executeNextCommand");
if (commands_.size() == 0)
{
log("done");
running_ = false;
return;
}
SerializedCommand head = commands_.remove(0);
head.onExecute(new Command()
{
public void execute()
{
log("continuation");
executeNextCommand();
}
});
}
private void log(String label)
{
if (log_)
{
Debug.log(hashCode() + " " + label + " size=" + commands_.size());
}
}
private boolean running_ = false;
private ArrayList<SerializedCommand> commands_
= new ArrayList<SerializedCommand>();
private final boolean log_;
}