]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.db.impl/src/org/simantics/db/impl/query/ReadEntry.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.db.impl / src / org / simantics / db / impl / query / ReadEntry.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 org.simantics.db.AsyncReadGraph;\r
15 import org.simantics.db.exception.DatabaseException;\r
16 import org.simantics.db.impl.graph.ReadGraphImpl;\r
17 import org.simantics.db.impl.graph.WriteGraphImpl;\r
18 import org.simantics.db.procedure.AsyncProcedure;\r
19 import org.simantics.db.request.Read;\r
20 import org.simantics.db.request.ReadExt;\r
21 import org.simantics.db.request.RequestFlags;\r
22 \r
23 final public class ReadEntry<T> extends CacheEntryBase {\r
24 \r
25         protected Read<T> request;\r
26 \r
27         public ReadEntry(Read<T> request) {\r
28         this.request = request;\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         setResult(null);\r
45     }\r
46         \r
47     final public void addOrSet(AsyncReadGraph graph, Object item) {\r
48 \r
49         assert(assertPending());\r
50         \r
51 //        ArrayList<Pair<AsyncProcedure<T>, AsyncBarrier>> p = null;\r
52 \r
53         synchronized(this) {\r
54             \r
55             setResult(item);\r
56                 setReady();\r
57 //              p = procs;\r
58 //              procs = null;\r
59                 \r
60         }\r
61 \r
62 //        if(p != null)\r
63 //              for(Pair<AsyncProcedure<T>, AsyncBarrier> proc : p) {\r
64 //                      proc.first.execute(graph, (T)item);\r
65 //                      proc.second.dec();\r
66 //              }\r
67         \r
68     }\r
69 \r
70     @Override\r
71     final public Query getQuery() {\r
72         \r
73         return new Query() {\r
74 \r
75                         @Override\r
76                         public void recompute(ReadGraphImpl graph_, Object provider, CacheEntry entry) {\r
77                                 \r
78                                 QueryProcessor qp = (QueryProcessor)provider;\r
79                                 \r
80                         WriteGraphImpl write = qp.getCore().getSession().getService(WriteGraphImpl.class);\r
81                                 \r
82                         ReadGraphImpl graph = write.newSync(entry);\r
83 \r
84                                 try {\r
85 \r
86                                         entry.setPending();\r
87                                     T result = request.perform(graph);\r
88                                     addOrSet(graph, result);\r
89 \r
90                                 } catch (Throwable t) {\r
91 \r
92                                         except(t);\r
93                     \r
94                 }\r
95                                 \r
96                         }\r
97 \r
98                         @Override\r
99                         public void removeEntry(QueryProcessor processor) {\r
100                                 processor.readMap.remove(request);\r
101                         }\r
102 \r
103                         @Override\r
104                         public int type() {\r
105                                 if(request instanceof ReadExt) {\r
106                                         return ((ReadExt)request).getType();\r
107                                 } else {\r
108                                         return RequestFlags.INVALIDATE;\r
109                                 }\r
110                         }\r
111                         \r
112                         @Override\r
113                         public String toString() {\r
114                                 if(request == null) return "DISCARDED";\r
115                                 else return request.toString() + statusOrException;\r
116                         }\r
117                 \r
118         };\r
119         \r
120     }\r
121     \r
122         public void performFromCache(ReadGraphImpl graph, Object provider,      Object procedure) {\r
123             \r
124         AsyncProcedure<T> proc = (AsyncProcedure<T>)procedure;\r
125 \r
126             if(isExcepted()) {\r
127 \r
128             try {\r
129                 proc.exception(graph, (Throwable)getResult());\r
130             } catch (Throwable t) {\r
131                 t.printStackTrace();\r
132             }\r
133                 \r
134             } else {\r
135                 \r
136             try {\r
137                 proc.execute(graph, (T)getResult());\r
138             } catch (Throwable t) {\r
139                 t.printStackTrace();\r
140             }\r
141 \r
142             }\r
143                 \r
144         }\r
145         \r
146         @Override\r
147         public String toString() {\r
148                 if(request == null) return "DISCARDED";\r
149                 else return request.toString() + " - " + statusOrException;\r
150         }\r
151         \r
152         public Object get(ReadGraphImpl graph, QueryProcessor processor, Object procedure) throws DatabaseException {\r
153                 if(procedure != null) performFromCache(graph, processor, procedure);\r
154                 checkAndThrow();\r
155                 return getResult();\r
156         }\r
157         \r
158         @Override\r
159         boolean isImmutable(ReadGraphImpl graph) throws DatabaseException {\r
160                 if(request instanceof ReadExt) {\r
161                         return ((ReadExt)request).isImmutable(graph);\r
162                 }\r
163                 return false;\r
164         }\r
165 \r
166 }\r