Fixup checkstyle
[controller.git] / opendaylight / md-sal / sal-distributed-datastore / src / main / java / org / opendaylight / controller / cluster / datastore / utils / NormalizedNodeAggregator.java
1 /*
2  * Copyright (c) 2015 Cisco Systems, Inc. and others.  All rights reserved.
3  *
4  * This program and the accompanying materials are made available under the
5  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6  * and is available at http://www.eclipse.org/legal/epl-v10.html
7  */
8 package org.opendaylight.controller.cluster.datastore.utils;
9
10 import java.util.List;
11 import java.util.Optional;
12 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
13 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
14 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
15 import org.opendaylight.yangtools.yang.data.tree.api.DataTree;
16 import org.opendaylight.yangtools.yang.data.tree.api.DataTreeCandidate;
17 import org.opendaylight.yangtools.yang.data.tree.api.DataTreeConfiguration;
18 import org.opendaylight.yangtools.yang.data.tree.api.DataTreeModification;
19 import org.opendaylight.yangtools.yang.data.tree.api.DataValidationFailedException;
20 import org.opendaylight.yangtools.yang.data.tree.impl.di.InMemoryDataTreeFactory;
21 import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
22
23 public final class NormalizedNodeAggregator {
24     private final YangInstanceIdentifier rootIdentifier;
25     private final List<Optional<NormalizedNode>> nodes;
26     private final DataTree dataTree;
27
28     private NormalizedNodeAggregator(final YangInstanceIdentifier rootIdentifier,
29             final List<Optional<NormalizedNode>> nodes, final EffectiveModelContext schemaContext,
30             final LogicalDatastoreType logicalDatastoreType) {
31         this.rootIdentifier = rootIdentifier;
32         this.nodes = nodes;
33         dataTree = new InMemoryDataTreeFactory().create(logicalDatastoreType == LogicalDatastoreType.CONFIGURATION
34             ? DataTreeConfiguration.DEFAULT_CONFIGURATION : DataTreeConfiguration.DEFAULT_OPERATIONAL);
35         dataTree.setEffectiveModelContext(schemaContext);
36     }
37
38     /**
39      * Combine data from all the nodes in the list into a tree with root as rootIdentifier.
40      */
41     public static Optional<NormalizedNode> aggregate(final YangInstanceIdentifier rootIdentifier,
42             final List<Optional<NormalizedNode>> nodes, final EffectiveModelContext schemaContext,
43             final LogicalDatastoreType logicalDatastoreType) throws DataValidationFailedException {
44         return new NormalizedNodeAggregator(rootIdentifier, nodes, schemaContext, logicalDatastoreType).aggregate();
45     }
46
47     private Optional<NormalizedNode> aggregate() throws DataValidationFailedException {
48         final DataTreeModification mod = dataTree.takeSnapshot().newModification();
49         boolean nodePresent = false;
50
51         for (final Optional<NormalizedNode> node : nodes) {
52             if (node.isPresent()) {
53                 mod.merge(rootIdentifier, node.orElseThrow());
54                 nodePresent = true;
55             }
56         }
57
58         if (!nodePresent) {
59             return Optional.empty();
60         }
61
62
63         mod.ready();
64         dataTree.validate(mod);
65         final DataTreeCandidate candidate = dataTree.prepare(mod);
66         dataTree.commit(candidate);
67
68         return dataTree.takeSnapshot().readNode(rootIdentifier);
69     }
70 }