]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics/src/org/simantics/AutosaveVirtualGraphs.java
Include acorn db in db.client feature and make it the default db driver
[simantics/platform.git] / bundles / org.simantics / src / org / simantics / AutosaveVirtualGraphs.java
1 /*******************************************************************************\r
2  * Copyright (c) 2012 Association for Decentralized Information Management\r
3  * in Industry THTH ry.\r
4  * All rights reserved. This program and the accompanying materials\r
5  * are made available under the terms of the Eclipse Public License v1.0\r
6  * which accompanies this distribution, and is available at\r
7  * http://www.eclipse.org/legal/epl-v10.html\r
8  *\r
9  * Contributors:\r
10  *     Semantum Oy - initial API and implementation\r
11  *******************************************************************************/\r
12 package org.simantics;\r
13 \r
14 import org.eclipse.core.runtime.IProgressMonitor;\r
15 import org.eclipse.core.runtime.IStatus;\r
16 import org.eclipse.core.runtime.Status;\r
17 import org.eclipse.core.runtime.jobs.Job;\r
18 import org.eclipse.core.runtime.preferences.DefaultScope;\r
19 import org.eclipse.core.runtime.preferences.InstanceScope;\r
20 import org.osgi.service.prefs.Preferences;\r
21 import org.simantics.db.ReadGraph;\r
22 import org.simantics.db.Session;\r
23 import org.simantics.db.common.request.ReadRequest;\r
24 import org.simantics.db.exception.DatabaseException;\r
25 import org.simantics.db.service.LifecycleSupport;\r
26 import org.simantics.db.service.VirtualGraphSupport;\r
27 import org.simantics.internal.Activator;\r
28 \r
29 /**\r
30  * @author Tuukka Lehtonen <tuukka.lehtonen@semantum.fi>\r
31  */\r
32 public class AutosaveVirtualGraphs extends Job {\r
33 \r
34         private static final boolean         TRACE        = false;\r
35 \r
36         private boolean                      enabled      = true;\r
37 \r
38         private Preferences                  defaultPrefs = DefaultScope.INSTANCE.getNode(AutosavePreferences.P_NODE);\r
39         private Preferences                  prefs        = InstanceScope.INSTANCE.getNode(AutosavePreferences.P_NODE);\r
40 \r
41         private static AutosaveVirtualGraphs INSTANCE;\r
42 \r
43         private boolean getBooleanPref(String preference, boolean def) {\r
44                 return prefs.getBoolean(preference, defaultPrefs.getBoolean(preference, def));\r
45         }\r
46 \r
47         private int getIntPref(String preference, int def) {\r
48                 return prefs.getInt(preference, defaultPrefs.getInt(preference, def));\r
49         }\r
50 \r
51         private AutosaveVirtualGraphs() {\r
52                 super("Autosave Virtual Graphs");\r
53                 setSystem(true);\r
54                 setPriority(Job.LONG);\r
55         }\r
56 \r
57         public static synchronized AutosaveVirtualGraphs getInstance() {\r
58                 if(INSTANCE == null) {\r
59                         INSTANCE = new AutosaveVirtualGraphs();\r
60                 }\r
61                 return INSTANCE;\r
62         }\r
63 \r
64         /**\r
65          * @param enabled\r
66          * @return\r
67          */\r
68         public boolean isEnabled() {\r
69                 return enabled;\r
70         }\r
71 \r
72         /**\r
73          * @param enabled new enabled state\r
74          * @return previous enabled state\r
75          */\r
76         public boolean setEnabled(boolean enabled) {\r
77                 if (enabled == this.enabled)\r
78                         return enabled;\r
79                 this.enabled = enabled;\r
80                 if (enabled)\r
81                         scheduleAfterInterval();\r
82                 else\r
83                         cancel();\r
84                 return !enabled;\r
85         }\r
86 \r
87         public AutosaveVirtualGraphs scheduleAfterInterval() {\r
88                 // Check global disable first.\r
89                 String enabled = System.getProperty(AutosavePreferences.SYSTEM_PROPERTY_AUTOSAVE);\r
90                 if (enabled != null && enabled.equalsIgnoreCase(Boolean.FALSE.toString())) {\r
91                         return this;\r
92                 }\r
93 \r
94                 // Then check preference.\r
95                 if (!getBooleanPref(AutosavePreferences.P_VG_AUTOSAVE_ENABLED, AutosavePreferences.DEFAULT_VG_AUTOSAVE_ENABLED))\r
96                         return this;\r
97 \r
98                 wakeUp();\r
99                 int interval = getIntPref(AutosavePreferences.P_VG_AUTOSAVE_INTERVAL, AutosavePreferences.DEFAULT_VG_AUTOSAVE_INTERVAL);\r
100                 schedule(interval*1000L);\r
101                 return this;\r
102         }\r
103 \r
104         @Override\r
105         public boolean shouldSchedule() {\r
106                 return enabled;\r
107         }\r
108 \r
109         @Override\r
110         public boolean shouldRun() {\r
111                 return enabled;\r
112         }\r
113 \r
114         protected IStatus runHeadless(IProgressMonitor monitor) {\r
115                 try {\r
116                         Session session = Simantics.peekSession();\r
117                         if (session == null)\r
118                                 return Status.CANCEL_STATUS;\r
119                         LifecycleSupport lfs = session.peekService(LifecycleSupport.class);\r
120                         if (lfs == null || lfs.isClosed() || lfs.isClosing())\r
121                                 return Status.CANCEL_STATUS;\r
122 \r
123                         // Save\r
124                         monitor.beginTask("Autosaving virtual graphs...", IProgressMonitor.UNKNOWN);\r
125                         if (TRACE)\r
126                                 System.out.println("Autosaving virtual graphs...");\r
127                         long startTime = System.nanoTime();\r
128 \r
129                         session.syncRequest(new ReadRequest() {\r
130                                 @Override\r
131                                 public void run(ReadGraph graph) throws DatabaseException {\r
132                                         doSave(graph);\r
133                                 }\r
134                         });\r
135 \r
136                         if (TRACE) {\r
137                                 long endTime = System.nanoTime();\r
138                                 System.out.println("Autosave of virtual graphs completed in " + (endTime-startTime)*1e-6 + " ms");\r
139                         }\r
140 \r
141                         return Status.OK_STATUS;\r
142                 } catch (DatabaseException e) {\r
143                         return new Status(Status.ERROR, Activator.PLUGIN_ID, "Autosaving virtual graphs failed", e);\r
144                 } finally {\r
145                 }\r
146         }\r
147 \r
148         @Override\r
149         protected IStatus run(IProgressMonitor monitor) {\r
150                 if (!getBooleanPref(AutosavePreferences.P_VG_AUTOSAVE_ENABLED, AutosavePreferences.DEFAULT_VG_AUTOSAVE_ENABLED))\r
151                         return Status.OK_STATUS;\r
152                 int interval = getIntPref(AutosavePreferences.P_VG_AUTOSAVE_INTERVAL, AutosavePreferences.DEFAULT_VG_AUTOSAVE_INTERVAL);\r
153                 try {\r
154                         // Never run while a heavy database job is in progress.\r
155                         if (DatabaseJob.inProgress()) {\r
156                                 // Schedule again in at most 10 seconds instead of\r
157                                 // waiting for the whole autosave period again.\r
158                                 interval = Math.min(10, interval);\r
159                                 return Status.OK_STATUS;\r
160                         }\r
161 \r
162 //                      if(PlatformUI.isWorkbenchRunning()) {\r
163 //                              return runInWorkbench(monitor);\r
164 //                      } else {\r
165                                 return runHeadless(monitor);\r
166 //                      }\r
167                 } finally {\r
168                         schedule(interval*1000L);\r
169                 }\r
170         }\r
171 \r
172         public static void doSave(ReadGraph graph) throws DatabaseException {\r
173                 VirtualGraphSupport vgs = graph.getService(VirtualGraphSupport.class);\r
174                 vgs.saveAll();\r
175         }\r
176 \r
177         public static void saveVirtualGraphsPeriodically() {\r
178                 getInstance().scheduleAfterInterval();\r
179         }\r
180 \r
181 }\r