X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=src%2Fnet%2Fpterodactylus%2Ffcp%2Fhighlevel%2FHighLevelCallback.java;h=101e16d9fbe970c407993c8f896ee44966ffc4fd;hb=7b73e6e23b03d9412e9dcc0ff3b4f681baa301c5;hp=aed413ddb52813e23608b046ead31c5eda025926;hpb=348c8edc79eb5e46c737d4881edffa3a720d2d33;p=jFCPlib.git diff --git a/src/net/pterodactylus/fcp/highlevel/HighLevelCallback.java b/src/net/pterodactylus/fcp/highlevel/HighLevelCallback.java index aed413d..101e16d 100644 --- a/src/net/pterodactylus/fcp/highlevel/HighLevelCallback.java +++ b/src/net/pterodactylus/fcp/highlevel/HighLevelCallback.java @@ -35,21 +35,25 @@ import java.util.List; public class HighLevelCallback { /** Object used for synchronization. */ - private final Object syncObject = new Object(); + protected final Object syncObject = new Object(); /** The list of callback listeners. */ private final List> highLevelCallbackListeners = Collections.synchronizedList(new ArrayList>()); /** Whether the result is complete. */ - private boolean resultComplete = false; + protected boolean resultComplete = false; /** The result of the operation. */ private R result = null; /** * Package-private construtor. + * + * @param result + * The result of the operation */ - HighLevelCallback() { + HighLevelCallback(R result) { + this.result = result; } /** @@ -80,15 +84,17 @@ public class HighLevelCallback { } /** - * Notifies all listeners that the result of the operation is now known. + * Notifies all listeners that the result of the operation is now known. As + * soon as a listener was notified it will be removed from the list of + * listeners! * * @see HighLevelCallbackListener#gotResult(HighLevelCallback) */ private synchronized void fireGotResult() { for (HighLevelCallbackListener highLevelCallbackListener: highLevelCallbackListeners) { - highLevelCallbackListeners.remove(highLevelCallbackListener); highLevelCallbackListener.gotResult(this); } + highLevelCallbackListeners.clear(); } /** @@ -129,7 +135,7 @@ public class HighLevelCallback { */ public R getResult(long waitTime) throws InterruptedException { synchronized (syncObject) { - if (!resultComplete) { + while (!resultComplete) { syncObject.wait(waitTime); } return result; @@ -137,52 +143,29 @@ public class HighLevelCallback { } /** - * Sets the complete result of the operation. Calling this method will - * result in all listeners being notified. - * - * @see #fireGotResult() - * @param result - * The result of the operation - */ - void setResult(R result) { - setResult(result, true); - } - - /** - * Sets the result of the operation. Depending on the notify - * parameter the listeners are notified. You have to call this method with - * notify = true after your result is completed, otherwise - * clients will block endlessly! + * Returns the result even if it is not yet complete. * - * @param result - * The result of the operation - * @param notify - * true to finalize the result and notify all - * listeners, false if something in the result - * might still change + * @return The result of the operation */ - void setResult(R result, boolean notify) { + R getIntermediaryResult() { synchronized (syncObject) { - this.result = result; - if (notify) { - resultComplete = true; - syncObject.notifyAll(); - } - } - if (notify) { - fireGotResult(); + return result; } } /** - * Returns the result even if it is not yet complete. - * - * @return The result of the operation + * Marks the result as complete and notify the listeners. If the result was + * already complete, nothing will be done. */ - R getIntermediaryResult() { + void setDone() { synchronized (syncObject) { - return result; + if (resultComplete) { + return; + } + resultComplete = true; + syncObject.notifyAll(); } + fireGotResult(); } }