1 package org.simantics.graphviz.continuation;
\r
3 import java.util.ArrayList;
\r
4 import java.util.concurrent.CancellationException;
\r
5 import java.util.concurrent.CountDownLatch;
\r
7 public abstract class Computation<T> {
\r
10 ArrayList<Continuation<T>> continuations = new ArrayList<Continuation<T>>();
\r
11 CountDownLatch doneGate = new CountDownLatch(1);
\r
13 public void addContinuation(Continuation<T> continuation) {
\r
14 synchronized(doneGate) {
\r
15 if(doneGate.getCount() == 0) {
\r
16 if(exception == null)
\r
17 continuation.succeeded(result);
\r
19 continuation.failed(exception);
\r
22 continuations.add(continuation);
\r
26 public boolean isDone() {
\r
27 return doneGate.getCount() == 0;
\r
30 protected void failWith(Exception exception) {
\r
31 this.exception = exception;
\r
32 ArrayList<Continuation<T>> cs;
\r
33 synchronized (doneGate) {
\r
34 cs = this.continuations;
\r
35 this.continuations = null;
\r
36 doneGate.countDown();
\r
39 for(Continuation<T> continuation : cs)
\r
40 continuation.failed(exception);
\r
43 protected void doneWith(T result) {
\r
44 this.result = result;
\r
45 ArrayList<Continuation<T>> cs;
\r
46 synchronized (doneGate) {
\r
47 cs = this.continuations;
\r
48 this.continuations = null;
\r
49 doneGate.countDown();
\r
52 for(Continuation<T> continuation : cs)
\r
53 continuation.succeeded(result);
\r
56 public void cancel() {
\r
57 failWith(new CancellationException());
\r
60 public T get() throws Exception {
\r
62 if(exception != null)
\r