X-Git-Url: https://gerrit.simantics.org/r/gitweb?a=blobdiff_plain;f=bundles%2Forg.simantics.diagram%2Fsrc%2Forg%2Fsimantics%2Fdiagram%2Fadapter%2FGraphToDiagramSynchronizer.java;h=226f47daa76b62ea90f572d561aa75e6bc830295;hb=28438fa467ae60dd63515be2df724c6ff9c299c9;hp=aa35c63342c28e8d952a7989f2cc5edd26f83f21;hpb=881a82d0707953038b327d334560ac12ac3e5ea9;p=simantics%2Fplatform.git diff --git a/bundles/org.simantics.diagram/src/org/simantics/diagram/adapter/GraphToDiagramSynchronizer.java b/bundles/org.simantics.diagram/src/org/simantics/diagram/adapter/GraphToDiagramSynchronizer.java index aa35c6334..226f47daa 100644 --- a/bundles/org.simantics.diagram/src/org/simantics/diagram/adapter/GraphToDiagramSynchronizer.java +++ b/bundles/org.simantics.diagram/src/org/simantics/diagram/adapter/GraphToDiagramSynchronizer.java @@ -616,6 +616,17 @@ public class GraphToDiagramSynchronizer extends AbstractDisposable implements ID */ ConcurrentMap dataConnection = new ConcurrentHashMap(); + + 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 @@ -1638,7 +1649,7 @@ public class GraphToDiagramSynchronizer extends AbstractDisposable implements ID this.removedRouteGraphConnections.clear(); } - void processNodes(ReadGraph graph) throws DatabaseException { + void processNodes(AsyncReadGraph graph) throws DatabaseException { for (Map.Entry entry : changes.elements.entrySet()) { @@ -1730,7 +1741,7 @@ public class GraphToDiagramSynchronizer extends AbstractDisposable implements ID } }; - graph.syncRequest(new ConnectionRequest(canvas, diagram, element, errorHandler, loadListener), new AsyncProcedure() { + graph.asyncRequest(new ConnectionRequest(canvas, diagram, element, errorHandler, loadListener), new AsyncProcedure() { @Override public void execute(AsyncReadGraph graph, final IElement e) { @@ -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); } } @@ -1833,7 +1850,7 @@ public class GraphToDiagramSynchronizer extends AbstractDisposable implements ID }; //System.out.println("NODE REQUEST: " + element); - graph.syncRequest(new NodeRequest(canvas, diagram, element, loadListener), new AsyncProcedure() { + graph.asyncRequest(new NodeRequest(canvas, diagram, element, loadListener), new AsyncProcedure() { @Override public void execute(AsyncReadGraph graph, IElement e) { } @@ -2088,7 +2105,7 @@ public class GraphToDiagramSynchronizer extends AbstractDisposable implements ID return assertMappedConnection(connection); } - void processBranchPoints(ReadGraph graph) throws DatabaseException { + void processBranchPoints(AsyncReadGraph graph) throws DatabaseException { for (Map.Entry entry : changes.branchPoints.entrySet()) { final Resource element = entry.getKey(); @@ -2099,7 +2116,7 @@ public class GraphToDiagramSynchronizer extends AbstractDisposable implements ID IElement mappedElement = getMappedElement(element); if (mappedElement == null) { if (DebugPolicy.DEBUG_NODE_LOAD) - graph.syncRequest(new ReadRequest() { + graph.asyncRequest(new ReadRequest() { @Override public void run(ReadGraph graph) throws DatabaseException { System.out.println(" EXTERNALLY ADDED BRANCH POINT: " @@ -2169,7 +2186,7 @@ public class GraphToDiagramSynchronizer extends AbstractDisposable implements ID } }; - graph.syncRequest(new NodeRequest(canvas, diagram, element, loadListener), new AsyncProcedure() { + graph.asyncRequest(new NodeRequest(canvas, diagram, element, loadListener), new AsyncProcedure() { @Override public void execute(AsyncReadGraph graph, IElement e) { } @@ -2203,7 +2220,7 @@ public class GraphToDiagramSynchronizer extends AbstractDisposable implements ID } } - void processConnectionSegments(ReadGraph graph) throws DatabaseException { + void processConnectionSegments(AsyncReadGraph graph) throws DatabaseException { ConnectionSegmentAdapter adapter = connectionSegmentAdapter; for (Map.Entry entry : changes.connectionSegments.entrySet()) { @@ -2215,7 +2232,7 @@ public class GraphToDiagramSynchronizer extends AbstractDisposable implements ID IElement mappedElement = getMappedElement(seg); if (mappedElement == null) { if (DebugPolicy.DEBUG_EDGE_LOAD) - graph.syncRequest(new ReadRequest() { + graph.asyncRequest(new ReadRequest() { @Override public void run(ReadGraph graph) throws DatabaseException { System.out.println(" EXTERNALLY ADDED CONNECTION SEGMENT: " + seg.toString() @@ -2223,13 +2240,13 @@ public class GraphToDiagramSynchronizer extends AbstractDisposable implements ID } }); - graph.syncRequest(new EdgeRequest(canvas, errorHandler, canvasListenerSupport, diagram, adapter, seg), new AsyncProcedure() { + graph.asyncRequest(new EdgeRequest(GraphToDiagramSynchronizer.this, canvas, errorHandler, canvasListenerSupport, diagram, adapter, seg), new AsyncProcedure() { @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); @@ -2251,7 +2268,7 @@ public class GraphToDiagramSynchronizer extends AbstractDisposable implements ID case REMOVED: { final IElement e = getMappedElement(seg); if (DebugPolicy.DEBUG_EDGE_LOAD) - graph.syncRequest(new ReadRequest() { + graph.asyncRequest(new ReadRequest() { @Override public void run(ReadGraph graph) throws DatabaseException { System.out.println(" EXTERNALLY REMOVED CONNECTION SEGMENT: " + seg.toString() + " - " @@ -2302,13 +2319,15 @@ public class GraphToDiagramSynchronizer extends AbstractDisposable implements ID if (changes.isEmpty()) return; + ITask threadLog = ThreadLogger.task("processNodes"); + // NOTE: This order is important. Object task = Timing.BEGIN("processNodesConnections"); //System.out.println("---- PROCESS NODES & CONNECTIONS BEGIN"); if (!changes.elements.isEmpty()) { - graph.syncRequest(new ReadRequest() { + graph.syncRequest(new AsyncReadRequest() { @Override - public void run(ReadGraph graph) throws DatabaseException { + public void run(AsyncReadGraph graph) throws DatabaseException { processNodes(graph); } @Override @@ -2319,13 +2338,21 @@ public class GraphToDiagramSynchronizer extends AbstractDisposable implements ID } //System.out.println("---- PROCESS NODES & CONNECTIONS END"); + threadLog.finish(); + + threadLog = ThreadLogger.task("processConnections"); + processConnections(); + threadLog.finish(); + + threadLog = ThreadLogger.task("processBranchPoints"); + //System.out.println("---- PROCESS BRANCH POINTS BEGIN"); if (!changes.branchPoints.isEmpty()) { - graph.syncRequest(new ReadRequest() { + graph.syncRequest(new AsyncReadRequest() { @Override - public void run(ReadGraph graph) throws DatabaseException { + public void run(AsyncReadGraph graph) throws DatabaseException { processBranchPoints(graph); } @Override @@ -2336,14 +2363,19 @@ public class GraphToDiagramSynchronizer extends AbstractDisposable implements ID } //System.out.println("---- PROCESS BRANCH POINTS END"); + threadLog.finish(); + Timing.END(task); + + threadLog = ThreadLogger.task("processConnectionSegments"); + task = Timing.BEGIN("processConnectionSegments"); //System.out.println("---- PROCESS CONNECTION SEGMENTS BEGIN"); if (!changes.connectionSegments.isEmpty()) { - graph.syncRequest(new ReadRequest() { + graph.syncRequest(new AsyncReadRequest() { @Override - public void run(ReadGraph graph) throws DatabaseException { + public void run(AsyncReadGraph graph) throws DatabaseException { processConnectionSegments(graph); } @Override @@ -2354,8 +2386,12 @@ public class GraphToDiagramSynchronizer extends AbstractDisposable implements ID } //System.out.println("---- PROCESS CONNECTION SEGMENTS END"); + threadLog.finish(); + Timing.END(task); + threadLog = ThreadLogger.task("processRouteGraphConnections"); + task = Timing.BEGIN("processRouteGraphConnections"); if (!changes.routeGraphConnections.isEmpty()) { graph.syncRequest(new ReadRequest() { @@ -2371,6 +2407,8 @@ public class GraphToDiagramSynchronizer extends AbstractDisposable implements ID } Timing.END(task); + threadLog.finish(); + //System.out.println("---- AFTER LOADING"); //for (IElement e : addedElements) // System.out.println(" ADDED ELEMENT: " + e); @@ -2378,7 +2416,12 @@ public class GraphToDiagramSynchronizer extends AbstractDisposable implements ID // System.out.println(" ADDED BRANCH POINTS: " + e); task = Timing.BEGIN("executeDeferredLoaders"); + threadLog = ThreadLogger.task("executeDeferredLoaders"); + executeDeferredLoaders(graph); + + threadLog.finish(); + Timing.END(task); } @@ -2428,8 +2471,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 +2478,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