From 2239a3e6a365d9d9ed4295139785c9042cc4efd2 Mon Sep 17 00:00:00 2001 From: Armin Schrenk Date: Wed, 26 Feb 2025 11:56:17 +0100 Subject: [PATCH] reduce API to only consider vault events --- .../org/cryptomator/common/CommonsModule.java | 4 +-- .../org/cryptomator/common/vaults/Vault.java | 10 +++--- .../java/org/cryptomator/event/Event.java | 15 --------- .../event/NotificationHandler.java | 2 +- .../org/cryptomator/event/UpdateEvent.java | 17 ---------- .../org/cryptomator/event/VaultEvent.java | 10 ++++-- .../ui/eventview/EventListCellController.java | 31 ++++++++----------- .../ui/eventview/EventListCellFactory.java | 10 +++--- .../ui/eventview/EventViewController.java | 10 +++--- .../cryptomator/ui/fxapp/UpdateChecker.java | 11 +------ 10 files changed, 39 insertions(+), 81 deletions(-) delete mode 100644 src/main/java/org/cryptomator/event/Event.java delete mode 100644 src/main/java/org/cryptomator/event/UpdateEvent.java diff --git a/src/main/java/org/cryptomator/common/CommonsModule.java b/src/main/java/org/cryptomator/common/CommonsModule.java index b130a7d83..296b2c039 100644 --- a/src/main/java/org/cryptomator/common/CommonsModule.java +++ b/src/main/java/org/cryptomator/common/CommonsModule.java @@ -14,8 +14,8 @@ import org.cryptomator.common.settings.SettingsProvider; import org.cryptomator.common.vaults.VaultComponent; import org.cryptomator.common.vaults.VaultListModule; import org.cryptomator.cryptolib.common.MasterkeyFileAccess; +import org.cryptomator.event.VaultEvent; import org.cryptomator.integrations.revealpath.RevealPathService; -import org.cryptomator.event.Event; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -133,7 +133,7 @@ public abstract class CommonsModule { @Provides @Singleton - static ObservableList provideAppEventQueue() { + static ObservableList provideVaultEventQueue() { return FXCollections.synchronizedObservableList(FXCollections.observableArrayList()); } diff --git a/src/main/java/org/cryptomator/common/vaults/Vault.java b/src/main/java/org/cryptomator/common/vaults/Vault.java index 0530d9528..4103488f0 100644 --- a/src/main/java/org/cryptomator/common/vaults/Vault.java +++ b/src/main/java/org/cryptomator/common/vaults/Vault.java @@ -22,7 +22,6 @@ import org.cryptomator.cryptofs.event.FilesystemEvent; import org.cryptomator.cryptolib.api.CryptoException; import org.cryptomator.cryptolib.api.MasterkeyLoader; import org.cryptomator.cryptolib.api.MasterkeyLoadingFailedException; -import org.cryptomator.event.Event; import org.cryptomator.event.VaultEvent; import org.cryptomator.integrations.mount.MountFailedException; import org.cryptomator.integrations.mount.Mountpoint; @@ -80,7 +79,7 @@ public class Vault { private final ObjectBinding mountPoint; private final Mounter mounter; private final Settings settings; - private final ObservableList eventQueue; + private final ObservableList eventList; private final BooleanProperty showingStats; private final AtomicReference mountHandle = new AtomicReference<>(null); @@ -93,7 +92,7 @@ public class Vault { @Named("lastKnownException") ObjectProperty lastKnownException, // VaultStats stats, // Mounter mounter, Settings settings, // - ObservableList eventQueue) { + ObservableList eventList) { this.vaultSettings = vaultSettings; this.configCache = configCache; this.cryptoFileSystem = cryptoFileSystem; @@ -110,7 +109,7 @@ public class Vault { this.mountPoint = Bindings.createObjectBinding(this::getMountPoint, state); this.mounter = mounter; this.settings = settings; - this.eventQueue = eventQueue; + this.eventList = eventList; this.showingStats = new SimpleBooleanProperty(false); this.quickAccessEntry = new AtomicReference<>(null); } @@ -262,8 +261,9 @@ public class Vault { } private void consumeVaultEvent(FilesystemEvent e) { + //TODO: here we could implement a buffer to prevent event spam (due to many filesystem requests) long timestamp = Instant.now().toEpochMilli(); - Platform.runLater(() -> eventQueue.addLast(new VaultEvent(timestamp, this, e))); + Platform.runLater(() -> eventList.addLast(new VaultEvent(timestamp, this, e))); } // ****************************************************************************** diff --git a/src/main/java/org/cryptomator/event/Event.java b/src/main/java/org/cryptomator/event/Event.java deleted file mode 100644 index 34fb3176a..000000000 --- a/src/main/java/org/cryptomator/event/Event.java +++ /dev/null @@ -1,15 +0,0 @@ -package org.cryptomator.event; - -public sealed interface Event extends Comparable permits UpdateEvent, VaultEvent { - - long getTimestampMilli(); - - default int compareTo(Event other) { - long timeDiff = this.getTimestampMilli() - other.getTimestampMilli(); - if (timeDiff != 0) { - return (int) timeDiff; - } - return this.equals(other) ? 0 : this.getClass().getName().compareTo(other.getClass().getName()); - } - -} diff --git a/src/main/java/org/cryptomator/event/NotificationHandler.java b/src/main/java/org/cryptomator/event/NotificationHandler.java index fe8818ec2..983a5d2dd 100644 --- a/src/main/java/org/cryptomator/event/NotificationHandler.java +++ b/src/main/java/org/cryptomator/event/NotificationHandler.java @@ -7,7 +7,7 @@ import java.util.stream.Stream; public interface NotificationHandler { - Answer handle(Event e); + Answer handle(VaultEvent e); static Stream loadAll() { return IntegrationsLoader.loadAll(ServiceLoader.load(NotificationHandler.class), NotificationHandler.class); diff --git a/src/main/java/org/cryptomator/event/UpdateEvent.java b/src/main/java/org/cryptomator/event/UpdateEvent.java deleted file mode 100644 index 2e4ae0f2d..000000000 --- a/src/main/java/org/cryptomator/event/UpdateEvent.java +++ /dev/null @@ -1,17 +0,0 @@ -package org.cryptomator.event; - -import java.time.Instant; - -public record UpdateEvent(long timestamp, String newVersion) implements Event { - - public UpdateEvent(String newVersion) { - this(Instant.now().toEpochMilli(), newVersion); - } - - @Override - public long getTimestampMilli() { - return timestamp; - } -} - - diff --git a/src/main/java/org/cryptomator/event/VaultEvent.java b/src/main/java/org/cryptomator/event/VaultEvent.java index b507c3dc6..cd4fc0b52 100644 --- a/src/main/java/org/cryptomator/event/VaultEvent.java +++ b/src/main/java/org/cryptomator/event/VaultEvent.java @@ -5,14 +5,18 @@ import org.cryptomator.cryptofs.event.FilesystemEvent; import java.time.Instant; -public record VaultEvent(long timestamp, Vault v, FilesystemEvent actualEvent) implements Event { +public record VaultEvent(long timestamp, Vault v, FilesystemEvent actualEvent) implements Comparable { public VaultEvent(Vault v, FilesystemEvent actualEvent) { this(Instant.now().toEpochMilli(), v, actualEvent); } @Override - public long getTimestampMilli() { - return timestamp; + public int compareTo(VaultEvent other) { + long timeDiff = this.timestamp - other.timestamp; + if (timeDiff != 0) { + return (int) timeDiff; + } + return this.equals(other) ? 0 : this.actualEvent.getClass().getName().compareTo(other.actualEvent.getClass().getName()); } } diff --git a/src/main/java/org/cryptomator/ui/eventview/EventListCellController.java b/src/main/java/org/cryptomator/ui/eventview/EventListCellController.java index db6e3a027..8f546a97f 100644 --- a/src/main/java/org/cryptomator/ui/eventview/EventListCellController.java +++ b/src/main/java/org/cryptomator/ui/eventview/EventListCellController.java @@ -4,8 +4,6 @@ import org.cryptomator.common.ObservableUtil; import org.cryptomator.common.vaults.Vault; import org.cryptomator.cryptofs.event.ConflictResolvedEvent; import org.cryptomator.cryptofs.event.FilesystemEvent; -import org.cryptomator.event.Event; -import org.cryptomator.event.UpdateEvent; import org.cryptomator.event.VaultEvent; import org.cryptomator.integrations.revealpath.RevealFailedException; import org.cryptomator.integrations.revealpath.RevealPathService; @@ -32,10 +30,10 @@ public class EventListCellController implements FxController { private static final Logger LOG = LoggerFactory.getLogger(EventListCellController.class); - private final ObservableList events; + private final ObservableList events; private final Optional revealService; private final ResourceBundle resourceBundle; - private final ObjectProperty event; + private final ObjectProperty event; private final ObservableValue message; private final ObservableValue description; private final ObservableValue icon; @@ -48,7 +46,7 @@ public class EventListCellController implements FxController { Button eventActionsButton; @Inject - public EventListCellController(ObservableList events, Optional revealService, ResourceBundle resourceBundle) { + public EventListCellController(ObservableList events, Optional revealService, ResourceBundle resourceBundle) { this.events = events; this.revealService = revealService; this.resourceBundle = resourceBundle; @@ -60,26 +58,23 @@ public class EventListCellController implements FxController { } - private void hideContextMenus(Observable observable, Event oldValue, Event newValue) { + private void hideContextMenus(Observable observable, VaultEvent oldValue, VaultEvent newValue) { basicEventActions.hide(); conflictResoledEventActions.hide(); } - public void setEvent(Event item) { + public void setEvent(VaultEvent item) { event.set(item); } - private FontAwesome5Icon selectIcon(Event e) { - return switch (e) { - case UpdateEvent _ -> FontAwesome5Icon.BELL; - case VaultEvent _ -> FontAwesome5Icon.FILE; - }; + private FontAwesome5Icon selectIcon(VaultEvent e) { + return FontAwesome5Icon.FILE; } - private String selectDescription(Event e) { - return switch (e) { - case UpdateEvent(_, String newVersion) -> resourceBundle.getString("preferences.updates.updateAvailable").formatted(newVersion); - case VaultEvent _ -> "A vault is weird!"; + private String selectDescription(VaultEvent e) { + return switch (e.actualEvent()) { + case ConflictResolvedEvent _-> "A conflict is resolved!"; + default -> "Something happened"; }; } @@ -87,8 +82,8 @@ public class EventListCellController implements FxController { public void toggleEventActionsMenu() { var e = event.get(); if (e != null) { - var contextMenu = switch (e) { - case VaultEvent _ -> conflictResoledEventActions; + var contextMenu = switch (e.actualEvent()) { + case ConflictResolvedEvent _ -> conflictResoledEventActions; default -> basicEventActions; }; if (contextMenu.isShowing()) { diff --git a/src/main/java/org/cryptomator/ui/eventview/EventListCellFactory.java b/src/main/java/org/cryptomator/ui/eventview/EventListCellFactory.java index 505ef7a83..102bbfa05 100644 --- a/src/main/java/org/cryptomator/ui/eventview/EventListCellFactory.java +++ b/src/main/java/org/cryptomator/ui/eventview/EventListCellFactory.java @@ -1,6 +1,6 @@ package org.cryptomator.ui.eventview; -import org.cryptomator.event.Event; +import org.cryptomator.event.VaultEvent; import org.cryptomator.ui.common.FxmlLoaderFactory; import javax.inject.Inject; @@ -14,7 +14,7 @@ import java.io.IOException; import java.io.UncheckedIOException; @EventViewScoped -public class EventListCellFactory implements Callback, ListCell> { +public class EventListCellFactory implements Callback, ListCell> { private static final String FXML_PATH = "/fxml/eventview_cell.fxml"; @@ -27,7 +27,7 @@ public class EventListCellFactory implements Callback, ListCell< @Override - public ListCell call(ListView eventListView) { + public ListCell call(ListView eventListView) { try { FXMLLoader fxmlLoader = fxmlLoaders.load(FXML_PATH); return new Cell(fxmlLoader.getRoot(), fxmlLoader.getController()); @@ -36,7 +36,7 @@ public class EventListCellFactory implements Callback, ListCell< } } - private static class Cell extends ListCell { + private static class Cell extends ListCell { private final Parent root; private final EventListCellController controller; @@ -47,7 +47,7 @@ public class EventListCellFactory implements Callback, ListCell< } @Override - protected void updateItem(Event item, boolean empty) { + protected void updateItem(VaultEvent 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 bec9c844c..9e53a5ec2 100644 --- a/src/main/java/org/cryptomator/ui/eventview/EventViewController.java +++ b/src/main/java/org/cryptomator/ui/eventview/EventViewController.java @@ -1,6 +1,6 @@ package org.cryptomator.ui.eventview; -import org.cryptomator.event.Event; +import org.cryptomator.event.VaultEvent; import org.cryptomator.ui.common.FxController; import javax.inject.Inject; @@ -13,15 +13,15 @@ import java.util.Comparator; @EventViewScoped public class EventViewController implements FxController { - private final SortedList reversedEventList; - private final ObservableList eventList; + private final SortedList reversedEventList; + private final ObservableList eventList; private final EventListCellFactory cellFactory; @FXML - ListView eventListView; + ListView eventListView; @Inject - public EventViewController(ObservableList eventList, EventListCellFactory cellFactory) { + public EventViewController(ObservableList eventList, EventListCellFactory cellFactory) { reversedEventList = new SortedList<>(eventList, Comparator.reverseOrder()); this.eventList = eventList; this.cellFactory = cellFactory; diff --git a/src/main/java/org/cryptomator/ui/fxapp/UpdateChecker.java b/src/main/java/org/cryptomator/ui/fxapp/UpdateChecker.java index 39eeaa277..b857adcae 100644 --- a/src/main/java/org/cryptomator/ui/fxapp/UpdateChecker.java +++ b/src/main/java/org/cryptomator/ui/fxapp/UpdateChecker.java @@ -3,8 +3,6 @@ package org.cryptomator.ui.fxapp; import org.cryptomator.common.Environment; import org.cryptomator.common.SemVerComparator; import org.cryptomator.common.settings.Settings; -import org.cryptomator.event.Event; -import org.cryptomator.event.UpdateEvent; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -16,7 +14,6 @@ import javafx.beans.property.ReadOnlyStringProperty; import javafx.beans.property.SimpleObjectProperty; import javafx.beans.property.SimpleStringProperty; import javafx.beans.property.StringProperty; -import javafx.collections.ObservableList; import javafx.concurrent.ScheduledService; import javafx.concurrent.Worker; import javafx.concurrent.WorkerStateEvent; @@ -36,7 +33,6 @@ public class UpdateChecker { private final ScheduledService updateCheckerService; private final ObjectProperty state = new SimpleObjectProperty<>(UpdateCheckState.NOT_CHECKED); private final ObjectProperty lastSuccessfulUpdateCheck; - private final ObservableList eventQueue; private final Comparator versionComparator = new SemVerComparator(); private final BooleanBinding updateAvailable; private final BooleanBinding checkFailed; @@ -44,13 +40,11 @@ public class UpdateChecker { @Inject UpdateChecker(Settings settings, // Environment env, // - ScheduledService updateCheckerService, // - ObservableList eventQueue) { + ScheduledService updateCheckerService) { this.env = env; this.settings = settings; this.updateCheckerService = updateCheckerService; this.lastSuccessfulUpdateCheck = settings.lastSuccessfulUpdateCheck; - this.eventQueue = eventQueue; this.updateAvailable = Bindings.createBooleanBinding(this::isUpdateAvailable, latestVersion); this.checkFailed = Bindings.equal(UpdateCheckState.CHECK_FAILED, state); } @@ -86,9 +80,6 @@ public class UpdateChecker { lastSuccessfulUpdateCheck.set(Instant.now()); latestVersion.set(latestVersionString); state.set(UpdateCheckState.CHECK_SUCCESSFUL); - if( updateAvailable.get()) { - eventQueue.addLast(new UpdateEvent(latestVersionString)); - } } private void checkFailed(WorkerStateEvent event) {