]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.db.impl/src/org/simantics/db/impl/query/MultiReadEntry.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.db.impl / src / org / simantics / db / impl / query / MultiReadEntry.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.common.exception.DebugException;\r
18 import org.simantics.db.impl.graph.ReadGraphImpl;\r
19 import org.simantics.db.impl.query.QueryProcessor.AsyncBarrier;\r
20 import org.simantics.db.procedure.AsyncMultiProcedure;\r
21 import org.simantics.db.request.MultiRead;\r
22 import org.simantics.db.request.RequestFlags;\r
23 import org.simantics.utils.datastructures.Pair;\r
24 \r
25 final public class MultiReadEntry<T> extends CacheEntryBase {\r
26 \r
27 //    public ArrayList<Pair<AsyncMultiProcedure<T>, AsyncBarrier>> procs;\r
28 \r
29     protected MultiRead<T> request;\r
30     \r
31     public MultiReadEntry(MultiRead<T> request) {\r
32         this.request = request;\r
33     }\r
34 \r
35     @Override\r
36     int makeHash() {\r
37         return request.hashCode();\r
38     }\r
39     \r
40     @Override\r
41     public Object getOriginalRequest() {\r
42         return request;\r
43     }\r
44     \r
45     @Override\r
46     public void discard() {\r
47         super.discard();\r
48         request = null;\r
49         setResult(null);\r
50     }\r
51     \r
52     synchronized public void finish(AsyncReadGraph graph) {\r
53         \r
54         assert(isPending());\r
55 \r
56         ArrayList<Pair<AsyncMultiProcedure<T>, AsyncBarrier>> p = null;\r
57 \r
58         synchronized(this) {\r
59 \r
60                 setReady();\r
61                 \r
62 //            p = procs;\r
63 //            procs = null; \r
64         \r
65         }\r
66         \r
67 //        if(p != null) {\r
68 //              ArrayList<T> v = (ArrayList<T>)getResult();\r
69 //              if(v != null) {\r
70 //                      for(Pair<AsyncMultiProcedure<T>, AsyncBarrier> pair : p) {\r
71 //                              for(T t : v) pair.first.execute(graph, t);\r
72 //                      }\r
73 //              }\r
74 //              for(Pair<AsyncMultiProcedure<T>, AsyncBarrier> pair : p) {\r
75 //                      pair.first.finished(graph);\r
76 //                      pair.second.dec();\r
77 //              }\r
78 //        }\r
79         \r
80     }\r
81 \r
82     @Override\r
83     final public void clearResult(QuerySupport support) {\r
84         setResult(new ArrayList<T>());\r
85     }\r
86 \r
87     final synchronized public void addOrSet(Object item) {\r
88 \r
89         assert(isPending());\r
90 \r
91         ArrayList<T> value = (ArrayList<T>)getResult(); \r
92         value.add((T)item);\r
93         \r
94     }\r
95     \r
96     @Override\r
97     final public Query getQuery() {\r
98         \r
99         return new Query() {\r
100 \r
101                         @Override\r
102                         public void recompute(ReadGraphImpl graph, Object provider, CacheEntry entry) {\r
103                                 \r
104                                 QueryProcessor qp = (QueryProcessor)provider;\r
105 \r
106                                 final ReadGraphImpl parentGraph = ReadGraphImpl.forRecompute(entry, qp); \r
107 //                parentGraph.state.barrier.inc();\r
108 \r
109                                 try {\r
110 \r
111                                     request.perform(parentGraph , new AsyncMultiProcedure<T>() {\r
112 \r
113                         @Override\r
114                         public void execute(AsyncReadGraph graph, T result) {\r
115                             addOrSet(result);\r
116 //                            parentGraph.state.barrier.dec();\r
117                         }\r
118                         \r
119                         public void finished(AsyncReadGraph graph) {\r
120                                 finish(graph);\r
121 //                            parentGraph.state.barrier.dec();\r
122                         };\r
123                                         \r
124                                         @Override\r
125                                         public void exception(AsyncReadGraph graph, Throwable t) {\r
126                             except(t);\r
127 //                            parentGraph.state.barrier.dec();\r
128                             }\r
129 \r
130                     });\r
131 \r
132 //                                      parentGraph.waitAsync(request);\r
133 \r
134                                 } catch (Throwable t) {\r
135                     except(t);\r
136 //                    parentGraph.state.barrier.dec();\r
137                     if(DebugException.DEBUG) new DebugException(t).printStackTrace();\r
138                 }\r
139                                 \r
140                         }\r
141 \r
142                         @Override\r
143                         public void removeEntry(QueryProcessor processor) {\r
144                         processor.multiReadMap.remove(request);\r
145                         }\r
146 \r
147                         @Override\r
148                         public int type() {\r
149                                 return RequestFlags.INVALIDATE;\r
150                         }\r
151                         \r
152                         @Override\r
153                         public String toString() {\r
154                                 if(request == null) return "DISCARDED";\r
155                                 else return request.toString() + statusOrException;\r
156                         }\r
157                 \r
158         };\r
159         \r
160     }\r
161 \r
162     public void performFromCache(AsyncReadGraph graph, Object provider, Object procedure) {\r
163         \r
164         AsyncMultiProcedure<T> proc = (AsyncMultiProcedure<T>)procedure;\r
165 \r
166         if(isExcepted()) {\r
167             \r
168             try {\r
169                 proc.exception(graph, (Throwable)getResult());\r
170             } catch (Throwable t) {\r
171                 t.printStackTrace();\r
172             }\r
173 //            parentBarrier.dec();\r
174             \r
175         } else {\r
176             \r
177             final ArrayList<T> values = (ArrayList<T>)getResult();\r
178             for(T value : values) {\r
179                 try {\r
180                     proc.execute(graph, value);\r
181                 } catch (Throwable t) {\r
182                     t.printStackTrace();\r
183                 }\r
184             }\r
185 \r
186             try {\r
187                 proc.finished(graph);\r
188             } catch (Throwable t) {\r
189                 t.printStackTrace();\r
190             }\r
191 //            parentBarrier.dec();\r
192 \r
193         }\r
194         \r
195     }\r
196     \r
197         @Override\r
198         public void performFromCache(ReadGraphImpl graph, Object provider,\r
199                         Object procedure) {\r
200                 \r
201                 final AsyncMultiProcedure<T> proc = (AsyncMultiProcedure<T>)procedure;\r
202 \r
203         if(isExcepted()) {\r
204             \r
205             try {\r
206                 proc.exception(graph, (Throwable)getResult());\r
207             } catch (Throwable t) {\r
208                 t.printStackTrace();\r
209             }\r
210             \r
211         } else {\r
212             \r
213             final ArrayList<T> values = (ArrayList<T>)getResult();\r
214             for(T value : values) {\r
215                 try {\r
216                     proc.execute(graph, value);\r
217                 } catch (Throwable t) {\r
218                     t.printStackTrace();\r
219                 }\r
220             }\r
221 \r
222             try {\r
223                 proc.finished(graph);\r
224             } catch (Throwable t) {\r
225                 t.printStackTrace();\r
226             }\r
227 \r
228         }\r
229                 \r
230                 \r
231                 \r
232         }\r
233         \r
234         @Override\r
235         public String toString() {\r
236                 if(request == null) return "DISCARDED";\r
237                 else return request.toString() + statusOrException;\r
238         }\r
239 \r
240 }\r