- public void merge(final YangInstanceIdentifier path, final NormalizedNode<?, ?> data) {
- executeModification(new MergeModification(path, data));
+ public void merge(final YangInstanceIdentifier path, final NormalizedNode data) {
+ checkModificationState("merge", path);
+
+ if (path.isEmpty()) {
+ mergeAllData(checkRootData(data));
+ } else {
+ executeModification(new MergeOperation(path, data));
+ }
+ }
+
+ private void mergeAllData(final ContainerNode rootData) {
+ // Populate requests for individual shards that are being touched
+ final Map<String, DataContainerNodeBuilder<NodeIdentifier, ContainerNode>> rootBuilders = new HashMap<>();
+ for (DataContainerChild child : rootData.body()) {
+ final String shardName = shardNameFromRootChild(child);
+ rootBuilders.computeIfAbsent(shardName,
+ unused -> Builders.containerBuilder().withNodeIdentifier(rootData.getIdentifier()))
+ .addChild(child);
+ }
+
+ // Now dispatch all merges
+ for (Entry<String, DataContainerNodeBuilder<NodeIdentifier, ContainerNode>> entry : rootBuilders.entrySet()) {
+ getContextWrapper(entry.getKey()).maybeExecuteTransactionOperation(new MergeOperation(
+ YangInstanceIdentifier.empty(), entry.getValue().build()));
+ }