package org.compass.core.lucene.engine; import java.io.IOException; import java.io.Reader; import java.io.StringReader; import java.util.ArrayList; import org.apache.lucene.analysis.Analyzer; import org.apache.lucene.analysis.Token; import org.apache.lucene.analysis.TokenStream; import org.compass.core.CompassToken; import org.compass.core.Resource; import org.compass.core.engine.SearchEngineAnalyzerHelper; import org.compass.core.engine.SearchEngineException; import org.compass.core.lucene.LuceneToken; import org.compass.core.lucene.engine.analyzer.LuceneAnalyzerManager; /** * @author kimchy */ public class LuceneSearchEngineAnalyzerHelper implements SearchEngineAnalyzerHelper { private LuceneAnalyzerManager analyzerManager; private Analyzer analyzer; public LuceneSearchEngineAnalyzerHelper(LuceneSearchEngine searchEngine) { this.analyzerManager = searchEngine.getSearchEngineFactory().getAnalyzerManager(); this.analyzer = analyzerManager.getDefaultAnalyzer(); } public SearchEngineAnalyzerHelper setAnalyzer(String analyzerName) { this.analyzer = analyzerManager.getAnalyzerMustExist(analyzerName); return this; } public SearchEngineAnalyzerHelper setAnalyzer(Resource resource) throws SearchEngineException { this.analyzer = analyzerManager.getAnalyzerByResource(resource); return this; } public SearchEngineAnalyzerHelper setAnalyzerByAlias(String alias) throws SearchEngineException { this.analyzer = analyzerManager.getAnalyzerByAliasMustExists(alias); return this; } public CompassToken analyzeSingle(String text) throws SearchEngineException { CompassToken[] tokens = analyze(text); if (tokens == null || tokens.length == 0) { return null; } return tokens[0]; } public CompassToken[] analyze(String text) { return analyze(new StringReader(text)); } public CompassToken[] analyze(String propertyName, String text) throws SearchEngineException { return analyze(propertyName, new StringReader(text)); } public CompassToken[] analyze(Reader textReader) throws SearchEngineException { return analyze(null, textReader); } public CompassToken[] analyze(String propertyName, Reader textReader) throws SearchEngineException { try { TokenStream tokenStream = analyzer.tokenStream(propertyName, textReader); ArrayList tokenList = new ArrayList(); while (true) { Token token = tokenStream.next(); if (token == null) break; tokenList.add(new LuceneToken(token)); } return (CompassToken[]) tokenList.toArray(new CompassToken[tokenList.size()]); } catch (IOException e) { throw new SearchEngineException("Failed to iterate token stream from analyzer [" + analyzer + "]"); } } }