]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.db.impl/src/org/simantics/db/impl/query/AsyncReadEntry.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.db.impl / src / org / simantics / db / impl / query / AsyncReadEntry.java
1 /*******************************************************************************\r
2  * Copyright (c) 2007, 2010 Association for Decentralized Information Management\r
3  * in Industry THTH ry.\r
4  * All rights reserved. This program and the accompanying materials\r
5  * are made available under the terms of the Eclipse Public License v1.0\r
6  * which accompanies this distribution, and is available at\r
7  * http://www.eclipse.org/legal/epl-v10.html\r
8  *\r
9  * Contributors:\r
10  *     VTT Technical Research Centre of Finland - initial API and implementation\r
11  *******************************************************************************/\r
12 package org.simantics.db.impl.query;\r
13 \r
14 import java.util.ArrayList;\r
15 \r
16 import org.simantics.db.AsyncReadGraph;\r
17 import org.simantics.db.impl.DebugPolicy;\r
18 import org.simantics.db.impl.graph.ReadGraphImpl;\r
19 import org.simantics.db.procedure.AsyncProcedure;\r
20 import org.simantics.db.request.AsyncRead;\r
21 \r
22 final public class AsyncReadEntry<T> extends CacheEntryBase {\r
23 \r
24     protected AsyncRead<T> request;\r
25 \r
26     public AsyncReadEntry(AsyncRead<T> request) {\r
27         this.request = request;\r
28         if(DebugPolicy.QUERY_STATE) System.out.println("[QUERY STATE]: created " + this);\r
29     }\r
30 \r
31     @Override\r
32     int makeHash() {\r
33         return request.hashCode();\r
34     }\r
35     \r
36     @Override\r
37     public Object getOriginalRequest() {\r
38         return request;\r
39     }\r
40     \r
41     @Override\r
42     public void discard() {\r
43         super.discard();\r
44         //request = null;\r
45         setResult(null);\r
46     }\r
47     \r
48     final public void addOrSet(AsyncReadGraph graph, Object item) {\r
49 \r
50         assert(isPending());\r
51         \r
52 //        ArrayList<AsyncProcedure<T>> p = null;\r
53 \r
54         synchronized(this) {\r
55                 \r
56             setResult(item);\r
57                 setReady();\r
58 //            p = procs;\r
59 //            procs = null;\r
60             \r
61         }\r
62 \r
63 //        if(p != null)\r
64 //            for(AsyncProcedure<T> proc : p) {\r
65 //              proc.execute(graph, (T)item);\r
66 ////                proc.first.execute(graph, (T)item);\r
67 ////                proc.second.dec();\r
68 //            }\r
69         \r
70     }\r
71     \r
72     \r
73     public void except(AsyncReadGraph graph, Throwable t) {\r
74         \r
75         assert(isPending());\r
76         \r
77 //        ArrayList<AsyncProcedure<T>> p = null;\r
78 \r
79         synchronized(this) {\r
80                 \r
81             except(t);\r
82 ////            p = procs;\r
83 //            procs = null;\r
84             \r
85         }\r
86 \r
87 //        if(p != null)\r
88 //            for(AsyncProcedure<T> proc : p) {\r
89 //              proc.exception(graph, t);\r
90 //            }\r
91         \r
92     }\r
93     \r
94     \r
95     @Override\r
96     final public Query getQuery() {\r
97         \r
98         return new Query() {\r
99 \r
100                         @Override\r
101                         public void recompute(ReadGraphImpl graph, Object provider, CacheEntry entry) {\r
102                                 \r
103                                 QueryProcessor qp = (QueryProcessor)provider;\r
104 \r
105                                 final ReadGraphImpl parentGraph = ReadGraphImpl.forRecompute(entry, qp); \r
106 \r
107                                 try {\r
108 \r
109                                     request.perform(parentGraph , new AsyncProcedure<T>() {\r
110 \r
111                         @Override\r
112                         public void execute(AsyncReadGraph graph, T result) {\r
113                             addOrSet(graph, result);\r
114                         }\r
115                                 \r
116                                 @Override\r
117                                 public void exception(AsyncReadGraph graph, Throwable t) {\r
118                                     except(t);\r
119                         }\r
120 \r
121                     });\r
122 \r
123                                 } catch (Throwable t) {\r
124                                     except(t);\r
125                 }\r
126                                 \r
127                         }\r
128 \r
129                         @Override\r
130                         public void removeEntry(QueryProcessor qp) {\r
131                         qp.asyncReadMap.remove(request);\r
132                         }\r
133 \r
134                         @Override\r
135                         public int type() {\r
136                                 return request.getFlags();\r
137                         }\r
138                         \r
139                         @Override\r
140                         public String toString() {\r
141                                 if(request == null) return "DISCARDED";\r
142                                 else if(isExcepted()) return request.toString() + " " + getResult();\r
143                                 else return request.toString() + " " + statusOrException;\r
144                         }\r
145                 \r
146         };\r
147         \r
148     }\r
149 \r
150         public void performFromCache(ReadGraphImpl graph, Object provider, Object procedure) {\r
151                 \r
152         AsyncProcedure<T> proc = (AsyncProcedure<T>)procedure;\r
153 \r
154             if(isExcepted()) {\r
155             \r
156             try {\r
157                 proc.exception(graph, (Throwable)getResult());\r
158             } catch (Throwable t) {\r
159                 t.printStackTrace();\r
160             }\r
161             \r
162         } else {\r
163             \r
164             try {\r
165                 proc.execute(graph, (T)getResult());\r
166             } catch (Throwable t) {\r
167                 t.printStackTrace();\r
168             }\r
169             \r
170         }\r
171                 \r
172         }\r
173 \r
174         @Override\r
175         public String toString() {\r
176                 if(isDiscarded()) return "DISCARDED " + request.toString();\r
177                 else if(isExcepted()) return request.toString() + " " + getResult();\r
178                 else return request.toString() + " " + statusOrException;\r
179         }\r
180 \r
181 }\r