]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.db.impl/src/org/simantics/db/impl/query/ExternalReadEntry.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.db.impl / src / org / simantics / db / impl / query / ExternalReadEntry.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 import java.util.LinkedList;\r
16 \r
17 import org.simantics.db.impl.graph.ReadGraphImpl;\r
18 import org.simantics.db.procedure.Procedure;\r
19 import org.simantics.db.request.ExternalRead;\r
20 import org.simantics.db.request.RequestFlags;\r
21 \r
22 final public class ExternalReadEntry<T> extends CacheEntryBase {\r
23 \r
24     final LinkedList<T> items = new LinkedList<T>();\r
25     \r
26 //    public ArrayList<Procedure<T>> procs;\r
27 \r
28     protected ExternalRead<T> request;\r
29 \r
30     @Override\r
31     int makeHash() {\r
32         return request.hashCode();\r
33     }\r
34     \r
35     @Override\r
36     public Object getOriginalRequest() {\r
37         return request;\r
38     }\r
39     \r
40     @Override\r
41     public void clearResult(QuerySupport support) {\r
42     }\r
43     \r
44     @Override\r
45     public void discard() {\r
46         request.unregistered();\r
47         request = null;\r
48         super.discard();\r
49     }\r
50     \r
51     public ExternalReadEntry(ExternalRead<T> request) {\r
52         assert request != null;\r
53         this.request = request;\r
54     }\r
55     \r
56     final public void queue(T item) {\r
57         synchronized(items) {\r
58                 items.addLast(item);\r
59                 // TODO: implement flags/logic in ExternalRead to state that all but the latest request result can be evaporated\r
60                 // In some cases where data is produced really fast this might be necessary but currently this queueing will do.\r
61         }\r
62     }\r
63     \r
64     final public void addOrSet(QueryProcessor processor, Object item) {\r
65 \r
66         try {\r
67         \r
68             assert(isPending());\r
69 \r
70             ArrayList<Procedure<T>> p = null;\r
71 \r
72             synchronized(this) {\r
73 \r
74                 setResult(item);\r
75                 setReady();\r
76 //                p = procs;\r
77 //                procs = null;\r
78 \r
79             }\r
80 \r
81 //            if(p != null)\r
82 //                for(Procedure proc : p) {\r
83 //                    proc.execute((T)item);\r
84 //                }\r
85 \r
86         } catch (Throwable t) {\r
87             t.printStackTrace();\r
88         }\r
89         \r
90     }\r
91     \r
92     @Override\r
93     final public Query getQuery() {\r
94         \r
95         return new Query() {\r
96 \r
97                         @Override\r
98                         public void recompute(ReadGraphImpl graph, Object provider, CacheEntry entry) {\r
99 \r
100                             final QueryProcessor qp = (QueryProcessor)provider;\r
101                             synchronized(items) {\r
102 \r
103                                 if(entry.isExcepted()) {\r
104                                         \r
105                                         // Exception persists\r
106                                         \r
107                                 } else {\r
108                                 \r
109                                         // Update\r
110                                         if(!items.isEmpty()) {\r
111                                                 setResult(items.removeFirst());\r
112                                         }\r
113                                         // Reschedule\r
114                                             if(!items.isEmpty()) {\r
115                                                 qp.updatePrimitive(request);\r
116                                             }\r
117                                             \r
118                                             setReady();\r
119                                             \r
120                                 }\r
121                                 \r
122                             }\r
123                                 \r
124                         }\r
125 \r
126                         @Override\r
127                         public void removeEntry(QueryProcessor processor) {\r
128                                 processor.externalReadMap.remove(request);\r
129                         }\r
130 \r
131                         @Override\r
132                         public int type() {\r
133                                 return RequestFlags.IMMEDIATE_UPDATE;\r
134                         }\r
135                         \r
136                         @Override\r
137                         public String toString() {\r
138                                 if(request == null) return "DISCARDED ExternalRead";\r
139                                 else return request.toString();\r
140                         }\r
141                 \r
142         };\r
143         \r
144     }\r
145 \r
146         public void performFromCache(Object procedure) {\r
147                 \r
148         Procedure<T> proc = (Procedure<T>)procedure;\r
149 \r
150             if(isExcepted()) {\r
151             \r
152             proc.exception((Throwable)getResult());\r
153             \r
154         } else {\r
155             \r
156             proc.execute((T)getResult());\r
157 \r
158         }\r
159                 \r
160         }\r
161 \r
162         @Override\r
163         public String toString() {\r
164                 if(request == null) return "DISCARDED ExternalRead " + System.identityHashCode(this);\r
165                 else return request.toString() + " " + + System.identityHashCode(this);\r
166         }\r
167 \r
168     @Override\r
169     public void performFromCache(ReadGraphImpl graph, Object provider, Object procedure) {\r
170         performFromCache(procedure);\r
171     }\r
172     \r
173     @Override\r
174     public void setReady() {\r
175         super.setReady();\r
176     }\r
177     \r
178     @Override\r
179     void prepareRecompute(QuerySupport querySupport) {\r
180         // Do nothing - the state is already set and cannot be recomputed on demand\r
181     }\r
182 \r
183 }\r