package org.xbib.elasticsearch.action.langdetect;
import org.elasticsearch.action.ActionListener;
import org.elasticsearch.action.support.ActionFilters;
import org.elasticsearch.action.support.TransportAction;
import org.elasticsearch.cluster.metadata.IndexNameExpressionResolver;
import org.elasticsearch.common.inject.Inject;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.threadpool.ThreadPool;
import org.elasticsearch.transport.TransportService;
import org.xbib.elasticsearch.common.langdetect.LangdetectService;
import org.xbib.elasticsearch.common.langdetect.Language;
import org.xbib.elasticsearch.common.langdetect.LanguageDetectionException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
*
*/
public class TransportLangdetectAction extends TransportAction<LangdetectRequest, LangdetectResponse> {
private static final Map<String, LangdetectService> services = new HashMap<>();
@Inject
public TransportLangdetectAction(Settings settings, ThreadPool threadPool,
ActionFilters actionFilters,
IndexNameExpressionResolver indexNameExpressionResolver,
TransportService transportService) {
super(settings, LangdetectAction.NAME, threadPool, actionFilters, indexNameExpressionResolver, transportService.getTaskManager());
services.put("", new LangdetectService(settings));
}
@Override
protected void doExecute(LangdetectRequest request, ActionListener<LangdetectResponse> listener) {
String profile = request.getProfile();
if (profile == null) {
profile = "";
}
if (!services.containsKey(profile)) {
services.put(profile, new LangdetectService(settings, profile));
}
// detectAll() is not thread-safe
synchronized (services) {
try {
List<Language> langs = services.get(profile).detectAll(request.getText());
listener.onResponse(new LangdetectResponse().setLanguages(langs).setProfile(request.getProfile()));
} catch (LanguageDetectionException e) {
listener.onFailure(e);
}
}
}
}