From b70a6ac5dd61a0f6eb86118df64dbaf4ae435782 Mon Sep 17 00:00:00 2001 From: gjoranv Date: Thu, 8 Jun 2017 14:35:40 +0200 Subject: Revert "Revert "Gjoranv/remove default ctor4"" --- .../com/yahoo/vespa/model/InstanceResolver.java | 60 ++++------------------ 1 file changed, 11 insertions(+), 49 deletions(-) (limited to 'config-model') diff --git a/config-model/src/main/java/com/yahoo/vespa/model/InstanceResolver.java b/config-model/src/main/java/com/yahoo/vespa/model/InstanceResolver.java index 9c761e425a7..fdb9fdf9796 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/InstanceResolver.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/InstanceResolver.java @@ -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 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 configClass = (Class)clazz; + Constructor 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()); -- cgit v1.2.3