package org.fastcatsearch.http.action.management.dictionary;
import java.io.IOException;
import java.io.Writer;
import java.util.ArrayList;
import java.util.List;
import org.fastcatsearch.cluster.ClusterUtils;
import org.fastcatsearch.cluster.Node;
import org.fastcatsearch.cluster.NodeService;
import org.fastcatsearch.control.JobExecutor;
import org.fastcatsearch.control.JobService;
import org.fastcatsearch.control.ResultFuture;
import org.fastcatsearch.http.ActionAuthority;
import org.fastcatsearch.http.ActionAuthorityLevel;
import org.fastcatsearch.http.ActionMapping;
import org.fastcatsearch.http.action.ActionRequest;
import org.fastcatsearch.http.action.ActionResponse;
import org.fastcatsearch.http.action.AuthAction;
import org.fastcatsearch.job.plugin.MasterUpdateAllNodeDictionaryJob;
import org.fastcatsearch.plugin.Plugin;
import org.fastcatsearch.plugin.PluginService;
import org.fastcatsearch.plugin.analysis.AnalysisPlugin;
import org.fastcatsearch.plugin.analysis.AnalysisPluginSetting;
import org.fastcatsearch.service.ServiceManager;
import org.fastcatsearch.util.ResponseWriter;
@ActionMapping(value="/management/dictionary/apply", authority=ActionAuthority.Dictionary, authorityLevel=ActionAuthorityLevel.WRITABLE)
public class ApplyDictionaryAction extends AuthAction {
@Override
public void doAuthAction(ActionRequest request, ActionResponse response) throws Exception {
String pluginId = request.getParameter("pluginId");
String dictionaryId = request.getParameter("dictionaryId");
PluginService pluginService = ServiceManager.getInstance().getService(PluginService.class);
Plugin plugin = pluginService.getPlugin(pluginId);
AnalysisPlugin analysisPlugin = (AnalysisPlugin) plugin;
AnalysisPluginSetting analysisPluginSetting = analysisPlugin.getPluginSetting();
String[] dictionaryIdList = dictionaryId.split(",");
List<String> successList = new ArrayList<String>();
List<Integer> successCountList = new ArrayList<Integer>();
List<String> failList = new ArrayList<String>();
for (int i = 0; i < dictionaryIdList.length; i++) {
logger.info("# Compile dictionary {}", dictionaryIdList[i]);
long st = System.nanoTime();
try{
//컴파일.
int count = analysisPlugin.compileDictionaryFromDAO(dictionaryIdList[i]);
successList.add(dictionaryIdList[i]);
successCountList.add(count);
logger.info("# Compile {} dictionary {} : {} Done! {}ms", pluginId, dictionaryIdList[i], count, (System.nanoTime() - st) / (1000 * 1000));
}catch(IOException e){
failList.add(dictionaryIdList[i]);
logger.error("# Compile {} dictionary {} Fail! {}ms", pluginId, dictionaryIdList[i], (System.nanoTime() - st) / (1000 * 1000), e);
}
}
/*
* 0. db 사전상태 업데이트
* */
for (int i = 0; i < successList.size(); i++) {
String id = successList.get(i);
int applyEntrySize = successCountList.get(i);
analysisPlugin.dictionaryStatusDAO().updateApplyStatus(id, applyEntrySize);
}
if(successList.size() > 0){
//1. 로컬 사전리로드
// analysisPlugin.reloadDictionary();
//2. 타 서버 전파 및 리로드 요청.
//해당 plugin의 모든 파일을 전송하고 업데이트 한다.
MasterUpdateAllNodeDictionaryJob updateDictionaryJob = new MasterUpdateAllNodeDictionaryJob();
updateDictionaryJob.setArgs(pluginId);
ResultFuture resultFuture = JobService.getInstance().offer(updateDictionaryJob);
resultFuture.take();
}
Writer writer = response.getWriter();
ResponseWriter resultWriter = getDefaultResponseWriter(writer);
resultWriter.object().key("success").value(failList.size() == 0 && successList.size() > 0);
resultWriter.key("successList").array();
for(String id : successList){
resultWriter.value(id);
}
resultWriter.endArray();
resultWriter.key("failList").array();
for(String id : failList){
resultWriter.value(id);
}
resultWriter.endArray();
resultWriter.endObject();
resultWriter.done();
}
}