package db.restore; import java.io.File; import java.util.HashMap; import java.util.Map; import org.apache.logging.log4j.Level; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.util.Assert; import db.DBBackupRecord; import db.DBOperatorEvent; import db.DBRestore; import db.DBRestoreBeanHandler; import db.OpertProcessListener; import kernel.util.StringUtils; public abstract class AbstractRestoreImpl implements DBRestore, DBRestoreBeanHandler { /** * logger */ protected final Logger logger = LoggerFactory.getLogger(this.getClass()); /** * 事件通知 */ protected DBOperatorEvent operatorEvent; /** * 备份文件后缀 * @return 备份文件后缀名 */ protected abstract String getBackupFileSuffix(); @Override public boolean restore(File file, Map params, OpertProcessListener processListener) { if (params == null) { params = new HashMap(); } params = parserMapParams(params); // 解析参数 boolean result = false; try { if (doEnvironmentCheck(file, params, processListener)) { result = doResotre(file, params, processListener); // 执行还原操作 } } catch (Throwable e) { result = false; logger.error("restore database error", e); throw new RuntimeException(e); } finally { if (processListener != null) { processListener.onExit(); } clearAfterRestore(file, params); // 还原后清理 } String msg = "Finished - " + (result ? "Successfully" : "Failed"); onOutputAndLog(processListener, msg, (result ? Level.INFO : Level.ERROR)); params.put("result", result); // 结果 // operatorEvent.afterRestore(file, params); return result; } /** * 还原清理工作(清除临时目录、临时文件等操作 * @param file 备份文件 * @param params 参数 */ protected void clearAfterRestore(File file, Map params) { // default do nothing } @Override public boolean restore(String filePath, Map params, OpertProcessListener processListener) { return restore(new File(filePath), params, processListener); } @Override public boolean restore(DBBackupRecord record, Map params, OpertProcessListener processListener) { Assert.isTrue(record != null && record.getFilePath() != null); return restore(new File(record.getFilePath()), params, processListener); } /** *

Description: 解析参数

*

Create Time: 2013-2-7

* @author weiminghua * @param params 参数 * @return 参数 */ protected abstract Map parserMapParams(Map params); /** * 运行环境检测 * @param file 待还原的文件 * @param params 参数 * @param processListener 监听器 * @return 结果 */ protected boolean doEnvironmentCheck(File file, Map params, OpertProcessListener processListener) { Assert.isTrue(params != null && file != null); // TODO:doEnvironmentCheck if (!file.exists()) { logger.error("restore database failed for file[" + file.getPath() + "] not exists"); return false; } String suffix = getBackupFileSuffix(); if (-1 == file.getPath().indexOf(suffix)) { logger.error("The file[" + file.getPath() + "] not end of [" + suffix + "]"); return false; } return true; } /** * 执行备份 * @param file 待还原的文件 * @param params 参数 * @param processListener 监听器 * @return 结果 */ protected abstract boolean doResotre(File file, Map params, OpertProcessListener processListener); /** * @param operatorEvent The operatorEvent to set. */ public void setOperatorEvent(DBOperatorEvent operatorEvent) { this.operatorEvent = operatorEvent; } /** * 输出监听,同时添加日志信息 * @param processListener 过程监听 * @param msg 日志信息 * @param log4jLevel 日志级别 */ protected void onOutputAndLog(OpertProcessListener processListener, String msg, Level log4jLevel) { if (StringUtils.isNullOrEmpty(msg)) { return; } if (processListener != null) { // 不支持中断 if (processListener.getOutputListener() != null) { processListener.getOutputListener().onOutput(msg); } } if (log4jLevel == null) { try { Thread.sleep(200); // 延迟加载信息 } catch (InterruptedException e) { // ignore } return; } // 输出日志信息 if (Level.ERROR.equals(log4jLevel)) { logger.error(msg); } else if (Level.WARN.equals(log4jLevel)) { logger.warn(msg); } else if (Level.INFO.equals(log4jLevel)) { logger.info(msg); } else if (Level.DEBUG.equals(log4jLevel)) { logger.debug(msg); } } }