From 3446144f9683bec9ad4f32b3f40170afb9fcb69b Mon Sep 17 00:00:00 2001 From: Bernd Eckenfels Date: Fri, 24 May 2024 13:24:47 +0200 Subject: [PATCH] Avoid piling up FileListener during GC This short-cuts getting the URIs for Collected files. DarcBasicTest.testCollectBlobs ensures result is unchanged. --- .../digestarc/DarcFileCollectOperation.java | 29 ++++++++++--------- .../provider/digestarc/DarcFileObject.java | 22 ++++++++++++++ 2 files changed, 37 insertions(+), 14 deletions(-) diff --git a/vfs2provider-digestarc/src/main/java/com/seeburger/vfs2/provider/digestarc/DarcFileCollectOperation.java b/vfs2provider-digestarc/src/main/java/com/seeburger/vfs2/provider/digestarc/DarcFileCollectOperation.java index 3ff1960..32e870e 100644 --- a/vfs2provider-digestarc/src/main/java/com/seeburger/vfs2/provider/digestarc/DarcFileCollectOperation.java +++ b/vfs2provider-digestarc/src/main/java/com/seeburger/vfs2/provider/digestarc/DarcFileCollectOperation.java @@ -48,25 +48,26 @@ public DarcFileCollectOperation(FileObject root) public void process() throws FileSystemException { - if (root instanceof DarcFileObject) + if (!(root instanceof DarcFileObject)) { - DarcFileObject darcFile = (DarcFileObject) root; - FileObject delegateFile = darcFile.getDelegateFile(); + return; + } - filesList.add(delegateFile.getName().getURI()); + final DarcFileObject darcFile = (DarcFileObject) root; + final String uri = darcFile.getDelegateURI(); + filesList.add(uri); - if (darcFile.getType() == FileType.FOLDER) + if (darcFile.getType() == FileType.FOLDER) + { + FileObject[] fileList = darcFile.getChildren(); + for (FileObject nextFile : fileList) { - FileObject[] fileList = darcFile.getChildren(); - for (FileObject nextFile : fileList) + FileOperations fileOperations = nextFile.getFileOperations(); + CollectFilesOperation operation = (CollectFilesOperation) fileOperations.getOperation(CollectFilesOperation.class); + if (operation != null) { - FileOperations fileOperations = nextFile.getFileOperations(); - CollectFilesOperation operation = (CollectFilesOperation) fileOperations.getOperation(CollectFilesOperation.class); - if (operation != null) - { - operation.setFilesList(filesList); - operation.process(); - } + operation.setFilesList(filesList); + operation.process(); } } } diff --git a/vfs2provider-digestarc/src/main/java/com/seeburger/vfs2/provider/digestarc/DarcFileObject.java b/vfs2provider-digestarc/src/main/java/com/seeburger/vfs2/provider/digestarc/DarcFileObject.java index 21b3916..5f0c37b 100644 --- a/vfs2provider-digestarc/src/main/java/com/seeburger/vfs2/provider/digestarc/DarcFileObject.java +++ b/vfs2provider-digestarc/src/main/java/com/seeburger/vfs2/provider/digestarc/DarcFileObject.java @@ -372,6 +372,28 @@ public void fileChanged(FileChangeEvent event) } } + + /** + * Used by DarcFileCollectOperation to get URI of delegate. + *

+ * This is done to avoid listener registration in {@link #getDelegateFile()}. + * + * @throws FileSystemException if lower level miss-behaves + */ + protected String getDelegateURI() throws FileSystemException + { + Entry entry = getEntry(); + String hash = entry.getHash(); + FileObject targetFile = getProvider().resolveFileHash(hash); + if (targetFile != null) + { + /* we could refresh target here */ + return targetFile.getName().getURI(); + } + throw new FileSystemException("Expected file blob with hash=" + hash + " cannot be resolved"); + } + + private BlobStorageProvider getProvider() { return ((DarcFileSystem)getFileSystem()).getBlobProvider();