Commit c61a80a8 authored by Jason Song's avatar Jason Song Committed by GitHub

Merge pull request #1356 from nobodyiam/type-property

Add getProperty with transform function
parents 0118f1fa 2edacbac
package com.ctrip.framework.apollo; package com.ctrip.framework.apollo;
import com.google.common.base.Function;
import java.util.Date; import java.util.Date;
import java.util.Locale; import java.util.Locale;
import java.util.Set; import java.util.Set;
...@@ -182,4 +184,15 @@ public interface Config { ...@@ -182,4 +184,15 @@ public interface Config {
* @return the property names * @return the property names
*/ */
public Set<String> getPropertyNames(); 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 { ...@@ -64,10 +64,10 @@ public abstract class AbstractConfig implements Config {
} }
public AbstractConfig() { public AbstractConfig() {
m_configUtil = ApolloInjector.getInstance(ConfigUtil.class); m_configUtil = ApolloInjector.getInstance(ConfigUtil.class);
m_configVersion = new AtomicLong(); m_configVersion = new AtomicLong();
m_arrayCache = Maps.newConcurrentMap(); m_arrayCache = Maps.newConcurrentMap();
allCaches = Lists.newArrayList(); allCaches = Lists.newArrayList();
} }
@Override @Override
...@@ -349,6 +349,23 @@ public abstract class AbstractConfig implements Config { ...@@ -349,6 +349,23 @@ public abstract class AbstractConfig implements Config {
return defaultValue; 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) { private <T> T getValueFromCache(String key, Function<String, T> parser, Cache<String, T> cache, T defaultValue) {
T result = cache.getIfPresent(key); T result = cache.getIfPresent(key);
......
...@@ -17,8 +17,12 @@ import java.util.Map; ...@@ -17,8 +17,12 @@ import java.util.Map;
import java.util.Properties; import java.util.Properties;
import java.util.Set; import java.util.Set;
import java.util.Collections; import java.util.Collections;
import java.util.List;
import java.util.concurrent.TimeUnit; 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.After;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
...@@ -734,6 +738,36 @@ public class DefaultConfigTest { ...@@ -734,6 +738,36 @@ public class DefaultConfigTest {
assertEquals(Collections.emptySet(), propertyNames); 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 private void checkDatePropertyWithFormat(Config config, Date expected, String propertyName, String format, Date
defaultValue) { defaultValue) {
assertEquals(expected, config.getDateProperty(propertyName, format, defaultValue)); assertEquals(expected, config.getDateProperty(propertyName, format, defaultValue));
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment