diff --git a/main/ui/src/main/java/org/cryptomator/ui/CryptomatorModule.java b/main/ui/src/main/java/org/cryptomator/ui/CryptomatorModule.java index 74d161909..b0e0675a5 100644 --- a/main/ui/src/main/java/org/cryptomator/ui/CryptomatorModule.java +++ b/main/ui/src/main/java/org/cryptomator/ui/CryptomatorModule.java @@ -77,8 +77,8 @@ class CryptomatorModule { @Provides @Singleton - WebDavMounter provideWebDavMounterProvider(WebDavServer server, ExecutorService executorService) { - return new WebDavMounterProvider(server, executorService).get(); + WebDavMounter provideWebDavMounterProvider(WebDavMounterProvider webDavMounterProvider) { + return webDavMounterProvider.get(); } @Provides diff --git a/main/ui/src/main/java/org/cryptomator/ui/util/mount/LinuxGvfsWebDavMounter.java b/main/ui/src/main/java/org/cryptomator/ui/util/mount/LinuxGvfsWebDavMounter.java index fd82e164a..0a31a3a01 100644 --- a/main/ui/src/main/java/org/cryptomator/ui/util/mount/LinuxGvfsWebDavMounter.java +++ b/main/ui/src/main/java/org/cryptomator/ui/util/mount/LinuxGvfsWebDavMounter.java @@ -12,10 +12,19 @@ package org.cryptomator.ui.util.mount; import java.net.URI; +import javax.inject.Inject; +import javax.inject.Singleton; + import org.apache.commons.lang3.SystemUtils; import org.cryptomator.ui.util.command.Script; +@Singleton final class LinuxGvfsWebDavMounter implements WebDavMounterStrategy { + + @Inject + LinuxGvfsWebDavMounter() { + + } @Override public boolean shouldWork() { diff --git a/main/ui/src/main/java/org/cryptomator/ui/util/mount/MacOsXWebDavMounter.java b/main/ui/src/main/java/org/cryptomator/ui/util/mount/MacOsXWebDavMounter.java index 2b4c3588a..da793d5b7 100644 --- a/main/ui/src/main/java/org/cryptomator/ui/util/mount/MacOsXWebDavMounter.java +++ b/main/ui/src/main/java/org/cryptomator/ui/util/mount/MacOsXWebDavMounter.java @@ -14,10 +14,19 @@ import java.nio.file.FileSystems; import java.nio.file.Files; import java.util.UUID; +import javax.inject.Inject; +import javax.inject.Singleton; + import org.apache.commons.lang3.SystemUtils; import org.cryptomator.ui.util.command.Script; +@Singleton final class MacOsXWebDavMounter implements WebDavMounterStrategy { + + @Inject + MacOsXWebDavMounter() { + + } @Override public boolean shouldWork() { diff --git a/main/ui/src/main/java/org/cryptomator/ui/util/mount/MountStrategies.java b/main/ui/src/main/java/org/cryptomator/ui/util/mount/MountStrategies.java new file mode 100644 index 000000000..5bf74b54a --- /dev/null +++ b/main/ui/src/main/java/org/cryptomator/ui/util/mount/MountStrategies.java @@ -0,0 +1,84 @@ +package org.cryptomator.ui.util.mount; + +import static java.util.Arrays.asList; +import static java.util.Collections.unmodifiableList; + +import java.util.Collection; +import java.util.Iterator; + +import javax.inject.Inject; +import javax.inject.Singleton; + +@Singleton +class MountStrategies implements Collection { + + private final Collection delegate; + + @Inject + MountStrategies(LinuxGvfsWebDavMounter linuxMounter, MacOsXWebDavMounter osxMounter, WindowsWebDavMounter winMounter) { + delegate = unmodifiableList(asList(linuxMounter, osxMounter, winMounter)); + } + + public int size() { + return delegate.size(); + } + + public boolean isEmpty() { + return delegate.isEmpty(); + } + + public boolean contains(Object o) { + return delegate.contains(o); + } + + public Iterator iterator() { + return delegate.iterator(); + } + + public Object[] toArray() { + return delegate.toArray(); + } + + public T[] toArray(T[] a) { + return delegate.toArray(a); + } + + public boolean add(WebDavMounterStrategy e) { + return delegate.add(e); + } + + public boolean remove(Object o) { + return delegate.remove(o); + } + + public boolean containsAll(Collection c) { + return delegate.containsAll(c); + } + + public boolean addAll(Collection c) { + return delegate.addAll(c); + } + + public boolean removeAll(Collection c) { + return delegate.removeAll(c); + } + + public boolean retainAll(Collection c) { + return delegate.retainAll(c); + } + + public void clear() { + delegate.clear(); + } + + public boolean equals(Object o) { + return delegate.equals(o); + } + + public int hashCode() { + return delegate.hashCode(); + } + + + +} diff --git a/main/ui/src/main/java/org/cryptomator/ui/util/mount/WebDavMounterProvider.java b/main/ui/src/main/java/org/cryptomator/ui/util/mount/WebDavMounterProvider.java index a1707e6d5..64745d69b 100644 --- a/main/ui/src/main/java/org/cryptomator/ui/util/mount/WebDavMounterProvider.java +++ b/main/ui/src/main/java/org/cryptomator/ui/util/mount/WebDavMounterProvider.java @@ -9,24 +9,26 @@ ******************************************************************************/ package org.cryptomator.ui.util.mount; +import java.util.Collection; import java.util.concurrent.ExecutorService; import javax.inject.Inject; import javax.inject.Provider; +import javax.inject.Singleton; import org.cryptomator.webdav.WebDavServer; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +@Singleton public class WebDavMounterProvider implements Provider { private static final Logger LOG = LoggerFactory.getLogger(WebDavMounterProvider.class); - private static final WebDavMounterStrategy[] STRATEGIES = {new WindowsWebDavMounter(), new MacOsXWebDavMounter(), new LinuxGvfsWebDavMounter()}; private final WebDavMounterStrategy choosenStrategy; @Inject - public WebDavMounterProvider(WebDavServer server, ExecutorService executorService) { - this.choosenStrategy = getStrategyWhichShouldWork(); + public WebDavMounterProvider(WebDavServer server, ExecutorService executorService, MountStrategies availableStrategies) { + this.choosenStrategy = getStrategyWhichShouldWork(availableStrategies); executorService.execute(() -> { this.choosenStrategy.warmUp(server.getPort()); }); @@ -37,14 +39,10 @@ public class WebDavMounterProvider implements Provider { return this.choosenStrategy; } - private static WebDavMounterStrategy getStrategyWhichShouldWork() { - for (WebDavMounterStrategy strategy : STRATEGIES) { - if (strategy.shouldWork()) { - LOG.info("Using {}", strategy.getClass().getSimpleName()); - return strategy; - } - } - return new FallbackWebDavMounter(); + private WebDavMounterStrategy getStrategyWhichShouldWork(Collection availableStrategies) { + WebDavMounterStrategy strategy = availableStrategies.stream().filter(WebDavMounterStrategy::shouldWork).findFirst().orElse(new FallbackWebDavMounter()); + LOG.info("Using {}", strategy.getClass().getSimpleName()); + return strategy; } } diff --git a/main/ui/src/main/java/org/cryptomator/ui/util/mount/WindowsDriveLetters.java b/main/ui/src/main/java/org/cryptomator/ui/util/mount/WindowsDriveLetters.java new file mode 100644 index 000000000..ef4447ab6 --- /dev/null +++ b/main/ui/src/main/java/org/cryptomator/ui/util/mount/WindowsDriveLetters.java @@ -0,0 +1,35 @@ +package org.cryptomator.ui.util.mount; + +import static java.util.stream.Collectors.toSet; +import static java.util.stream.IntStream.rangeClosed; + +import java.nio.file.FileSystems; +import java.nio.file.Path; +import java.util.Set; +import java.util.stream.StreamSupport; + +import javax.inject.Inject; +import javax.inject.Singleton; + +import com.google.common.collect.Sets; + + +@Singleton +public final class WindowsDriveLetters { + + private static final Set A_TO_Z = rangeClosed('A', 'Z').mapToObj(i -> (char) i).collect(toSet()); + + @Inject + public WindowsDriveLetters() { + } + + public Set getOccupiedDriveLetters() { + Iterable rootDirs = FileSystems.getDefault().getRootDirectories(); + return StreamSupport.stream(rootDirs.spliterator(), false).map(path -> path.toString().toUpperCase().charAt(0)).collect(toSet()); + } + + public Set getAvailableDriveLetters() { + return Sets.difference(A_TO_Z, getOccupiedDriveLetters()); + } + +} diff --git a/main/ui/src/main/java/org/cryptomator/ui/util/mount/WindowsWebDavMounter.java b/main/ui/src/main/java/org/cryptomator/ui/util/mount/WindowsWebDavMounter.java index 26cf5ff41..941309b2d 100644 --- a/main/ui/src/main/java/org/cryptomator/ui/util/mount/WindowsWebDavMounter.java +++ b/main/ui/src/main/java/org/cryptomator/ui/util/mount/WindowsWebDavMounter.java @@ -18,6 +18,9 @@ import java.util.concurrent.TimeUnit; import java.util.regex.Matcher; import java.util.regex.Pattern; +import javax.inject.Inject; +import javax.inject.Singleton; + import org.apache.commons.lang3.SystemUtils; import org.cryptomator.ui.util.command.CommandResult; import org.cryptomator.ui.util.command.Script; @@ -27,10 +30,17 @@ import org.cryptomator.ui.util.command.Script; *

* Tested on Windows 7 but should also work on Windows 8. */ -final class WindowsWebDavMounter implements WebDavMounterStrategy { +@Singleton +public final class WindowsWebDavMounter implements WebDavMounterStrategy { private static final Pattern WIN_MOUNT_DRIVELETTER_PATTERN = Pattern.compile("\\s*([A-Z]:)\\s*"); private static final int MAX_MOUNT_ATTEMPTS = 8; + private final WindowsDriveLetters driveLetters; + + @Inject + WindowsWebDavMounter(WindowsDriveLetters driveLetters) { + this.driveLetters = driveLetters; + } @Override public boolean shouldWork() {