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();