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