]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.modeling.ui/src/org/simantics/modeling/ui/diagramEditor/DiagramViewer.java
Rid TypicalPropertyTester of database read transactions
[simantics/platform.git] / bundles / org.simantics.modeling.ui / src / org / simantics / modeling / ui / diagramEditor / DiagramViewer.java
index e773a7a639b181cd46c1cce60d2794eae9c9dc52..a0f504030675d1b9129a6548550ef524b8f762fe 100644 (file)
@@ -1,5 +1,5 @@
 /*******************************************************************************
 /*******************************************************************************
- * Copyright (c) 2007, 2013 Association for Decentralized Information Management
+ * Copyright (c) 2007, 2019 Association for Decentralized Information Management
  * in Industry THTH ry.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * in Industry THTH ry.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
@@ -8,7 +8,7 @@
  *
  * Contributors:
  *     VTT Technical Research Centre of Finland - initial API and implementation
  *
  * Contributors:
  *     VTT Technical Research Centre of Finland - initial API and implementation
- *     Semantum Oy - issue #4384
+ *     Semantum Oy - issue #4384, gitlab #399
  *******************************************************************************/
 package org.simantics.modeling.ui.diagramEditor;
 
  *******************************************************************************/
 package org.simantics.modeling.ui.diagramEditor;
 
@@ -41,9 +41,11 @@ import org.simantics.db.Resource;
 import org.simantics.db.Session;
 import org.simantics.db.WriteGraph;
 import org.simantics.db.common.primitiverequest.PossibleAdapter;
 import org.simantics.db.Session;
 import org.simantics.db.WriteGraph;
 import org.simantics.db.common.primitiverequest.PossibleAdapter;
+import org.simantics.db.common.primitiverequest.PossibleObject;
 import org.simantics.db.common.procedure.adapter.ListenerDelegate;
 import org.simantics.db.common.procedure.adapter.ListenerSupport;
 import org.simantics.db.common.request.ParametrizedRead;
 import org.simantics.db.common.procedure.adapter.ListenerDelegate;
 import org.simantics.db.common.procedure.adapter.ListenerSupport;
 import org.simantics.db.common.request.ParametrizedRead;
+import org.simantics.db.common.request.TypeURIs;
 import org.simantics.db.common.request.WriteRequest;
 import org.simantics.db.common.utils.CommonDBUtils;
 import org.simantics.db.common.utils.TagUtil;
 import org.simantics.db.common.request.WriteRequest;
 import org.simantics.db.common.utils.CommonDBUtils;
 import org.simantics.db.common.utils.TagUtil;
@@ -104,6 +106,7 @@ import org.simantics.g2d.diagram.participant.ZOrderHandler;
 import org.simantics.g2d.diagram.participant.pointertool.PointerInteractor;
 import org.simantics.g2d.element.ElementClassProviders;
 import org.simantics.g2d.element.ElementClasses;
 import org.simantics.g2d.diagram.participant.pointertool.PointerInteractor;
 import org.simantics.g2d.element.ElementClassProviders;
 import org.simantics.g2d.element.ElementClasses;
+import org.simantics.g2d.element.ElementUtils;
 import org.simantics.g2d.element.IElement;
 import org.simantics.g2d.element.IElementClassProvider;
 import org.simantics.g2d.element.handler.impl.StaticObjectAdapter;
 import org.simantics.g2d.element.IElement;
 import org.simantics.g2d.element.IElementClassProvider;
 import org.simantics.g2d.element.handler.impl.StaticObjectAdapter;
@@ -184,7 +187,7 @@ public class DiagramViewer
         void doSetTitleToolTip(String name);
     }
 
         void doSetTitleToolTip(String name);
     }
 
-    public static final String                     DIAGRAMMING_CONTEXT      = "org.simantics.modeling.ui.diagramming"; //$NON-NLS-1$
+    public static final String                      DIAGRAMMING_CONTEXT      = "org.simantics.modeling.ui.diagramming"; //$NON-NLS-1$
     private static final String                     PREFERENCE_VIRTUAL_GRAPH = "preferences"; //$NON-NLS-1$
 
     private static final boolean                    PROFILE                  = false;
     private static final String                     PREFERENCE_VIRTUAL_GRAPH = "preferences"; //$NON-NLS-1$
 
     private static final boolean                    PROFILE                  = false;
@@ -233,6 +236,7 @@ public class DiagramViewer
     protected GridSnapAdvisor            snapAdvisor;
 
     private RuntimeDiagramManager        runtimeDiagramManager;
     protected GridSnapAdvisor            snapAdvisor;
 
     private RuntimeDiagramManager        runtimeDiagramManager;
+    private HasDiagramSourceListener     hasDiagramSourceListener;
 
     /**
      * Set externally in
 
     /**
      * Set externally in
@@ -631,14 +635,35 @@ public class DiagramViewer
      * @throws DatabaseException
      */
     protected IDiagram loadDiagram(IProgressMonitor monitor, Resource diagram, IHintContext initialHints) throws DatabaseException {
      * @throws DatabaseException
      */
     protected IDiagram loadDiagram(IProgressMonitor monitor, Resource diagram, IHintContext initialHints) throws DatabaseException {
-       RuntimeDiagramManager rtdm = runtimeDiagramManager;
-       Resource runtimeDiagram = rtdm != null ? rtdm.getRuntimeDiagram() : null;
-       IDiagramLoader loader = synchronizer;
-       if (rtdm == null || runtimeDiagram == null || loader == null)
-               return null;
-        IDiagram d = sessionContext.getSession().syncRequest(
-                DiagramRequests.loadDiagram(monitor, getResourceInput2().getModel(null), diagram,
-                        runtimeDiagram, null, loader, initialHints));
+        RuntimeDiagramManager rtdm = runtimeDiagramManager;
+        Resource runtimeDiagram = rtdm != null ? rtdm.getRuntimeDiagram() : null;
+        IDiagramLoader loader = synchronizer;
+        if (rtdm == null || runtimeDiagram == null || loader == null)
+            return null;
+        IDiagram d = sessionContext.getSession().syncRequest((Read<IDiagram>) graph -> {
+            IDiagram result = DiagramRequests.loadDiagram(monitor, getResourceInput2().getModel(null), diagram,
+                    runtimeDiagram, null, loader, initialHints).perform(graph);
+
+            // #399: Enable certain PropertyTester implementation without database transactions
+            ModelingResources MOD = ModelingResources.getInstance(graph);
+            Resource composite = graph.getPossibleObject(diagram, MOD.DiagramToComposite);
+            result.setHint(
+                    DiagramModelHints.KEY_DIAGRAM_RESOURCE_TYPE_URIS,
+                    graph.syncRequest(new TypeURIs(diagram)));
+            result.setHint(
+                    DiagramModelHints.KEY_MAPPED_COMPOSITE_RESOURCE_TYPE_URIS,
+                    composite != null ? graph.syncRequest(new TypeURIs(composite)) : Collections.emptySet());
+
+            Resource diagramSource = graph.syncRequest(
+                    new PossibleObject(diagram, MOD.HasDiagramSource),
+                    hasDiagramSourceListener = new HasDiagramSourceListener(sourceDiagramContainer));
+            ElementUtils.setOrRemoveHint(
+                    result, 
+                    DiagramModelHints.KEY_HAS_DIAGRAM_SOURCE,
+                    diagramSource);
+
+            return result;
+        });
         return d;
     }
 
         return d;
     }
 
@@ -923,6 +948,12 @@ public class DiagramViewer
         }
 
         disposed = true;
         }
 
         disposed = true;
+
+        if (hasDiagramSourceListener != null) {
+            hasDiagramSourceListener.dispose();
+            hasDiagramSourceListener = null;
+        }
+
         if (activation != null) {
             activation.deactivate();
             activation = null;
         if (activation != null) {
             activation.deactivate();
             activation = null;