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%2Fprofile%2FProfiles.java;h=03da3b78ca287da81bd56d2bb9fe2e6bc5a2f454;hp=ff0f7b685f1d25e751b0a72061b336a47c38f05e;hb=95e05b3cc3208ec57118e8167a090c9b90edfaf2;hpb=53578306fadb429efdc2799bcb2cd8c2966bf5d7 diff --git a/bundles/org.simantics.diagram/src/org/simantics/diagram/profile/Profiles.java b/bundles/org.simantics.diagram/src/org/simantics/diagram/profile/Profiles.java index ff0f7b685..03da3b78c 100644 --- a/bundles/org.simantics.diagram/src/org/simantics/diagram/profile/Profiles.java +++ b/bundles/org.simantics.diagram/src/org/simantics/diagram/profile/Profiles.java @@ -18,8 +18,11 @@ import java.util.Map; import java.util.Set; 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 +36,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; @@ -321,4 +325,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 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; + } + }