package org.fastcatsearch.job.plugin;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import org.fastcatsearch.cluster.ClusterUtils;
import org.fastcatsearch.cluster.Node;
import org.fastcatsearch.cluster.NodeJobResult;
import org.fastcatsearch.cluster.NodeService;
import org.fastcatsearch.control.ResultFuture;
import org.fastcatsearch.exception.FastcatSearchException;
import org.fastcatsearch.job.MasterNodeJob;
import org.fastcatsearch.plugin.Plugin;
import org.fastcatsearch.plugin.PluginService;
import org.fastcatsearch.plugin.analysis.AnalysisPlugin;
import org.fastcatsearch.service.ServiceManager;
import org.fastcatsearch.task.IndexFileTransfer;
public class MasterUpdateAllNodeDictionaryJob extends MasterNodeJob {
private static final long serialVersionUID = 1289076529665937727L;
@Override
public JobResult doRun() throws FastcatSearchException {
String pluginId = getStringArgs();
PluginService pluginService = ServiceManager.getInstance().getService(PluginService.class);
Plugin plugin = pluginService.getPlugin(pluginId);
AnalysisPlugin analysisPlugin = null;
if (plugin != null && plugin instanceof AnalysisPlugin) {
analysisPlugin = (AnalysisPlugin) plugin;
}else{
return new JobResult(false);
}
NodeService nodeService = ServiceManager.getInstance().getService(NodeService.class);
List<Node> nodeList = nodeService.getNodeArrayList();
/*
* 1. 사전파일을 보낸다.
* */
List<Node> transferNodeList = new ArrayList<Node>();
IndexFileTransfer indexFileTransfer = new IndexFileTransfer(environment);
for(Node node : nodeList){
if(nodeService.isMyNode(node)){
continue;
}
CheckPluginExistsJob checkPluginExistsJob = new CheckPluginExistsJob();
checkPluginExistsJob.setArgs(pluginId);
ResultFuture resultFuture = nodeService.sendRequest(node, checkPluginExistsJob);
if (resultFuture != null) {
Object result = resultFuture.take();
if(resultFuture.isSuccess() && result != null){
if((Boolean) result){
transferNodeList.add(node);
}
}
}
}
//FIXME:살아있는노드가 1개 (자기자신) 인경우 검사를 하지 않는 방향으로..
//if(transferNodeList.size() == 0){
// return new JobResult(false);
//}
File directory = analysisPlugin.getDictionaryDirectory();
indexFileTransfer.transferDirectory(directory, nodeService, transferNodeList);
/*
* 2. 사전을 업데이트 한다.
* */
UpdateDictionaryJob updateDictionaryJob = new UpdateDictionaryJob();
updateDictionaryJob.setArgs(pluginId);
NodeJobResult[] resultList = ClusterUtils.sendJobToNodeList(updateDictionaryJob, nodeService, nodeList, true);
boolean isSuccess = false;
if(resultList != null){
for(NodeJobResult result : resultList){
if(result.isSuccess()){
if((Boolean) result.result()){
isSuccess = true;
}
}
}
}
return new JobResult(isSuccess);
}
}