未验证 提交 c61a80a8 编写于 作者: J Jason Song 提交者: GitHub

Merge pull request #1356 from nobodyiam/type-property

Add getProperty with transform function
package com.ctrip.framework.apollo;
import com.google.common.base.Function;
import java.util.Date;
import java.util.Locale;
import java.util.Set;
......@@ -182,4 +184,15 @@ public interface Config {
* @return the property names
*/
public Set<String> getPropertyNames();
/**
* Return the user-defined property value with the given key, or {@code defaultValue} if the key doesn't exist.
*
* @param key the property name
* @param function the transform {@link Function}. from String to user-defined type
* @param defaultValue the default value when key is not found or any error occurred
* @param <T> user-defined type
* @return the property value
*/
public <T> T getProperty(String key, Function<String, T> function, T defaultValue);
}
......@@ -64,10 +64,10 @@ public abstract class AbstractConfig implements Config {
}
public AbstractConfig() {
m_configUtil = ApolloInjector.getInstance(ConfigUtil.class);
m_configVersion = new AtomicLong();
m_arrayCache = Maps.newConcurrentMap();
allCaches = Lists.newArrayList();
m_configUtil = ApolloInjector.getInstance(ConfigUtil.class);
m_configVersion = new AtomicLong();
m_arrayCache = Maps.newConcurrentMap();
allCaches = Lists.newArrayList();
}
@Override
......@@ -349,6 +349,23 @@ public abstract class AbstractConfig implements Config {
return defaultValue;
}
@Override
public <T> T getProperty(String key, Function<String, T> function, T defaultValue) {
try {
String value = getProperty(key, null);
if (value != null) {
return function.apply(value);
}
} catch (Throwable ex) {
Tracer.logError(new ApolloConfigException(
String.format("getProperty for %s failed, return default value %s", key,
defaultValue), ex));
}
return defaultValue;
}
private <T> T getValueFromCache(String key, Function<String, T> parser, Cache<String, T> cache, T defaultValue) {
T result = cache.getIfPresent(key);
......
......@@ -17,8 +17,12 @@ import java.util.Map;
import java.util.Properties;
import java.util.Set;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.TimeUnit;
import com.google.common.base.Function;
import com.google.common.base.Splitter;
import com.google.common.collect.Lists;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
......@@ -734,6 +738,36 @@ public class DefaultConfigTest {
assertEquals(Collections.emptySet(), propertyNames);
}
@Test
public void testGetPropertyWithFunction() throws Exception {
String someKey = "someKey";
String someValue = "a,b,c";
String someNullKey = "someNullKey";
//set up config repo
someProperties = new Properties();
someProperties.setProperty(someKey, someValue);
when(configRepository.getConfig()).thenReturn(someProperties);
DefaultConfig defaultConfig =
new DefaultConfig(someNamespace, configRepository);
assertEquals(defaultConfig.getProperty(someKey, new Function<String, List<String>>() {
@Override
public List<String> apply(String s) {
return Splitter.on(",").trimResults().omitEmptyStrings().splitToList(s);
}
}, Lists.<String>newArrayList()), Lists.newArrayList("a", "b", "c"));
assertEquals(defaultConfig.getProperty(someNullKey, new Function<String, List<String>>() {
@Override
public List<String> apply(String s) {
return Splitter.on(",").trimResults().omitEmptyStrings().splitToList(s);
}
}, Lists.<String>newArrayList()), Lists.newArrayList());
}
private void checkDatePropertyWithFormat(Config config, Date expected, String propertyName, String format, Date
defaultValue) {
assertEquals(expected, config.getDateProperty(propertyName, format, defaultValue));
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册