]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.simulation/src/org/simantics/simulation/project/ExperimentRuns.java
b6d4395b374a7e40e0c1dd47de02a3128bdd69ce
[simantics/platform.git] / bundles / org.simantics.simulation / src / org / simantics / simulation / project / ExperimentRuns.java
1 package org.simantics.simulation.project;\r
2 \r
3 import java.util.concurrent.atomic.AtomicReference;\r
4 import java.util.function.Consumer;\r
5 \r
6 import org.simantics.databoard.Bindings;\r
7 import org.simantics.db.Resource;\r
8 import org.simantics.db.Session;\r
9 import org.simantics.db.VirtualGraph;\r
10 import org.simantics.db.WriteGraph;\r
11 import org.simantics.db.common.CommentMetadata;\r
12 import org.simantics.db.common.request.WriteRequest;\r
13 import org.simantics.db.common.utils.NameUtils;\r
14 import org.simantics.db.exception.DatabaseException;\r
15 import org.simantics.db.service.VirtualGraphSupport;\r
16 import org.simantics.layer0.Layer0;\r
17 import org.simantics.scl.runtime.function.Function2;\r
18 import org.simantics.simulation.experiment.ExperimentState;\r
19 import org.simantics.simulation.experiment.IExperiment;\r
20 import org.simantics.simulation.experiment.IExperimentListener;\r
21 import org.simantics.simulation.ontology.SimulationResource;\r
22 import org.simantics.utils.datastructures.Callback;\r
23 import org.simantics.utils.ui.ErrorLogger;\r
24 \r
25 /**\r
26  * Facade for handling experiment run modeling and experiment activation\r
27  * related tasks.\r
28  * \r
29  * @author Tuukka Lehtonen\r
30  */\r
31 public class ExperimentRuns {\r
32 \r
33     /**\r
34      * @param session\r
35      * @param experimentResource\r
36      * @param experiment\r
37      * @param listener\r
38      */\r
39     public static void createRun(Session session, Resource experimentResource, IExperiment experiment,\r
40             IExperimentActivationListener listener, Consumer<Resource> successCallback) {\r
41         VirtualGraphSupport support = session.getService(VirtualGraphSupport.class);\r
42         createRun(session, support.getWorkspacePersistent("experiments"), experimentResource, experiment, listener, successCallback);\r
43     }\r
44 \r
45     /**\r
46      * Create new experiment run in a selected virtual graph.\r
47      * \r
48      * @param session\r
49      * @param graph\r
50      * @param experimentResource\r
51      * @param experiment\r
52      * @param listener\r
53      */\r
54     public static void createRun(final Session session, VirtualGraph graph, final Resource experimentResource,\r
55             final IExperiment experiment, final IExperimentActivationListener listener,\r
56             final Consumer<Resource> successCallback)\r
57     {\r
58         createRun(session, graph, experimentResource, experiment, SimulationResource.URIs.Run, listener, successCallback);\r
59     }\r
60 \r
61     public static void createRun(final Session session, VirtualGraph vg, final Resource experimentResource,\r
62             final IExperiment experiment, final String experimentRunTypeURI,\r
63             final IExperimentActivationListener listener, final Consumer<Resource> successCallback)\r
64     {\r
65         createRun(session, vg, experimentResource, experiment, experimentRunTypeURI, listener, null, successCallback);\r
66     }\r
67 \r
68     /**\r
69      * Create new experiment run in a selected virtual graph.\r
70      * \r
71      * @param session\r
72      * @param vg\r
73      * @param experimentResource\r
74      * @param experiment\r
75      * @param experimentRunTypeURI\r
76      * @param listener\r
77      * @param successCallback if non-null invoked with the created run resource\r
78      *        as an argument, just before invoking\r
79      *        listener.onExperimentActivated(experiment)\r
80      */\r
81     public static void createRun(final Session session, VirtualGraph vg, final Resource experimentResource,\r
82             final IExperiment experiment, final String experimentRunTypeURI,\r
83             final IExperimentActivationListener listener, final Function2<WriteGraph, Resource, Object> external, final Consumer<Resource> successCallback)\r
84     {\r
85         final AtomicReference<Resource> _run = new AtomicReference<Resource>();\r
86         session.asyncRequest(new WriteRequest(vg) {\r
87             @Override\r
88             public void perform(WriteGraph graph) throws DatabaseException {\r
89 //                System.out.println("ExperimentActivator " + experimentResource + " " + experiment.getIdentifier());\r
90 \r
91                 final Layer0 L0 = Layer0.getInstance(graph);\r
92                 final SimulationResource SIMU = SimulationResource.getInstance(graph);\r
93 \r
94                 final Resource run = graph.newResource();\r
95                 String label = NameUtils.findFreshLabel(graph, "Experiment", experimentResource);\r
96                 graph.claim(run, L0.InstanceOf, null, graph.getResource(experimentRunTypeURI));\r
97                 graph.addLiteral(run, L0.HasName, L0.NameOf, L0.String, experiment.getIdentifier(), Bindings.STRING);\r
98                 graph.addLiteral(run, L0.HasLabel, L0.HasLabel_Inverse, L0.String, label, Bindings.STRING);\r
99                 graph.addLiteral(run, SIMU.HasActivationTime, SIMU.HasActivationTime_Inverse, L0.Long, System.currentTimeMillis(), Bindings.LONG);\r
100                 graph.claim(experimentResource, L0.ConsistsOf, L0.PartOf, run);\r
101                 \r
102                 // Mark the run active in the transient virtual graph.\r
103                 VirtualGraph runtime = graph.getService(VirtualGraph.class);\r
104                 graph.syncRequest(new WriteRequest(runtime) {\r
105                     @Override\r
106                     public void perform(WriteGraph graph) throws DatabaseException {\r
107                         graph.claim(run, SIMU.IsActive, run);\r
108                         if(external != null)\r
109                                 external.apply(graph, run);\r
110                     }\r
111                 });\r
112 \r
113                 _run.set(run);\r
114             }\r
115         }, new Callback<DatabaseException>() {\r
116             @Override\r
117             public void run(DatabaseException e) {\r
118                 if (e != null) {\r
119                     if (listener != null)\r
120                         listener.onFailure(e);\r
121                     else\r
122                         ErrorLogger.defaultLogError(e);\r
123                 } else {\r
124                     attachStateListener(session, experiment, _run.get());\r
125                     if (successCallback != null)\r
126                         successCallback.accept(_run.get());\r
127                     if (listener != null)\r
128                         listener.onExperimentActivated(experiment);\r
129                 }\r
130             }\r
131         });\r
132     }\r
133 \r
134     /**\r
135      * Add listener for tracking run IsActive state in the graph.\r
136      * \r
137      * @param session\r
138      * @param experiment\r
139      * @param run\r
140      */\r
141     private static void attachStateListener(final Session session, IExperiment experiment, final Resource run) {\r
142         experiment.addListener(new IExperimentListener() {\r
143             @Override\r
144             public void stateChanged(ExperimentState state) {\r
145                 if (state == ExperimentState.DISPOSED) {\r
146                     VirtualGraph runtime = session.getService(VirtualGraph.class);\r
147                     session.asyncRequest(new WriteRequest(runtime) {\r
148                         @Override\r
149                         public void perform(WriteGraph graph) throws DatabaseException {\r
150                             SimulationResource SIMU = SimulationResource.getInstance(graph);\r
151                             graph.denyStatement(run, SIMU.IsActive, run);\r
152                             \r
153                             CommentMetadata cm = graph.getMetadata(CommentMetadata.class);\r
154                             graph.addMetadata(cm.add("Attaching state listener to track isActive for run"));\r
155                         }\r
156                     }, new Callback<DatabaseException>() {\r
157                         @Override\r
158                         public void run(DatabaseException e) {\r
159                             if (e != null)\r
160                                 ErrorLogger.defaultLogError(e);\r
161                         }\r
162                     });\r
163                 }\r
164             }\r
165         });\r
166     }\r
167 \r
168 }\r