--- /dev/null
+package org.simantics.structural.synchronization;\r
+\r
+import java.util.concurrent.ConcurrentMap;\r
+\r
+import org.eclipse.core.runtime.IProgressMonitor;\r
+import org.eclipse.core.runtime.IStatus;\r
+import org.eclipse.core.runtime.Status;\r
+import org.eclipse.core.runtime.jobs.Job;\r
+import org.simantics.DatabaseJob;\r
+import org.simantics.Simantics;\r
+import org.simantics.simulation.experiment.ExperimentState;\r
+import org.simantics.simulation.experiment.IExperiment;\r
+\r
+public class ContinuousSynchronizationJob extends DatabaseJob {\r
+ \r
+ public static final String FAMILY = "ContinuousSynchronizationJob";\r
+\r
+ final private ConcurrentMap<IExperiment, Job> currentSyncJobs;\r
+ \r
+ IExperiment experiment;\r
+\r
+ public ContinuousSynchronizationJob(IExperiment experiment, ConcurrentMap<IExperiment, Job> currentSyncJobs) {\r
+ super("Synchronization");\r
+ this.experiment = experiment;\r
+ this.currentSyncJobs = currentSyncJobs;\r
+ setPriority(SHORT);\r
+ setSystem(false);\r
+ }\r
+ \r
+ @Override\r
+ public boolean belongsTo(Object family) {\r
+ if (FAMILY == family) return true;\r
+ return super.belongsTo(family);\r
+ }\r
+\r
+ @Override\r
+ public boolean shouldRun() {\r
+ return currentSyncJobs.remove(experiment, this);\r
+ }\r
+\r
+ @Override\r
+ protected IStatus run(IProgressMonitor monitor) {\r
+ try {\r
+ //System.out.println("SYNC #" + (++syncCounter));\r
+ monitor.beginTask("", IProgressMonitor.UNKNOWN);\r
+ if (experiment.getState() != ExperimentState.DISPOSED)\r
+ experiment.refresh(Simantics.getSession());\r
+ return Status.OK_STATUS;\r
+ } catch (Throwable t) {\r
+ return new Status(IStatus.ERROR, "org.simantics.structural.synchronization.client", "Failed to refresh experiment "\r
+ + experiment + " with ID " + experiment.getIdentifier(), t);\r
+ } finally {\r
+ monitor.done();\r
+ }\r
+ }\r
+\r
+}
\ No newline at end of file