Refactored adding vaults

This commit is contained in:
Sebastian Stenzel
2019-09-12 17:01:50 +02:00
parent 9e14b5e70f
commit 2bbc3e5834
9 changed files with 130 additions and 101 deletions
@@ -10,16 +10,13 @@ import dagger.Module;
import dagger.Provides;
import javafx.beans.binding.Binding;
import javafx.beans.binding.Bindings;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import org.apache.commons.lang3.SystemUtils;
import org.cryptomator.common.settings.Settings;
import org.cryptomator.common.settings.SettingsProvider;
import org.cryptomator.common.settings.VaultSettings;
import org.cryptomator.common.vaults.Vault;
import org.cryptomator.common.vaults.VaultComponent;
import org.cryptomator.common.vaults.VaultFactory;
import org.cryptomator.common.vaults.VaultListChangeListener;
import org.cryptomator.common.vaults.VaultListManager;
import org.cryptomator.frontend.webdav.WebDavServer;
import org.fxmisc.easybind.EasyBind;
@@ -53,14 +50,8 @@ public abstract class CommonsModule {
@Provides
@Singleton
static ObservableList<Vault> provideVaultList(Settings settings, VaultFactory vaultFactory) {
ObservableList<Vault> list = FXCollections.observableArrayList(Vault::observables);
for (VaultSettings s : settings.getDirectories()) {
Vault v = vaultFactory.get(s);
list.add(v);
}
list.addListener(new VaultListChangeListener(settings.getDirectories()));
return list;
static ObservableList<Vault> provideVaultList(VaultListManager vaultListManager) {
return vaultListManager.getVaultList();
}
@Provides
@@ -10,7 +10,7 @@ import java.util.stream.Collectors;
/**
* This listener makes sure to reflect any changes to the vault list back to the settings.
*/
public class VaultListChangeListener implements ListChangeListener<Vault> {
class VaultListChangeListener implements ListChangeListener<Vault> {
private final ObservableList<VaultSettings> vaultSettingsList;
@@ -8,6 +8,9 @@
*******************************************************************************/
package org.cryptomator.common.vaults;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import org.cryptomator.common.settings.Settings;
import org.cryptomator.common.settings.VaultSettings;
import org.cryptomator.cryptofs.CryptoFileSystemProvider;
import org.cryptomator.cryptofs.migration.Migrators;
@@ -15,25 +18,56 @@ import org.cryptomator.cryptofs.migration.Migrators;
import javax.inject.Inject;
import javax.inject.Singleton;
import java.io.IOException;
import java.nio.file.NoSuchFileException;
import java.nio.file.Path;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
import java.util.Collection;
import java.util.Optional;
import java.util.stream.Collectors;
@Singleton
public class VaultFactory {
public class VaultListManager {
private static final String MASTERKEY_FILENAME = "masterkey.cryptomator"; // TODO: deduplicate constant declared in multiple classes
private final VaultComponent.Builder vaultComponentBuilder;
private final ConcurrentMap<VaultSettings, Vault> vaults = new ConcurrentHashMap<>();
private final ObservableList<Vault> vaultList;
@Inject
public VaultFactory(VaultComponent.Builder vaultComponentBuilder) {
public VaultListManager(VaultComponent.Builder vaultComponentBuilder, Settings settings) {
this.vaultComponentBuilder = vaultComponentBuilder;
this.vaultList = FXCollections.observableArrayList(Vault::observables);
addAll(settings.getDirectories());
vaultList.addListener(new VaultListChangeListener(settings.getDirectories()));
}
public Vault get(VaultSettings vaultSettings) {
return vaults.computeIfAbsent(vaultSettings, this::create);
public ObservableList<Vault> getVaultList() {
return vaultList;
}
public Vault add(Path pathToVault) throws NoSuchFileException {
if (!CryptoFileSystemProvider.containsVault(pathToVault, MASTERKEY_FILENAME)) {
throw new NoSuchFileException(pathToVault.toString(), null, "Not a vault directory");
}
Optional<Vault> alreadyExistingVault = get(pathToVault);
if (alreadyExistingVault.isPresent()) {
return alreadyExistingVault.get();
} else {
VaultSettings vaultSettings = VaultSettings.withRandomId();
vaultSettings.path().set(pathToVault);
Vault newVault = create(vaultSettings);
vaultList.add(newVault);
return newVault;
}
}
private void addAll(Collection<VaultSettings> vaultSettings) {
Collection<Vault> vaults = vaultSettings.stream().map(this::create).collect(Collectors.toList());
vaultList.addAll(vaults);
}
private Optional<Vault> get(Path vaultPath) {
return vaultList.stream().filter(v -> v.getPath().equals(vaultPath)).findAny();
}
private Vault create(VaultSettings vaultSettings) {