public static class IndexBackup {
private SnapshotDeletionPolicy snapshotDeletionPolicy;
private File backupFolder;
private IndexCommit indexCommit;
public IndexBackup(final SnapshotDeletionPolicy snapshotDeletionPolicy,
final File backupFolder) {
this.snapshotDeletionPolicy = snapshotDeletionPolicy;
this.backupFolder = backupFolder;
}
public boolean willBackupFromNowOn() {
try {
this.indexCommit = (IndexCommit) this.snapshotDeletionPolicy
.snapshot();
return indexCommit != null;
} catch (final Exception e) {
return false;
}
}
public boolean backup() throws IOException {
if (this.indexCommit == null)
return false;
try {
final File indexFolder = ((FSDirectory) this.indexCommit
.getDirectory()).getFile();
final String[] filesToBackup = indexFolder
.list(new FilterFilesToBackup(
IndexBackup.this.indexCommit.getFileNames()));
for (String fileToBackup : filesToBackup) {
FileUtils.copyFileToDirectory(new File(indexFolder,
fileToBackup), this.backupFolder, true);
}
return true;
} finally {
this.snapshotDeletionPolicy.release();
}
}
private class FilterFilesToBackup implements FilenameFilter {
private Collection filesToNotBackup;
private FilterFilesToBackup(final Collection filesToNotBackup) {
this.filesToNotBackup = filesToNotBackup;
}
public boolean accept(final File dir, final String name) {
if (name.equals("segments.gen") || name.equals("write.lock"))
return false;
else
return !this.filesToNotBackup.contains(name);
}
}
}