faster directory moving (no recursive iteration on filesystem needed any longer)

This commit is contained in:
Sebastian Stenzel
2016-02-17 12:05:16 +01:00
parent a909095a1c
commit f93d32c6fb
2 changed files with 15 additions and 12 deletions

View File

@@ -1,6 +1,7 @@
package org.cryptomator.common;
import java.util.concurrent.ExecutionException;
import java.util.function.BiConsumer;
import java.util.function.Function;
import com.google.common.cache.CacheBuilder;
@@ -40,4 +41,8 @@ public class WeakValuedCache<Key, Value> {
}
}
public void forEach(BiConsumer<Key, Value> function) {
delegate.asMap().forEach(function);
}
}

View File

@@ -13,8 +13,6 @@ import static java.nio.charset.StandardCharsets.UTF_8;
import java.io.FileNotFoundException;
import java.io.UncheckedIOException;
import java.nio.file.FileAlreadyExistsException;
import java.util.Collection;
import java.util.HashSet;
import java.util.Optional;
import java.util.UUID;
import java.util.concurrent.atomic.AtomicReference;
@@ -27,7 +25,6 @@ import org.cryptomator.common.WeakValuedCache;
import org.cryptomator.crypto.engine.Cryptor;
import org.cryptomator.filesystem.Deleter;
import org.cryptomator.filesystem.File;
import org.cryptomator.filesystem.FileSystemVisitor;
import org.cryptomator.filesystem.Folder;
import org.cryptomator.filesystem.Node;
import org.cryptomator.io.FileContents;
@@ -142,7 +139,7 @@ class CryptoFolder extends CryptoNode implements Folder {
throw new IllegalStateException("Newly created folder, that didn't exist before, already had an directoryId.");
}
if (parent.file(name).exists()) {
throw new UncheckedIOException(new FileAlreadyExistsException(toString()));
throw new UncheckedIOException(new FileAlreadyExistsException(parent.file(name).toString()));
}
FileContents.UTF_8.writeContents(dirFile, directoryId.get());
dir.create();
@@ -167,10 +164,6 @@ class CryptoFolder extends CryptoNode implements Folder {
target.parent().get().create();
target.delete();
// determine subFolder as long as we can still browse our current hierarchy:
Collection<Folder> subFolders = new HashSet<>();
FileSystemVisitor.fileSystemVisitor().beforeFolder(subFolders::add).visit(this);
// perform the actual move:
final File dirFile = forceGetPhysicalFile();
final String dirId = getDirectoryId().get();
@@ -180,10 +173,8 @@ class CryptoFolder extends CryptoNode implements Folder {
}
dirFile.moveTo(target.forceGetPhysicalFile());
// invalidate the directory id of any directory beneath the _old_ location:
subFolders.stream().filter(CryptoFolder.class::isInstance).map(CryptoFolder.class::cast).forEach(folder -> {
folder.directoryId.set(null);
});
// cut all ties:
this.invalidateDirectoryIdsRecursively();
assert!exists();
assert target.exists();
@@ -198,7 +189,14 @@ class CryptoFolder extends CryptoNode implements Folder {
Deleter.deleteContent(this);
forceGetPhysicalFolder().delete();
forceGetPhysicalFile().delete();
invalidateDirectoryIdsRecursively();
}
private void invalidateDirectoryIdsRecursively() {
directoryId.set(null);
folders.forEach((name, folder) -> {
folder.invalidateDirectoryIdsRecursively();
});
}
@Override