package com.embracesource.config; import java.io.IOException; import java.io.StringReader; import java.util.Enumeration; import java.util.List; import java.util.Map; import java.util.Properties; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.CopyOnWriteArrayList; import org.apache.commons.lang.ObjectUtils; import org.apache.commons.lang.StringUtils; /** * 动态配置文件辅助类 * @author june * */ public class DynamicPropertiesHelper { private ConcurrentHashMap<String, String> properties = new ConcurrentHashMap<String, String>(); private ConcurrentHashMap<String, List<PropertyChangeListener>> propListeners = new ConcurrentHashMap<String, List<PropertyChangeListener>>(); public DynamicPropertiesHelper(String initValue) { Properties props = parse(initValue); for (Map.Entry<Object, Object> propEn : props.entrySet()) this.properties.put((String) propEn.getKey(), (String) propEn.getValue()); } private Properties parse(String value) { Properties props = new Properties(); if (!StringUtils.isEmpty(value)) try { props.load(new StringReader(value)); } catch (IOException localIOException) { } return props; } public synchronized void refresh(String propertiesAsStr) { Properties props = parse(propertiesAsStr); for (Map.Entry<Object, Object> propEn : props.entrySet()) setValue((String) propEn.getKey(), (String) propEn.getValue()); } private void setValue(String key, String newValue) { String oldValue = (String) this.properties.get(key); this.properties.put(key, newValue); if (!ObjectUtils.equals(oldValue, newValue)) firePropertyChanged(key, oldValue, newValue); } public boolean containsProperty(String key) { return this.properties.containsKey(key); } public String getProperty(String key) { return (String) this.properties.get(key); } public String getProperty(String key,String defaultValue) { if(!containsProperty(key)||this.properties.get(key)==null){ return defaultValue; } return (String) this.properties.get(key); } public Boolean getBooleanProperty(String key,Boolean defaultValue) { if(!containsProperty(key)||this.properties.get(key)==null){ return defaultValue; } return Boolean.valueOf((String) this.properties.get(key)); } public Integer getIntProperty(String key,Integer defaultValue) { Integer retValue=defaultValue; try { retValue=Integer.parseInt((String) this.properties.get(key)); } catch (NumberFormatException e) { } return retValue; } public Long getLongProperty(String key,Long defaultValue) { Long retValue=defaultValue; try { retValue=Long.parseLong((String) this.properties.get(key)); } catch (NumberFormatException e) { } return retValue; } public Double getDoubleProperty(String key,Double defaultValue) { Double retValue=defaultValue; try { retValue=Double.parseDouble((String) this.properties.get(key)); } catch (NumberFormatException e) { } return retValue; } public Enumeration<String> getPropertyKeys() { return this.properties.keys(); } /** * * @param key listener名字 * @param listener */ public void registerListener(String key, PropertyChangeListener listener) { List<PropertyChangeListener> listeners = new CopyOnWriteArrayList<PropertyChangeListener>(); List<PropertyChangeListener> old = this.propListeners.putIfAbsent(key, listeners); if (old != null) { listeners = old; } listeners.add(listener); } private void firePropertyChanged(String key, String oldValue, String newValue) { List<PropertyChangeListener> listeners = (List<PropertyChangeListener>) this.propListeners.get(key); if ((listeners == null) || (listeners.size() == 0)) { return; } for (PropertyChangeListener listener : listeners) listener.propertyChanged(oldValue, newValue); } public static abstract interface PropertyChangeListener { public abstract void propertyChanged(String paramString1, String paramString2); } }