]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.graphviz/src/org/simantics/graphviz/continuation/Computation.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.graphviz / src / org / simantics / graphviz / continuation / Computation.java
1 package org.simantics.graphviz.continuation;\r
2 \r
3 import java.util.ArrayList;\r
4 import java.util.concurrent.CancellationException;\r
5 import java.util.concurrent.CountDownLatch;\r
6 \r
7 public abstract class Computation<T> {\r
8     T result;\r
9     Exception exception;\r
10     ArrayList<Continuation<T>> continuations = new ArrayList<Continuation<T>>(); \r
11     CountDownLatch doneGate = new CountDownLatch(1); \r
12 \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
18                 else\r
19                     continuation.failed(exception);\r
20             }\r
21             else\r
22                 continuations.add(continuation);\r
23         }\r
24     }\r
25 \r
26     public boolean isDone() {\r
27         return doneGate.getCount() == 0;\r
28     }\r
29     \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
37         }\r
38         if(cs != null)\r
39             for(Continuation<T> continuation : cs)\r
40                 continuation.failed(exception);\r
41     }\r
42     \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
50         }\r
51         if(cs != null)\r
52             for(Continuation<T> continuation : cs)\r
53                 continuation.succeeded(result);\r
54     }\r
55     \r
56     public void cancel() {\r
57         failWith(new CancellationException());\r
58     }\r
59     \r
60     public T get() throws Exception {\r
61         doneGate.await();\r
62         if(exception != null)\r
63             throw exception;\r
64         return result;\r
65     }\r
66 }\r