diff --git a/main/commons/src/main/java/org/cryptomator/common/WeakValuedCache.java b/main/commons/src/main/java/org/cryptomator/common/WeakValuedCache.java index 0c2030f94..5dfa131bc 100644 --- a/main/commons/src/main/java/org/cryptomator/common/WeakValuedCache.java +++ b/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 { } } + public void forEach(BiConsumer function) { + delegate.asMap().forEach(function); + } + } diff --git a/main/filesystem-crypto/src/main/java/org/cryptomator/filesystem/crypto/CryptoFolder.java b/main/filesystem-crypto/src/main/java/org/cryptomator/filesystem/crypto/CryptoFolder.java index edd494a91..66551b7f3 100644 --- a/main/filesystem-crypto/src/main/java/org/cryptomator/filesystem/crypto/CryptoFolder.java +++ b/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 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