package org.compass.core.lucene.engine.indexdeletionpolicy;
import org.apache.lucene.index.IndexDeletionPolicy;
import org.apache.lucene.index.KeepOnlyLastCommitDeletionPolicy;
import org.apache.lucene.store.Directory;
import org.compass.core.CompassException;
import org.compass.core.config.CompassConfigurable;
import org.compass.core.config.CompassSettings;
import org.compass.core.engine.SearchEngineException;
import org.compass.core.lucene.LuceneEnvironment;
import org.compass.core.lucene.engine.manager.LuceneSearchEngineIndexManager;
import org.compass.core.util.ClassUtils;
/**
* An {@link org.apache.lucene.index.IndexDeletionPolicy} factory.
*
* @author kimchy
*/
public class IndexDeletionPolicyFactory implements CompassConfigurable {
private LuceneSearchEngineIndexManager indexManager;
private CompassSettings settings;
private IndexDeletionPolicy globalIndexDeletionPolicy;
public IndexDeletionPolicyFactory(LuceneSearchEngineIndexManager indexManager) {
this.indexManager = indexManager;
}
public void configure(CompassSettings settings) throws CompassException {
this.settings = settings;
}
public IndexDeletionPolicy createIndexDeletionPolicy(Directory dir) throws SearchEngineException {
if (globalIndexDeletionPolicy != null) {
return globalIndexDeletionPolicy;
}
String indexDeletionPolicyType = settings.getSetting(LuceneEnvironment.IndexDeletionPolicy.TYPE, indexManager.getStore().suggestedIndexDeletionPolicy());
if (indexDeletionPolicyType == null) {
indexDeletionPolicyType = LuceneEnvironment.IndexDeletionPolicy.KeepLastCommit.NAME;
}
if (LuceneEnvironment.IndexDeletionPolicy.KeepLastCommit.NAME.equalsIgnoreCase(indexDeletionPolicyType)) {
globalIndexDeletionPolicy = new KeepOnlyLastCommitDeletionPolicy();
} else if (LuceneEnvironment.IndexDeletionPolicy.KeepLastN.NAME.equalsIgnoreCase(indexDeletionPolicyType)) {
globalIndexDeletionPolicy = new KeepLastNDeletionPolicy();
} else if (LuceneEnvironment.IndexDeletionPolicy.KeepAll.NAME.equalsIgnoreCase(indexDeletionPolicyType)) {
globalIndexDeletionPolicy = new KeepAllDeletionPolicy();
} else
if (LuceneEnvironment.IndexDeletionPolicy.KeepNoneOnInit.NAME.equalsIgnoreCase(indexDeletionPolicyType)) {
globalIndexDeletionPolicy = new KeepNoneOnInitDeletionPolicy();
}
if (globalIndexDeletionPolicy != null) {
if (globalIndexDeletionPolicy instanceof CompassConfigurable) {
((CompassConfigurable) globalIndexDeletionPolicy).configure(settings);
}
return globalIndexDeletionPolicy;
}
// index deletion policy that rely on the actual directory
if (LuceneEnvironment.IndexDeletionPolicy.ExpirationTime.NAME.equalsIgnoreCase(indexDeletionPolicyType)) {
ExpirationTimeDeletionPolicy indexDeletionPolicy = new ExpirationTimeDeletionPolicy();
indexDeletionPolicy.setDirectory(dir);
indexDeletionPolicy.configure(settings);
return indexDeletionPolicy;
}
try {
IndexDeletionPolicy indexDeletionPolicy = (IndexDeletionPolicy) ClassUtils.forName(indexDeletionPolicyType, settings.getClassLoader()).newInstance();
if (indexDeletionPolicy instanceof DirectoryConfigurable) {
((DirectoryConfigurable) indexDeletionPolicy).setDirectory(dir);
}
if (indexDeletionPolicy instanceof CompassConfigurable) {
((CompassConfigurable) indexDeletionPolicy).configure(settings);
}
return indexDeletionPolicy;
} catch (Exception e) {
throw new SearchEngineException("Failed to create custom index deletion policy [" + indexDeletionPolicyType + "]", e);
}
}
}