]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.simulation/src/org/simantics/simulation/project/ExperimentRuns.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.simulation / src / org / simantics / simulation / project / ExperimentRuns.java
diff --git a/bundles/org.simantics.simulation/src/org/simantics/simulation/project/ExperimentRuns.java b/bundles/org.simantics.simulation/src/org/simantics/simulation/project/ExperimentRuns.java
new file mode 100644 (file)
index 0000000..b6d4395
--- /dev/null
@@ -0,0 +1,168 @@
+package org.simantics.simulation.project;\r
+\r
+import java.util.concurrent.atomic.AtomicReference;\r
+import java.util.function.Consumer;\r
+\r
+import org.simantics.databoard.Bindings;\r
+import org.simantics.db.Resource;\r
+import org.simantics.db.Session;\r
+import org.simantics.db.VirtualGraph;\r
+import org.simantics.db.WriteGraph;\r
+import org.simantics.db.common.CommentMetadata;\r
+import org.simantics.db.common.request.WriteRequest;\r
+import org.simantics.db.common.utils.NameUtils;\r
+import org.simantics.db.exception.DatabaseException;\r
+import org.simantics.db.service.VirtualGraphSupport;\r
+import org.simantics.layer0.Layer0;\r
+import org.simantics.scl.runtime.function.Function2;\r
+import org.simantics.simulation.experiment.ExperimentState;\r
+import org.simantics.simulation.experiment.IExperiment;\r
+import org.simantics.simulation.experiment.IExperimentListener;\r
+import org.simantics.simulation.ontology.SimulationResource;\r
+import org.simantics.utils.datastructures.Callback;\r
+import org.simantics.utils.ui.ErrorLogger;\r
+\r
+/**\r
+ * Facade for handling experiment run modeling and experiment activation\r
+ * related tasks.\r
+ * \r
+ * @author Tuukka Lehtonen\r
+ */\r
+public class ExperimentRuns {\r
+\r
+    /**\r
+     * @param session\r
+     * @param experimentResource\r
+     * @param experiment\r
+     * @param listener\r
+     */\r
+    public static void createRun(Session session, Resource experimentResource, IExperiment experiment,\r
+            IExperimentActivationListener listener, Consumer<Resource> successCallback) {\r
+        VirtualGraphSupport support = session.getService(VirtualGraphSupport.class);\r
+        createRun(session, support.getWorkspacePersistent("experiments"), experimentResource, experiment, listener, successCallback);\r
+    }\r
+\r
+    /**\r
+     * Create new experiment run in a selected virtual graph.\r
+     * \r
+     * @param session\r
+     * @param graph\r
+     * @param experimentResource\r
+     * @param experiment\r
+     * @param listener\r
+     */\r
+    public static void createRun(final Session session, VirtualGraph graph, final Resource experimentResource,\r
+            final IExperiment experiment, final IExperimentActivationListener listener,\r
+            final Consumer<Resource> successCallback)\r
+    {\r
+        createRun(session, graph, experimentResource, experiment, SimulationResource.URIs.Run, listener, successCallback);\r
+    }\r
+\r
+    public static void createRun(final Session session, VirtualGraph vg, final Resource experimentResource,\r
+            final IExperiment experiment, final String experimentRunTypeURI,\r
+            final IExperimentActivationListener listener, final Consumer<Resource> successCallback)\r
+    {\r
+       createRun(session, vg, experimentResource, experiment, experimentRunTypeURI, listener, null, successCallback);\r
+    }\r
+\r
+    /**\r
+     * Create new experiment run in a selected virtual graph.\r
+     * \r
+     * @param session\r
+     * @param vg\r
+     * @param experimentResource\r
+     * @param experiment\r
+     * @param experimentRunTypeURI\r
+     * @param listener\r
+     * @param successCallback if non-null invoked with the created run resource\r
+     *        as an argument, just before invoking\r
+     *        listener.onExperimentActivated(experiment)\r
+     */\r
+    public static void createRun(final Session session, VirtualGraph vg, final Resource experimentResource,\r
+            final IExperiment experiment, final String experimentRunTypeURI,\r
+            final IExperimentActivationListener listener, final Function2<WriteGraph, Resource, Object> external, final Consumer<Resource> successCallback)\r
+    {\r
+        final AtomicReference<Resource> _run = new AtomicReference<Resource>();\r
+        session.asyncRequest(new WriteRequest(vg) {\r
+            @Override\r
+            public void perform(WriteGraph graph) throws DatabaseException {\r
+//                System.out.println("ExperimentActivator " + experimentResource + " " + experiment.getIdentifier());\r
+\r
+                final Layer0 L0 = Layer0.getInstance(graph);\r
+                final SimulationResource SIMU = SimulationResource.getInstance(graph);\r
+\r
+                final Resource run = graph.newResource();\r
+                String label = NameUtils.findFreshLabel(graph, "Experiment", experimentResource);\r
+                graph.claim(run, L0.InstanceOf, null, graph.getResource(experimentRunTypeURI));\r
+                graph.addLiteral(run, L0.HasName, L0.NameOf, L0.String, experiment.getIdentifier(), Bindings.STRING);\r
+                graph.addLiteral(run, L0.HasLabel, L0.HasLabel_Inverse, L0.String, label, Bindings.STRING);\r
+                graph.addLiteral(run, SIMU.HasActivationTime, SIMU.HasActivationTime_Inverse, L0.Long, System.currentTimeMillis(), Bindings.LONG);\r
+                graph.claim(experimentResource, L0.ConsistsOf, L0.PartOf, run);\r
+                \r
+                // Mark the run active in the transient virtual graph.\r
+                VirtualGraph runtime = graph.getService(VirtualGraph.class);\r
+                graph.syncRequest(new WriteRequest(runtime) {\r
+                    @Override\r
+                    public void perform(WriteGraph graph) throws DatabaseException {\r
+                        graph.claim(run, SIMU.IsActive, run);\r
+                        if(external != null)\r
+                               external.apply(graph, run);\r
+                    }\r
+                });\r
+\r
+                _run.set(run);\r
+            }\r
+        }, new Callback<DatabaseException>() {\r
+            @Override\r
+            public void run(DatabaseException e) {\r
+                if (e != null) {\r
+                    if (listener != null)\r
+                        listener.onFailure(e);\r
+                    else\r
+                        ErrorLogger.defaultLogError(e);\r
+                } else {\r
+                    attachStateListener(session, experiment, _run.get());\r
+                    if (successCallback != null)\r
+                        successCallback.accept(_run.get());\r
+                    if (listener != null)\r
+                        listener.onExperimentActivated(experiment);\r
+                }\r
+            }\r
+        });\r
+    }\r
+\r
+    /**\r
+     * Add listener for tracking run IsActive state in the graph.\r
+     * \r
+     * @param session\r
+     * @param experiment\r
+     * @param run\r
+     */\r
+    private static void attachStateListener(final Session session, IExperiment experiment, final Resource run) {\r
+        experiment.addListener(new IExperimentListener() {\r
+            @Override\r
+            public void stateChanged(ExperimentState state) {\r
+                if (state == ExperimentState.DISPOSED) {\r
+                    VirtualGraph runtime = session.getService(VirtualGraph.class);\r
+                    session.asyncRequest(new WriteRequest(runtime) {\r
+                        @Override\r
+                        public void perform(WriteGraph graph) throws DatabaseException {\r
+                            SimulationResource SIMU = SimulationResource.getInstance(graph);\r
+                            graph.denyStatement(run, SIMU.IsActive, run);\r
+                            \r
+                            CommentMetadata cm = graph.getMetadata(CommentMetadata.class);\r
+                            graph.addMetadata(cm.add("Attaching state listener to track isActive for run"));\r
+                        }\r
+                    }, new Callback<DatabaseException>() {\r
+                        @Override\r
+                        public void run(DatabaseException e) {\r
+                            if (e != null)\r
+                                ErrorLogger.defaultLogError(e);\r
+                        }\r
+                    });\r
+                }\r
+            }\r
+        });\r
+    }\r
+\r
+}\r