Selaa lähdekoodia

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

Sebastian Stenzel 9 vuotta sitten
vanhempi
commit
f93d32c6fb

+ 5 - 0
main/commons/src/main/java/org/cryptomator/common/WeakValuedCache.java

@@ -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);
+	}
+
 }

+ 10 - 12
main/filesystem-crypto/src/main/java/org/cryptomator/filesystem/crypto/CryptoFolder.java

@@ -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