ConfigUtil: Accept collections and maps as attributes

For now we allow them to exist by skipping them during load and store
operations so that it's the caller responsibility to handle store and
load.  Later we could do better, by passing closure and invoking it
from load and store methods.

Change-Id: Id665e48f25767aa06b47857405cc566fc045423c
This commit is contained in:
David Ostrovsky
2015-11-01 09:52:22 +01:00
committed by David Pursehouse
parent a8ba8665a5
commit d287ab744d
2 changed files with 19 additions and 2 deletions

View File

@@ -23,7 +23,9 @@ import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Modifier;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
@@ -281,7 +283,7 @@ public class ConfigUtil {
f.setAccessible(true);
Object c = f.get(s);
Object d = f.get(defaults);
if (!isString(t)) {
if (!isString(t) && !isCollectionOrMap(t)) {
Preconditions.checkNotNull(d, "Default cannot be null for: " + n);
}
if (c == null || c.equals(d)) {
@@ -297,6 +299,9 @@ public class ConfigUtil {
cfg.setBoolean(section, sub, n, (Boolean) c);
} else if (t.isEnum()) {
cfg.setEnum(section, sub, n, (Enum<?>) c);
} else if (isCollectionOrMap(t)) {
// TODO(davido): accept closure passed in from caller
continue;
} else {
throw new ConfigInvalidException("type is unknown: " + t.getName());
}
@@ -337,7 +342,7 @@ public class ConfigUtil {
String n = f.getName();
f.setAccessible(true);
Object d = f.get(defaults);
if (!isString(t)) {
if (!isString(t) && !isCollectionOrMap(t)) {
Preconditions.checkNotNull(d, "Default cannot be null for: " + n);
}
if (isString(t)) {
@@ -357,6 +362,9 @@ public class ConfigUtil {
}
} else if (t.isEnum()) {
f.set(s, cfg.getEnum(section, sub, n, (Enum<?>) d));
} else if (isCollectionOrMap(t)) {
// TODO(davido): accept closure passed in from caller
continue;
} else {
throw new ConfigInvalidException("type is unknown: " + t.getName());
}
@@ -374,6 +382,11 @@ public class ConfigUtil {
return s;
}
private static boolean isCollectionOrMap(Class<?> t) {
return Collection.class.isAssignableFrom(t)
|| Map.class.isAssignableFrom(t);
}
private static boolean skipField(Field field) {
int modifiers = field.getModifiers();
return Modifier.isFinal(modifiers) || Modifier.isTransient(modifiers);

View File

@@ -27,6 +27,8 @@ import com.google.gerrit.extensions.client.Theme;
import org.eclipse.jgit.lib.Config;
import org.junit.Test;
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;
public class ConfigUtilTest {
@@ -50,6 +52,8 @@ public class ConfigUtilTest {
public String nd;
public Theme t;
public Theme td;
public List<String> list;
public Map<String, String> map;
static SectionInfo defaults() {
SectionInfo i = new SectionInfo();
i.i = 1;