975da60b3d4704cb3e62a4e6560b341cff0b9cee
[netconf.git] / restconf / restconf-nb-bierman02 / src / main / java / org / opendaylight / netconf / sal / restconf / impl / NormalizedDataPrunner.java
1 /*
2  * Copyright (c) 2014 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.netconf.sal.restconf.impl;
9
10 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.AugmentationIdentifier;
11 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
12 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifierWithPredicates;
13 import org.opendaylight.yangtools.yang.data.api.schema.AnyxmlNode;
14 import org.opendaylight.yangtools.yang.data.api.schema.AugmentationNode;
15 import org.opendaylight.yangtools.yang.data.api.schema.ChoiceNode;
16 import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
17 import org.opendaylight.yangtools.yang.data.api.schema.DataContainerChild;
18 import org.opendaylight.yangtools.yang.data.api.schema.DataContainerNode;
19 import org.opendaylight.yangtools.yang.data.api.schema.LeafNode;
20 import org.opendaylight.yangtools.yang.data.api.schema.LeafSetNode;
21 import org.opendaylight.yangtools.yang.data.api.schema.MapEntryNode;
22 import org.opendaylight.yangtools.yang.data.api.schema.MapNode;
23 import org.opendaylight.yangtools.yang.data.api.schema.MixinNode;
24 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
25 import org.opendaylight.yangtools.yang.data.api.schema.SystemMapNode;
26 import org.opendaylight.yangtools.yang.data.api.schema.UnkeyedListEntryNode;
27 import org.opendaylight.yangtools.yang.data.api.schema.UnkeyedListNode;
28 import org.opendaylight.yangtools.yang.data.api.schema.UserMapNode;
29 import org.opendaylight.yangtools.yang.data.api.schema.builder.CollectionNodeBuilder;
30 import org.opendaylight.yangtools.yang.data.api.schema.builder.DataContainerNodeBuilder;
31 import org.opendaylight.yangtools.yang.data.impl.schema.Builders;
32
33 class NormalizedDataPrunner {
34
35     public DataContainerChild pruneDataAtDepth(final DataContainerChild node, final Integer depth) {
36         if (depth == null) {
37             return node;
38         }
39
40         if (node instanceof LeafNode || node instanceof LeafSetNode || node instanceof AnyxmlNode) {
41             return node;
42         } else if (node instanceof MixinNode) {
43             return processMixinNode(node, depth);
44         } else if (node instanceof DataContainerNode) {
45             return processContainerNode(node, depth);
46         }
47         throw new IllegalStateException("Unexpected Mixin node occured why pruning data to requested depth");
48     }
49
50     private DataContainerChild processMixinNode(final NormalizedNode node, final Integer depth) {
51         if (node instanceof AugmentationNode) {
52             return processAugmentationNode(node, depth);
53         } else if (node instanceof ChoiceNode) {
54             return processChoiceNode(node, depth);
55         } else if (node instanceof UserMapNode) {
56             return processOrderedMapNode(node, depth);
57         } else if (node instanceof MapNode) {
58             return processMapNode(node, depth);
59         } else if (node instanceof UnkeyedListNode) {
60             return processUnkeyedListNode(node, depth);
61         }
62         throw new IllegalStateException("Unexpected Mixin node occured why pruning data to requested depth");
63     }
64
65     private DataContainerChild processContainerNode(final NormalizedNode node, final Integer depth) {
66         final ContainerNode containerNode = (ContainerNode) node;
67         DataContainerNodeBuilder<NodeIdentifier, ContainerNode> newContainerBuilder = Builders.containerBuilder()
68                 .withNodeIdentifier(containerNode.getIdentifier());
69         if (depth > 1) {
70             processDataContainerChild((DataContainerNode) node, depth, newContainerBuilder);
71         }
72         return newContainerBuilder.build();
73     }
74
75     private DataContainerChild processChoiceNode(final NormalizedNode node, final Integer depth) {
76         final ChoiceNode choiceNode = (ChoiceNode) node;
77         DataContainerNodeBuilder<NodeIdentifier, ChoiceNode> newChoiceBuilder = Builders.choiceBuilder()
78                 .withNodeIdentifier(choiceNode.getIdentifier());
79
80         processDataContainerChild((DataContainerNode) node, depth, newChoiceBuilder);
81
82         return newChoiceBuilder.build();
83     }
84
85     private DataContainerChild processAugmentationNode(final NormalizedNode node, final Integer depth) {
86         final AugmentationNode augmentationNode = (AugmentationNode) node;
87         DataContainerNodeBuilder<AugmentationIdentifier, ? extends DataContainerChild> newAugmentationBuilder =
88                 Builders.augmentationBuilder().withNodeIdentifier(augmentationNode.getIdentifier());
89
90         processDataContainerChild((DataContainerNode) node, depth, newAugmentationBuilder);
91
92         return newAugmentationBuilder.build();
93     }
94
95     private void processDataContainerChild(final DataContainerNode node, final Integer depth,
96             final DataContainerNodeBuilder<?, ?> newBuilder) {
97         for (DataContainerChild nodeValue : node.body()) {
98             newBuilder.withChild(pruneDataAtDepth(nodeValue, depth - 1));
99         }
100     }
101
102     private DataContainerChild processUnkeyedListNode(final NormalizedNode node, final Integer depth) {
103         CollectionNodeBuilder<UnkeyedListEntryNode, UnkeyedListNode> newUnkeyedListBuilder = Builders
104                 .unkeyedListBuilder();
105         if (depth > 1) {
106             for (UnkeyedListEntryNode oldUnkeyedListEntry : ((UnkeyedListNode) node).body()) {
107                 DataContainerNodeBuilder<NodeIdentifier, UnkeyedListEntryNode> newUnkeyedListEntry = Builders
108                         .unkeyedListEntryBuilder().withNodeIdentifier(oldUnkeyedListEntry.getIdentifier());
109                 for (DataContainerChild oldUnkeyedListEntryValue : oldUnkeyedListEntry.body()) {
110                     newUnkeyedListEntry.withChild(pruneDataAtDepth(oldUnkeyedListEntryValue, depth - 1));
111                 }
112                 newUnkeyedListBuilder.addChild(newUnkeyedListEntry.build());
113             }
114         }
115         return newUnkeyedListBuilder.build();
116     }
117
118     private DataContainerChild processOrderedMapNode(final NormalizedNode node, final Integer depth) {
119         CollectionNodeBuilder<MapEntryNode, UserMapNode> newOrderedMapNodeBuilder = Builders.orderedMapBuilder();
120         processMapEntries(node, depth, newOrderedMapNodeBuilder);
121         return newOrderedMapNodeBuilder.build();
122     }
123
124     private DataContainerChild processMapNode(final NormalizedNode node, final Integer depth) {
125         CollectionNodeBuilder<MapEntryNode, SystemMapNode> newMapNodeBuilder = Builders.mapBuilder();
126         processMapEntries(node, depth, newMapNodeBuilder);
127         return newMapNodeBuilder.build();
128     }
129
130     private void processMapEntries(final NormalizedNode node, final Integer depth,
131             final CollectionNodeBuilder<MapEntryNode, ? extends MapNode> newOrderedMapNodeBuilder) {
132         if (depth > 1) {
133             for (MapEntryNode oldMapEntryNode : ((MapNode) node).body()) {
134                 DataContainerNodeBuilder<NodeIdentifierWithPredicates, MapEntryNode> newMapEntryNodeBuilder =
135                         Builders.mapEntryBuilder().withNodeIdentifier(oldMapEntryNode.getIdentifier());
136                 for (DataContainerChild mapEntryNodeValue : oldMapEntryNode.body()) {
137                     newMapEntryNodeBuilder.withChild(pruneDataAtDepth(mapEntryNodeValue, depth - 1));
138                 }
139                 newOrderedMapNodeBuilder.withChild(newMapEntryNodeBuilder.build());
140             }
141         }
142     }
143 }