summaryrefslogtreecommitdiff
path: root/src/main/java/com/keuin/kbackupfabric/util/backup/suggestion/BackupNameSuggestionProvider.java
diff options
context:
space:
mode:
authorKeuin <[email protected]>2020-11-30 13:15:15 +0800
committerkeuin <[email protected]>2020-11-30 13:15:15 +0800
commit61ade9adad4668494dfc32da7751e1b86251dc97 (patch)
treec220fe41d0691d7ad6ed08e51d351537fa220a4f /src/main/java/com/keuin/kbackupfabric/util/backup/suggestion/BackupNameSuggestionProvider.java
parente59bdf4ac0b66ce683be1bbc36852bfce6f70a63 (diff)
Implementing incremental backup
Diffstat (limited to 'src/main/java/com/keuin/kbackupfabric/util/backup/suggestion/BackupNameSuggestionProvider.java')
-rw-r--r--src/main/java/com/keuin/kbackupfabric/util/backup/suggestion/BackupNameSuggestionProvider.java78
1 files changed, 78 insertions, 0 deletions
diff --git a/src/main/java/com/keuin/kbackupfabric/util/backup/suggestion/BackupNameSuggestionProvider.java b/src/main/java/com/keuin/kbackupfabric/util/backup/suggestion/BackupNameSuggestionProvider.java
new file mode 100644
index 0000000..f6f4056
--- /dev/null
+++ b/src/main/java/com/keuin/kbackupfabric/util/backup/suggestion/BackupNameSuggestionProvider.java
@@ -0,0 +1,78 @@
+package com.keuin.kbackupfabric.util.backup.suggestion;
+
+import com.keuin.kbackupfabric.util.backup.BackupFilesystemUtil;
+import com.mojang.brigadier.suggestion.SuggestionProvider;
+import com.mojang.brigadier.suggestion.Suggestions;
+import com.mojang.brigadier.suggestion.SuggestionsBuilder;
+import net.minecraft.server.command.ServerCommandSource;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Locale;
+import java.util.concurrent.CompletableFuture;
+
+public class BackupNameSuggestionProvider {
+
+ private static final List<String> candidateCacheList = new ArrayList<>();
+ private static final Object syncSetDirectory = new Object();
+ private static final Object syncCache = new Object();
+ private static final long CACHE_TTL = 8000;
+ private static String backupSaveDirectory;
+ private static long cacheUpdateTime = 0;
+
+ public static void setBackupSaveDirectory(String backupSaveDirectory) {
+ synchronized (syncSetDirectory) {
+ BackupNameSuggestionProvider.backupSaveDirectory = backupSaveDirectory;
+ }
+ // Immediately perform an update
+ updateCandidateList();
+ }
+
+ public static void updateCandidateList() {
+ synchronized (syncCache) {
+ try {
+ File file = new File(backupSaveDirectory);
+ candidateCacheList.clear();
+ File[] files = file.listFiles();
+ if (files == null)
+ return;
+ for (File f : files)
+ candidateCacheList.add(BackupFilesystemUtil.getBackupName(f.getName()));
+ cacheUpdateTime = System.currentTimeMillis();
+ } catch (NullPointerException ignored) {
+ }
+ }
+ }
+
+// private static void updateCandidateList(Collection<String> stringCollection) {
+// candidateList.clear();
+// candidateList.addAll(stringCollection);
+// }
+
+ public static SuggestionProvider<ServerCommandSource> getProvider() {
+ return (context, builder) -> getCompletableFuture(builder);
+ }
+
+ private static CompletableFuture<Suggestions> getCompletableFuture(SuggestionsBuilder builder) {
+ if (isCacheExpired())
+ updateCandidateList();
+ String remaining = builder.getRemaining().toLowerCase(Locale.ROOT);
+ synchronized (syncCache) {
+ if (candidateCacheList.isEmpty()) { // If the list is empty then return no suggestions
+ return Suggestions.empty(); // No suggestions
+ }
+
+ for (String string : candidateCacheList) { // Iterate through the supplied list
+ if (string.toLowerCase(Locale.ROOT).startsWith(remaining)) {
+ builder.suggest(string); // Add every single entry to suggestions list.
+ }
+ }
+ }
+ return builder.buildFuture(); // Create the CompletableFuture containing all the suggestions
+ }
+
+ private static boolean isCacheExpired() {
+ return System.currentTimeMillis() - cacheUpdateTime > CACHE_TTL || cacheUpdateTime == 0;
+ }
+}