Merge changes I525c2070,Ib920ff67
[controller.git] / opendaylight / md-sal / sal-clustering-commons / src / main / java / org / opendaylight / controller / cluster / datastore / node / utils / NormalizedNodeNavigator.java
1 /*
2  *
3  *  Copyright (c) 2014 Cisco Systems, Inc. and others.  All rights reserved.
4  *
5  *  This program and the accompanying materials are made available under the
6  *  terms of the Eclipse Public License v1.0 which accompanies this distribution,
7  *  and is available at http://www.eclipse.org/legal/epl-v10.html
8  *
9  */
10
11 package org.opendaylight.controller.cluster.datastore.node.utils;
12
13 import com.google.common.base.Preconditions;
14 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
15 import org.opendaylight.yangtools.yang.data.api.schema.DataContainerChild;
16 import org.opendaylight.yangtools.yang.data.api.schema.DataContainerNode;
17 import org.opendaylight.yangtools.yang.data.api.schema.MixinNode;
18 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
19 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNodeContainer;
20
21 /**
22  * NormalizedNodeNavigator walks a {@link NormalizedNodeVisitor} through the NormalizedNode
23  *
24  * {@link NormalizedNode } is a tree like structure that provides a generic structure for a yang data model
25  *
26  * For examples of visitors
27  * @see NormalizedNodePrinter
28  *
29  *
30  */
31 public class NormalizedNodeNavigator {
32
33   private final org.opendaylight.controller.cluster.datastore.node.utils.NormalizedNodeVisitor
34       visitor;
35
36   public NormalizedNodeNavigator(
37       org.opendaylight.controller.cluster.datastore.node.utils.NormalizedNodeVisitor visitor){
38     Preconditions.checkNotNull(visitor, "visitor should not be null");
39     this.visitor = visitor;
40   }
41   public void navigate(String parentPath, NormalizedNode<?,?> normalizedNode){
42     if(parentPath == null){
43       parentPath = "";
44     }
45     navigateNormalizedNode(0, parentPath, normalizedNode);
46   }
47
48   private void navigateDataContainerNode(int level, final String parentPath, final DataContainerNode<?> dataContainerNode){
49     visitor.visitNode(level, parentPath ,dataContainerNode);
50
51     String newParentPath = parentPath + "/" + dataContainerNode.getIdentifier().toString();
52
53     final Iterable<DataContainerChild<? extends YangInstanceIdentifier.PathArgument,?>> value = dataContainerNode.getValue();
54     for(NormalizedNode<?,?> node : value){
55       if(node instanceof MixinNode && node instanceof NormalizedNodeContainer){
56         navigateNormalizedNodeContainerMixin(level, newParentPath, (NormalizedNodeContainer<?, ?, ?>) node);
57       } else {
58         navigateNormalizedNode(level, newParentPath, node);
59       }
60     }
61
62   }
63
64   private void navigateNormalizedNodeContainerMixin(int level, final String parentPath, NormalizedNodeContainer<?, ?, ?> node) {
65     visitor.visitNode(level, parentPath, node);
66
67     String newParentPath = parentPath + "/" + node.getIdentifier().toString();
68
69     final Iterable<? extends NormalizedNode<?, ?>> value = node.getValue();
70     for(NormalizedNode<?, ?> normalizedNode : value){
71       if(normalizedNode instanceof MixinNode && normalizedNode instanceof NormalizedNodeContainer){
72         navigateNormalizedNodeContainerMixin(level + 1, newParentPath, (NormalizedNodeContainer) normalizedNode);
73       } else {
74         navigateNormalizedNode(level, newParentPath, normalizedNode);
75       }
76     }
77
78   }
79
80
81   private void navigateNormalizedNode(int level, String parentPath, NormalizedNode<?,?> normalizedNode){
82     if(normalizedNode instanceof DataContainerNode){
83
84       final DataContainerNode<?> dataContainerNode = (DataContainerNode<?>) normalizedNode;
85
86       navigateDataContainerNode(level + 1, parentPath, dataContainerNode);
87     } else {
88       visitor.visitNode(level+1, parentPath, normalizedNode);
89     }
90   }
91 }