]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.diagram/src/org/simantics/diagram/adapter/DiagramContentRequest.java
Still working for multiple readers
[simantics/platform.git] / bundles / org.simantics.diagram / src / org / simantics / diagram / adapter / DiagramContentRequest.java
index 56063b990f71e771180a75acfd06db99b09877fa..fe7479e5df20a5dfdf0d59a605370414d754219d 100644 (file)
@@ -17,13 +17,17 @@ import gnu.trove.procedure.TIntProcedure;
 import gnu.trove.set.hash.THashSet;
 
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.Set;
+import java.util.concurrent.Semaphore;
 import java.util.concurrent.atomic.AtomicInteger;
 
 import org.simantics.db.AsyncReadGraph;
 import org.simantics.db.ReadGraph;
 import org.simantics.db.Resource;
+import org.simantics.db.common.primitiverequest.OrderedSet;
 import org.simantics.db.common.procedure.adapter.ProcedureAdapter;
+import org.simantics.db.common.utils.OrderedSetUtils;
 import org.simantics.db.exception.DatabaseException;
 import org.simantics.db.procedure.AsyncMultiProcedure;
 import org.simantics.db.procedure.AsyncProcedure;
@@ -71,124 +75,149 @@ public class DiagramContentRequest extends BaseRequest<Resource, DiagramContents
         // These help loading result.elements in the correct order.
         final AtomicInteger index = new AtomicInteger();
         final TIntArrayList unrecognizedElementIndices = new TIntArrayList();
-
-        g.forOrderedSet(data, new AsyncMultiProcedure<Resource>() {
-
-            @Override
-            public void execute(AsyncReadGraph graph, final Resource component) {
-
-                // Must add the elements to the result set here in order to
-                // keep their order the same as in the ordered set.
-                final int elementIndex = index.getAndIncrement();
-                result.elements.add(component);
-
-                graph.forTypes(component, new AsyncProcedure<Set<Resource>>() {
-
-                    @Override
-                    public void exception(AsyncReadGraph graph, Throwable t) {
-                        if (errorHandler != null)
-                            errorHandler.error(t.getMessage(), t);
-                    }
-
-                    @Override
-                    public void execute(AsyncReadGraph graph, Set<Resource> types) {
-                        if (types.contains(DIA.Connection)) {
-                            if (types.contains(DIA.RouteGraphConnection)) {
-                                graph.asyncRequest(new RouteGraphConnectionPartRequest(errorHandler, DIA, component),
-                                        new ProcedureAdapter<RouteGraphConnectionPartData>() {
-                                    @Override
-                                    public void execute(RouteGraphConnectionPartData partData) {
-                                        synchronized (result) {
-                                            for (EdgeResource link : partData.links) {
-                                                result.routeLinks.add(link);
-                                                result.partToConnection.put(link, component);
-                                                result.connectionToParts.add(component, link);
-                                            }
-                                            for (Resource line : partData.routeLines) {
-                                                result.routeLines.add(line);
-                                                result.connectionToParts.add(component, line);
-                                                result.partToConnection.put(line, component);
-                                            }
-                                            for (Resource point : partData.routePoints) {
-                                                result.routePoints.add(point);
-                                                result.connectionToParts.add(component, point);
-                                                result.partToConnection.put(point, component);
-                                            }
-                                        }
-                                    }
-                                });
-
-                                synchronized (result.routeGraphConnectionSet) {
-                                    result.routeGraphConnectionSet.add(component);
-                                }
-                            } else {
-                                graph.asyncRequest(new ConnectionPartRequest(errorHandler, DIA, component),
-                                        new ProcedureAdapter<ConnectionPartData>() {
-                                    @Override
-                                    public void execute(ConnectionPartData partData) {
-                                        synchronized (result) {
-                                            for (EdgeResource er : partData.edges) {
-                                                result.connectionSegments.add(er);
-                                                result.partToConnection.put(er, component);
-                                                result.connectionToParts.add(component, er);
-                                            }
-                                            for (Resource bp : partData.branchPoints) {
-                                                result.branchPoints.add(bp);
-                                                result.connectionToParts.add(component, bp);
-                                                result.partToConnection.put(bp, component);
-                                            }
-                                        }
-                                    }
-                                });
-
-                                synchronized (result.connectionSet) {
-                                    result.connectionSet.add(component);
-                                }
-                            }
-                        }
-                        else if (types.contains(DIA.Element)) {
-                            synchronized (result.nodeSet) {
-                                result.nodeSet.add(component);
-                            }
-                        }
-                        else {
-                            synchronized (unrecognizedElementIndices) {
-                                // Unrecognized element, mark it to be
-                                // removed after everything is processed.
-                                unrecognizedElementIndices.add(elementIndex);
-                            }
-                        }
-                    }
-
-                });
-
-            }
-
+        
+        Collection<Resource> components = OrderedSetUtils.toList(g, data);
+        
+        Semaphore s = new Semaphore(0);
+        
+        for(Resource component : components) {
+               
+            // Must add the elements to the result set here in order to
+            // keep their order the same as in the ordered set.
+            final int elementIndex = index.getAndIncrement();
+            result.elements.add(component);
+
+               Set<Resource> types = g.getTypes(component);
+               
+                if (types.contains(DIA.Connection)) {
+                 if (types.contains(DIA.RouteGraphConnection)) {
+                     g.asyncRequest(new RouteGraphConnectionPartRequest(errorHandler, DIA, component),
+                             new ProcedureAdapter<RouteGraphConnectionPartData>() {
+                         @Override
+                         public void execute(RouteGraphConnectionPartData partData) {
+                             synchronized (result) {
+                                 for (EdgeResource link : partData.links) {
+                                     result.routeLinks.add(link);
+                                     result.partToConnection.put(link, component);
+                                     result.connectionToParts.add(component, link);
+                                 }
+                                 for (Resource line : partData.routeLines) {
+                                     result.routeLines.add(line);
+                                     result.connectionToParts.add(component, line);
+                                     result.partToConnection.put(line, component);
+                                 }
+                                 for (Resource point : partData.routePoints) {
+                                     result.routePoints.add(point);
+                                     result.connectionToParts.add(component, point);
+                                     result.partToConnection.put(point, component);
+                                 }
+                             }
+                             s.release();
+                         }
+                     });
+
+                     synchronized (result.routeGraphConnectionSet) {
+                         result.routeGraphConnectionSet.add(component);
+                     }
+                 } else {
+                     g.asyncRequest(new ConnectionPartRequest(errorHandler, DIA, component),
+                             new ProcedureAdapter<ConnectionPartData>() {
+                         @Override
+                         public void execute(ConnectionPartData partData) {
+                             synchronized (result) {
+                                 for (EdgeResource er : partData.edges) {
+                                     result.connectionSegments.add(er);
+                                     result.partToConnection.put(er, component);
+                                     result.connectionToParts.add(component, er);
+                                 }
+                                 for (Resource bp : partData.branchPoints) {
+                                     result.branchPoints.add(bp);
+                                     result.connectionToParts.add(component, bp);
+                                     result.partToConnection.put(bp, component);
+                                 }
+                             }
+                             s.release();
+                         }
+                     });
+
+                     synchronized (result.connectionSet) {
+                         result.connectionSet.add(component);
+                     }
+                 }
+             }
+             else if (types.contains(DIA.Element)) {
+                 synchronized (result.nodeSet) {
+                     result.nodeSet.add(component);
+                 }
+                 s.release();
+
+             }
+             else {
+                 synchronized (unrecognizedElementIndices) {
+                     // Unrecognized element, mark it to be
+                     // removed after everything is processed.
+                     unrecognizedElementIndices.add(elementIndex);
+                 }
+                 s.release();
+             }         
+               
+        }
+
+        try {
+                       s.acquire(components.size());
+               } catch (InterruptedException e) {
+                       e.printStackTrace();
+               }
+        
+        // Remove elements that were not recognized in descending order.
+        unrecognizedElementIndices.sort();
+        unrecognizedElementIndices.forEachDescending(new TIntProcedure() {
             @Override
-            public void finished(AsyncReadGraph graph) {
-                // Remove elements that were not recognized in descending order.
-                unrecognizedElementIndices.sort();
-                unrecognizedElementIndices.forEachDescending(new TIntProcedure() {
-                    @Override
-                    public boolean execute(int index) {
-                        result.elements.remove(index);
-                        return true;
-                    }
-                });
-
-                // Help successive request executions by remembering the previous
-                // element count. This will relieve some ArrayList reallocation
-                // strain down the road.
-                previousElementCount = result.elements.size();
-            }
-
-            @Override
-            public void exception(AsyncReadGraph graph, Throwable t) {
-                if (errorHandler != null)
-                    errorHandler.error(t.getMessage(), t);
+            public boolean execute(int index) {
+                result.elements.remove(index);
+                return true;
             }
         });
 
+        // Help successive request executions by remembering the previous
+        // element count. This will relieve some ArrayList reallocation
+        // strain down the road.
+        previousElementCount = result.elements.size();
+        
+
+//        g.forOrderedSet(data, new AsyncMultiProcedure<Resource>() {
+//
+//            @Override
+//            public void execute(AsyncReadGraph graph, final Resource component) {
+//
+//                graph.forTypes(component, new AsyncProcedure<Set<Resource>>() {
+//
+//                    @Override
+//                    public void exception(AsyncReadGraph graph, Throwable t) {
+//                        if (errorHandler != null)
+//                            errorHandler.error(t.getMessage(), t);
+//                    }
+//
+//                    @Override
+//                    public void execute(AsyncReadGraph graph, Set<Resource> types) {
+//                       
+//                    }
+//
+//                });
+//
+//            }
+//
+//            @Override
+//            public void finished(AsyncReadGraph graph) {
+//            }
+//
+//            @Override
+//            public void exception(AsyncReadGraph graph, Throwable t) {
+//                if (errorHandler != null)
+//                    errorHandler.error(t.getMessage(), t);
+//            }
+//        });
+
         return result;
     }
 }
\ No newline at end of file