diff options
author | Jon Bratseth <bratseth@yahoo-inc.com> | 2016-06-15 23:09:44 +0200 |
---|---|---|
committer | Jon Bratseth <bratseth@yahoo-inc.com> | 2016-06-15 23:09:44 +0200 |
commit | 72231250ed81e10d66bfe70701e64fa5fe50f712 (patch) | |
tree | 2728bba1131a6f6e5bdf95afec7d7ff9358dac50 /config-model/src/main/java/com/yahoo/config/model/producer/UserConfigRepo.java |
Publish
Diffstat (limited to 'config-model/src/main/java/com/yahoo/config/model/producer/UserConfigRepo.java')
-rw-r--r-- | config-model/src/main/java/com/yahoo/config/model/producer/UserConfigRepo.java | 109 |
1 files changed, 109 insertions, 0 deletions
diff --git a/config-model/src/main/java/com/yahoo/config/model/producer/UserConfigRepo.java b/config-model/src/main/java/com/yahoo/config/model/producer/UserConfigRepo.java new file mode 100644 index 00000000000..d32b0c75e69 --- /dev/null +++ b/config-model/src/main/java/com/yahoo/config/model/producer/UserConfigRepo.java @@ -0,0 +1,109 @@ +// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +package com.yahoo.config.model.producer; + +import com.yahoo.config.application.api.DeployLogger; +import com.yahoo.log.LogLevel; +import com.yahoo.vespa.config.*; + +import java.util.LinkedHashMap; +import java.util.Map; +import java.util.Set; + +/** + * A UserConfigRepo is a repository for user configs, typically for a particular config producer. The repo encapsulates + * how the user configs are stored, and defines the methods to retrieve user configs and merge the repo with others. + * + * @author lulf + * @since 5.1 + */ +public class UserConfigRepo { + private final Map<ConfigDefinitionKey, ConfigPayloadBuilder> userConfigsMap; + + public UserConfigRepo() { + this.userConfigsMap = new LinkedHashMap<>(); + } + + @Override + public UserConfigRepo clone() { + return new UserConfigRepo(copyBuilders(userConfigsMap)); + } + + /** + * Must copy the builder, because the merge method on {@link AbstractConfigProducer} might override the row's builders otherwise + */ + private Map<ConfigDefinitionKey, ConfigPayloadBuilder> copyBuilders(Map<ConfigDefinitionKey, ConfigPayloadBuilder> source) { + Map<ConfigDefinitionKey, ConfigPayloadBuilder> ret = new LinkedHashMap<>(); + for (Map.Entry<ConfigDefinitionKey, ConfigPayloadBuilder> e : source.entrySet()) { + ConfigDefinitionKey key = e.getKey(); + ConfigPayloadBuilder sourceVal = e.getValue(); + ConfigPayloadBuilder destVal = new ConfigPayloadBuilder(ConfigPayload.fromBuilder(sourceVal)); + ret.put(key, destVal); + } + return ret; + } + + public UserConfigRepo(Map<ConfigDefinitionKey, ConfigPayloadBuilder> map) { + this.userConfigsMap = map; + } + + public UserConfigRepo(UserConfigRepo userConfigRepo) { + this.userConfigsMap = userConfigRepo.userConfigsMap; + } + + public ConfigPayloadBuilder get(ConfigDefinitionKey key) { + return userConfigsMap.get(key); + } + + public void merge(UserConfigRepo newRepo) { + for (Map.Entry<ConfigDefinitionKey, ConfigPayloadBuilder> entry : newRepo.userConfigsMap.entrySet()) { + if (entry.getValue() == null) continue; + + ConfigDefinitionKey key = entry.getKey(); + if (userConfigsMap.containsKey(key)) { + ConfigPayloadBuilder lhsBuilder = userConfigsMap.get(key); + ConfigPayloadBuilder rhsBuilder = entry.getValue(); + lhsBuilder.override(rhsBuilder); + } else { + userConfigsMap.put(key, entry.getValue()); + } + } + } + + public boolean isEmpty() { + return userConfigsMap.isEmpty(); + } + + public int size() { + return userConfigsMap.size(); + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + for (ConfigDefinitionKey key : userConfigsMap.keySet()) { + sb.append(key.toString()); + } + return sb.toString(); + } + + /** + * The keys of all the configs contained in this. + * @return a set of ConfigDefinitionsKey + */ + public Set<ConfigDefinitionKey> configsProduced() { + return userConfigsMap.keySet(); + } + + /** + * Will take the warning messages stored on the payload builders, and apply them to the producer's {@link DeployLogger} + * @param producer the producer to apply warnings to + */ + public void applyWarnings(AbstractConfigProducer<?> producer) { + for (ConfigPayloadBuilder b : userConfigsMap.values()) { + for (String warning : b.warnings()) { + producer.deployLogger().log(LogLevel.WARNING, warning); + } + } + } + +} |