]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.scenegraph.profile/src/org/simantics/scenegraph/profile/ProfileUtils.java
Better support for ontological profiles
[simantics/platform.git] / bundles / org.simantics.scenegraph.profile / src / org / simantics / scenegraph / profile / ProfileUtils.java
index b35ccd9f2064b425bbece1d43566f5b2ea4a09ad..88a69065be58d358294c0238f263a755ad38aa45 100644 (file)
@@ -1,25 +1,71 @@
-package org.simantics.scenegraph.profile;\r
-\r
-import java.util.Collections;\r
-import java.util.List;\r
-\r
-import org.simantics.db.ReadGraph;\r
-import org.simantics.db.Resource;\r
-import org.simantics.db.exception.DatabaseException;\r
-import org.simantics.diagram.stubs.DiagramResource;\r
-\r
-public class ProfileUtils {\r
-\r
-       public static List<Resource> getProfileChildren(ReadGraph graph, Resource profile) throws DatabaseException {\r
-               DiagramResource DIA = DiagramResource.getInstance(graph);\r
-               Resource entries = graph.getPossibleObject(profile, DIA.HasEntries);\r
-               if(entries == null) return Collections.emptyList();\r
-               return getProfileChildrenFromEntries(graph, entries);\r
-       }\r
-\r
-       public static List<Resource> getProfileChildrenFromEntries(ReadGraph graph, Resource entries) throws DatabaseException {\r
-               DiagramResource DIA = DiagramResource.getInstance(graph);\r
-               return graph.getRelatedValue2(entries, DIA.Profile_children, entries);\r
-       }\r
-\r
-}\r
+package org.simantics.scenegraph.profile;
+
+import java.util.Collections;
+import java.util.List;
+import java.util.UUID;
+
+import org.simantics.databoard.Bindings;
+import org.simantics.db.ReadGraph;
+import org.simantics.db.Resource;
+import org.simantics.db.WriteGraph;
+import org.simantics.db.common.request.ObjectsWithType;
+import org.simantics.db.common.request.PossibleIndexRoot;
+import org.simantics.db.exception.DatabaseException;
+import org.simantics.diagram.stubs.DiagramResource;
+import org.simantics.layer0.Layer0;
+import org.simantics.scenegraph.profile.request.ProfileActiveEntryResources;
+
+public class ProfileUtils {
+
+       public static List<Resource> getProfileChildren(ReadGraph graph, Resource profile) throws DatabaseException {
+               DiagramResource DIA = DiagramResource.getInstance(graph);
+               Resource entries = graph.getPossibleObject(profile, DIA.HasEntries);
+               if(entries == null) return Collections.emptyList();
+               return getProfileChildrenFromEntries(graph, entries);
+       }
+
+       public static List<Resource> getProfileChildrenFromEntries(ReadGraph graph, Resource entries) throws DatabaseException {
+               DiagramResource DIA = DiagramResource.getInstance(graph);
+               return graph.getRelatedValue2(entries, DIA.Profile_children, entries);
+       }
+
+       public static Resource getPossibleProfileActivationState(ReadGraph graph, Resource runtimeDiagram, Resource profile) throws DatabaseException {
+
+               Layer0 L0 = Layer0.getInstance(graph);
+               DiagramResource DIA = DiagramResource.getInstance(graph);
+               Resource conf = graph.getPossibleObject(runtimeDiagram, DIA.RuntimeDiagram_HasConfiguration);
+               if(conf == null) return null;
+               Resource indexRoot = graph.syncRequest(new PossibleIndexRoot(conf));
+               if(indexRoot == null) return null;
+               // Find existing state
+               for(Resource state : graph.syncRequest(new ObjectsWithType(indexRoot, L0.ConsistsOf, DIA.ProfileActivationState))) {
+                       Resource ref = graph.getPossibleObject(state, DIA.ProfileActivationState_HasProfile);
+                       if(profile.equals(ref)) return state;
+               }
+               return null;
+               
+       }
+       
+       public static Resource claimProfileActivationState(WriteGraph graph, Resource runtimeDiagram, Resource runtimeProfile, Resource entry) throws DatabaseException {
+               Layer0 L0 = Layer0.getInstance(graph);
+               DiagramResource DIA = DiagramResource.getInstance(graph);
+               Resource conf = graph.getPossibleObject(runtimeDiagram, DIA.RuntimeDiagram_HasConfiguration);
+               if(conf == null) return null;
+               Resource indexRoot = graph.syncRequest(new PossibleIndexRoot(conf));
+               if(indexRoot == null) return null;
+               // Find existing state
+               for(Resource state : graph.syncRequest(new ObjectsWithType(indexRoot, L0.ConsistsOf, DIA.ProfileActivationState))) {
+                       Resource profile = graph.getPossibleObject(state, DIA.ProfileActivationState_HasProfile);
+                       if(profile.equals(runtimeProfile)) return state;
+               }
+               // Create new state
+               Resource state = graph.newResource();
+               graph.claim(state, L0.InstanceOf, DIA.ProfileActivationState);
+               graph.claimLiteral(state, L0.HasName, L0.String, UUID.randomUUID().toString(), Bindings.STRING);
+               graph.claim(state, DIA.ProfileActivationState_HasProfile, runtimeProfile);
+               graph.claim(indexRoot, L0.ConsistsOf, state);
+               return state;
+       }
+       
+       
+}