package com.netflix.config;
import java.util.Collections;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.common.collect.Maps;
public abstract class DynamicMapProperty<TKEY, TVAL> extends DynamicStringListProperty {
private static final Logger logger = LoggerFactory.getLogger(DynamicMapProperty.class);
private Map<TKEY,TVAL> defaultValuesMap;
private volatile Map<TKEY,TVAL> values;
public DynamicMapProperty(String propName, String defaultValue, String mapEntryDelimiterRegex) {
super(propName, defaultValue, mapEntryDelimiterRegex);
defaultValuesMap = parseMapFromStringList(getDefaultValue());
}
public DynamicMapProperty(String propName, String defaultValue) {
super(propName, defaultValue);
defaultValuesMap = parseMapFromStringList(getDefaultValue());
}
public DynamicMapProperty(String propName, Map<TKEY, TVAL> defaultValue, String mapEntryDelimiterRegex) {
this(propName, (String) null, mapEntryDelimiterRegex);
defaultValuesMap = (defaultValue == null ? null : Collections.unmodifiableMap(Maps.newLinkedHashMap(defaultValue)));
if (defaultValuesMap != null && values.isEmpty()) {
values = defaultValuesMap;
}
}
public DynamicMapProperty(String propName, Map<TKEY, TVAL> defaultValue) {
this(propName, defaultValue, DynamicStringListProperty.DEFAULT_DELIMITER);
}
public Map<TKEY,TVAL> getMap() {
return values;
}
public Map<TKEY,TVAL> getDefaultValueMap() {
return defaultValuesMap;
}
protected void load() {
super.load();
values = parseMapFromStringList(super.get());
}
protected Map<TKEY,TVAL> parseMapFromStringList(List<String> strings) {
if (strings == null || strings.isEmpty()) {
return Collections.emptyMap();
}
Map<TKEY,TVAL> map = new LinkedHashMap<TKEY,TVAL>(strings.size());
for (String s : strings) {
String kv[] = getKeyValue(s);
if (kv.length == 2) {
map.put(getKey(kv[0]), getValue(kv[1]));
} else {
logger.warn("Ignoring illegal key value pair: " + s);
}
}
return Collections.unmodifiableMap(map);
}
protected String[] getKeyValue(String keyValue) {
return keyValue.split("=");
}
protected abstract TKEY getKey(String key);
protected abstract TVAL getValue(String value);
}