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
10 * VTT Technical Research Centre of Finland - initial API and implementation
\r
11 *******************************************************************************/
\r
12 package org.simantics.db.impl.query;
\r
14 import java.util.Collection;
\r
15 import java.util.concurrent.Semaphore;
\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
22 final public class DirectObjects extends CollectionBinaryQuery<IntProcedure> {
\r
24 private DirectObjects(final int r1, final int r2) {
\r
30 return RequestFlags.INVALIDATE;
\r
34 public void clearResult(QuerySupport support) {
\r
35 setResult(INVALID_RESULT);
\r
38 final static DirectObjects entry(final QueryProcessor provider, final int r1, final int r2) {
\r
40 return (DirectObjects)provider.directObjectsMap.get(id(r1,r2));
\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
49 final static void runner(ReadGraphImpl graph, final int r1, final int r2, CacheEntry parent, final ListenerBase listener, final IntProcedure procedure) {
\r
51 QueryProcessor processor = graph.processor;
\r
53 DirectObjects entry = (DirectObjects)processor.directObjectsMap.get(id(r1,r2));
\r
56 entry = new DirectObjects(r1, r2);
\r
58 entry.clearResult(processor.querySupport);
\r
59 entry.putEntry(processor);
\r
61 processor.performForEach(graph, entry, parent, listener, procedure);
\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
75 processor.performForEach(graph, entry, parent, listener, procedure);
\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
86 if(parent == null && listener == null) {
\r
87 DirectObjects.computeForEach(graph, r1, r2, null, procedure);
\r
89 runner(graph, r1, r2, parent, listener, procedure);
\r
95 public BinaryQuery<IntProcedure> getEntry(QueryProcessor provider) {
\r
96 return provider.directObjectsMap.get(id);
\r
100 public void putEntry(QueryProcessor provider) {
\r
101 provider.directObjectsMap.put(id, this);
\r
105 final public void removeEntry(QueryProcessor provider) {
\r
106 provider.directObjectsMap.remove(id);
\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
114 static public void computeForEach(ReadGraphImpl graph, int r1, int r2, final DirectObjects entry, final IntProcedure procedure) {
\r
116 QueryProcessor processor = graph.processor;
\r
118 processor.querySupport.ensureLoaded(graph, r1, r2);
\r
120 processor.querySupport.getObjects(graph, r1, r2, new IntProcedure() {
\r
123 public void execute(ReadGraphImpl graph, int i) {
\r
124 procedure.execute(graph, i);
\r
128 public void finished(ReadGraphImpl graph) {
\r
132 public void exception(ReadGraphImpl graph, Throwable t) {
\r
133 if(DebugException.DEBUG) new DebugException(t).printStackTrace();
\r
138 if(entry != null) entry.finish(graph, processor);
\r
139 procedure.finished(graph);
\r
144 public String toString() {
\r
145 return "DirectObjects[" + r1() + " - " + r2() + "]";
\r
149 public void setReady() {
\r
150 statusOrException = READY;
\r
153 final private void finish(ReadGraphImpl graph, QueryProcessor provider) {
\r
158 public void performFromCache(ReadGraphImpl graph, QueryProcessor provider, IntProcedure procedure) {
\r
161 computeForEach(graph, provider, procedure, false);
\r
166 public void recompute(ReadGraphImpl graph, QueryProcessor provider) {
\r
168 final Semaphore s = new Semaphore(0);
\r
170 computeForEach(graph, provider, new IntProcedure() {
\r
173 public void finished(ReadGraphImpl graph) {
\r
178 public void exception(ReadGraphImpl graph, Throwable t) {
\r
179 throw new Error("Error in recompute.", t);
\r
183 public void execute(ReadGraphImpl graphd, int i) {
\r
188 while(!s.tryAcquire()) {
\r
189 provider.resume(graph);
\r
195 boolean isImmutable(ReadGraphImpl graph) {
\r
196 return graph.processor.isImmutable(r1());
\r