Browse Source

Preparations for #74

Sebastian Stenzel 9 years ago
parent
commit
ca88e05849

+ 2 - 2
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

+ 9 - 0
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() {

+ 9 - 0
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() {

+ 84 - 0
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<WebDavMounterStrategy> {
+	
+	private final Collection<WebDavMounterStrategy> 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<WebDavMounterStrategy> iterator() {
+		return delegate.iterator();
+	}
+
+	public Object[] toArray() {
+		return delegate.toArray();
+	}
+
+	public <T> 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<? extends WebDavMounterStrategy> 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();
+	}
+
+
+
+}

+ 9 - 11
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<WebDavMounter> {
 
 	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<WebDavMounter> {
 		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<WebDavMounterStrategy> availableStrategies) {
+		WebDavMounterStrategy strategy = availableStrategies.stream().filter(WebDavMounterStrategy::shouldWork).findFirst().orElse(new FallbackWebDavMounter());
+		LOG.info("Using {}", strategy.getClass().getSimpleName());
+		return strategy;
 	}
 
 }

+ 35 - 0
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<Character> A_TO_Z = rangeClosed('A', 'Z').mapToObj(i -> (char) i).collect(toSet());
+	
+	@Inject
+	public WindowsDriveLetters() {
+	}
+	
+	public Set<Character> getOccupiedDriveLetters() {
+		Iterable<Path> rootDirs = FileSystems.getDefault().getRootDirectories();
+		return StreamSupport.stream(rootDirs.spliterator(), false).map(path -> path.toString().toUpperCase().charAt(0)).collect(toSet());
+	}
+	
+	public Set<Character> getAvailableDriveLetters() {
+		return Sets.difference(A_TO_Z, getOccupiedDriveLetters());
+	}
+
+}

+ 11 - 1
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;
  * <p>
  * 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() {