2 * Copyright (c) 2014 Cisco Systems, Inc. and others. All rights reserved.
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
8 package org.opendaylight.netconf.sal.restconf.impl;
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;
33 class NormalizedDataPrunner {
35 public DataContainerChild pruneDataAtDepth(final DataContainerChild node, final Integer depth) {
40 if (node instanceof LeafNode || node instanceof LeafSetNode || node instanceof AnyxmlNode) {
42 } else if (node instanceof MixinNode) {
43 return processMixinNode(node, depth);
44 } else if (node instanceof DataContainerNode) {
45 return processContainerNode(node, depth);
47 throw new IllegalStateException("Unexpected Mixin node occured why pruning data to requested depth");
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);
62 throw new IllegalStateException("Unexpected Mixin node occured why pruning data to requested depth");
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());
70 processDataContainerChild((DataContainerNode) node, depth, newContainerBuilder);
72 return newContainerBuilder.build();
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());
80 processDataContainerChild((DataContainerNode) node, depth, newChoiceBuilder);
82 return newChoiceBuilder.build();
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());
90 processDataContainerChild((DataContainerNode) node, depth, newAugmentationBuilder);
92 return newAugmentationBuilder.build();
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));
102 private DataContainerChild processUnkeyedListNode(final NormalizedNode node, final Integer depth) {
103 CollectionNodeBuilder<UnkeyedListEntryNode, UnkeyedListNode> newUnkeyedListBuilder = Builders
104 .unkeyedListBuilder();
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));
112 newUnkeyedListBuilder.addChild(newUnkeyedListEntry.build());
115 return newUnkeyedListBuilder.build();
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();
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();
130 private void processMapEntries(final NormalizedNode node, final Integer depth,
131 final CollectionNodeBuilder<MapEntryNode, ? extends MapNode> newOrderedMapNodeBuilder) {
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));
139 newOrderedMapNodeBuilder.withChild(newMapEntryNodeBuilder.build());