]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.db.impl/src/org/simantics/db/impl/query/ChildMap.java
Trying to remove synchronization problems
[simantics/platform.git] / bundles / org.simantics.db.impl / src / org / simantics / db / impl / query / ChildMap.java
index 7dd00d29ba7815443809c556070647c78d8a6ebc..19c36c77c67491483d2d0d48b4505522e5007968 100644 (file)
@@ -21,170 +21,130 @@ import org.simantics.db.impl.graph.ReadGraphImpl;
 import org.simantics.db.impl.procedure.InternalProcedure;
 import org.simantics.db.service.CollectionSupport;
 
-final public class ChildMap extends UnaryQuery<InternalProcedure<ObjectResourceIdMap<String>>> {
-       
+final public class ChildMap extends UnaryQueryP<ObjectResourceIdMap<String>> {
+
     ChildMap(final int r) {
         super(r);
     }
-    
-       @Override
-       final public void removeEntry(QueryProcessor provider) {
-               provider.cache.remove(this);
-       }
-       
-    //@Override
-       public Object compute(ReadGraphImpl graph, final InternalProcedure<ObjectResourceIdMap<String>> procedure) throws DatabaseException {
-               computeForEach(graph, id, this, procedure);
-               return getResult();
+
+    @Override
+    final public void removeEntry(QueryProcessor provider) {
+        provider.cache.remove(this);
     }
 
-       public static void computeForEach(ReadGraphImpl graph, final int root, final ChildMap entry, final InternalProcedure<ObjectResourceIdMap<String>> procedure) throws DatabaseException {
-               
-               if(root == 0) {
-                       if(entry != null)
-                               entry.add2(graph, null);
+    @Override
+    public void compute(ReadGraphImpl graph, final InternalProcedure<ObjectResourceIdMap<String>> procedure)
+            throws DatabaseException {
+        computeForEach(graph, id, this, procedure);
+    }
+
+    public static void computeForEach(ReadGraphImpl graph, final int root, final ChildMap entry,
+            final InternalProcedure<ObjectResourceIdMap<String>> procedure_) throws DatabaseException {
+
+        InternalProcedure<ObjectResourceIdMap<String>> procedure = entry != null ? entry : procedure_;
+
+        computeForEach2(graph, root, entry, procedure);
+
+        if (entry != null)
+            entry.performFromCache(graph, procedure_);
+
+    }
+
+    public static void computeForEach2(ReadGraphImpl graph, final int root, final ChildMap parent,
+            final InternalProcedure<ObjectResourceIdMap<String>> procedure) throws DatabaseException {
+
+        if (root == 0) {
             procedure.execute(graph, null);
             return;
-               }
-
-               QueryProcessor processor = graph.processor;
-               
-               final int consistsOf = processor.getConsistsOf();
-               final int hasName = processor.getHasName();
-        
-               ObjectResourceIdMap<String> result = graph.getService(CollectionSupport.class).createObjectResourceMap(String.class);
-        
-        QueryCache.runnerObjects(graph, root, consistsOf, entry, null, new SyncIntProcedure() {
-               
-               @Override
-                       public void run(ReadGraphImpl graph) throws DatabaseException {
-                       
-                       if(entry != null) entry.add2(graph, result);
-                       procedure.execute(graph, result);
-                               
-                       }
-
-                       @Override
-                       public void finished(ReadGraphImpl graph) throws DatabaseException {
-                               dec(graph);
-                       }
-
-               @Override
-               public void execute(ReadGraphImpl graph, final int obj) throws DatabaseException {
-
-                       inc();
-                       
-                       QueryCache.runnerObjects(graph, obj, hasName, entry, null, new IntProcedure() {
-                       
-                       @Override
-                       public void execute(ReadGraphImpl graph, int i) throws DatabaseException {
-
-                               inc();
-
-                               QueryCache.runnerValueQuery(graph, i, entry, null, new InternalProcedure<byte[]>() {
-                                       
-                                       @Override
-                                       public void execute(ReadGraphImpl graph, byte[] value) throws DatabaseException {
-                                               
-                                               if(value != null) {
-
-                                       try {
-
-                                               Binding b = WriteBindings.STRING;
-                                           Serializer serializer = b.serializer();
-                                           final String part = (String)serializer.deserialize(value);
-                                           result.putId(part, obj);
-                                           
-                                               } catch (Throwable e) {
-                                           if(DebugException.DEBUG) new DebugException(e).printStackTrace();
-                                       }
-                                               
-                                               }
-                                               
-                                       dec(graph);
-                                       
-                                       }
-                                       
-                                       @Override
-                                       public void exception(ReadGraphImpl graph, Throwable t) throws DatabaseException {
-                                                       if(entry != null) entry.except(t);
-                                               dec(graph);
+        }
+
+        QueryProcessor processor = graph.processor;
+
+        final int consistsOf = processor.getConsistsOf();
+        final int hasName = processor.getHasName();
+
+        ObjectResourceIdMap<String> result = graph.getService(CollectionSupport.class)
+                .createObjectResourceMap(String.class);
+
+        QueryCache.runnerObjects(graph, root, consistsOf, parent, null, new SyncIntProcedure() {
+
+            @Override
+            public void run(ReadGraphImpl graph) throws DatabaseException {
+                procedure.execute(graph, result);
+            }
+
+            @Override
+            public void finished(ReadGraphImpl graph) throws DatabaseException {
+                dec(graph);
+            }
+
+            @Override
+            public void execute(ReadGraphImpl graph, final int obj) throws DatabaseException {
+
+                inc();
+
+                QueryCache.runnerObjects(graph, obj, hasName, parent, null, new IntProcedure() {
+
+                    @Override
+                    public void execute(ReadGraphImpl graph, int i) throws DatabaseException {
+
+                        inc();
+
+                        QueryCache.runnerValueQuery(graph, i, parent, null, new InternalProcedure<byte[]>() {
+
+                            @Override
+                            public void execute(ReadGraphImpl graph, byte[] value) throws DatabaseException {
+
+                                if (value != null) {
+
+                                    try {
+
+                                        Binding b = WriteBindings.STRING;
+                                        Serializer serializer = b.serializer();
+                                        final String part = (String) serializer.deserialize(value);
+                                        result.putId(part, obj);
+
+                                    } catch (Throwable e) {
+                                        if (DebugException.DEBUG)
+                                            new DebugException(e).printStackTrace();
+                                    }
+
+                                }
+
+                                dec(graph);
+
+                            }
+
+                            @Override
+                            public void exception(ReadGraphImpl graph, Throwable t) throws DatabaseException {
+                                dec(graph);
                             }
 
-                               });
-                               
-                       }
-                       
-                       @Override
-                       public void finished(ReadGraphImpl graph) throws DatabaseException {
-                               dec(graph);
-                       }
-                               
-                               @Override
-                               public void exception(ReadGraphImpl graph, Throwable t) throws DatabaseException {
-                                       if(entry != null) entry.except(t);
+                        });
+
+                    }
+
+                    @Override
+                    public void finished(ReadGraphImpl graph) throws DatabaseException {
+                        dec(graph);
+                    }
+
+                    @Override
+                    public void exception(ReadGraphImpl graph, Throwable t) throws DatabaseException {
                         dec(graph);
                     }
 
                 });
 
-               }
-               
+            }
+
         });
-        
-    }
 
-    @Override
-    public String toString() {
-       return "ChildMap[" + id + "]";
     }
 
-    private void add2(ReadGraphImpl graph, ObjectResourceIdMap<String> result) {
-       
-       assert(isPending());
-
-        synchronized(this) {
-
-            setResult(result);
-               setReady();
-        
-        }
-       
-    }
-    
     @Override
-    public Object performFromCache(ReadGraphImpl graph, InternalProcedure<ObjectResourceIdMap<String>> procedure) throws DatabaseException {
-        
-        assert(isReady());
-        
-       if(handleException(graph, procedure)) return (Throwable)statusOrException;
-        
-       ObjectResourceIdMap<String> result = (ObjectResourceIdMap<String>)getResult();
-       
-        procedure.execute(graph, result);
-        
-        return result;
-        
+    public String toString() {
+        return "ChildMap[" + id + "]";
     }
-    
-    @Override
-    public void recompute(ReadGraphImpl graph) throws DatabaseException {
-        
-        compute(graph, new InternalProcedure<ObjectResourceIdMap<String>>() {
-
-            @Override
-            public void execute(ReadGraphImpl graph, ObjectResourceIdMap<String> result) {
-            }
-                       
-                       @Override
-                       public void exception(ReadGraphImpl graph, Throwable t) {
-                if(DebugException.DEBUG) new DebugException(t).printStackTrace();
-                               throw new Error("Error in recompute.", t);
-            }
 
-        });
-        
-    }
-    
 }
-