]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.db.impl/src/org/simantics/db/impl/query/DirectObjects.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.db.impl / src / org / simantics / db / impl / query / DirectObjects.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.Collection;\r
15 import java.util.concurrent.Semaphore;\r
16 \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.ListenerBase;\r
20 import org.simantics.db.request.RequestFlags;\r
21 \r
22 final public class DirectObjects extends CollectionBinaryQuery<IntProcedure> {\r
23 \r
24         private DirectObjects(final int r1, final int r2) {\r
25                 super(r1, r2);\r
26         }\r
27 \r
28         @Override\r
29         public int type() {\r
30                 return RequestFlags.INVALIDATE;\r
31         }\r
32         \r
33     @Override\r
34     public void clearResult(QuerySupport support) {\r
35         setResult(INVALID_RESULT);\r
36     }\r
37 \r
38         final static DirectObjects entry(final QueryProcessor provider, final int r1, final int r2) {\r
39 \r
40                 return (DirectObjects)provider.directObjectsMap.get(id(r1,r2));\r
41 \r
42         }\r
43         \r
44         final static Collection<DirectObjects> entries(final QueryProcessor processor, final int r1) {\r
45                 DoubleKeyQueryHashMap<IntProcedure> hash = processor.directObjectsMap;\r
46                 return hash.values(r1);\r
47         }\r
48 \r
49         final static void runner(ReadGraphImpl graph, final int r1, final int r2, CacheEntry parent, final ListenerBase listener, final IntProcedure procedure) {\r
50 \r
51         QueryProcessor processor = graph.processor;\r
52                 \r
53                 DirectObjects entry = (DirectObjects)processor.directObjectsMap.get(id(r1,r2));\r
54                 if(entry == null) {\r
55                         \r
56                 entry = new DirectObjects(r1, r2);\r
57                 entry.setPending();\r
58                 entry.clearResult(processor.querySupport);\r
59                 entry.putEntry(processor);\r
60                 \r
61                         processor.performForEach(graph, entry, parent, listener, procedure);\r
62                         \r
63                 } else {\r
64                         \r
65             if(entry.isPending()) {\r
66                 synchronized(entry) {\r
67                     if(entry.isPending()) {\r
68                         processor.registerDependencies(graph, entry, parent, listener, procedure, false);\r
69                                                 entry.computeForEach(graph, processor, procedure, true);\r
70                         return;\r
71                     }\r
72                 }\r
73             }\r
74                 \r
75                         processor.performForEach(graph, entry, parent, listener, procedure);\r
76                         \r
77                 }\r
78 \r
79         }\r
80 \r
81         final public static void queryEach(ReadGraphImpl graph, final int r1, final int r2, final QueryProcessor provider, final CacheEntry parent, final ListenerBase listener, final IntProcedure procedure) {\r
82 \r
83         assert(r1 != 0);\r
84         assert(r2 != 0);\r
85         \r
86         if(parent == null && listener == null) {\r
87                 DirectObjects.computeForEach(graph, r1, r2, null, procedure);\r
88         } else {\r
89                 runner(graph, r1, r2, parent, listener, procedure);\r
90         }\r
91 \r
92         }\r
93 \r
94         @Override\r
95         public BinaryQuery<IntProcedure> getEntry(QueryProcessor provider) {\r
96                 return provider.directObjectsMap.get(id);\r
97         }\r
98 \r
99         @Override\r
100         public void putEntry(QueryProcessor provider) {\r
101                 provider.directObjectsMap.put(id, this);\r
102         }\r
103 \r
104         @Override\r
105         final public void removeEntry(QueryProcessor provider) {\r
106                 provider.directObjectsMap.remove(id);\r
107         }\r
108 \r
109         @Override\r
110         public void computeForEach(ReadGraphImpl graph, final QueryProcessor queryProvider, final IntProcedure procedure, final boolean store) {\r
111                 computeForEach(graph, r1(), r2(), this, procedure);\r
112         }\r
113 \r
114         static public void computeForEach(ReadGraphImpl graph, int r1, int r2, final DirectObjects entry, final IntProcedure procedure) {\r
115 \r
116                 QueryProcessor processor = graph.processor;\r
117                 \r
118                 processor.querySupport.ensureLoaded(graph, r1, r2);\r
119 \r
120                 processor.querySupport.getObjects(graph, r1, r2, new IntProcedure() {\r
121 \r
122                         @Override\r
123                         public void execute(ReadGraphImpl graph, int i) {\r
124                                 procedure.execute(graph, i);\r
125                         }\r
126 \r
127                         @Override\r
128                         public void finished(ReadGraphImpl graph) {\r
129                         }\r
130 \r
131                         @Override\r
132                         public void exception(ReadGraphImpl graph, Throwable t) {\r
133                                 if(DebugException.DEBUG) new DebugException(t).printStackTrace();\r
134                         }\r
135 \r
136                 });\r
137 \r
138                 if(entry != null) entry.finish(graph, processor);\r
139                 procedure.finished(graph);\r
140 \r
141         }\r
142 \r
143         @Override\r
144         public String toString() {\r
145                 return "DirectObjects[" + r1() + " - " + r2() + "]";\r
146         }\r
147 \r
148         @Override\r
149         public void setReady() {\r
150                 statusOrException = READY;\r
151         }\r
152         \r
153         final private void finish(ReadGraphImpl graph, QueryProcessor provider) {\r
154                 setReady();\r
155         }\r
156 \r
157         @Override\r
158         public void performFromCache(ReadGraphImpl graph, QueryProcessor provider, IntProcedure procedure) {\r
159 \r
160                 assert(isReady());\r
161                 computeForEach(graph, provider, procedure, false);\r
162 \r
163         }\r
164 \r
165         @Override\r
166         public void recompute(ReadGraphImpl graph, QueryProcessor provider) {\r
167 \r
168         final Semaphore s = new Semaphore(0);\r
169                 \r
170                 computeForEach(graph, provider, new IntProcedure() {\r
171 \r
172                         @Override\r
173                         public void finished(ReadGraphImpl graph) {\r
174                                 s.release();\r
175                         }\r
176 \r
177                         @Override\r
178                         public void exception(ReadGraphImpl graph, Throwable t) {\r
179                                 throw new Error("Error in recompute.", t);\r
180                         }\r
181 \r
182                         @Override\r
183                         public void execute(ReadGraphImpl graphd, int i) {\r
184                         }\r
185 \r
186                 }, true);\r
187 \r
188         while(!s.tryAcquire()) {\r
189                 provider.resume(graph);\r
190         }\r
191 \r
192         }\r
193 \r
194     @Override\r
195     boolean isImmutable(ReadGraphImpl graph) {\r
196         return graph.processor.isImmutable(r1());\r
197     }\r
198         \r
199 }\r
200 \r