diff --git a/src/main/java/org/cryptomator/event/FSEventBucket.java b/src/main/java/org/cryptomator/event/FSEventBucket.java new file mode 100644 index 000000000..370a9557a --- /dev/null +++ b/src/main/java/org/cryptomator/event/FSEventBucket.java @@ -0,0 +1,8 @@ +package org.cryptomator.event; + +import org.cryptomator.common.vaults.Vault; +import org.cryptomator.cryptofs.event.FilesystemEvent; + +import java.nio.file.Path; + +public record FSEventBucket(Vault vault, Path idPath, Class c) {} diff --git a/src/main/java/org/cryptomator/event/FSEventBucketContent.java b/src/main/java/org/cryptomator/event/FSEventBucketContent.java new file mode 100644 index 000000000..b252608c7 --- /dev/null +++ b/src/main/java/org/cryptomator/event/FSEventBucketContent.java @@ -0,0 +1,5 @@ +package org.cryptomator.event; + +import org.cryptomator.cryptofs.event.FilesystemEvent; + +public record FSEventBucketContent(FilesystemEvent mostRecentEvent, int count) {} diff --git a/src/main/java/org/cryptomator/event/FileSystemEventAggregator.java b/src/main/java/org/cryptomator/event/FileSystemEventAggregator.java index a1db4138d..c2b787daa 100644 --- a/src/main/java/org/cryptomator/event/FileSystemEventAggregator.java +++ b/src/main/java/org/cryptomator/event/FileSystemEventAggregator.java @@ -16,15 +16,10 @@ import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.atomic.AtomicBoolean; -//TODO: Rename to aggregator @Singleton public class FileSystemEventAggregator { - public record Key(Vault vault, Path idPath, Class c) {}; - - public record Value(FilesystemEvent mostRecentEvent, int count) {} - - private final ConcurrentHashMap map; + private final ConcurrentHashMap map; private final AtomicBoolean hasUpdates; @Inject @@ -44,9 +39,9 @@ public class FileSystemEventAggregator { hasUpdates.set(true); map.compute(key, (k, val) -> { if (val == null) { - return new Value(e, 1); + return new FSEventBucketContent(e, 1); } else { - return new Value(e, val.count() + 1); + return new FSEventBucketContent(e, val.count() + 1); } }); @@ -55,7 +50,7 @@ public class FileSystemEventAggregator { /** * Removes an event bucket from the map. */ - public Value remove(Key key) { + public FSEventBucketContent remove(FSEventBucket key) { hasUpdates.set(true); return map.remove(key); } @@ -80,7 +75,7 @@ public class FileSystemEventAggregator { * * @param target collection which is first cleared and then the EntrySet copied to. */ - public void cloneTo(Collection> target) { + public void cloneTo(Collection> target) { hasUpdates.set(false); target.clear(); target.addAll(map.entrySet()); @@ -91,9 +86,9 @@ public class FileSystemEventAggregator { * * @param v Vault where the event occurred * @param event Actual {@link FilesystemEvent} - * @return a {@link Key} used in the map and lru cache + * @return a {@link FSEventBucket} used in the map and lru cache */ - private static Key computeKey(Vault v, FilesystemEvent event) { + private static FSEventBucket computeKey(Vault v, FilesystemEvent event) { var p = switch (event) { case DecryptionFailedEvent(_, Path ciphertextPath, _) -> ciphertextPath; case ConflictResolvedEvent(_, _, _, _, Path resolvedCiphertext) -> resolvedCiphertext; @@ -101,6 +96,6 @@ public class FileSystemEventAggregator { case BrokenDirFileEvent(_, Path ciphertext) -> ciphertext; case BrokenFileNodeEvent(_, _, Path ciphertext) -> ciphertext; }; - return new Key(v, p, event.getClass()); + return new FSEventBucket(v, p, event.getClass()); } } diff --git a/src/main/java/org/cryptomator/ui/eventview/EventListCellController.java b/src/main/java/org/cryptomator/ui/eventview/EventListCellController.java index c1abaddac..1327ea62c 100644 --- a/src/main/java/org/cryptomator/ui/eventview/EventListCellController.java +++ b/src/main/java/org/cryptomator/ui/eventview/EventListCellController.java @@ -1,5 +1,7 @@ package org.cryptomator.ui.eventview; +import org.cryptomator.event.FSEventBucket; +import org.cryptomator.event.FSEventBucketContent; import org.cryptomator.event.FileSystemEventAggregator; import org.cryptomator.common.Nullable; import org.cryptomator.common.ObservableUtil; @@ -55,7 +57,7 @@ public class EventListCellController implements FxController { @Nullable private final RevealPathService revealService; private final ResourceBundle resourceBundle; - private final ObjectProperty> eventEntry; + private final ObjectProperty> eventEntry; private final StringProperty eventMessage; private final StringProperty eventDescription; private final ObjectProperty eventIcon; @@ -108,7 +110,7 @@ public class EventListCellController implements FxController { return vaultUnlocked.getValue() && (eventActionsMenu.isShowing() || root.isHover()); } - public void setEventEntry(@NotNull Map.Entry item) { + public void setEventEntry(@NotNull Map.Entry item) { eventEntry.set(item); eventActionsMenu.hide(); eventActionsMenu.getItems().clear(); diff --git a/src/main/java/org/cryptomator/ui/eventview/EventListCellFactory.java b/src/main/java/org/cryptomator/ui/eventview/EventListCellFactory.java index 558803968..e607b41a7 100644 --- a/src/main/java/org/cryptomator/ui/eventview/EventListCellFactory.java +++ b/src/main/java/org/cryptomator/ui/eventview/EventListCellFactory.java @@ -1,6 +1,7 @@ package org.cryptomator.ui.eventview; -import org.cryptomator.event.FileSystemEventAggregator; +import org.cryptomator.event.FSEventBucket; +import org.cryptomator.event.FSEventBucketContent; import org.cryptomator.ui.common.FxmlLoaderFactory; import javax.inject.Inject; @@ -15,7 +16,7 @@ import java.io.UncheckedIOException; import java.util.Map; @EventViewScoped -public class EventListCellFactory implements Callback>, ListCell>> { +public class EventListCellFactory implements Callback>, ListCell>> { private static final String FXML_PATH = "/fxml/eventview_cell.fxml"; @@ -28,7 +29,7 @@ public class EventListCellFactory implements Callback> call(ListView> eventListView) { + public ListCell> call(ListView> eventListView) { try { FXMLLoader fxmlLoader = fxmlLoaders.load(FXML_PATH); return new Cell(fxmlLoader.getRoot(), fxmlLoader.getController()); @@ -37,7 +38,7 @@ public class EventListCellFactory implements Callback> { + private static class Cell extends ListCell> { private final Parent root; private final EventListCellController controller; @@ -48,7 +49,7 @@ public class EventListCellFactory implements Callback item, boolean empty) { + protected void updateItem(Map.Entry item, boolean empty) { super.updateItem(item, empty); if (empty || item == null) { diff --git a/src/main/java/org/cryptomator/ui/eventview/EventViewController.java b/src/main/java/org/cryptomator/ui/eventview/EventViewController.java index bba62605b..b60b4cb81 100644 --- a/src/main/java/org/cryptomator/ui/eventview/EventViewController.java +++ b/src/main/java/org/cryptomator/ui/eventview/EventViewController.java @@ -1,7 +1,8 @@ package org.cryptomator.ui.eventview; import org.cryptomator.common.vaults.Vault; -import org.cryptomator.event.FileSystemEventAggregator; +import org.cryptomator.event.FSEventBucket; +import org.cryptomator.event.FSEventBucketContent; import org.cryptomator.ui.common.FxController; import org.cryptomator.ui.fxapp.EventsUpdateCheck; @@ -22,9 +23,9 @@ import java.util.ResourceBundle; @EventViewScoped public class EventViewController implements FxController { - private final FilteredList> filteredEventList; + private final FilteredList> filteredEventList; private final ObservableList vaults; - private final SortedList> sortedEventList; + private final SortedList> sortedEventList; private final ObservableList choiceBoxEntries; private final ResourceBundle resourceBundle; private final EventListCellFactory cellFactory; @@ -32,7 +33,7 @@ public class EventViewController implements FxController { @FXML ChoiceBox vaultFilterChoiceBox; @FXML - ListView> eventListView; + ListView> eventListView; @Inject public EventViewController(EventsUpdateCheck eventsUpdateCheck, ObservableList vaults, ResourceBundle resourceBundle, EventListCellFactory cellFactory) { @@ -48,11 +49,11 @@ public class EventViewController implements FxController { * Comparsion method for the lru cache. During comparsion the map is accessed. * First the entries are compared by the event timestamp, then vaultId, then identifying path and lastly by class name. * - * @param left a {@link FileSystemEventAggregator.Key} object - * @param right another {@link FileSystemEventAggregator.Key} object, compared to {@code left} + * @param left a {@link FSEventBucket} object + * @param right another {@link FSEventBucket} object, compared to {@code left} * @return a negative integer, zero, or a positive integer as the first argument is less than, equal to, or greater than the second. */ - private int compareBuckets(Map.Entry left, Map.Entry right) { + private int compareBuckets(Map.Entry left, Map.Entry right) { var t1 = left.getValue().mostRecentEvent().getTimestamp(); var t2 = right.getValue().mostRecentEvent().getTimestamp(); var timeComparison = t1.compareTo(t2); diff --git a/src/main/java/org/cryptomator/ui/fxapp/EventsUpdateCheck.java b/src/main/java/org/cryptomator/ui/fxapp/EventsUpdateCheck.java index 948e8f09e..8d5a144eb 100644 --- a/src/main/java/org/cryptomator/ui/fxapp/EventsUpdateCheck.java +++ b/src/main/java/org/cryptomator/ui/fxapp/EventsUpdateCheck.java @@ -1,5 +1,7 @@ package org.cryptomator.ui.fxapp; +import org.cryptomator.event.FSEventBucket; +import org.cryptomator.event.FSEventBucketContent; import org.cryptomator.event.FileSystemEventAggregator; import javax.inject.Inject; @@ -17,7 +19,7 @@ import java.util.concurrent.TimeUnit; @FxApplicationScoped public class EventsUpdateCheck { - private final ObservableList> events; + private final ObservableList> events; private final FileSystemEventAggregator eventRegistry; private final ScheduledFuture scheduledTask; private final BooleanProperty unreadEvents; @@ -35,7 +37,7 @@ public class EventsUpdateCheck { //TODO: allow the task to be canceled (to enable ui actions, e.g. when the contextMenu is open, the list should not be updated } - public ObservableList> getList() { + public ObservableList> getList() { return events; }