aboutsummaryrefslogtreecommitdiffstats
path: root/config-model/src/main/java/com/yahoo/config/model/producer/UserConfigRepo.java
diff options
context:
space:
mode:
authorJon Bratseth <bratseth@yahoo-inc.com>2016-06-15 23:09:44 +0200
committerJon Bratseth <bratseth@yahoo-inc.com>2016-06-15 23:09:44 +0200
commit72231250ed81e10d66bfe70701e64fa5fe50f712 (patch)
tree2728bba1131a6f6e5bdf95afec7d7ff9358dac50 /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.java109
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);
+ }
+ }
+ }
+
+}