summaryrefslogtreecommitdiffstats
path: root/config-lib
diff options
context:
space:
mode:
authorgjoranv <gv@yahoo-inc.com>2017-06-14 13:20:53 +0200
committergjoranv <gv@yahoo-inc.com>2017-06-14 13:20:53 +0200
commit227a660e992f073ae0d42cd84b37e3faad7d2d72 (patch)
tree75271b7f7226b4239d32f22789a77ad159fe86cc /config-lib
parent49bcf09e8923723d19276f75288ebbb7b91842b1 (diff)
Use builder to instantiate default node.
Diffstat (limited to 'config-lib')
-rw-r--r--config-lib/src/main/java/com/yahoo/config/InnerNodeVector.java18
1 files changed, 15 insertions, 3 deletions
diff --git a/config-lib/src/main/java/com/yahoo/config/InnerNodeVector.java b/config-lib/src/main/java/com/yahoo/config/InnerNodeVector.java
index eec2d3cd500..9380af9e273 100644
--- a/config-lib/src/main/java/com/yahoo/config/InnerNodeVector.java
+++ b/config-lib/src/main/java/com/yahoo/config/InnerNodeVector.java
@@ -3,6 +3,7 @@ package com.yahoo.config;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
+import java.util.Arrays;
import java.util.List;
/**
@@ -40,9 +41,20 @@ public class InnerNodeVector<NODE extends InnerNode> extends NodeVector<NODE> {
@SuppressWarnings("unchecked")
protected NODE createNew() {
try {
- Constructor<? extends InnerNode> ctor = defaultNode.getClass().getDeclaredConstructor();
- ctor.setAccessible(true);
- return (NODE) ctor.newInstance();
+ Class<? extends InnerNode> nodeClass = defaultNode.getClass();
+ Class<?> builderClass = Arrays.stream(nodeClass.getClasses())
+ .filter(klass -> klass.getSimpleName().equals("Builder"))
+ .findFirst()
+ .orElseThrow(() -> new ConfigurationRuntimeException("Could not find builder class for " + nodeClass.getName()));
+
+ Constructor<?> builderCtor = builderClass.getConstructor();
+ Object builderInstance = builderCtor.newInstance();
+ if (! (builderInstance instanceof ConfigBuilder))
+ throw new ConfigurationRuntimeException("Builder is not a ConfigBuilder, has class: " + builderInstance.getClass().getName());
+
+ Constructor<? extends InnerNode> nodeCtor = nodeClass.getDeclaredConstructor(builderClass, boolean.class);
+ nodeCtor.setAccessible(true);
+ return (NODE) nodeCtor.newInstance(builderInstance, false);
} catch (InvocationTargetException | IllegalAccessException | InstantiationException | NoSuchMethodException e) {
throw new ConfigurationRuntimeException(e);
}