public class HighLevelCallback<R extends HighLevelResult> {
/** Object used for synchronization. */
- private final Object syncObject = new Object();
+ protected final Object syncObject = new Object();
/** The list of callback listeners. */
private final List<HighLevelCallbackListener<R>> highLevelCallbackListeners = Collections.synchronizedList(new ArrayList<HighLevelCallbackListener<R>>());
/** 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;
}
/**
}
/**
- * 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 <code>notify</code>
- * parameter the listeners are notified. You have to call this method with
- * <code>notify = true</code> 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
- * <code>true</code> to finalize the result and notify all
- * listeners, <code>false</code> 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.notify();
}
+ fireGotResult();
}
}