diff --git a/main/commons/src/main/java/org/cryptomator/common/ConsumerThrowingException.java b/main/commons/src/main/java/org/cryptomator/common/ConsumerThrowingException.java new file mode 100644 index 000000000..649a2b6b6 --- /dev/null +++ b/main/commons/src/main/java/org/cryptomator/common/ConsumerThrowingException.java @@ -0,0 +1,8 @@ +package org.cryptomator.common; + +@FunctionalInterface +public interface ConsumerThrowingException { + + void accept(T t) throws E; + +} diff --git a/main/commons/src/main/java/org/cryptomator/common/Optionals.java b/main/commons/src/main/java/org/cryptomator/common/Optionals.java new file mode 100644 index 000000000..d7c510bea --- /dev/null +++ b/main/commons/src/main/java/org/cryptomator/common/Optionals.java @@ -0,0 +1,17 @@ +package org.cryptomator.common; + +import java.util.Optional; + +public final class Optionals { + + private Optionals() { + } + + public static void ifPresent(Optional optional, ConsumerThrowingException consumer) throws E { + final T t = optional.orElse(null); + if (t != null) { + consumer.accept(t); + } + } + +} diff --git a/main/frontend-webdav/src/main/java/org/cryptomator/frontend/webdav/mount/CommandFailedException.java b/main/frontend-api/src/main/java/org/cryptomator/frontend/CommandFailedException.java similarity index 93% rename from main/frontend-webdav/src/main/java/org/cryptomator/frontend/webdav/mount/CommandFailedException.java rename to main/frontend-api/src/main/java/org/cryptomator/frontend/CommandFailedException.java index 6599f19a7..635d1fe8a 100644 --- a/main/frontend-webdav/src/main/java/org/cryptomator/frontend/webdav/mount/CommandFailedException.java +++ b/main/frontend-api/src/main/java/org/cryptomator/frontend/CommandFailedException.java @@ -7,7 +7,7 @@ * Sebastian Stenzel - initial API and implementation * Markus Kreusch - Refactored WebDavMounter to use strategy pattern ******************************************************************************/ -package org.cryptomator.frontend.webdav.mount; +package org.cryptomator.frontend; public class CommandFailedException extends Exception { diff --git a/main/frontend-api/src/main/java/org/cryptomator/frontend/Frontend.java b/main/frontend-api/src/main/java/org/cryptomator/frontend/Frontend.java index 8acbeb060..6ee3b4770 100644 --- a/main/frontend-api/src/main/java/org/cryptomator/frontend/Frontend.java +++ b/main/frontend-api/src/main/java/org/cryptomator/frontend/Frontend.java @@ -9,10 +9,10 @@ public interface Frontend extends AutoCloseable { MOUNT_NAME, WIN_DRIVE_LETTER } - boolean mount(Map> map); + void mount(Map> map) throws CommandFailedException; - void unmount(); + void unmount() throws CommandFailedException; - void reveal(); + void reveal() throws CommandFailedException; } diff --git a/main/frontend-webdav/src/main/java/org/cryptomator/frontend/webdav/WebDavFrontend.java b/main/frontend-webdav/src/main/java/org/cryptomator/frontend/webdav/WebDavFrontend.java index c54738162..fdb82f195 100644 --- a/main/frontend-webdav/src/main/java/org/cryptomator/frontend/webdav/WebDavFrontend.java +++ b/main/frontend-webdav/src/main/java/org/cryptomator/frontend/webdav/WebDavFrontend.java @@ -4,9 +4,9 @@ import java.net.URI; import java.util.Map; import java.util.Optional; +import org.cryptomator.frontend.CommandFailedException; import org.cryptomator.frontend.Frontend; import org.cryptomator.frontend.FrontendCreationFailedException; -import org.cryptomator.frontend.webdav.mount.CommandFailedException; import org.cryptomator.frontend.webdav.mount.WebDavMount; import org.cryptomator.frontend.webdav.mount.WebDavMounterProvider; import org.eclipse.jetty.servlet.ServletContextHandler; @@ -36,36 +36,21 @@ class WebDavFrontend implements Frontend { } @Override - public boolean mount(Map> mountParams) { - try { - mount = webdavMounterProvider.get().mount(uri, mountParams); - return true; - } catch (CommandFailedException e) { - return false; + public void mount(Map> mountParams) throws CommandFailedException { + mount = webdavMounterProvider.get().mount(uri, mountParams); + } + + @Override + public void unmount() throws CommandFailedException { + if (mount != null) { + mount.unmount(); } } @Override - public void unmount() { + public void reveal() throws CommandFailedException { if (mount != null) { - try { - mount.unmount(); - } catch (CommandFailedException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - } - } - - @Override - public void reveal() { - if (mount != null) { - try { - mount.reveal(); - } catch (CommandFailedException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } + mount.reveal(); } } diff --git a/main/frontend-webdav/src/main/java/org/cryptomator/frontend/webdav/mount/FallbackWebDavMounter.java b/main/frontend-webdav/src/main/java/org/cryptomator/frontend/webdav/mount/FallbackWebDavMounter.java index 778037c4b..711faa7c1 100644 --- a/main/frontend-webdav/src/main/java/org/cryptomator/frontend/webdav/mount/FallbackWebDavMounter.java +++ b/main/frontend-webdav/src/main/java/org/cryptomator/frontend/webdav/mount/FallbackWebDavMounter.java @@ -12,6 +12,7 @@ import java.net.URI; import java.util.Map; import java.util.Optional; +import org.cryptomator.frontend.CommandFailedException; import org.cryptomator.frontend.Frontend.MountParam; /** diff --git a/main/frontend-webdav/src/main/java/org/cryptomator/frontend/webdav/mount/LinuxGvfsWebDavMounter.java b/main/frontend-webdav/src/main/java/org/cryptomator/frontend/webdav/mount/LinuxGvfsWebDavMounter.java index 685e95dc2..f0c87be68 100644 --- a/main/frontend-webdav/src/main/java/org/cryptomator/frontend/webdav/mount/LinuxGvfsWebDavMounter.java +++ b/main/frontend-webdav/src/main/java/org/cryptomator/frontend/webdav/mount/LinuxGvfsWebDavMounter.java @@ -18,6 +18,7 @@ import javax.inject.Inject; import javax.inject.Singleton; import org.apache.commons.lang3.SystemUtils; +import org.cryptomator.frontend.CommandFailedException; import org.cryptomator.frontend.Frontend.MountParam; import org.cryptomator.frontend.webdav.mount.command.Script; diff --git a/main/frontend-webdav/src/main/java/org/cryptomator/frontend/webdav/mount/MacOsXWebDavMounter.java b/main/frontend-webdav/src/main/java/org/cryptomator/frontend/webdav/mount/MacOsXWebDavMounter.java index a0c46b9ee..ba7bc1fe3 100644 --- a/main/frontend-webdav/src/main/java/org/cryptomator/frontend/webdav/mount/MacOsXWebDavMounter.java +++ b/main/frontend-webdav/src/main/java/org/cryptomator/frontend/webdav/mount/MacOsXWebDavMounter.java @@ -20,6 +20,7 @@ import javax.inject.Inject; import javax.inject.Singleton; import org.apache.commons.lang3.SystemUtils; +import org.cryptomator.frontend.CommandFailedException; import org.cryptomator.frontend.Frontend.MountParam; import org.cryptomator.frontend.webdav.mount.command.Script; diff --git a/main/frontend-webdav/src/main/java/org/cryptomator/frontend/webdav/mount/WebDavMount.java b/main/frontend-webdav/src/main/java/org/cryptomator/frontend/webdav/mount/WebDavMount.java index 9908c3317..b05c82c2b 100644 --- a/main/frontend-webdav/src/main/java/org/cryptomator/frontend/webdav/mount/WebDavMount.java +++ b/main/frontend-webdav/src/main/java/org/cryptomator/frontend/webdav/mount/WebDavMount.java @@ -8,6 +8,8 @@ ******************************************************************************/ package org.cryptomator.frontend.webdav.mount; +import org.cryptomator.frontend.CommandFailedException; + /** * A mounted webdav share. * diff --git a/main/frontend-webdav/src/main/java/org/cryptomator/frontend/webdav/mount/WebDavMounter.java b/main/frontend-webdav/src/main/java/org/cryptomator/frontend/webdav/mount/WebDavMounter.java index 78f0d9aec..25afbba0f 100644 --- a/main/frontend-webdav/src/main/java/org/cryptomator/frontend/webdav/mount/WebDavMounter.java +++ b/main/frontend-webdav/src/main/java/org/cryptomator/frontend/webdav/mount/WebDavMounter.java @@ -13,6 +13,7 @@ import java.net.URI; import java.util.Map; import java.util.Optional; +import org.cryptomator.frontend.CommandFailedException; import org.cryptomator.frontend.Frontend.MountParam; public interface WebDavMounter { diff --git a/main/frontend-webdav/src/main/java/org/cryptomator/frontend/webdav/mount/WindowsWebDavMounter.java b/main/frontend-webdav/src/main/java/org/cryptomator/frontend/webdav/mount/WindowsWebDavMounter.java index 45e22987e..f9b1b7acc 100644 --- a/main/frontend-webdav/src/main/java/org/cryptomator/frontend/webdav/mount/WindowsWebDavMounter.java +++ b/main/frontend-webdav/src/main/java/org/cryptomator/frontend/webdav/mount/WindowsWebDavMounter.java @@ -23,6 +23,7 @@ import javax.inject.Singleton; import org.apache.commons.lang3.CharUtils; import org.apache.commons.lang3.SystemUtils; +import org.cryptomator.frontend.CommandFailedException; import org.cryptomator.frontend.Frontend.MountParam; import org.cryptomator.frontend.webdav.mount.command.CommandResult; import org.cryptomator.frontend.webdav.mount.command.Script; diff --git a/main/frontend-webdav/src/main/java/org/cryptomator/frontend/webdav/mount/command/CommandResult.java b/main/frontend-webdav/src/main/java/org/cryptomator/frontend/webdav/mount/command/CommandResult.java index e5cbb6253..0af5412b8 100644 --- a/main/frontend-webdav/src/main/java/org/cryptomator/frontend/webdav/mount/command/CommandResult.java +++ b/main/frontend-webdav/src/main/java/org/cryptomator/frontend/webdav/mount/command/CommandResult.java @@ -15,7 +15,7 @@ import java.io.IOException; import org.apache.commons.io.IOUtils; import org.apache.logging.log4j.util.Strings; -import org.cryptomator.frontend.webdav.mount.CommandFailedException; +import org.cryptomator.frontend.CommandFailedException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/main/frontend-webdav/src/main/java/org/cryptomator/frontend/webdav/mount/command/CommandRunner.java b/main/frontend-webdav/src/main/java/org/cryptomator/frontend/webdav/mount/command/CommandRunner.java index d8e1af65b..d551cf758 100644 --- a/main/frontend-webdav/src/main/java/org/cryptomator/frontend/webdav/mount/command/CommandRunner.java +++ b/main/frontend-webdav/src/main/java/org/cryptomator/frontend/webdav/mount/command/CommandRunner.java @@ -24,7 +24,7 @@ import java.util.stream.Collectors; import org.apache.commons.lang3.ArrayUtils; import org.apache.commons.lang3.SystemUtils; -import org.cryptomator.frontend.webdav.mount.CommandFailedException; +import org.cryptomator.frontend.CommandFailedException; /** *

diff --git a/main/frontend-webdav/src/main/java/org/cryptomator/frontend/webdav/mount/command/FutureCommandResult.java b/main/frontend-webdav/src/main/java/org/cryptomator/frontend/webdav/mount/command/FutureCommandResult.java index 6b0baff70..a624f94cd 100644 --- a/main/frontend-webdav/src/main/java/org/cryptomator/frontend/webdav/mount/command/FutureCommandResult.java +++ b/main/frontend-webdav/src/main/java/org/cryptomator/frontend/webdav/mount/command/FutureCommandResult.java @@ -17,7 +17,7 @@ import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; -import org.cryptomator.frontend.webdav.mount.CommandFailedException; +import org.cryptomator.frontend.CommandFailedException; final class FutureCommandResult implements Future, Runnable { diff --git a/main/frontend-webdav/src/main/java/org/cryptomator/frontend/webdav/mount/command/Script.java b/main/frontend-webdav/src/main/java/org/cryptomator/frontend/webdav/mount/command/Script.java index dc3c2724c..4192358d8 100644 --- a/main/frontend-webdav/src/main/java/org/cryptomator/frontend/webdav/mount/command/Script.java +++ b/main/frontend-webdav/src/main/java/org/cryptomator/frontend/webdav/mount/command/Script.java @@ -12,7 +12,7 @@ import java.util.HashMap; import java.util.Map; import java.util.concurrent.TimeUnit; -import org.cryptomator.frontend.webdav.mount.CommandFailedException; +import org.cryptomator.frontend.CommandFailedException; public final class Script { diff --git a/main/pom.xml b/main/pom.xml index 8a701a90d..217b825b5 100644 --- a/main/pom.xml +++ b/main/pom.xml @@ -163,7 +163,7 @@ com.google.guava guava - 18.0 + 19.0 diff --git a/main/ui/pom.xml b/main/ui/pom.xml index 4d8d263af..6cf2d334a 100644 --- a/main/ui/pom.xml +++ b/main/ui/pom.xml @@ -18,6 +18,10 @@ Cryptomator GUI + + org.cryptomator + commons + org.cryptomator filesystem-api diff --git a/main/ui/src/main/java/org/cryptomator/ui/controllers/UnlockController.java b/main/ui/src/main/java/org/cryptomator/ui/controllers/UnlockController.java index 2dc2e270c..fa4a7acef 100644 --- a/main/ui/src/main/java/org/cryptomator/ui/controllers/UnlockController.java +++ b/main/ui/src/main/java/org/cryptomator/ui/controllers/UnlockController.java @@ -19,6 +19,7 @@ import javax.inject.Inject; import org.apache.commons.lang3.CharUtils; import org.apache.commons.lang3.SystemUtils; import org.cryptomator.crypto.engine.InvalidPassphraseException; +import org.cryptomator.frontend.CommandFailedException; import org.cryptomator.frontend.FrontendCreationFailedException; import org.cryptomator.frontend.webdav.mount.WindowsDriveLetters; import org.cryptomator.ui.controls.SecPasswordField; @@ -291,7 +292,13 @@ public class UnlockController extends AbstractFXMLViewController { if (vault.isUnlocked() && !mountSuccess) { exec.submit(vault::deactivateFrontend); } else if (vault.isUnlocked() && mountSuccess) { - exec.submit(vault::reveal); + exec.submit(() -> { + try { + vault.reveal(); + } catch (CommandFailedException e) { + LOG.error("Failed to reveal mounted vault", e); + } + }); } if (mountSuccess && listener != null) { listener.didUnlock(this); diff --git a/main/ui/src/main/java/org/cryptomator/ui/controllers/UnlockedController.java b/main/ui/src/main/java/org/cryptomator/ui/controllers/UnlockedController.java index 34c2e1826..86f25c331 100644 --- a/main/ui/src/main/java/org/cryptomator/ui/controllers/UnlockedController.java +++ b/main/ui/src/main/java/org/cryptomator/ui/controllers/UnlockedController.java @@ -15,6 +15,7 @@ import java.util.concurrent.ExecutorService; import javax.inject.Inject; import javax.inject.Provider; +import org.cryptomator.frontend.CommandFailedException; import org.cryptomator.ui.model.Vault; import org.cryptomator.ui.util.ActiveWindowStyleSupport; @@ -78,20 +79,28 @@ public class UnlockedController extends AbstractFXMLViewController { @FXML private void didClickRevealVault(ActionEvent event) { - exec.submit(vault::reveal); + exec.submit(() -> { + try { + vault.reveal(); + } catch (CommandFailedException e) { + Platform.runLater(() -> { + messageLabel.setText(resourceBundle.getString("unlocked.label.revealFailed")); + }); + } + }); } @FXML private void didClickCloseVault(ActionEvent event) { exec.submit(() -> { - // try { - vault.unmount(); - // } catch (CommandFailedException e) { - // Platform.runLater(() -> { - // messageLabel.setText(resourceBundle.getString("unlocked.label.unmountFailed")); - // }); - // return; - // } + try { + vault.unmount(); + } catch (CommandFailedException e) { + Platform.runLater(() -> { + messageLabel.setText(resourceBundle.getString("unlocked.label.unmountFailed")); + }); + return; + } vault.deactivateFrontend(); if (listener != null) { Platform.runLater(() -> { diff --git a/main/ui/src/main/java/org/cryptomator/ui/model/Vault.java b/main/ui/src/main/java/org/cryptomator/ui/model/Vault.java index f3361e5f9..2ddf8867a 100644 --- a/main/ui/src/main/java/org/cryptomator/ui/model/Vault.java +++ b/main/ui/src/main/java/org/cryptomator/ui/model/Vault.java @@ -15,10 +15,12 @@ import java.util.Set; import org.apache.commons.lang3.CharUtils; import org.apache.commons.lang3.StringUtils; +import org.cryptomator.common.Optionals; import org.cryptomator.filesystem.FileSystem; import org.cryptomator.filesystem.crypto.CryptoFileSystemDelegate; import org.cryptomator.filesystem.crypto.CryptoFileSystemFactory; import org.cryptomator.filesystem.nio.NioFileSystem; +import org.cryptomator.frontend.CommandFailedException; import org.cryptomator.frontend.Frontend; import org.cryptomator.frontend.Frontend.MountParam; import org.cryptomator.frontend.FrontendCreationFailedException; @@ -120,23 +122,22 @@ public class Vault implements Serializable, CryptoFileSystemDelegate { } public Boolean mount() { - // TODO exception handling - Frontend frontend = filesystemFrontend.get().orElse(null); - if (frontend == null) { + try { + Optionals.ifPresent(filesystemFrontend.get(), f -> { + f.mount(getMountParams()); + }); + return true; + } catch (CommandFailedException e) { return false; - } else { - return frontend.mount(getMountParams()); } } - public void reveal() { - // TODO exception handling - filesystemFrontend.get().ifPresent(Frontend::reveal); + public void reveal() throws CommandFailedException { + Optionals.ifPresent(filesystemFrontend.get(), Frontend::reveal); } - public void unmount() { - // TODO exception handling - filesystemFrontend.get().ifPresent(Frontend::unmount); + public void unmount() throws CommandFailedException { + Optionals.ifPresent(filesystemFrontend.get(), Frontend::unmount); } /* Delegate Methods */