Skip to content

Commit 85d8600

Browse files
committed
Show a warning if disk space is running out
1 parent a562ef7 commit 85d8600

File tree

4 files changed

+75
-78
lines changed

4 files changed

+75
-78
lines changed
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
package fi.helsinki.cs.tmc.actions;
2+
3+
import fi.helsinki.cs.tmc.core.utilities.SingletonTask;
4+
import fi.helsinki.cs.tmc.core.utilities.TmcRequestProcessor;
5+
import fi.helsinki.cs.tmc.coreimpl.TmcCoreSettingsImpl;
6+
import fi.helsinki.cs.tmc.ui.ConvenientDialogDisplayer;
7+
import fi.helsinki.cs.tmc.ui.TmcNotificationDisplayer;
8+
import fi.helsinki.cs.tmc.ui.TmcNotificationDisplayer.SingletonToken;
9+
import java.io.IOException;
10+
import java.nio.file.FileStore;
11+
import java.nio.file.Files;
12+
import java.nio.file.Paths;
13+
import java.text.DecimalFormat;
14+
import java.util.function.Consumer;
15+
import org.openide.awt.NotificationDisplayer;
16+
import org.openide.util.ImageUtilities;
17+
18+
public class CheckDiskSpace {
19+
20+
private static final long DEFAULT_CHECK_INTERVAL = 10 * 60 * 1000;
21+
22+
private final TmcCoreSettingsImpl settings;
23+
private final SingletonToken notifierToken;
24+
25+
public CheckDiskSpace(TmcCoreSettingsImpl settings) {
26+
this.settings = settings;
27+
this.notifierToken = TmcNotificationDisplayer.createSingletonToken();
28+
}
29+
30+
public void startCheckingPeriodically() {
31+
SingletonTask periodicChecker = new SingletonTask(() -> {
32+
doChecks((message) -> {
33+
TmcNotificationDisplayer.getDefault().notify(notifierToken, "You're running out of disk space", ImageUtilities.loadImageIcon("fi/helsinki/cs/tmc/ui/infobubble.png", false), message, null, NotificationDisplayer.Priority.HIGH);
34+
});
35+
}, TmcRequestProcessor.instance);
36+
periodicChecker.setInterval(DEFAULT_CHECK_INTERVAL);
37+
}
38+
39+
public void run() {
40+
doChecks((message) -> {
41+
ConvenientDialogDisplayer.getDefault().displayWarning(message);
42+
});
43+
}
44+
45+
private void doChecks(Consumer<String> onMessage) {
46+
try {
47+
final FileStore fileStore = Files.getFileStore(settings.getConfigRoot());
48+
// Gigabytes
49+
final double usableSpace = fileStore.getUsableSpace() / 1000000000.0;
50+
if (usableSpace < 1) {
51+
showDiskWarning(fileStore, usableSpace, onMessage);
52+
} else {
53+
final FileStore projectFileStore = Files.getFileStore(Paths.get(settings.getProjectRootDir()));
54+
final double projectUsableSpace = projectFileStore.getUsableSpace() / 1000000000.0;
55+
if (projectUsableSpace < 1) {
56+
showDiskWarning(projectFileStore, projectUsableSpace, onMessage);
57+
}
58+
}
59+
} catch (IOException ex) {
60+
}
61+
}
62+
63+
private void showDiskWarning(FileStore store, double usableSpace, Consumer<String> notifier) {
64+
final String formattedSpaceAvailable = new DecimalFormat("##.##").format(usableSpace);
65+
final String fileStoreName = store.name();
66+
final String message = "Your computer has only " + formattedSpaceAvailable + "GB of free disk space available.\n"
67+
+ "Consider freeing up some space by deleting unused files or this program may not work properly!\n"
68+
+ "\nThe lack of free space was detected in " + fileStoreName + ".";
69+
notifier.accept(message);
70+
}
71+
}

tmc-plugin/src/fi/helsinki/cs/tmc/actions/TmcModuleInstall.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,9 @@
33
import fi.helsinki.cs.tmc.core.TmcCore;
44
import fi.helsinki.cs.tmc.core.configuration.TmcSettings;
55
import fi.helsinki.cs.tmc.core.domain.Course;
6-
import fi.helsinki.cs.tmc.core.events.TmcEventBus;
76
import fi.helsinki.cs.tmc.core.holders.TmcLangsHolder;
87
import fi.helsinki.cs.tmc.core.holders.TmcSettingsHolder;
98
import fi.helsinki.cs.tmc.coreimpl.TmcCoreSettingsImpl;
10-
import fi.helsinki.cs.tmc.events.LoginStateChangedEvent;
119
import fi.helsinki.cs.tmc.langs.util.TaskExecutorImpl;
1210
import fi.helsinki.cs.tmc.spywareLocal.SpywareFacade;
1311
import fi.helsinki.cs.tmc.tasks.LoginTask;
@@ -58,6 +56,9 @@ public void run() {
5856
// an email notification.
5957
// PushEventListener.start();
6058
TmcSettings settings = TmcSettingsHolder.get();
59+
final CheckDiskSpace checkDiskSpace = new CheckDiskSpace((TmcCoreSettingsImpl)settings);
60+
checkDiskSpace.startCheckingPeriodically();
61+
checkDiskSpace.run();
6162
SpywareFacade.start();
6263

6364
Preferences prefs = NbPreferences.forModule(TmcModuleInstall.class);

tmc-plugin/src/fi/helsinki/cs/tmc/utilities/SingletonTask.java

Lines changed: 0 additions & 76 deletions
This file was deleted.

tmc-plugin/src/fi/helsinki/cs/tmc/utilities/TmcRequestProcessor.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import org.openide.util.RequestProcessor;
44

55
/** Holds TMC's default RequestProcessor. */
6+
// TODO: use tmc-core's implementation instead
67
public class TmcRequestProcessor {
78
public static final RequestProcessor instance =
89
new RequestProcessor("TMC request processor", 5, true);

0 commit comments

Comments
 (0)