01: package org.compass.core.lucene.engine.indexdeletionpolicy;
02:
03: import org.apache.lucene.index.IndexDeletionPolicy;
04: import org.apache.lucene.index.KeepOnlyLastCommitDeletionPolicy;
05: import org.apache.lucene.store.Directory;
06: import org.compass.core.CompassException;
07: import org.compass.core.config.CompassConfigurable;
08: import org.compass.core.config.CompassSettings;
09: import org.compass.core.engine.SearchEngineException;
10: import org.compass.core.lucene.LuceneEnvironment;
11: import org.compass.core.util.ClassUtils;
12:
13: /**
14: * An {@link org.apache.lucene.index.IndexDeletionPolicy} factory.
15: *
16: * @author kimchy
17: */
18: public class IndexDeletionPolicyFactory implements CompassConfigurable {
19:
20: private CompassSettings settings;
21:
22: private String indexDeletionPolicyType;
23:
24: private IndexDeletionPolicy globalIndexDeletionPolicy;
25:
26: public void configure(CompassSettings settings)
27: throws CompassException {
28: this .settings = settings;
29: indexDeletionPolicyType = settings
30: .getSetting(
31: LuceneEnvironment.IndexDeletionPolicy.TYPE,
32: LuceneEnvironment.IndexDeletionPolicy.KeepLastCommit.NAME);
33: if (LuceneEnvironment.IndexDeletionPolicy.KeepLastCommit.NAME
34: .equalsIgnoreCase(indexDeletionPolicyType)) {
35: globalIndexDeletionPolicy = new KeepOnlyLastCommitDeletionPolicy();
36: } else if (LuceneEnvironment.IndexDeletionPolicy.KeepLastN.NAME
37: .equalsIgnoreCase(indexDeletionPolicyType)) {
38: globalIndexDeletionPolicy = new KeepLastNDeletionPolicy();
39: } else if (LuceneEnvironment.IndexDeletionPolicy.KeepAll.NAME
40: .equalsIgnoreCase(indexDeletionPolicyType)) {
41: globalIndexDeletionPolicy = new KeepAllDeletionPolicy();
42: } else if (LuceneEnvironment.IndexDeletionPolicy.KeepNoneOnInit.NAME
43: .equalsIgnoreCase(indexDeletionPolicyType)) {
44: globalIndexDeletionPolicy = new KeepNoneOnInitDeletionPolicy();
45: }
46: if (globalIndexDeletionPolicy != null) {
47: if (globalIndexDeletionPolicy instanceof CompassConfigurable) {
48: ((CompassConfigurable) globalIndexDeletionPolicy)
49: .configure(settings);
50: }
51: }
52: }
53:
54: public IndexDeletionPolicy createIndexDeletionPolicy(Directory dir)
55: throws SearchEngineException {
56: if (globalIndexDeletionPolicy != null) {
57: return globalIndexDeletionPolicy;
58: }
59: if (LuceneEnvironment.IndexDeletionPolicy.ExpirationTime.NAME
60: .equalsIgnoreCase(indexDeletionPolicyType)) {
61: ExpirationTimeDeletionPolicy indexDeletionPolicy = new ExpirationTimeDeletionPolicy();
62: indexDeletionPolicy.setDirectory(dir);
63: indexDeletionPolicy.configure(settings);
64: return indexDeletionPolicy;
65: }
66: try {
67: IndexDeletionPolicy indexDeletionPolicy = (IndexDeletionPolicy) ClassUtils
68: .forName(indexDeletionPolicyType,
69: settings.getClassLoader()).newInstance();
70: if (indexDeletionPolicy instanceof DirectoryConfigurable) {
71: ((DirectoryConfigurable) indexDeletionPolicy)
72: .setDirectory(dir);
73: }
74: if (indexDeletionPolicy instanceof CompassConfigurable) {
75: ((CompassConfigurable) indexDeletionPolicy)
76: .configure(settings);
77: }
78: return indexDeletionPolicy;
79: } catch (Exception e) {
80: throw new SearchEngineException(
81: "Failed to create custom index deletion policy ["
82: + indexDeletionPolicyType + "]", e);
83: }
84: }
85: }
|