]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.diagram/src/org/simantics/diagram/profile/Profiles.java
Fixed multiple issues causing dangling references to discarded queries
[simantics/platform.git] / bundles / org.simantics.diagram / src / org / simantics / diagram / profile / Profiles.java
index ff0f7b685f1d25e751b0a72061b336a47c38f05e..cca82ff9aa3edc292f11a7d0219beee6f3b048dc 100644 (file)
@@ -17,9 +17,13 @@ import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
+import org.eclipse.core.runtime.NullProgressMonitor;
 import org.simantics.databoard.Bindings;
+import org.simantics.databoard.binding.mutable.Variant;
 import org.simantics.db.ReadGraph;
+import org.simantics.db.RequestProcessor;
 import org.simantics.db.Resource;
+import org.simantics.db.VirtualGraph;
 import org.simantics.db.WriteGraph;
 import org.simantics.db.WriteOnlyGraph;
 import org.simantics.db.common.request.WriteRequest;
@@ -33,6 +37,7 @@ import org.simantics.db.layer0.util.SimanticsClipboardImpl;
 import org.simantics.db.layer0.util.SimanticsKeys;
 import org.simantics.db.layer0.variable.Variable;
 import org.simantics.db.service.VirtualGraphSupport;
+import org.simantics.diagram.profile.ProfileActivityBean.Profile;
 import org.simantics.diagram.stubs.DiagramResource;
 import org.simantics.graph.db.TransferableGraphs;
 import org.simantics.graph.representation.Root;
@@ -288,7 +293,7 @@ public class Profiles {
                                        return resource;
                                }
                        };
-                       handler.copyToClipboard(graph, builder);
+                       handler.copyToClipboard(graph, builder, new NullProgressMonitor());
                        for(Set<SimanticsClipboard.Representation> object : builder.getContents()) {
                    TransferableGraph1 tg = ClipboardUtils.accept(graph, object, SimanticsKeys.KEY_TRANSFERABLE_GRAPH);
                    TransferableGraphs.importGraph1(graph, tg, advisor);
@@ -321,4 +326,89 @@ public class Profiles {
                return instance;
        }
 
+       public static ProfileActivityBean readProfileActivity(
+                       RequestProcessor processor,
+                       Resource root)
+                                       throws DatabaseException
+       {
+               return processor.syncRequest(new ProfileActivityBeanRequest(root));
+       }
+
+       public static ProfileActivityBean readProfileActivity(
+                       RequestProcessor processor,
+                       Resource root,
+                       Map<String, Variant> writeToMap)
+                                       throws DatabaseException
+       {
+               ProfileActivityBean pab = readProfileActivity(processor, root);
+               if (pab != null && writeToMap != null)
+                       writeToMap.put(ProfileActivityBean.EXTENSION_KEY, new Variant(ProfileActivityBean.BINDING, pab));
+               return pab;
+       }
+
+       public static void writeProfileActivity(
+                       RequestProcessor processor,
+                       Resource root,
+                       ProfileActivityBean bean)
+                                       throws DatabaseException
+       {
+               VirtualGraph vg = processor.getService(VirtualGraphSupport.class).getWorkspacePersistent("profiles");
+               processor.syncRequest(new WriteRequest(vg) {
+                       @Override
+                       public void perform(WriteGraph graph) throws DatabaseException {
+                               writeProfileActivity(graph, root, bean);
+                       }
+               });
+       }
+
+       private static void writeProfileActivity(
+                       WriteGraph graph,
+                       Resource root,
+                       ProfileActivityBean bean)
+                                       throws DatabaseException
+       {
+               String rootUri = graph.getPossibleURI(root);
+               if (rootUri == null)
+                       return;
+
+               SimulationResource SIMU = SimulationResource.getInstance(graph);
+               for (Profile p : bean.topLevelProfiles.values()) {
+                       Resource pr = resolveRelativeUri(graph, rootUri, p.relativeUri);
+                       if (pr == null)
+                               continue;
+                       for (String active : p.activeEntries) {
+                               Resource ar = resolveRelativeUri(graph, rootUri, active);
+                               if (ar != null)
+                                       graph.claim(pr, SIMU.IsActive, ar);
+                       }
+               }
+
+               Resource activeProfile = resolveRelativeUri(graph, rootUri, bean.activeProfile);
+               if (activeProfile != null) {
+                       DiagramResource DIA = DiagramResource.getInstance(graph);
+                       graph.claim(root, DIA.HasActiveProfile, DIA.HasActiveProfile_Inverse, activeProfile);
+               }
+       }
+
+       static String possiblyRelativeUri(ReadGraph graph, String rootUri, Resource r) throws DatabaseException {
+               if (r == null)
+                       return null;
+               String uri = graph.getPossibleURI(r);
+               if (rootUri != null && uri != null && uri.startsWith(rootUri))
+                       return uri.substring(rootUri.length());
+               return uri;
+       }
+
+       static Resource resolveRelativeUri(ReadGraph graph, String rootUri, String possiblyRelativeUri) throws DatabaseException {
+               return possiblyRelativeUri != null
+                               ? graph.getPossibleResource( resolveRelativeUri(rootUri, possiblyRelativeUri) )
+                               : null;
+       }
+
+       private static String resolveRelativeUri(String rootUri, String possiblyRelativeUri) {
+               return possiblyRelativeUri.startsWith("http:/")
+                               ? possiblyRelativeUri
+                               : rootUri + possiblyRelativeUri;
+       }
+
 }