public class HighLevelCallback<R extends HighLevelResult> {
/** Object used for synchronization. */
- public final Object syncObject = new Object();
+ private final Object syncObject = new Object();
/** The list of callback listeners. */
- public final List<HighLevelCallbackListener<R>> highLevelCallbackListeners = Collections.synchronizedList(new ArrayList<HighLevelCallbackListener<R>>());
+ private final List<HighLevelCallbackListener<R>> highLevelCallbackListeners = Collections.synchronizedList(new ArrayList<HighLevelCallbackListener<R>>());
+
+ /** Whether the result is complete. */
+ private boolean resultComplete = false;
/** The result of the operation. */
- public R result = null;
+ private R result = null;
+
+ /**
+ * Package-private construtor.
+ *
+ * @param result
+ * The result of the operation
+ */
+ HighLevelCallback(R result) {
+ this.result = result;
+ }
/**
* Adds a callback listener to this callback. The callback listener will be
*/
public boolean isDone() {
synchronized (syncObject) {
- return result != null;
+ return resultComplete;
}
}
*/
public R getResult(long waitTime) throws InterruptedException {
synchronized (syncObject) {
- if (result == null) {
+ if (!resultComplete) {
syncObject.wait(waitTime);
}
return result;
}
/**
- * Sets the result of the operation. Calling this method will result in all
- * listeners being notified.
+ * Returns the result even if it is not yet complete.
*
- * @see #fireGotResult()
- * @param result
- * The result of the operation
+ * @return The result of the operation
*/
- void setResult(R result) {
+ R getIntermediaryResult() {
synchronized (syncObject) {
- this.result = result;
- syncObject.notifyAll();
+ return result;
+ }
+ }
+
+ /**
+ * Marks the result as complete and notify the listeners. If the result was
+ * already complete, nothing will be done.
+ */
+ void setDone() {
+ synchronized (syncObject) {
+ if (resultComplete) {
+ return;
+ }
+ resultComplete = true;
+ syncObject.notify();
}
fireGotResult();
}