
/**
 * 
 */
package org.tio.sitexxx;

import org.tio.sitexxx.service.init.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.tio.sitexxx.im.server.TioSiteImServerStarter;
import org.tio.sitexxx.im.server.handler.wx.WxChatQueueApi;
import org.tio.sitexxx.service.ip2region.Ip2RegionInit;
import org.tio.sitexxx.service.service.base.SensitiveWordsService;
import org.tio.sitexxx.service.utils.LogUtils;
import org.tio.sitexxx.view.WebViewStarter;
import org.tio.sitexxx.view.http.WebViewInit;
import org.tio.sitexxx.server.init.WebApiInit;
import org.tio.utils.quartz.QuartzUtils;

/**
 * @author tanyaowu
 *
 */
public class Starter {
	private static final Logger log = LoggerFactory.getLogger(Starter.class);

	/**
	 * 基本的初始化，一般用于单元小测试
	 */
	public static void initBase() {
		PropInit.init();
		LogUtils.logJvmStartTime(PropInit.class.getName() + ".init()");
		// redis初始化，里面会有topic等的初始化
		RedisInit.init(true);
		LogUtils.logJvmStartTime(RedisInit.class.getName() + ".init()");

		// ip2region初始化
		Ip2RegionInit.init();
		LogUtils.logJvmStartTime(Ip2RegionInit.class.getName() + ".init()");

		// 敏感词初始化
		SensitiveWordsService.init();
		LogUtils.logJvmStartTime(SensitiveWordsService.class.getName() + ".init()");

		// Json配置初始化
		JsonInit.init();
		LogUtils.logJvmStartTime(JsonInit.class.getName() + ".init()");

		// jfinal 初始化
		JFInit.init();
		LogUtils.logJvmStartTime(JFInit.class.getName() + ".init()");

		// 缓存初始化
		CacheInit.init(true);
		LogUtils.logJvmStartTime(CacheInit.class.getName() + ".init()");

	}

	/**
	 * @param args
	 * @author tanyaowu
	 */
	public static void main(String[] args) {
		try {
			initBase();
			LogUtils.logJvmStartTime(Starter.class.getName() + ".initBase()");

			org.tio.sitexxx.server.init.TopicInit.init();
			LogUtils.logJvmStartTime(org.tio.sitexxx.server.init.TopicInit.class.getName() + ".init()");

			// 加载头像数据
			if (org.tio.sitexxx.service.vo.Const.IS_START_IM) {
				//先启动聊天服务器
				TioSiteImServerStarter.initImServer();
				LogUtils.logJvmStartTime(TioSiteImServerStarter.class.getName() + ".initImServer()");
				//队列初始化
				WxChatQueueApi.wxQueueInit();
				LogUtils.logJvmStartTime(WxChatQueueApi.class.getName() + ".wxQueueInit()");
			}

			// 启动Api服务器
			WebApiInit.init();
			LogUtils.logJvmStartTime(WebApiInit.class.getName() + ".init()");

			if (org.tio.sitexxx.service.vo.Const.IS_START_IM) {
				org.tio.sitexxx.im.server.init.TopicInit.init();
				LogUtils.logJvmStartTime(org.tio.sitexxx.im.server.init.TopicInit.class.getName() + ".init()");
			}

			//启动View服务器
			if (org.tio.sitexxx.service.vo.Const.IS_START_VIEW) {
				org.tio.sitexxx.view.init.TopicInit.init();
				LogUtils.logJvmStartTime(org.tio.sitexxx.view.init.TopicInit.class.getName() + ".init()");
				WebViewStarter.initView(args);
				WebViewInit.httpServerStarter.getTioServerConfig().share(WebApiInit.httpServerStarter.getTioServerConfig());
				LogUtils.logJvmStartTime(WebViewStarter.class.getName() + ".initView()");
			}

			//启动定时任务
			QuartzUtils.start();
			LogUtils.logJvmStartTime(QuartzUtils.class.getName() + ".start()");
		} catch (Throwable e) {
			log.error("", e);
			System.exit(1);
		}
	}
}
