/*
* Copyright 2004-2009 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.compass.core.lucene.engine.queryparser;
import java.util.HashMap;
import java.util.Map;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.compass.core.CompassException;
import org.compass.core.config.CompassConfigurable;
import org.compass.core.config.CompassMappingAware;
import org.compass.core.config.CompassSettings;
import org.compass.core.config.ConfigurationException;
import org.compass.core.config.SearchEngineFactoryAware;
import org.compass.core.lucene.LuceneEnvironment;
import org.compass.core.lucene.engine.LuceneSearchEngineFactory;
import org.compass.core.lucene.engine.spellcheck.queryparser.SpellCheckLuceneQueryParser;
import org.compass.core.util.ClassUtils;
/**
* @author kimchy
*/
public class LuceneQueryParserManager implements CompassConfigurable {
private static final Log log = LogFactory.getLog(LuceneQueryParserManager.class);
private HashMap<String, LuceneQueryParser> queryParsers = new HashMap<String, LuceneQueryParser>();
private LuceneSearchEngineFactory searchEngineFactory;
public LuceneQueryParserManager(LuceneSearchEngineFactory searchEngineFactory) {
this.searchEngineFactory = searchEngineFactory;
}
public void configure(CompassSettings settings) throws CompassException {
CompassSettings defaultGroupSettings = null;
Map<String, CompassSettings> queryParserSettingGroups = settings.getSettingGroups(LuceneEnvironment.QueryParser.PREFIX);
for (Map.Entry<String, CompassSettings> entry : queryParserSettingGroups.entrySet()) {
String queryParserName = entry.getKey();
CompassSettings queryParserSettings = entry.getValue();
if (log.isDebugEnabled()) {
log.debug("Building query parser [" + queryParserName + "] with settings " + queryParserSettings);
}
if (queryParserName.equals(LuceneEnvironment.QueryParser.DEFAULT_GROUP)) {
defaultGroupSettings = queryParserSettings;
}
Object queryParserType = queryParserSettings.getSettingAsObject(LuceneEnvironment.QueryParser.TYPE);
if (queryParserType == null) {
if (queryParserName.equals(LuceneEnvironment.QueryParser.DEFAULT_GROUP)) {
// no problem, continue here and we will create the default one ourself using the provided settings
continue;
}
throw new ConfigurationException("Failed to locate query parser [" + queryParserName + "] type, it must be set");
}
LuceneQueryParser queryParser;
if (queryParserType instanceof LuceneQueryParser) {
queryParser = (LuceneQueryParser) queryParserType;
} else {
try {
queryParser = (LuceneQueryParser) ClassUtils.forName((String) queryParserType, settings.getClassLoader()).newInstance();
} catch (Exception e) {
throw new ConfigurationException("Failed to create query parser class [" + queryParserType + "]", e);
}
}
if (queryParser instanceof CompassConfigurable) {
((CompassConfigurable) queryParser).configure(queryParserSettings);
}
if (queryParser instanceof CompassMappingAware) {
((CompassMappingAware) queryParser).setCompassMapping(searchEngineFactory.getMapping());
}
if (queryParser instanceof SearchEngineFactoryAware) {
((SearchEngineFactoryAware) queryParser).setSearchEngineFactory(searchEngineFactory);
}
queryParsers.put(queryParserName, queryParser);
}
if (defaultGroupSettings == null) {
defaultGroupSettings = new CompassSettings(settings.getClassLoader());
}
if (queryParsers.get(LuceneEnvironment.QueryParser.DEFAULT_GROUP) == null) {
if (log.isDebugEnabled()) {
log.debug("No default query parser found (under groupd [default]), registering a default one");
}
DefaultLuceneQueryParser queryParser = new DefaultLuceneQueryParser();
queryParser.configure(defaultGroupSettings);
queryParser.setCompassMapping(searchEngineFactory.getMapping());
queryParser.setSearchEngineFactory(searchEngineFactory);
queryParsers.put(LuceneEnvironment.QueryParser.DEFAULT_GROUP, queryParser);
}
if (searchEngineFactory.getSpellCheckManager() != null) {
if (queryParsers.get(LuceneEnvironment.QueryParser.SPELLCHECK_GROUP) == null) {
if (log.isDebugEnabled()) {
log.debug("No spellcheck query parser found (under groupd [spellcheck]), registering a default one");
}
SpellCheckLuceneQueryParser queryParser = new SpellCheckLuceneQueryParser();
queryParser.configure(defaultGroupSettings);
queryParser.setCompassMapping(searchEngineFactory.getMapping());
queryParser.setSearchEngineFactory(searchEngineFactory);
queryParsers.put(LuceneEnvironment.QueryParser.SPELLCHECK_GROUP, queryParser);
}
}
}
public LuceneQueryParser getDefaultQueryParser() {
return getQueryParser(LuceneEnvironment.QueryParser.DEFAULT_GROUP);
}
public LuceneQueryParser getQueryParser(String queryParserName) throws IllegalArgumentException {
LuceneQueryParser queryParser = queryParsers.get(queryParserName);
if (queryParser == null) {
throw new IllegalArgumentException("No query parser is configured under [" + queryParserName + "]");
}
return queryParser;
}
}