// Path: xxl-conf-core/src/main/java/com/xxl/conf/core/XxlConfClient.java
// public class XxlConfClient {
// 
// 	public static String get(String key, String defaultVal) {
// 		return XxlConfLocalCacheConf.get(key, defaultVal);
// 	}
// 
// 	/**
// 	 * get conf (string)
// 	 *
// 	 * @param key
// 	 * @return
// 	 */
// 	public static String get(String key) {
// 		return get(key, null);
// 	}
// 
// 	/**
// 	 * get conf (boolean)
// 	 *
// 	 * @param key
// 	 * @return
// 	 */
// 	public static boolean getBoolean(String key) {
// 		String value = get(key, null);
// 		if (value == null) {
// 			throw new XxlConfException("config key [" + key + "] does not exist");
// 		}
// 		return Boolean.valueOf(value);
// 	}
// 
// 	/**
// 	 * get conf (short)
// 	 *
// 	 * @param key
// 	 * @return
// 	 */
// 	public static short getShort(String key) {
// 		String value = get(key, null);
// 		if (value == null) {
// 			throw new XxlConfException("config key [" + key + "] does not exist");
// 		}
// 		return Short.valueOf(value);
// 	}
// 
// 	/**
// 	 * get conf (int)
// 	 *
// 	 * @param key
// 	 * @return
// 	 */
// 	public static int getInt(String key) {
// 		String value = get(key, null);
// 		if (value == null) {
// 			throw new XxlConfException("config key [" + key + "] does not exist");
// 		}
// 		return Integer.valueOf(value);
// 	}
// 
// 	/**
// 	 * get conf (long)
// 	 *
// 	 * @param key
// 	 * @return
// 	 */
// 	public static long getLong(String key) {
// 		String value = get(key, null);
// 		if (value == null) {
// 			throw new XxlConfException("config key [" + key + "] does not exist");
// 		}
// 		return Long.valueOf(value);
// 	}
// 
// 	/**
// 	 * get conf (float)
// 	 *
// 	 * @param key
// 	 * @return
// 	 */
// 	public static float getFloat(String key) {
// 		String value = get(key, null);
// 		if (value == null) {
// 			throw new XxlConfException("config key [" + key + "] does not exist");
// 		}
// 		return Float.valueOf(value);
// 	}
// 
// 	/**
// 	 * get conf (double)
// 	 *
// 	 * @param key
// 	 * @return
// 	 */
// 	public static double getDouble(String key) {
// 		String value = get(key, null);
// 		if (value == null) {
// 			throw new XxlConfException("config key [" + key + "] does not exist");
// 		}
// 		return Double.valueOf(value);
// 	}
// 
// 	/**
// 	 * add listener with xxl conf change
// 	 *
// 	 * @param key
// 	 * @param xxlConfListener
// 	 * @return
// 	 */
// 	public static boolean addListener(String key, XxlConfListener xxlConfListener){
// 		return XxlConfListenerFactory.addListener(key, xxlConfListener);
// 	}
// 	
// }


import com.xxl.conf.core.XxlConfClient;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.ConcurrentHashMap;
package com.xxl.conf.core.listener;



/**
 * xxl conf listener
 *
 * @author xuxueli 2018-02-04 01:27:30
 */
public class XxlConfListenerFactory {
    private static Logger logger = LoggerFactory.getLogger(XxlConfListenerFactory.class);

    /**
     * xxl conf listener repository
     */
    private static ConcurrentHashMap<String, List<XxlConfListener>> keyListenerRepository = new ConcurrentHashMap<>();
    private static List<XxlConfListener> noKeyConfListener = Collections.synchronizedList(new ArrayList<XxlConfListener>());

    /**
     * add listener and first invoke + watch
     *
     * @param key   empty will listener all key
     * @param xxlConfListener
     * @return
     */
    public static boolean addListener(String key, XxlConfListener xxlConfListener){
        if (xxlConfListener == null) {
            return false;
        }
        if (key==null || key.trim().length()==0) {
            // listene all key used
            noKeyConfListener.add(xxlConfListener);
            return true;
        } else {

            // first use, invoke and watch this key
            try {
// Path: xxl-conf-core/src/main/java/com/xxl/conf/core/XxlConfClient.java
// public class XxlConfClient {
// 
// 	public static String get(String key, String defaultVal) {
// 		return XxlConfLocalCacheConf.get(key, defaultVal);
// 	}
// 
// 	/**
// 	 * get conf (string)
// 	 *
// 	 * @param key
// 	 * @return
// 	 */
// 	public static String get(String key) {
// 		return get(key, null);
// 	}
// 
// 	/**
// 	 * get conf (boolean)
// 	 *
// 	 * @param key
// 	 * @return
// 	 */
// 	public static boolean getBoolean(String key) {
// 		String value = get(key, null);
// 		if (value == null) {
// 			throw new XxlConfException("config key [" + key + "] does not exist");
// 		}
// 		return Boolean.valueOf(value);
// 	}
// 
// 	/**
// 	 * get conf (short)
// 	 *
// 	 * @param key
// 	 * @return
// 	 */
// 	public static short getShort(String key) {
// 		String value = get(key, null);
// 		if (value == null) {
// 			throw new XxlConfException("config key [" + key + "] does not exist");
// 		}
// 		return Short.valueOf(value);
// 	}
// 
// 	/**
// 	 * get conf (int)
// 	 *
// 	 * @param key
// 	 * @return
// 	 */
// 	public static int getInt(String key) {
// 		String value = get(key, null);
// 		if (value == null) {
// 			throw new XxlConfException("config key [" + key + "] does not exist");
// 		}
// 		return Integer.valueOf(value);
// 	}
// 
// 	/**
// 	 * get conf (long)
// 	 *
// 	 * @param key
// 	 * @return
// 	 */
// 	public static long getLong(String key) {
// 		String value = get(key, null);
// 		if (value == null) {
// 			throw new XxlConfException("config key [" + key + "] does not exist");
// 		}
// 		return Long.valueOf(value);
// 	}
// 
// 	/**
// 	 * get conf (float)
// 	 *
// 	 * @param key
// 	 * @return
// 	 */
// 	public static float getFloat(String key) {
// 		String value = get(key, null);
// 		if (value == null) {
// 			throw new XxlConfException("config key [" + key + "] does not exist");
// 		}
// 		return Float.valueOf(value);
// 	}
// 
// 	/**
// 	 * get conf (double)
// 	 *
// 	 * @param key
// 	 * @return
// 	 */
// 	public static double getDouble(String key) {
// 		String value = get(key, null);
// 		if (value == null) {
// 			throw new XxlConfException("config key [" + key + "] does not exist");
// 		}
// 		return Double.valueOf(value);
// 	}
// 
// 	/**
// 	 * add listener with xxl conf change
// 	 *
// 	 * @param key
// 	 * @param xxlConfListener
// 	 * @return
// 	 */
// 	public static boolean addListener(String key, XxlConfListener xxlConfListener){
// 		return XxlConfListenerFactory.addListener(key, xxlConfListener);
// 	}
// 	
// }


// Path: xxl-conf-core/src/main/java/com/xxl/conf/core/listener/XxlConfListenerFactory.java
import com.xxl.conf.core.XxlConfClient;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.ConcurrentHashMap;

package com.xxl.conf.core.listener;



/**
 * xxl conf listener
 *
 * @author xuxueli 2018-02-04 01:27:30
 */
public class XxlConfListenerFactory {
    private static Logger logger = LoggerFactory.getLogger(XxlConfListenerFactory.class);

    /**
     * xxl conf listener repository
     */
    private static ConcurrentHashMap<String, List<XxlConfListener>> keyListenerRepository = new ConcurrentHashMap<>();
    private static List<XxlConfListener> noKeyConfListener = Collections.synchronizedList(new ArrayList<XxlConfListener>());

    /**
     * add listener and first invoke + watch
     *
     * @param key   empty will listener all key
     * @param xxlConfListener
     * @return
     */
    public static boolean addListener(String key, XxlConfListener xxlConfListener){
        if (xxlConfListener == null) {
            return false;
        }
        if (key==null || key.trim().length()==0) {
            // listene all key used
            noKeyConfListener.add(xxlConfListener);
            return true;
        } else {

            // first use, invoke and watch this key
            try {
                String value = XxlConfClient.get(key);