]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.diagram/src/org/simantics/diagram/adapter/DiagramContentRequest.java
Working towards multiple readers.
[simantics/platform.git] / bundles / org.simantics.diagram / src / org / simantics / diagram / adapter / DiagramContentRequest.java
index 36e4051571534a7d92094d47667470f91fffb188..843f907a8bedd526f95a0552c9dfe62144320135 100644 (file)
@@ -16,12 +16,14 @@ import java.util.Collection;
 import java.util.Set;
 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.GraphSemaphore;
 import org.simantics.db.common.procedure.adapter.ProcedureAdapter;
+import org.simantics.db.common.request.UniqueAsyncRead;
 import org.simantics.db.common.utils.OrderedSetUtils;
 import org.simantics.db.exception.DatabaseException;
+import org.simantics.db.procedure.AsyncProcedure;
 import org.simantics.diagram.content.ConnectionPartData;
 import org.simantics.diagram.content.ConnectionPartRequest;
 import org.simantics.diagram.content.DiagramContents;
@@ -58,19 +60,6 @@ public class DiagramContentRequest extends BaseRequest<Resource, DiagramContents
     public DiagramContents perform(ReadGraph g) throws DatabaseException {
 
         final DiagramResource DIA = DiagramResource.getInstance(g);
-        final DiagramContents result = new DiagramContents();
-
-        result.elements =   new ArrayList<Resource>(previousElementCount);
-        result.nodeSet = new THashSet<Resource>();
-        result.connectionSet = new THashSet<Resource>();
-        result.connectionSegments = new THashSet<EdgeResource>();
-        result.branchPoints = new THashSet<Resource>();
-        result.routeGraphConnectionSet = new THashSet<Resource>();
-        result.routeLinks = new THashSet<EdgeResource>();
-        result.routeLines = new THashSet<Resource>();
-        result.routePoints = new THashSet<Resource>();
-
-        result.partToConnection = new THashMap<Object, Resource>();
 
         // These help loading result.elements in the correct order.
         final AtomicInteger index = new AtomicInteger();
@@ -78,96 +67,113 @@ public class DiagramContentRequest extends BaseRequest<Resource, DiagramContents
         
         Collection<Resource> components = OrderedSetUtils.toList(g, data);
         
-        GraphSemaphore s = new GraphSemaphore(g, 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.waitFor(components.size());
-        } catch (InterruptedException e) {
-            LOGGER.error("An error occured while waiting for diagram to load", e);
-        }
+        DiagramContents result = g.syncRequest(new UniqueAsyncRead<DiagramContents>() {
+
+               @Override
+               public void perform(AsyncReadGraph graph, AsyncProcedure<DiagramContents> procedure) {
+
+                       DiagramContents result = new DiagramContents();
+                       procedure.execute(graph, result);
+
+                       result.elements =   new ArrayList<Resource>(previousElementCount);
+                       result.nodeSet = new THashSet<Resource>();
+                       result.connectionSet = new THashSet<Resource>();
+                       result.connectionSegments = new THashSet<EdgeResource>();
+                       result.branchPoints = new THashSet<Resource>();
+                       result.routeGraphConnectionSet = new THashSet<Resource>();
+                       result.routeLinks = new THashSet<EdgeResource>();
+                       result.routeLines = new THashSet<Resource>();
+                       result.routePoints = new THashSet<Resource>();
+
+                       result.partToConnection = new THashMap<Object, Resource>();
+
+                       for(final 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);
+
+                               graph.forTypes(component, new ProcedureAdapter<Set<Resource>>() {
+
+                                       @Override
+                                       public void execute(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);
+                                                       }
+                                               }               
+
+                                       }
+
+                               });
+
+                       }
+               }
+
+        });
 
         // Remove elements that were not recognized in descending order.
         unrecognizedElementIndices.sort();