// Index optimieren
try {
setIndexMode(WRITING_MODE);
mIndexWriter.optimize();
} catch (IOException exc) {
throw new RegainException("Finishing IndexWriter failed", exc);
}
// Prefetch destinct field values
String[] prefetchFields = mConfig.getValuePrefetchFields();
if (prefetchFields != null && prefetchFields.length != 0) {
String msg = "Prefetching destinct field values for: ";
for (int i = 0; i < prefetchFields.length; i++) {
msg += (i != 0 ? ", " : "") + prefetchFields[i];
}
mLog.info(msg);
setIndexMode(READING_MODE);
RegainToolkit.readFieldValues(mIndexReader, prefetchFields, mTempIndexDir);
}
// Prepare the final 'breakpoint'
// NOTE: This will set the ALL_CLOSED_MODE
prepareBreakpoint();
// Ressourcen der DocumentFactory freigeben
mDocumentFactory.close();
// Write all terms in the index into a file
if (mAnalysisDir != null) {
File termFile = new File(mAnalysisDir.getAbsolutePath() + File.separator + "AllTerms.txt");
writeTermFile(mTempIndexDir, termFile);
}
// Verzeichnis bestimmen, in das der Index kommen soll
File targetDir;
if (putIntoQuarantine) {
targetDir = mQuarantineIndexDir;
} else {
targetDir = mNewIndexDir;
}
// If there is already the target directory -> delete it
deleteOldIndex(targetDir);
// Let the new index become the working index
// Workaround: Siehe Javadoc von RENAME_TIMEOUT
long deadline = System.currentTimeMillis() + RENAME_TIMEOUT;
boolean renameSucceed = false;
while ((!renameSucceed) && (System.currentTimeMillis() < deadline)) {
renameSucceed = mTempIndexDir.renameTo(targetDir);
try {
Thread.sleep(100);
} catch (Exception exc) {
}
}
if (renameSucceed) {
// Delete the last breakpoint if there should be one
deleteOldIndex(mBreakpointIndexDir);
} else {
throw new RegainException("Renaming " + mTempIndexDir + " to " + targetDir + " failed after " + (RENAME_TIMEOUT / 1000) + " seconds!");
}
}