]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.diagram/src/org/simantics/diagram/adapter/GraphToDiagramSynchronizer.java
Merge "Diagram loading concurrency problem with Sysdyn"
[simantics/platform.git] / bundles / org.simantics.diagram / src / org / simantics / diagram / adapter / GraphToDiagramSynchronizer.java
index aa35c63342c28e8d952a7989f2cc5edd26f83f21..03cedfcb39a66cae558ccd27f0431bffa3dadadf 100644 (file)
@@ -616,6 +616,17 @@ public class GraphToDiagramSynchronizer extends AbstractDisposable implements ID
      */
     ConcurrentMap<Object, ConnectionEntityImpl> dataConnection = new ConcurrentHashMap<Object, ConnectionEntityImpl>();
 
+
+    void mapElementIfNew(final Object data, final IElement element) {
+        IElement mapped = getMappedElement(data);
+        if(mapped == null) {
+            mapElement(data, element);
+            currentUpdater.addedElements.add(element);
+            currentUpdater.addedElementMap.put(data, element);
+        }
+    }
+
+    
     /**
      * @param data
      * @param element
@@ -1744,9 +1755,15 @@ public class GraphToDiagramSynchronizer extends AbstractDisposable implements ID
                                             @Override
                                             public void execute(Resource connectionType) {
                                                 synchronized (GraphToDiagramUpdater.this) {
+                                                    IElement mapped = getMappedElement(element);
+                                                    assert(mapped != null);
+                                                    
+                                                    if (DebugPolicy.DEBUG_CONNECTION_LISTENER)
+                                                        System.out.println("CONNECTION ENTITY CREATED " + e + " " + element);
+
                                                     //System.out.println("new connection entity " + e);
-                                                    ConnectionEntityImpl entity = new ConnectionEntityImpl(element, connectionType, e);
-                                                    e.setHint(ElementHints.KEY_CONNECTION_ENTITY, entity);
+                                                    ConnectionEntityImpl entity = new ConnectionEntityImpl(element, connectionType, mapped);
+                                                    mapped.setHint(ElementHints.KEY_CONNECTION_ENTITY, entity);
                                                     addedConnectionEntities.put(element, entity);
                                                 }
                                             }
@@ -2223,13 +2240,13 @@ public class GraphToDiagramSynchronizer extends AbstractDisposable implements ID
                                     }
                                 });
 
-                            graph.syncRequest(new EdgeRequest(canvas, errorHandler, canvasListenerSupport, diagram, adapter, seg), new AsyncProcedure<IElement>() {
+                            graph.syncRequest(new EdgeRequest(GraphToDiagramSynchronizer.this, canvas, errorHandler, canvasListenerSupport, diagram, adapter, seg), new AsyncProcedure<IElement>() {
                                 @Override
                                 public void execute(AsyncReadGraph graph, IElement e) {
                                     if (DebugPolicy.DEBUG_EDGE_LOAD)
-                                        System.out.println("ADDED EDGE LOADED: " + e);
+                                        System.out.println("ADDED EDGE LOADED: " + e + " " + seg);
+
                                     if (e != null) {
-                                        mapElement(seg, e);
                                         synchronized (GraphToDiagramUpdater.this) {
                                             addedConnectionSegments.add(e);
                                             addedElementMap.put(seg, e);
@@ -2428,8 +2445,6 @@ public class GraphToDiagramSynchronizer extends AbstractDisposable implements ID
                     @Override
                     public void execute(IElement loaded) {
                         // Invoked when the element has been loaded.
-                        if (DebugPolicy.DEBUG_EDGE_LISTENER)
-                            System.out.println("EDGE LoadListener for " + loaded);
 
                         if (loaded == null) {
                             disposeListener();
@@ -2437,6 +2452,10 @@ public class GraphToDiagramSynchronizer extends AbstractDisposable implements ID
                         }
 
                         Object data = loaded.getHint(ElementHints.KEY_OBJECT);
+
+                        if (DebugPolicy.DEBUG_EDGE_LISTENER)
+                            System.out.println("EDGE LoadListener for " + loaded + " " + data);
+
                         if (addedElementMap.containsKey(data)) {
                             // This element was just loaded, in
                             // which case its hints need to