]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.simulation/src/org/simantics/simulation/experiment/ExperimentUtil.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.simulation / src / org / simantics / simulation / experiment / ExperimentUtil.java
1 package org.simantics.simulation.experiment;\r
2 \r
3 import java.util.Collection;\r
4 import java.util.UUID;\r
5 import java.util.function.Consumer;\r
6 \r
7 import org.eclipse.core.runtime.IProgressMonitor;\r
8 import org.eclipse.core.runtime.IStatus;\r
9 import org.eclipse.core.runtime.Status;\r
10 import org.eclipse.core.runtime.jobs.Job;\r
11 import org.eclipse.ui.progress.IProgressConstants2;\r
12 import org.simantics.DatabaseJob;\r
13 import org.simantics.Simantics;\r
14 import org.simantics.databoard.Bindings;\r
15 import org.simantics.db.ReadGraph;\r
16 import org.simantics.db.RequestProcessor;\r
17 import org.simantics.db.Resource;\r
18 import org.simantics.db.Session;\r
19 import org.simantics.db.WriteGraph;\r
20 import org.simantics.db.common.procedure.adapter.ProcedureAdapter;\r
21 import org.simantics.db.common.request.ObjectsWithType;\r
22 import org.simantics.db.common.request.WriteRequest;\r
23 import org.simantics.db.common.request.WriteResultRequest;\r
24 import org.simantics.db.exception.DatabaseException;\r
25 import org.simantics.db.layer0.request.PossibleActiveExperiment;\r
26 import org.simantics.db.layer0.request.PossibleActiveRun;\r
27 import org.simantics.db.layer0.variable.Variable;\r
28 import org.simantics.db.procedure.Procedure;\r
29 import org.simantics.db.service.VirtualGraphSupport;\r
30 import org.simantics.layer0.Layer0;\r
31 import org.simantics.project.IProject;\r
32 import org.simantics.simulation.ontology.SimulationResource;\r
33 import org.simantics.simulation.project.IExperimentManager;\r
34 \r
35 /**\r
36  * @author Tuukka Lehtonen\r
37  */\r
38 public final class ExperimentUtil {\r
39 \r
40     public static void stepExperiment(IExperiment experiment, double duration) {\r
41         if(experiment instanceof IDynamicExperiment)\r
42             ((IDynamicExperiment)experiment).simulateDuration(duration);\r
43     }\r
44 \r
45     public static void simulateExperiment(IExperiment experiment, boolean enabled) {\r
46         if(experiment instanceof IDynamicExperiment)\r
47             ((IDynamicExperiment)experiment).simulate(enabled);\r
48     }\r
49 \r
50     public static void disposeExperiment(final IExperiment experiment) {\r
51         \r
52         if(experiment instanceof IDynamicExperiment) {\r
53                 \r
54             ((IDynamicExperiment)experiment).shutdown(null);\r
55             \r
56             Session session = Simantics.getSession();\r
57                         VirtualGraphSupport vgs = session.getService(VirtualGraphSupport.class);\r
58                         session.asyncRequest(new WriteRequest(vgs.getMemoryPersistent("experiments")) {\r
59 \r
60                                 @Override\r
61                                 public void perform(WriteGraph graph) throws DatabaseException {\r
62 \r
63                                         SimulationResource SIMU = SimulationResource.getInstance(graph);\r
64                                         Resource activeRun = experiment.getResource();\r
65                                         graph.deny(activeRun, SIMU.IsActive, activeRun);\r
66 \r
67                                 }\r
68 \r
69                         });\r
70 \r
71         }\r
72         \r
73     }\r
74 \r
75     public static void step(double duration) {\r
76         IExperimentManager manager = \r
77             Simantics.getProject().getHint(IExperimentManager.KEY_EXPERIMENT_MANAGER);\r
78         IExperiment experiment = manager.getActiveExperiment();\r
79         if(experiment instanceof IDynamicExperiment)\r
80             ((IDynamicExperiment)experiment).simulateDuration(duration);\r
81     }\r
82 \r
83     public static void simulate(boolean enabled) {\r
84         IExperimentManager manager =\r
85             Simantics.getProject().getHint(IExperimentManager.KEY_EXPERIMENT_MANAGER);\r
86         IExperiment experiment = manager.getActiveExperiment();\r
87         if(experiment instanceof IDynamicExperiment)\r
88             ((IDynamicExperiment)experiment).simulate(enabled);\r
89     }\r
90 \r
91     /**\r
92      * Synchronously shutdown active experiment.\r
93      * \r
94      * @param project\r
95      */\r
96     public static void shutdownActiveExperiment(IProject project) {\r
97         shutdownActiveExperiment(project, null);\r
98     }\r
99 \r
100     /**\r
101      * Synchronously shutdown active experiment.\r
102      * \r
103      * @param project\r
104      */\r
105     public static void shutdownActiveExperiment(IProject project, IProgressMonitor monitor) {\r
106         IExperimentManager manager = project.getHint(IExperimentManager.KEY_EXPERIMENT_MANAGER);\r
107         IExperiment experiment = manager.getActiveExperiment();\r
108         if (experiment != null)\r
109             experiment.shutdown(monitor);\r
110     }\r
111 \r
112     /**\r
113      * If there is an active experiment, schedule a job for its shutdown.\r
114      * \r
115      * @param project\r
116      */\r
117     public static void scheduleShutdownActiveExperiment(IProject project) {\r
118         scheduleShutdownActiveExperiment(project, null);\r
119     }\r
120 \r
121     /**\r
122      * If there is an active experiment, schedule a job for its shutdown.\r
123      * \r
124      * @param project\r
125      */\r
126     public static void scheduleShutdownActiveExperiment(IProject project, Consumer<IExperiment> callback) {\r
127         IExperimentManager manager = project.getHint(IExperimentManager.KEY_EXPERIMENT_MANAGER);\r
128         final IExperiment experiment = manager.getActiveExperiment();\r
129         if (experiment != null) {\r
130             Job job = new DatabaseJob("Shutting down experiment") {\r
131                 @Override\r
132                 protected IStatus run(final IProgressMonitor monitor) {\r
133                     try {\r
134                         experiment.shutdown(monitor);\r
135                         if (callback != null)\r
136                             callback.accept(null);\r
137                         return Status.OK_STATUS;\r
138                     } finally {\r
139                         monitor.done();\r
140                     }\r
141                 }\r
142             };\r
143             job.setProperty(IProgressConstants2.SHOW_IN_TASKBAR_ICON_PROPERTY, Boolean.TRUE);\r
144             job.setUser(true);\r
145             job.schedule();\r
146         }\r
147     }\r
148 \r
149     public static Variable possibleActiveRunVariable(ReadGraph graph, Resource model) throws DatabaseException {\r
150         return graph.syncRequest(new PossibleActiveRun(model));\r
151     }\r
152 \r
153     /**\r
154      * @param processor\r
155      * @param experiment\r
156      * @param asyncCallback\r
157      * @return\r
158      * @throws DatabaseException\r
159      */\r
160     public static Resource activateExperiment(RequestProcessor processor, Resource experiment, Procedure<Resource> asyncCallback) throws DatabaseException {\r
161         VirtualGraphSupport vgs = processor.getService(VirtualGraphSupport.class);\r
162         WriteResultRequest<Resource> w = new WriteResultRequest<Resource>(vgs.getMemoryPersistent("experiments")) {\r
163             @Override\r
164             public Resource perform(WriteGraph graph) throws DatabaseException {\r
165                 return activateExperiment(graph, experiment);\r
166             }\r
167         };\r
168         if (processor instanceof WriteGraph) {\r
169             return ((WriteGraph) processor).syncRequest(w);\r
170         } else {\r
171             if (asyncCallback == null)\r
172                 asyncCallback = new ProcedureAdapter<>();\r
173             processor.getSession().asyncRequest(w, asyncCallback);\r
174             return null;\r
175         }\r
176     }\r
177 \r
178     /**\r
179      * @param processor\r
180      * @param run\r
181      * @throws DatabaseException\r
182      */\r
183     public static void activateRun(RequestProcessor processor, Resource run) throws DatabaseException {\r
184         VirtualGraphSupport vgs = processor.getService(VirtualGraphSupport.class);\r
185         WriteRequest w = new WriteRequest(vgs.getMemoryPersistent("experiments")) {\r
186             @Override\r
187             public void perform(WriteGraph graph) throws DatabaseException {\r
188                 ExperimentUtil.activateRun(graph, run);\r
189             }\r
190         };\r
191         if (processor instanceof WriteGraph) {\r
192             ((WriteGraph) processor).syncRequest(w);\r
193         } else {\r
194             processor.getSession().asyncRequest(w);\r
195         }\r
196     }\r
197 \r
198     private static Resource activateExperiment(WriteGraph graph, Resource experiment) throws DatabaseException {\r
199         Layer0 L0 = Layer0.getInstance(graph);\r
200         SimulationResource SIMU = SimulationResource.getInstance(graph);\r
201 \r
202         Resource experimentType = graph.getPossibleType(experiment, SIMU.Experiment);\r
203         if (experimentType == null)\r
204             throw new DatabaseException("No unique experiment type was found for experiment " + graph.getPossibleURI(experiment));\r
205         Collection<Resource> runTypes = graph.sync(new ObjectsWithType(experimentType, L0.ConsistsOf, SIMU.RunType));\r
206         if (runTypes.size() != 1)\r
207             throw new DatabaseException("No unique run type was found for experiment " + graph.getPossibleURI(experiment));\r
208         final Resource runType = runTypes.iterator().next();\r
209 \r
210         VirtualGraphSupport vgs = graph.getService(VirtualGraphSupport.class);\r
211         return graph.syncRequest(new WriteResultRequest<Resource>(vgs.getMemoryPersistent("experiments")) {\r
212             @Override\r
213             public Resource perform(WriteGraph graph) throws DatabaseException {\r
214                 Layer0 L0 = Layer0.getInstance(graph);\r
215                 Resource run = graph.newResource();\r
216                 graph.claim(run, L0.InstanceOf, runType);\r
217                 graph.addLiteral(run, L0.HasName, L0.NameOf, L0.String, UUID.randomUUID().toString(), Bindings.STRING);\r
218                 graph.claim(experiment, L0.ConsistsOf, run);\r
219 \r
220                 Resource activeRun = graph.syncRequest(new PossibleActiveExperiment(experiment));\r
221                 if (activeRun != null) {\r
222                     graph.deny(activeRun, SIMU.IsActive, activeRun);\r
223                 }\r
224                 graph.claim(run, SIMU.IsActive, run);\r
225 \r
226                 return run;\r
227             }\r
228         });\r
229     }\r
230 \r
231     private static void activateRun(WriteGraph graph, Resource run) throws DatabaseException {\r
232         SimulationResource SIMU = SimulationResource.getInstance(graph);\r
233         Resource activeRun = graph.syncRequest(new PossibleActiveExperiment(run));\r
234         if (activeRun != null) {\r
235             graph.deny(activeRun, SIMU.IsActive, activeRun);\r
236         }\r
237         graph.claim(run, SIMU.IsActive, run);\r
238     }\r
239 \r
240 }\r