Do not create a config instance with the default ctor.
(actually, a separate instance was created, just to get the class)
+ Remove unused method.
@@ -11,6 +11,7 @@ import com.yahoo.vespa.config.buildergen.ConfigDefinition;
import com.yahoo.yolean.Exceptions;
import com.yahoo.vespa.config.*;
+import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.List;
@@ -46,13 +47,19 @@ class InstanceResolver {
* @param targetDef the def to use
* @return the config instance or null of no producer for this found in model
*/
+ @SuppressWarnings("unchecked")
static ConfigInstance resolveToInstance(ConfigKey<?> key, ConfigBuilder builder, InnerCNode targetDef) {
- ConfigDefinitionKey defKey = new ConfigDefinitionKey(key);
try {
if (targetDef != null) applyDef(builder, targetDef);
- ConfigInstance instance = getInstance(defKey, builder.getClass().getClassLoader());
- Class<? extends ConfigInstance> clazz = instance.getClass();
- return clazz.getConstructor(new Class<?>[]{builder.getClass()}).newInstance(builder);
+ Class<?> clazz = builder.getClass().getEnclosingClass();
+ if (!(ConfigInstance.class.isAssignableFrom(clazz))) {
+ throw new ConfigurationRuntimeException("Cannot produce config for the name '" + key.getName() + ", as "
+ + clazz.getName() + " is not a ConfigInstance.");
+ }
+ Class<? extends ConfigInstance> configClass = (Class<? extends ConfigInstance>)clazz;
+ Constructor<? extends ConfigInstance> constructor = configClass.getDeclaredConstructor(builder.getClass(), boolean.class);
+ constructor.setAccessible(true);
+ return constructor.newInstance(builder, /*throwIfUninitialized*/ false);
} catch (Exception e) {
throw new ConfigurationRuntimeException(e);
}
@@ -143,51 +150,6 @@ class InstanceResolver {
}
}
- /**
- * Create a ConfigBuilder given a definition key and a payload
- * @param key The key to use to create the correct builder.
- * @param payload The payload to populate the builder with.
- * @return A ConfigBuilder initialized with payload.
- */
- static ConfigBuilder createBuilderFromPayload(ConfigDefinitionKey key, VespaModel model, ConfigPayload payload, ConfigDefinition targetDef) {
- ConfigBuilder builderInstance = model.createBuilder(key, targetDef);
- if (builderInstance == null || builderInstance instanceof GenericConfig.GenericConfigBuilder) {
- if (log.isLoggable(LogLevel.SPAM)) {
- log.log(LogLevel.SPAM, "Creating generic builder for key=" + key);
- }
- return new GenericConfig.GenericConfigBuilder(key, new ConfigPayloadBuilder(payload));
- }
- ConfigTransformer transformer = new ConfigTransformer(builderInstance.getClass().getDeclaringClass());
- return transformer.toConfigBuilder(payload);
- }
-
- /**
- * Returns a {@link ConfigInstance} of right type for given key using reflection
- *
- * @param cKey a ConfigKey
- * @return a {@link ConfigInstance} or null if not available in classpath
- */
- static ConfigInstance getInstance(ConfigDefinitionKey cKey, ClassLoader instanceLoader) {
- String className = ConfigGenerator.createClassName(cKey.getName());
- Class<?> clazz;
- String fullClassName = packageName(cKey) + "." + className;
- try {
- clazz = instanceLoader != null ? instanceLoader.loadClass(fullClassName) : Class.forName(fullClassName);
- } catch (ClassNotFoundException e) {
- return null;
- }
- Object i;
- try {
- i = clazz.newInstance();
- } catch (InstantiationException | IllegalAccessException e) {
- throw new ConfigurationRuntimeException(e);
- }
- if (!(i instanceof ConfigInstance)) {
- throw new ConfigurationRuntimeException(fullClassName + " is not a ConfigInstance, can not produce config for the name '" + cKey.getName() + "'.");
- }
- return (ConfigInstance) i;
- }
-
static String packageName(ConfigDefinitionKey cKey) {
String prefix = "com.yahoo.";
return prefix + (cKey.getNamespace().isEmpty() ? CNode.DEFAULT_NAMESPACE : cKey.getNamespace());
