package cn.hmsoft.frame.module;

import cn.hmsoft.frame.data.model.FrameModule;
import cn.hmsoft.log.LogHelper;

/**************************
 * 模块化组件加载基础类，所有模块必须实现该类
 * 
 * @author zxq
 * @create 2018-05-10 12:58:38
 * @version 5.0.0
 * @email: revisit@126.com
 * @Company: www.hmsoft.cn
 */
public abstract class FrameModuleConfig {

	private String module_name;
	private String module_version;
	protected FrameModule module;

	/******************
	 * 模块名称
	 */
	public String getModule_name() {
		return this.module_name;
	}

	/******************
	 * 模块版本
	 */
	public String getModule_version() {
		return this.module_version;
	}

	/******************
	 * 模块的配置文件
	 */
	public FrameModule getModule() {
		return this.module;
	}

	/***********************
	 * 必须设置模块名称
	 */
	public abstract String setModule_name();

	/***********************
	 * 必须设置模块版本
	 */
	public abstract String setModule_version();

	/************************
	 * 加载一个模块
	 */
	public boolean load(FrameModule module) {
		// 准备参数信息
		module.prepareParamMap();
		this.module = module;
		this.module_name = this.setModule_name();
		this.module_version = this.setModule_version();

		if (!module.getModule_name().equalsIgnoreCase(this.getModule_name())) {
			LogHelper.warn("frame module [" + module.getModule_name() + "] load error：module name not valid");
			return false;
		}
		if (!module.getModule_version().equalsIgnoreCase(this.getModule_version())) {
			LogHelper.warn("frame module [" + module.getModule_name() + "] load error：module version not valid");
			return false;
		}

		try {
			return this.start();
		} catch (Exception e) {
			LogHelper.error(e);
			LogHelper.warn("frame module [" + module.getModule_name() + "] load error：unknow reason");
		}
		return false;
	}

	/***********************
	 * 启动模块
	 */
	protected abstract boolean start() throws Exception;

	/***********************
	 * 停止模块
	 */
	protected abstract boolean stop() throws Exception;

	/**************************
	 * 重启模块
	 */
	protected boolean reload() throws Exception {
		if (this.stop())
			return this.start();
		return false;

	}
	
	protected boolean restart() throws Exception {
		return true;
	}
}
