package org.fastcatsearch.http.action.management.dictionary;
import java.io.Writer;
import java.sql.SQLException;
import java.util.List;
import org.fastcatsearch.db.InternalDBModule.MapperSession;
import org.fastcatsearch.db.dao.DictionaryDAO;
import org.fastcatsearch.db.mapper.DictionaryMapper;
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.plugin.Plugin;
import org.fastcatsearch.plugin.PluginService;
import org.fastcatsearch.plugin.analysis.AnalysisPlugin;
import org.fastcatsearch.plugin.analysis.AnalysisPluginSetting.ColumnSetting;
import org.fastcatsearch.service.ServiceManager;
import org.fastcatsearch.util.ResponseWriter;
@ActionMapping(value = "/management/dictionary/reset-data", authority = ActionAuthority.Dictionary, authorityLevel = ActionAuthorityLevel.WRITABLE)
public class ResetDictionaryDataAction extends AuthAction {
@Override
public void doAuthAction(ActionRequest request, ActionResponse response) throws Exception {
/**
* 맵사전 재구축, http post 로 받아오는 데이터를 기반으로 사전 재구축 기존데이터는 삭제하고 입력.
*
* TODO:만약 사전데이터가 아주 크다면 Stream 형식을 고려 하도록 한다. FIXME:맵사전에 한해 스키마가 바뀌지 않는다고 가정, 하드코딩 함.
*/
int status = 1;
Writer writer = response.getWriter();
ResponseWriter resultWriter = getDefaultResponseWriter(writer);
String pluginId = request.getParameter("pluginId", ""); // plugin
String dictionaryId = request.getParameter("dictionaryId", ""); // brand, maker....
String dataStr = request.getParameter("values", "");
String[] dataArray = dataStr.split("\n");
PluginService pluginService = ServiceManager.getInstance().getService(PluginService.class);
Plugin plugin = pluginService.getPlugin(pluginId);
@SuppressWarnings("rawtypes")
AnalysisPlugin analysisPlugin = (AnalysisPlugin) plugin;
MapperSession<DictionaryMapper> mapperSession = null;
try {
DictionaryDAO dictionaryDAO = analysisPlugin.getDictionaryDAO(dictionaryId);
List<ColumnSetting> columnSettingList = dictionaryDAO.columnSettingList();
String[] columns = new String[columnSettingList.size()];
for (int colInx = 0; colInx < columnSettingList.size(); colInx++) {
ColumnSetting columnSetting = columnSettingList.get(colInx);
columns[colInx] = columnSetting.getName().toUpperCase();
}
String tableName = dictionaryDAO.getTableName();
mapperSession = dictionaryDAO.openMapperSession();
mapperSession.getMapper().truncate(tableName);
for (int recordInx = 0; recordInx < dataArray.length; recordInx++) {
String recordStr = dataArray[recordInx];
String[] record = recordStr.split("\t");
String[] values = new String[columns.length];
System.arraycopy(record, 0, values, 0, record.length);
logger.trace("put entry data table:{}, columns:{}, values:{}", tableName, columns, values);
mapperSession.getMapper().putEntry(tableName, columns, values);
}
mapperSession.commit();
analysisPlugin.dictionaryStatusDAO().updateUpdateTime(dictionaryId);
status = 0;
} catch (SQLException e) {
status = 1;
logger.error("", e);
} finally {
if (mapperSession != null) {
if (status == 0) {
mapperSession.commit();
} else {
mapperSession.rollback();
}
mapperSession.closeSession();
}
}
resultWriter.object().key("status").value(status).key("success").value(status == 0).endObject();
resultWriter.done();
}
}