ibessonov commented on a change in pull request #41:
URL: https://github.com/apache/ignite-3/pull/41#discussion_r568592244
##########
File path:
modules/configuration/src/main/java/org/apache/ignite/configuration/ConfigurationChanger.java
##########
@@ -0,0 +1,133 @@
+package org.apache.ignite.configuration;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.stream.Collectors;
+import org.apache.ignite.configuration.storage.ConfigurationStorage;
+import org.apache.ignite.configuration.storage.Data;
+import org.apache.ignite.configuration.tree.ConfigurationVisitor;
+import org.apache.ignite.configuration.tree.InnerNode;
+import org.apache.ignite.configuration.tree.NamedListNode;
+import org.apache.ignite.configuration.tree.TraversableTreeNode;
+import
org.apache.ignite.configuration.validation.ConfigurationValidationException;
+import org.apache.ignite.configuration.validation.ValidationIssue;
+
+// TODO: stupid stub name, think later
+public class ConfigurationChanger {
+
+ private Map<RootKey<?>, Configurator<?>> registry = new HashMap<>();
+
+ private ConfigurationStorage configurationStorage;
+
+ private final AtomicInteger version = new AtomicInteger(0);
+
+ public ConfigurationChanger(ConfigurationStorage configurationStorage) {
+ this.configurationStorage = configurationStorage;
+ }
+
+ public void init() {
+ final Data data = configurationStorage.readAll();
+ version.set(data.version());
+
+ configurationStorage.addListener(changedEntries -> {
+ // TODO: add tree update
+ version.set(changedEntries.version());
+ });
+
+ // TODO: iterate over data and fill Configurators
+ }
+
+ public void registerConfiguration(RootKey<?> key, Configurator<?>
configurator) {
+ registry.put(key, configurator);
+ }
+
+ public <T extends ConfigurationTree<?, ?>> void change(Map<RootKey<?>,
TraversableTreeNode> changes) {
+ Map<String, Serializable> allChanges = changes.entrySet().stream()
+ .map((Map.Entry<RootKey<?>, TraversableTreeNode> change) ->
convertChangesToMap(change.getKey(), change.getValue()))
+ .flatMap(map -> map.entrySet().stream())
+ .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
+
+ boolean success = false;
+
+ List<ValidationIssue> validationIssues = Collections.emptyList();
+
+ while (!success) {
+ validationIssues = validate(changes);
+
+ final int version = this.version.get();
+
+ if (validationIssues.isEmpty())
+ success = configurationStorage.write(allChanges, version);
+ else
+ break;
+ }
+
+ if (!validationIssues.isEmpty())
+ throw new ConfigurationValidationException(validationIssues);
+ }
+
+ private List<ValidationIssue> validate(Map<RootKey<?>,
TraversableTreeNode> changes) {
+ List<ValidationIssue> issues = new ArrayList<>();
+
+ for (Map.Entry<RootKey<?>, TraversableTreeNode> entry :
changes.entrySet()) {
+ RootKey<?> rootKey = entry.getKey();
+ TraversableTreeNode changesForRoot = entry.getValue();
+
+ final Configurator<?> configurator = registry.get(rootKey);
+
+ List<ValidationIssue> list =
configurator.validateChanges(changesForRoot);
+ issues.addAll(list);
+ }
+
+ return issues;
+ }
+
+ private Map<String, Serializable> convertChangesToMap(RootKey<?> rootKey,
TraversableTreeNode node) {
+ Map<String, Serializable> values = new HashMap<>();
+
+ node.accept(null, new ConfigurationVisitor() {
+
+ String currentKey = rootKey.key();
+
+ @Override public void visitLeafNode(String key, Serializable val) {
+ values.put(currentKey + "." + key, val);
+ }
+
+ @Override public void visitInnerNode(String key, InnerNode node) {
+ String previousKey = currentKey;
+
+ if (key != null)
+ currentKey += "." + key;
Review comment:
Please use StringBuilder, concatenation in a recursive method is a bad
idea.
----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
For queries about this service, please contact Infrastructure at:
[email protected]