package org.fastcatsearch.job.plugin; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.io.Writer; import java.util.List; import java.util.Map; import org.apache.commons.io.FileUtils; import org.fastcatsearch.db.dao.DictionaryDAO; import org.fastcatsearch.exception.FastcatSearchException; import org.fastcatsearch.job.Job; 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.plugin.analysis.AnalysisPluginSetting.ColumnSetting; import org.fastcatsearch.plugin.analysis.AnalysisPluginSetting.DictionarySetting; import org.fastcatsearch.service.ServiceManager; public class BackupDictionaryJob extends Job { private static final long serialVersionUID = 4891838956215820136L; //FIXME:HardCoding.. private static final int BACKUP_SIZE = 3; @Override public JobResult doRun() throws FastcatSearchException { String pluginId = (String)getArgs(); PluginService pluginService = ServiceManager.getInstance().getService(PluginService.class); Plugin plugin = pluginService.getPlugin(pluginId); @SuppressWarnings("rawtypes") AnalysisPlugin analysisPlugin = (AnalysisPlugin) plugin; File baseDir = analysisPlugin.getDictionaryDirectory(); File backupDir = new File(baseDir, "backup"); if(!backupDir.exists()) { try { FileUtils.forceMkdir(backupDir); } catch (IOException e) { } } File tmpDir = null; try { tmpDir = File.createTempFile("dict_backup", ""); tmpDir.delete(); tmpDir.mkdir(); AnalysisPluginSetting analysisPluginSetting = (AnalysisPluginSetting) plugin.getPluginSetting(); List<DictionarySetting> dictionaryList = analysisPluginSetting.getDictionarySettingList(); if(dictionaryList != null){ for(DictionarySetting dictionary : dictionaryList){ String dictionaryId = dictionary.getId(); logger.debug("backup dictionary {}.{}", new Object[] {pluginId, dictionaryId}); DictionaryDAO dictionaryDAO = analysisPlugin.getDictionaryDAO(dictionaryId); if(dictionaryDAO!=null) { downloadFile(dictionaryDAO, tmpDir, pluginId, dictionaryId); } } } for(int inx=BACKUP_SIZE;inx >=1; inx--) { File oldBackup = new File(backupDir, String.valueOf(inx)); if(inx==BACKUP_SIZE) { if(oldBackup.exists()) { //오래된 백업은 지운다. FileUtils.forceDelete(oldBackup); } } else { if(oldBackup.exists()) { File toBackup = new File(backupDir, String.valueOf(inx+1)); FileUtils.moveDirectory(oldBackup, toBackup); } } if(inx==1) { FileUtils.moveDirectory(tmpDir, oldBackup); } } return new JobResult(true); } catch (Exception e) { logger.error("",e); if(tmpDir!=null) try { FileUtils.forceDelete(tmpDir); } catch (IOException e2) { } return new JobResult(e); } } public void downloadFile(DictionaryDAO dictionaryDAO, File backupDir, String pluginId, String dictionaryId) { File tmpFile = null; Writer writer = null; try { tmpFile = new File(backupDir, dictionaryId+".txt"); writer = new FileWriter(tmpFile); int length = dictionaryDAO.getCount(null,null); List<Map<String, Object>> list = dictionaryDAO.getEntryList(1, length, null, null, true); List<ColumnSetting> columnSettingList = dictionaryDAO.columnSettingList(); if(columnSettingList != null){ for(Map<String, Object> vo : list){ for(int i = 0 ;i < columnSettingList.size(); i++){ ColumnSetting columnSetting = columnSettingList.get(i); String name = columnSetting.getName().toUpperCase(); writer.append(String.valueOf(vo.get(name))); if(i<columnSettingList.size() - 1) { writer.append("\t"); } } writer.append("\n"); } } logger.debug("done"); } catch (Exception e) { logger.error("",e); } finally { try { writer.close(); } catch (IOException e) { } } } }