001: /*
002: * Copyright 2004-2006 the original author or authors.
003: *
004: * Licensed under the Apache License, Version 2.0 (the "License");
005: * you may not use this file except in compliance with the License.
006: * You may obtain a copy of the License at
007: *
008: * http://www.apache.org/licenses/LICENSE-2.0
009: *
010: * Unless required by applicable law or agreed to in writing, software
011: * distributed under the License is distributed on an "AS IS" BASIS,
012: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013: * See the License for the specific language governing permissions and
014: * limitations under the License.
015: */
016:
017: package org.compass.core.lucene.engine;
018:
019: import org.apache.commons.logging.Log;
020: import org.apache.commons.logging.LogFactory;
021: import org.compass.core.ResourceFactory;
022: import org.compass.core.config.CompassConfigurable;
023: import org.compass.core.config.CompassSettings;
024: import org.compass.core.config.RuntimeCompassSettings;
025: import org.compass.core.engine.SearchEngine;
026: import org.compass.core.engine.SearchEngineException;
027: import org.compass.core.engine.SearchEngineIndexManager;
028: import org.compass.core.engine.SearchEngineOptimizer;
029: import org.compass.core.engine.event.SearchEngineEventManager;
030: import org.compass.core.engine.naming.PropertyNamingStrategy;
031: import org.compass.core.engine.spellcheck.SearchEngineSpellCheckManager;
032: import org.compass.core.engine.spi.InternalSearchEngineFactory;
033: import org.compass.core.executor.ExecutorManager;
034: import org.compass.core.lucene.LuceneEnvironment;
035: import org.compass.core.lucene.LuceneResourceFactory;
036: import org.compass.core.lucene.engine.analyzer.LuceneAnalyzerManager;
037: import org.compass.core.lucene.engine.highlighter.LuceneHighlighterManager;
038: import org.compass.core.lucene.engine.indexdeletionpolicy.IndexDeletionPolicyFactory;
039: import org.compass.core.lucene.engine.manager.DefaultLuceneSearchEngineIndexManager;
040: import org.compass.core.lucene.engine.manager.LuceneSearchEngineIndexManager;
041: import org.compass.core.lucene.engine.optimizer.LuceneSearchEngineOptimizerManager;
042: import org.compass.core.lucene.engine.queryparser.LuceneQueryParserManager;
043: import org.compass.core.lucene.engine.spellcheck.DefaultLuceneSpellCheckManager;
044: import org.compass.core.lucene.engine.spellcheck.InternalLuceneSearchEngineSpellCheckManager;
045: import org.compass.core.lucene.engine.store.DefaultLuceneSearchEngineStore;
046: import org.compass.core.lucene.engine.store.LuceneSearchEngineStore;
047: import org.compass.core.mapping.CompassMapping;
048: import org.compass.core.transaction.context.TransactionContext;
049: import org.compass.core.util.ClassUtils;
050:
051: /**
052: * @author kimchy
053: */
054: public class LuceneSearchEngineFactory implements
055: InternalSearchEngineFactory {
056:
057: private static final Log log = LogFactory
058: .getLog(LuceneSearchEngineFactory.class);
059:
060: private CompassMapping mapping;
061:
062: private PropertyNamingStrategy propertyNamingStrategy;
063:
064: private LuceneSettings luceneSettings;
065:
066: private ResourceFactory resourceFactory;
067:
068: private SearchEngineOptimizer searchEngineOptimizer;
069:
070: private InternalLuceneSearchEngineSpellCheckManager spellCheckManager;
071:
072: private LuceneSearchEngineIndexManager indexManager;
073:
074: private ExecutorManager executorManager;
075:
076: private TransactionContext transactionContext;
077:
078: private LuceneAnalyzerManager analyzerManager;
079:
080: private LuceneHighlighterManager highlighterManager;
081:
082: private LuceneQueryParserManager queryParserManager;
083:
084: private IndexDeletionPolicyFactory indexDeletionPolicyManager;
085:
086: private CompassSettings settings;
087:
088: private SearchEngineEventManager eventManager = new SearchEngineEventManager();
089:
090: public LuceneSearchEngineFactory(
091: PropertyNamingStrategy propertyNamingStrategy,
092: CompassSettings settings, CompassMapping mapping,
093: ExecutorManager executorManager) {
094: this .propertyNamingStrategy = propertyNamingStrategy;
095: this .mapping = mapping;
096: this .executorManager = executorManager;
097: this .settings = settings;
098: this .luceneSettings = new LuceneSettings();
099: luceneSettings.configure(settings);
100: configure(settings, mapping);
101: }
102:
103: public void close() throws SearchEngineException {
104: if (spellCheckManager != null) {
105: spellCheckManager.close();
106: }
107: indexManager.close();
108: }
109:
110: public SearchEngine openSearchEngine(
111: RuntimeCompassSettings runtimeSettings) {
112: return new LuceneSearchEngine(runtimeSettings, this );
113: }
114:
115: public TransactionContext getTransactionContext() {
116: return transactionContext;
117: }
118:
119: public ExecutorManager getExecutorManager() {
120: return this .executorManager;
121: }
122:
123: public void setTransactionContext(
124: TransactionContext transactionContext) {
125: this .transactionContext = transactionContext;
126: }
127:
128: private void configure(CompassSettings settings,
129: CompassMapping mapping) {
130: resourceFactory = new LuceneResourceFactory(this );
131:
132: // build the analyzers
133: analyzerManager = new LuceneAnalyzerManager();
134: analyzerManager.configure(settings, mapping, luceneSettings);
135:
136: // build the index deletion policy manager
137: indexDeletionPolicyManager = new IndexDeletionPolicyFactory();
138: indexDeletionPolicyManager.configure(settings);
139:
140: // build the search engine store
141: LuceneSearchEngineStore searchEngineStore = new DefaultLuceneSearchEngineStore();
142: searchEngineStore.configure(this , settings, mapping);
143: indexManager = new DefaultLuceneSearchEngineIndexManager(this ,
144: searchEngineStore);
145:
146: try {
147: ClassUtils.forName(
148: "org.apache.lucene.search.highlight.Highlighter",
149: settings.getClassLoader());
150: highlighterManager = new LuceneHighlighterManager();
151: highlighterManager.configure(settings);
152: } catch (ClassNotFoundException e1) {
153: log
154: .info("Not using highlighter - no highlighter jar included.");
155: }
156:
157: searchEngineOptimizer = new LuceneSearchEngineOptimizerManager(
158: this );
159: ((CompassConfigurable) searchEngineOptimizer)
160: .configure(settings);
161:
162: if (settings.getSettingAsBoolean(
163: LuceneEnvironment.SpellCheck.ENABLE, false)) {
164: try {
165: ClassUtils.forName(
166: "org.apache.lucene.search.spell.SpellChecker",
167: settings.getClassLoader());
168: spellCheckManager = new DefaultLuceneSpellCheckManager();
169: spellCheckManager.configure(this , settings, mapping);
170: } catch (ClassNotFoundException e) {
171: if (log.isWarnEnabled()) {
172: log
173: .warn("No spell checker jar file found in classpath, disabling spell checker");
174: }
175: }
176: }
177:
178: // build the query parsers
179: queryParserManager = new LuceneQueryParserManager(this );
180: queryParserManager.configure(settings);
181: }
182:
183: public void start() {
184: searchEngineOptimizer.start();
185: indexManager.start();
186: if (spellCheckManager != null) {
187: spellCheckManager.start();
188: }
189: }
190:
191: public void stop() {
192: searchEngineOptimizer.stop();
193: indexManager.stop();
194: if (spellCheckManager != null) {
195: spellCheckManager.stop();
196: }
197: }
198:
199: public ResourceFactory getResourceFactory() {
200: return this .resourceFactory;
201: }
202:
203: public String getAliasProperty() {
204: return luceneSettings.getAliasProperty();
205: }
206:
207: public String getExtendedAliasProperty() {
208: return luceneSettings.getExtendedAliasProperty();
209: }
210:
211: public String getAllProperty() {
212: return luceneSettings.getAllProperty();
213: }
214:
215: public CompassMapping getMapping() {
216: return this .mapping;
217: }
218:
219: public PropertyNamingStrategy getPropertyNamingStrategy() {
220: return propertyNamingStrategy;
221: }
222:
223: public SearchEngineOptimizer getOptimizer() {
224: return searchEngineOptimizer;
225: }
226:
227: public SearchEngineSpellCheckManager getSpellCheckManager() {
228: return this .spellCheckManager;
229: }
230:
231: public SearchEngineIndexManager getIndexManager() {
232: return indexManager;
233: }
234:
235: public LuceneSearchEngineIndexManager getLuceneIndexManager() {
236: return this .indexManager;
237: }
238:
239: public LuceneSettings getLuceneSettings() {
240: return luceneSettings;
241: }
242:
243: public CompassSettings getSettings() {
244: return settings;
245: }
246:
247: public LuceneAnalyzerManager getAnalyzerManager() {
248: return analyzerManager;
249: }
250:
251: public SearchEngineEventManager getEventManager() {
252: return this .eventManager;
253: }
254:
255: public LuceneHighlighterManager getHighlighterManager()
256: throws SearchEngineException {
257: if (highlighterManager == null) {
258: throw new SearchEngineException(
259: "Trying to use highlighter, but no highlighter jar included");
260: }
261: return highlighterManager;
262: }
263:
264: public LuceneQueryParserManager getQueryParserManager() {
265: return this .queryParserManager;
266: }
267:
268: public IndexDeletionPolicyFactory getIndexDeletionPolicyManager() {
269: return indexDeletionPolicyManager;
270: }
271: }
|