package com.asura.framework.conf.subscribe;

import com.asura.framework.base.util.Check;
import com.asura.framework.base.util.PropertiesUtil;
import com.asura.framework.conf.common.CommonConstant;
import com.netflix.config.DynamicPropertyFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.Iterator;
import java.util.Map;

/**
 * <p>初始化文件</p>
 *
 * <PRE>
 * <BR>	修改记录
 * <BR>-----------------------------------------------
 * <BR>	修改日期			修改人			修改内容
 * </PRE>
 *
 * @author sunzhenlei
 * @version 1.0
 * @date 2016/9/16 15:45
 * @since 1.0
 */
public class InitFileProperties {

    private final static Logger LOGGER = LoggerFactory.getLogger(InitFileProperties.class);

    private static InitFileProperties initFileProperties;

    private InitFileProperties() {
        init();
    }

    public static synchronized InitFileProperties getInstance() {
        if (null != initFileProperties) return initFileProperties;
        initFileProperties = new InitFileProperties();
        return initFileProperties;
    }

    public void init() {
        String applicationName = DynamicPropertyFactory.getInstance().getStringProperty(CommonConstant.CONFIG_APPLICATION_NAME_KEY, null).get();
        String propertiesNames = DynamicPropertyFactory.getInstance().getStringProperty(CommonConstant.PROPERTIES_RESOURCES_NAME_KEY, null).get();

        if (Check.NuNObj(propertiesNames)) {
            return;
        }

        String[] propertiesNamesArr = propertiesNames.split(",");

        PropertiesUtil propertiesUtil = new PropertiesUtil(propertiesNamesArr);

        Iterator<Map.Entry<Object, Object>> allProperties = propertiesUtil.getAllProperties();

        if (Check.NuNObj(allProperties)) {
            return;
        }

        while (allProperties.hasNext()) {
            Map.Entry<Object, Object> objectEntry = allProperties.next();
            String key = (String) objectEntry.getKey();

            // 配置文件的key默认加上系统名称变量
            if (!Check.NuNStr(applicationName)) {
                key = applicationName + "." + key;
            }

            // 判断System中是否存在相应属性,如存在将不处理
            if (!Check.NuNObj(System.getProperty(key))) {
                continue;
            }

            // 注册ZK监听
            try {
                ConfigSubscriber.getInstance().registConfig(key, objectEntry.getValue());
            } catch (Exception e) {
                LOGGER.error("注册配置文件的属性到ZK监听异常。key:{},error:{}", key, e);
            }
        }
    }
}