]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics/src/org/simantics/AutosaveVirtualGraphs.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics / src / org / simantics / AutosaveVirtualGraphs.java
diff --git a/bundles/org.simantics/src/org/simantics/AutosaveVirtualGraphs.java b/bundles/org.simantics/src/org/simantics/AutosaveVirtualGraphs.java
new file mode 100644 (file)
index 0000000..2bff191
--- /dev/null
@@ -0,0 +1,181 @@
+/*******************************************************************************\r
+ * Copyright (c) 2012 Association for Decentralized Information Management\r
+ * in Industry THTH ry.\r
+ * All rights reserved. This program and the accompanying materials\r
+ * are made available under the terms of the Eclipse Public License v1.0\r
+ * which accompanies this distribution, and is available at\r
+ * http://www.eclipse.org/legal/epl-v10.html\r
+ *\r
+ * Contributors:\r
+ *     Semantum Oy - initial API and implementation\r
+ *******************************************************************************/\r
+package org.simantics;\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.eclipse.core.runtime.preferences.DefaultScope;\r
+import org.eclipse.core.runtime.preferences.InstanceScope;\r
+import org.osgi.service.prefs.Preferences;\r
+import org.simantics.db.ReadGraph;\r
+import org.simantics.db.Session;\r
+import org.simantics.db.common.request.ReadRequest;\r
+import org.simantics.db.exception.DatabaseException;\r
+import org.simantics.db.service.LifecycleSupport;\r
+import org.simantics.db.service.VirtualGraphSupport;\r
+import org.simantics.internal.Activator;\r
+\r
+/**\r
+ * @author Tuukka Lehtonen <tuukka.lehtonen@semantum.fi>\r
+ */\r
+public class AutosaveVirtualGraphs extends Job {\r
+\r
+       private static final boolean         TRACE        = false;\r
+\r
+       private boolean                      enabled      = true;\r
+\r
+       private Preferences                  defaultPrefs = DefaultScope.INSTANCE.getNode(AutosavePreferences.P_NODE);\r
+       private Preferences                  prefs        = InstanceScope.INSTANCE.getNode(AutosavePreferences.P_NODE);\r
+\r
+       private static AutosaveVirtualGraphs INSTANCE;\r
+\r
+       private boolean getBooleanPref(String preference, boolean def) {\r
+               return prefs.getBoolean(preference, defaultPrefs.getBoolean(preference, def));\r
+       }\r
+\r
+       private int getIntPref(String preference, int def) {\r
+               return prefs.getInt(preference, defaultPrefs.getInt(preference, def));\r
+       }\r
+\r
+       private AutosaveVirtualGraphs() {\r
+               super("Autosave Virtual Graphs");\r
+               setSystem(true);\r
+               setPriority(Job.LONG);\r
+       }\r
+\r
+       public static synchronized AutosaveVirtualGraphs getInstance() {\r
+               if(INSTANCE == null) {\r
+                       INSTANCE = new AutosaveVirtualGraphs();\r
+               }\r
+               return INSTANCE;\r
+       }\r
+\r
+       /**\r
+        * @param enabled\r
+        * @return\r
+        */\r
+       public boolean isEnabled() {\r
+               return enabled;\r
+       }\r
+\r
+       /**\r
+        * @param enabled new enabled state\r
+        * @return previous enabled state\r
+        */\r
+       public boolean setEnabled(boolean enabled) {\r
+               if (enabled == this.enabled)\r
+                       return enabled;\r
+               this.enabled = enabled;\r
+               if (enabled)\r
+                       scheduleAfterInterval();\r
+               else\r
+                       cancel();\r
+               return !enabled;\r
+       }\r
+\r
+       public AutosaveVirtualGraphs scheduleAfterInterval() {\r
+               // Check global disable first.\r
+               String enabled = System.getProperty(AutosavePreferences.SYSTEM_PROPERTY_AUTOSAVE);\r
+               if (enabled != null && enabled.equalsIgnoreCase(Boolean.FALSE.toString())) {\r
+                       return this;\r
+               }\r
+\r
+               // Then check preference.\r
+               if (!getBooleanPref(AutosavePreferences.P_VG_AUTOSAVE_ENABLED, AutosavePreferences.DEFAULT_VG_AUTOSAVE_ENABLED))\r
+                       return this;\r
+\r
+               wakeUp();\r
+               int interval = getIntPref(AutosavePreferences.P_VG_AUTOSAVE_INTERVAL, AutosavePreferences.DEFAULT_VG_AUTOSAVE_INTERVAL);\r
+               schedule(interval*1000L);\r
+               return this;\r
+       }\r
+\r
+       @Override\r
+       public boolean shouldSchedule() {\r
+               return enabled;\r
+       }\r
+\r
+       @Override\r
+       public boolean shouldRun() {\r
+               return enabled;\r
+       }\r
+\r
+       protected IStatus runHeadless(IProgressMonitor monitor) {\r
+               try {\r
+                       Session session = Simantics.peekSession();\r
+                       if (session == null)\r
+                               return Status.CANCEL_STATUS;\r
+                       LifecycleSupport lfs = session.peekService(LifecycleSupport.class);\r
+                       if (lfs == null || lfs.isClosed() || lfs.isClosing())\r
+                               return Status.CANCEL_STATUS;\r
+\r
+                       // Save\r
+                       monitor.beginTask("Autosaving virtual graphs...", IProgressMonitor.UNKNOWN);\r
+                       if (TRACE)\r
+                               System.out.println("Autosaving virtual graphs...");\r
+                       long startTime = System.nanoTime();\r
+\r
+                       session.syncRequest(new ReadRequest() {\r
+                               @Override\r
+                               public void run(ReadGraph graph) throws DatabaseException {\r
+                                       doSave(graph);\r
+                               }\r
+                       });\r
+\r
+                       if (TRACE) {\r
+                               long endTime = System.nanoTime();\r
+                               System.out.println("Autosave of virtual graphs completed in " + (endTime-startTime)*1e-6 + " ms");\r
+                       }\r
+\r
+                       return Status.OK_STATUS;\r
+               } catch (DatabaseException e) {\r
+                       return new Status(Status.ERROR, Activator.PLUGIN_ID, "Autosaving virtual graphs failed", e);\r
+               } finally {\r
+               }\r
+       }\r
+\r
+       @Override\r
+       protected IStatus run(IProgressMonitor monitor) {\r
+               if (!getBooleanPref(AutosavePreferences.P_VG_AUTOSAVE_ENABLED, AutosavePreferences.DEFAULT_VG_AUTOSAVE_ENABLED))\r
+                       return Status.OK_STATUS;\r
+               int interval = getIntPref(AutosavePreferences.P_VG_AUTOSAVE_INTERVAL, AutosavePreferences.DEFAULT_VG_AUTOSAVE_INTERVAL);\r
+               try {\r
+                       // Never run while a heavy database job is in progress.\r
+                       if (DatabaseJob.inProgress()) {\r
+                               // Schedule again in at most 10 seconds instead of\r
+                               // waiting for the whole autosave period again.\r
+                               interval = Math.min(10, interval);\r
+                               return Status.OK_STATUS;\r
+                       }\r
+\r
+//                     if(PlatformUI.isWorkbenchRunning()) {\r
+//                             return runInWorkbench(monitor);\r
+//                     } else {\r
+                               return runHeadless(monitor);\r
+//                     }\r
+               } finally {\r
+                       schedule(interval*1000L);\r
+               }\r
+       }\r
+\r
+       public static void doSave(ReadGraph graph) throws DatabaseException {\r
+               VirtualGraphSupport vgs = graph.getService(VirtualGraphSupport.class);\r
+               vgs.saveAll();\r
+       }\r
+\r
+       public static void saveVirtualGraphsPeriodically() {\r
+               getInstance().scheduleAfterInterval();\r
+       }\r
+\r
+}\r