in entity-store/src/main/java/jetbrains/exodus/entitystore/FileSystemBlobVaultOld.java [354:424]
public BackupStrategy getBackupStrategy() {
return new BackupStrategy() {
@Override
public Iterable<VirtualFileDescriptor> getContents() {
return () -> {
final Deque<FileDescriptor> queue = new LinkedList<>();
queue.add(new FileDescriptor(location.toFile(), blobsDirectory + File.separator));
return new Iterator<VirtualFileDescriptor>() {
int i = 0;
int n = 0;
File[] files;
FileDescriptor next;
String currentPrefix;
@Override
public boolean hasNext() {
if (next != null) {
return true;
}
while (i < n) {
final File file = files[i++];
final String name = file.getName();
if (file.isDirectory()) {
queue.push(new FileDescriptor(file, currentPrefix + file.getName() + File.separator));
} else if (file.isFile()) {
final long fileSize = file.length();
if (fileSize == 0) continue;
if (name.endsWith(blobExtension)) {
next = new FileDescriptor(file, currentPrefix, fileSize);
return true;
} else if (name.equalsIgnoreCase(VERSION_FILE)) {
next = new FileDescriptor(file, currentPrefix, fileSize, false);
return true;
}
} else if (file.exists()) {
// something strange with filesystem
throw new EntityStoreException("File or directory expected: " + file);
}
}
if (queue.isEmpty()) {
return false;
}
final FileDescriptor fd = queue.pop();
files = IOUtil.listFiles(fd.getFile());
currentPrefix = fd.getPath();
i = 0;
n = files.length;
next = fd;
return true;
}
@Override
public FileDescriptor next() {
if (!hasNext()) {
throw new NoSuchElementException();
}
final FileDescriptor result = next;
next = null;
return result;
}
@Override
public void remove() {
throw new UnsupportedOperationException();
}
};
};
}
};
}