package edu.umd.cs.findbugs.cloud; import java.util.ArrayList; import java.util.List; import java.util.concurrent.CopyOnWriteArrayList; public class MutableCloudTask implements Cloud.CloudTask { private String name; private CopyOnWriteArrayList<Cloud.CloudTaskListener> listeners = new CopyOnWriteArrayList<Cloud.CloudTaskListener>(); private String substatus = ""; private double percentDone = 0; /** A listener used only if no other listeners are present. */ private Cloud.CloudTaskListener defaultListener; private boolean finished = false; private boolean useDefaultListener = true; public MutableCloudTask(String name) { this.name = name; } public String getName() { return name; } public String getStatusLine() { return substatus; } public double getPercentCompleted() { return percentDone; } public void addListener(Cloud.CloudTaskListener listener) { listeners.addIfAbsent(listener); } public void removeListener(Cloud.CloudTaskListener listener) { listeners.remove(listener); } public boolean isFinished() { return finished; } public void setUseDefaultListener(boolean enabled) { this.useDefaultListener = enabled; } public void update(String substatus, double percentDone) { this.substatus = substatus; this.percentDone = percentDone; for (Cloud.CloudTaskListener listener : getListeners()) { listener.taskStatusUpdated(substatus, percentDone); } } public void finished() { finished = true; for (Cloud.CloudTaskListener listener : getListeners()) { listener.taskFinished(); } clearListeners(); } public void failed(String message) { finished = true; for (Cloud.CloudTaskListener listener : getListeners()) { listener.taskFailed(message); } clearListeners(); } /** A listener used only if no other listeners are present. */ public void setDefaultListener(Cloud.CloudTaskListener defaultListener) { this.defaultListener = defaultListener; } private List<Cloud.CloudTaskListener> getListeners() { List<Cloud.CloudTaskListener> myListeners = new ArrayList<Cloud.CloudTaskListener>(listeners); if (useDefaultListener && myListeners.isEmpty() && defaultListener != null) { myListeners.add(defaultListener); } return myListeners; } /** I think this is a good idea for garbage collection purposes -Keith */ private void clearListeners() { listeners.clear(); defaultListener = null; } public boolean isUsingDefaultListener() { return listeners.isEmpty(); } }