X-Git-Url: https://gerrit.simantics.org/r/gitweb?p=simantics%2Fplatform.git;a=blobdiff_plain;f=bundles%2Forg.simantics.diagram%2Fsrc%2Forg%2Fsimantics%2Fdiagram%2Fadapter%2FGraphToDiagramSynchronizer.java;h=aa35c63342c28e8d952a7989f2cc5edd26f83f21;hp=9be80c34e9c1d8c611a762e851a866dea62e0c3d;hb=881a82d0707953038b327d334560ac12ac3e5ea9;hpb=0d9b90834ce56b292c00b1a39850ed842c3e4d42 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 9be80c34e..aa35c6334 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 @@ -11,9 +11,6 @@ *******************************************************************************/ package org.simantics.diagram.adapter; -import gnu.trove.map.hash.TObjectIntHashMap; -import gnu.trove.set.hash.THashSet; - import java.awt.geom.AffineTransform; import java.lang.reflect.InvocationTargetException; import java.util.ArrayDeque; @@ -49,6 +46,7 @@ import org.simantics.db.common.procedure.adapter.AsyncProcedureAdapter; import org.simantics.db.common.procedure.adapter.CacheListener; import org.simantics.db.common.procedure.adapter.ListenerSupport; import org.simantics.db.common.procedure.adapter.ProcedureAdapter; +import org.simantics.db.common.procedure.adapter.TransientCacheAsyncListener; import org.simantics.db.common.request.AsyncReadRequest; import org.simantics.db.common.request.ReadRequest; import org.simantics.db.common.session.SessionEventListenerAdapter; @@ -157,6 +155,11 @@ import org.simantics.utils.strings.EString; import org.simantics.utils.threads.ThreadUtils; import org.simantics.utils.threads.logger.ITask; import org.simantics.utils.threads.logger.ThreadLogger; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import gnu.trove.map.hash.TObjectIntHashMap; +import gnu.trove.set.hash.THashSet; /** * This class loads a diagram contained in the graph database into the runtime @@ -249,6 +252,8 @@ import org.simantics.utils.threads.logger.ThreadLogger; */ public class GraphToDiagramSynchronizer extends AbstractDisposable implements IDiagramLoader, IModifiableSynchronizationContext { + private static final Logger LOGGER = LoggerFactory.getLogger(GraphToDiagramSynchronizer.class); + /** * Controls whether the class adds hint listeners to each diagram element * that try to perform basic sanity checks on changes happening in element @@ -762,7 +767,7 @@ public class GraphToDiagramSynchronizer extends AbstractDisposable implements ID else result.add(eh); } - return ElementClass.compile(result).setId(ec.getId()); + return ElementClass.compile(result, false).setId(ec.getId()); } } @@ -1110,7 +1115,7 @@ public class GraphToDiagramSynchronizer extends AbstractDisposable implements ID } } catch (InterruptedException e) { // Shouldn't happen. - e.printStackTrace(); + LOGGER.error("Dispose interrupted!", e); } finally { detachSessionListener(); @@ -1301,7 +1306,7 @@ public class GraphToDiagramSynchronizer extends AbstractDisposable implements ID task4.finish(); // ITask task5 = ThreadLogger.getInstance().begin("DiagramContentRequest2"); ITask task42 = ThreadLogger.getInstance().begin("DiagramContentRequest2"); - DiagramContents contents = g.syncRequest(query); + DiagramContents contents = g.syncRequest(query, TransientCacheAsyncListener.instance()); //System.err.println("contents: " + contents); task42.finish(); // task5.finish(); @@ -1342,7 +1347,11 @@ public class GraphToDiagramSynchronizer extends AbstractDisposable implements ID g.getSession().asyncRequest(new AsyncReadRequest() { @Override public void run(AsyncReadGraph graph) { - profileObserver.listen(graph, GraphToDiagramSynchronizer.this); + ProfileObserver po = profileObserver; + if (po != null) + po.listen(graph, GraphToDiagramSynchronizer.this); + else + LOGGER.info("profileObserver has been disposed already!"); } }); @@ -1609,11 +1618,11 @@ public class GraphToDiagramSynchronizer extends AbstractDisposable implements ID } public void clear() { - // Prevent DiagramContents leakage through DisposableListeners. - lastContent = null; - content = null; - changes = null; - + // Prevent DiagramContents leakage through DisposableListeners. + lastContent = null; + content = null; + changes = null; + this.addedElements.clear(); this.removedElements.clear(); this.addedConnectionSegments.clear(); @@ -1654,10 +1663,13 @@ public class GraphToDiagramSynchronizer extends AbstractDisposable implements ID // TODO: Connection loading has no listening, changes :Connection will not be noticed by this code! Listener loadListener = new DisposableListener(canvasListenerSupport) { - @Override - public String toString() { - return "Connection load listener for " + element; - } + + boolean firstTime = true; + + @Override + public String toString() { + return "Connection load listener for " + element; + } @Override public void execute(IElement loaded) { // Invoked when the element has been loaded. @@ -1669,6 +1681,19 @@ public class GraphToDiagramSynchronizer extends AbstractDisposable implements ID return; } + if (firstTime) { + + mapElement(element, loaded); + synchronized (GraphToDiagramUpdater.this) { + addedElements.add(loaded); + addedElementMap.put(element, loaded); + addedConnectionMap.put(element, loaded); + } + + firstTime = false; + + } + Object data = loaded.getHint(ElementHints.KEY_OBJECT); // Logic for disposing listener @@ -1708,16 +1733,6 @@ public class GraphToDiagramSynchronizer extends AbstractDisposable implements ID graph.syncRequest(new ConnectionRequest(canvas, diagram, element, errorHandler, loadListener), new AsyncProcedure() { @Override public void execute(AsyncReadGraph graph, final IElement e) { - if (e == null) - return; - - //System.out.println("ConnectionRequestProcedure " + e); - mapElement(element, e); - synchronized (GraphToDiagramUpdater.this) { - addedElements.add(e); - addedElementMap.put(element, e); - addedConnectionMap.put(element, e); - } // Read connection type graph.forSingleType(element, br.DIA.Connection, new Procedure() { @@ -1736,6 +1751,7 @@ public class GraphToDiagramSynchronizer extends AbstractDisposable implements ID } } }); + } @Override @@ -1746,10 +1762,13 @@ public class GraphToDiagramSynchronizer extends AbstractDisposable implements ID } else if (content.nodeSet.contains(element)) { Listener loadListener = new DisposableListener(canvasListenerSupport) { - @Override - public String toString() { - return "Node load listener for " + element; - } + + boolean firstTime = true; + + @Override + public String toString() { + return "Node load listener for " + element; + } @Override public void execute(IElement loaded) { // Invoked when the element has been loaded. @@ -1761,6 +1780,22 @@ public class GraphToDiagramSynchronizer extends AbstractDisposable implements ID return; } + if (firstTime) { + + // This is invoked before the element is actually loaded. + //System.out.println("NodeRequestProcedure " + e); + if (DebugPolicy.DEBUG_NODE_LOAD) + System.out.println("MAPPING ADDED NODE: " + element + " -> " + loaded); + mapElement(element, loaded); + synchronized (GraphToDiagramUpdater.this) { + addedElements.add(loaded); + addedElementMap.put(element, loaded); + } + + firstTime = false; + + } + Object data = loaded.getHint(ElementHints.KEY_OBJECT); // Logic for disposing listener @@ -1801,18 +1836,6 @@ public class GraphToDiagramSynchronizer extends AbstractDisposable implements ID graph.syncRequest(new NodeRequest(canvas, diagram, element, loadListener), new AsyncProcedure() { @Override public void execute(AsyncReadGraph graph, IElement e) { - if (e == null) - return; - - // This is invoked before the element is actually loaded. - //System.out.println("NodeRequestProcedure " + e); - if (DebugPolicy.DEBUG_NODE_LOAD) - System.out.println("MAPPING ADDED NODE: " + element + " -> " + e); - mapElement(element, e); - synchronized (GraphToDiagramUpdater.this) { - addedElements.add(e); - addedElementMap.put(element, e); - } } @Override @@ -1953,10 +1976,13 @@ public class GraphToDiagramSynchronizer extends AbstractDisposable implements ID continue; Listener loadListener = new DisposableListener(canvasListenerSupport) { - @Override - public String toString() { - return "processRouteGraphConnections " + connection; - } + + boolean firstTime = true; + + @Override + public String toString() { + return "processRouteGraphConnections " + connection; + } @Override public void execute(IElement loaded) { // Invoked when the element has been loaded. @@ -1968,6 +1994,18 @@ public class GraphToDiagramSynchronizer extends AbstractDisposable implements ID return; } + if(firstTime) { + if (DebugPolicy.DEBUG_NODE_LOAD) + System.out.println("MAPPING ADDED ROUTE GRAPH CONNECTION: " + connection + " -> " + loaded); + mapElement(connection, loaded); + synchronized (GraphToDiagramUpdater.this) { + addedElements.add(loaded); + addedElementMap.put(connection, loaded); + addedRouteGraphConnectionMap.put(connection, loaded); + } + firstTime = false; + } + Object data = loaded.getHint(ElementHints.KEY_OBJECT); // Logic for disposing listener @@ -2022,18 +2060,6 @@ public class GraphToDiagramSynchronizer extends AbstractDisposable implements ID graph.syncRequest(new ConnectionRequest(canvas, diagram, connection, errorHandler, loadListener), new Procedure() { @Override public void execute(final IElement e) { - if (e == null) - return; - - //System.out.println("ConnectionRequestProcedure " + e); - if (DebugPolicy.DEBUG_NODE_LOAD) - System.out.println("MAPPING ADDED ROUTE GRAPH CONNECTION: " + connection + " -> " + e); - mapElement(connection, e); - synchronized (GraphToDiagramUpdater.this) { - addedElements.add(e); - addedElementMap.put(connection, e); - addedRouteGraphConnectionMap.put(connection, e); - } } @Override public void exception(Throwable throwable) { @@ -2083,10 +2109,13 @@ public class GraphToDiagramSynchronizer extends AbstractDisposable implements ID }); Listener loadListener = new DisposableListener(canvasListenerSupport) { - @Override - public String toString() { - return "processBranchPoints for " + element; - } + + boolean firstTime = true; + + @Override + public String toString() { + return "processBranchPoints for " + element; + } @Override public void execute(IElement loaded) { // Invoked when the element has been loaded. @@ -2098,6 +2127,21 @@ public class GraphToDiagramSynchronizer extends AbstractDisposable implements ID return; } + if (firstTime) { + + mapElement(element, loaded); + synchronized (GraphToDiagramUpdater.this) { + addedBranchPoints.add(loaded); + addedElementMap.put(element, loaded); + ConnectionEntityImpl ce = getConnectionEntity(element); + loaded.setHint(ElementHints.KEY_CONNECTION_ENTITY, ce); + loaded.setHint(ElementHints.KEY_PARENT_ELEMENT, ce.getConnectionElement()); + } + + firstTime = false; + + } + Object data = loaded.getHint(ElementHints.KEY_OBJECT); if (addedElementMap.containsKey(data)) { // This element was just loaded, in @@ -2128,16 +2172,6 @@ public class GraphToDiagramSynchronizer extends AbstractDisposable implements ID graph.syncRequest(new NodeRequest(canvas, diagram, element, loadListener), new AsyncProcedure() { @Override public void execute(AsyncReadGraph graph, IElement e) { - if (e != null) { - mapElement(element, e); - synchronized (GraphToDiagramUpdater.this) { - addedBranchPoints.add(e); - addedElementMap.put(element, e); - ConnectionEntityImpl ce = getConnectionEntity(element); - e.setHint(ElementHints.KEY_CONNECTION_ENTITY, ce); - e.setHint(ElementHints.KEY_PARENT_ELEMENT, ce.getConnectionElement()); - } - } } @Override @@ -2385,12 +2419,12 @@ public class GraphToDiagramSynchronizer extends AbstractDisposable implements ID return "defaultConnectionSegmentAdapter"; } }, new DisposableListener(listenerSupport) { - - @Override - public String toString() { - return "DefaultConnectionSegmentAdapter listener for " + edge; - } - + + @Override + public String toString() { + return "DefaultConnectionSegmentAdapter listener for " + edge; + } + @Override public void execute(IElement loaded) { // Invoked when the element has been loaded. @@ -2667,9 +2701,9 @@ public class GraphToDiagramSynchronizer extends AbstractDisposable implements ID GraphToDiagramUpdater updater = new GraphToDiagramUpdater(lastContent, content, changes); GraphToDiagramSynchronizer.this.currentUpdater = updater; try { - updater.process(graph); + updater.process(graph); } finally { - GraphToDiagramSynchronizer.this.currentUpdater = null; + GraphToDiagramSynchronizer.this.currentUpdater = null; } Timing.END(task); @@ -3430,7 +3464,7 @@ public class GraphToDiagramSynchronizer extends AbstractDisposable implements ID Resource resource = ElementUtils.adapt(ec, Resource.class); if (resource == null) { pass = false; - new Exception("Attempted to add an element to the diagram that is not adaptable to Resource: " + e + ", class: " + ec).printStackTrace(); + LOGGER.error("", new Exception("Attempted to add an element to the diagram that is not adaptable to Resource: " + e + ", class: " + ec)); } // Sanity check connection hints