--- /dev/null
+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