package org.xbib.elasticsearch.index.analysis.combo;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.util.Version;
import org.elasticsearch.ElasticsearchIllegalArgumentException;
import org.elasticsearch.common.inject.Injector;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.index.analysis.AnalysisService;
import org.elasticsearch.index.analysis.NamedAnalyzer;
import java.io.Reader;
import java.util.ArrayList;
public final class ComboAnalyzerWrapper extends Analyzer {
public static final String NAME = "combo";
private final Injector injector;
private final Settings settings;
private final Version version;
private final String name;
private ComboAnalyzer analyzer;
public ComboAnalyzerWrapper(Version version, String name, Settings settings, Injector injector) {
this.name = name;
// Store parameters for lazy usage
// See ComboAnalyzerProvider comments to learn why
this.injector = injector;
this.settings = settings;
this.version = version;
this.analyzer = null; // must be lazy initialized to get free of the cyclic dependency on AnalysisService
}
/**
* Read settings and load the appropriate sub-analyzers.
*/
synchronized
protected void init() {
if (analyzer != null) {
return;
}
AnalysisService analysisService = injector.getInstance(AnalysisService.class);
String[] sub = settings.getAsArray("sub_analyzers");
ArrayList<Analyzer> subAnalyzers = new ArrayList<Analyzer>();
if (sub == null) {
throw new ElasticsearchIllegalArgumentException("Analyzer [" + name + "] analyzer of type [" + NAME + "], must have a \"sub_analyzers\" list property");
}
for (String subname : sub) {
NamedAnalyzer analyzer = analysisService.analyzer(subname);
if (analyzer != null) {
subAnalyzers.add(analyzer);
}
}
this.analyzer = new ComboAnalyzer(version, subAnalyzers.toArray(new Analyzer[subAnalyzers.size()]));
Boolean tokenstreamCaching = settings.getAsBoolean("tokenstream_caching", null);
if (tokenstreamCaching != null) {
this.analyzer.setTokenStreamCachingEnabled(tokenstreamCaching);
}
Boolean deduplication = settings.getAsBoolean("deduplication", null);
if (deduplication != null) {
this.analyzer.setDeduplicationEnabled(deduplication);
}
}
@Override
protected TokenStreamComponents createComponents(String fieldName, Reader reader) {
if (analyzer == null) {
init();
}
return this.analyzer.createComponents(fieldName, reader);
}
@Override
public void close() {
if (analyzer != null) {
this.analyzer.close();
}
super.close();
}
}