]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics/src/org/simantics/DiskWarningSystem.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics / src / org / simantics / DiskWarningSystem.java
diff --git a/bundles/org.simantics/src/org/simantics/DiskWarningSystem.java b/bundles/org.simantics/src/org/simantics/DiskWarningSystem.java
new file mode 100644 (file)
index 0000000..3ea694a
--- /dev/null
@@ -0,0 +1,79 @@
+package org.simantics;\r
+\r
+import java.util.Collection;\r
+import java.util.concurrent.CopyOnWriteArrayList;\r
+import java.util.concurrent.ScheduledFuture;\r
+import java.util.concurrent.TimeUnit;\r
+\r
+/**\r
+ * @author Antti Villberg\r
+ */\r
+public class DiskWarningSystem {\r
+\r
+    public interface DiskWarningListener {\r
+       /*\r
+        * @param available in bytes\r
+        */\r
+        void diskLow(long available);\r
+    }\r
+\r
+    private final Collection<DiskWarningListener> listeners = new CopyOnWriteArrayList<DiskWarningListener>();\r
+\r
+    // In bytes\r
+    private long limit = Long.MAX_VALUE;\r
+\r
+    private boolean disposed = false;\r
+\r
+    private ScheduledFuture<?> future;\r
+\r
+    /*\r
+     * @param limit in megabytes\r
+     */\r
+    public void setLimit(long limit) {\r
+       this.limit = limit*1024*1024;\r
+    }\r
+\r
+    public long get() {\r
+       return Simantics.getDiskBytes();\r
+    }\r
+    \r
+    public boolean check() {\r
+               return get() > limit;\r
+    }\r
+       \r
+    \r
+    public DiskWarningSystem(int amount, TimeUnit unit) {\r
+       \r
+       future = Simantics.scheduleAtFixedRate(new Runnable() {\r
+\r
+               @Override\r
+               public void run() {\r
+                       if(!disposed && !check()) {\r
+                               long bytes = get();\r
+                               for (DiskWarningListener listener : listeners) {\r
+                                       listener.diskLow(bytes);\r
+                               }\r
+                       }\r
+               }\r
+\r
+       }, 0, amount, unit);\r
+       \r
+    }\r
+\r
+    public boolean addListener(DiskWarningListener listener) {\r
+        return listeners.add(listener);\r
+    }\r
+\r
+    public boolean removeListener(DiskWarningListener listener) {\r
+        return listeners.remove(listener);\r
+    }\r
+\r
+    public void dispose() {\r
+        if (!disposed) {\r
+            disposed = true;\r
+            future.cancel(false);\r
+            listeners.clear();\r
+        }\r
+    }\r
+\r
+}
\ No newline at end of file