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.controller.sal.restconf.impl;
10 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
11 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.AugmentationIdentifier;
12 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
13 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifierWithPredicates;
14 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument;
15 import org.opendaylight.yangtools.yang.data.api.schema.AnyXmlNode;
16 import org.opendaylight.yangtools.yang.data.api.schema.AugmentationNode;
17 import org.opendaylight.yangtools.yang.data.api.schema.ChoiceNode;
18 import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
19 import org.opendaylight.yangtools.yang.data.api.schema.DataContainerChild;
20 import org.opendaylight.yangtools.yang.data.api.schema.DataContainerNode;
21 import org.opendaylight.yangtools.yang.data.api.schema.LeafNode;
22 import org.opendaylight.yangtools.yang.data.api.schema.LeafSetNode;
23 import org.opendaylight.yangtools.yang.data.api.schema.MapEntryNode;
24 import org.opendaylight.yangtools.yang.data.api.schema.MapNode;
25 import org.opendaylight.yangtools.yang.data.api.schema.MixinNode;
26 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
27 import org.opendaylight.yangtools.yang.data.api.schema.OrderedLeafSetNode;
28 import org.opendaylight.yangtools.yang.data.api.schema.OrderedMapNode;
29 import org.opendaylight.yangtools.yang.data.api.schema.UnkeyedListEntryNode;
30 import org.opendaylight.yangtools.yang.data.api.schema.UnkeyedListNode;
31 import org.opendaylight.yangtools.yang.data.impl.schema.Builders;
32 import org.opendaylight.yangtools.yang.data.impl.schema.builder.api.CollectionNodeBuilder;
33 import org.opendaylight.yangtools.yang.data.impl.schema.builder.api.DataContainerNodeAttrBuilder;
34 import org.opendaylight.yangtools.yang.data.impl.schema.builder.api.DataContainerNodeBuilder;
36 class NormalizedDataPrunner {
38 public DataContainerChild<?, ?> pruneDataAtDepth(final DataContainerChild<?, ?> node, final Integer depth) {
43 if (node instanceof LeafNode || node instanceof LeafSetNode || node instanceof AnyXmlNode
44 || node instanceof OrderedLeafSetNode) {
46 } else if (node instanceof MixinNode) {
47 return processMixinNode(node, depth);
48 } else if (node instanceof DataContainerNode) {
49 return processContainerNode(node, depth);
51 throw new IllegalStateException("Unexpected Mixin node occured why pruning data to requested depth");
54 private DataContainerChild<?, ?> processMixinNode(final NormalizedNode<?, ?> node, final Integer depth) {
55 if (node instanceof AugmentationNode) {
56 return processAugmentationNode(node, depth);
57 } else if (node instanceof ChoiceNode) {
58 return processChoiceNode(node, depth);
59 } else if (node instanceof OrderedMapNode) {
60 return processOrderedMapNode(node, depth);
61 } else if (node instanceof MapNode) {
62 return processMapNode(node, depth);
63 } else if (node instanceof UnkeyedListNode) {
64 return processUnkeyedListNode(node, depth);
66 throw new IllegalStateException("Unexpected Mixin node occured why pruning data to requested depth");
69 private DataContainerChild<?, ?> processContainerNode(final NormalizedNode<?, ?> node, final Integer depth) {
70 final ContainerNode containerNode = (ContainerNode) node;
71 DataContainerNodeAttrBuilder<NodeIdentifier, ContainerNode> newContainerBuilder = Builders.containerBuilder()
72 .withNodeIdentifier(containerNode.getIdentifier());
74 processDataContainerChild((DataContainerNode<?>) node, depth, newContainerBuilder);
76 return newContainerBuilder.build();
79 private DataContainerChild<?, ?> processChoiceNode(final NormalizedNode<?, ?> node, final Integer depth) {
80 final ChoiceNode choiceNode = (ChoiceNode) node;
81 DataContainerNodeBuilder<NodeIdentifier, ChoiceNode> newChoiceBuilder = Builders.choiceBuilder()
82 .withNodeIdentifier(choiceNode.getIdentifier());
84 processDataContainerChild((DataContainerNode<?>) node, depth, newChoiceBuilder);
86 return newChoiceBuilder.build();
89 private DataContainerChild<?, ?> processAugmentationNode(final NormalizedNode<?, ?> node, final Integer depth) {
90 final AugmentationNode augmentationNode = (AugmentationNode) node;
91 DataContainerNodeBuilder<AugmentationIdentifier, ? extends DataContainerChild<?, ?>> newAugmentationBuilder = Builders
92 .augmentationBuilder().withNodeIdentifier(augmentationNode.getIdentifier());
94 processDataContainerChild((DataContainerNode<?>) node, depth, newAugmentationBuilder);
96 return newAugmentationBuilder.build();
99 private void processDataContainerChild(
100 final DataContainerNode<?> node,
102 final DataContainerNodeBuilder<? extends YangInstanceIdentifier.PathArgument, ? extends DataContainerNode<?>> newBuilder) {
104 for (DataContainerChild<? extends PathArgument, ?> nodeValue : node.getValue()) {
105 newBuilder.withChild(pruneDataAtDepth(nodeValue, depth - 1));
110 private DataContainerChild<?, ?> processUnkeyedListNode(final NormalizedNode<?, ?> node, final Integer depth) {
111 CollectionNodeBuilder<UnkeyedListEntryNode, UnkeyedListNode> newUnkeyedListBuilder = Builders
112 .unkeyedListBuilder();
114 for (UnkeyedListEntryNode oldUnkeyedListEntry : ((UnkeyedListNode) node).getValue()) {
115 DataContainerNodeAttrBuilder<NodeIdentifier, UnkeyedListEntryNode> newUnkeyedListEntry = Builders
116 .unkeyedListEntryBuilder().withNodeIdentifier(oldUnkeyedListEntry.getIdentifier());
117 for (DataContainerChild<? extends PathArgument, ?> oldUnkeyedListEntryValue : oldUnkeyedListEntry
119 newUnkeyedListEntry.withChild(pruneDataAtDepth(oldUnkeyedListEntryValue, depth - 1));
121 newUnkeyedListBuilder.addChild(newUnkeyedListEntry.build());
124 return newUnkeyedListBuilder.build();
127 private DataContainerChild<?, ?> processOrderedMapNode(final NormalizedNode<?, ?> node, final Integer depth) {
128 CollectionNodeBuilder<MapEntryNode, OrderedMapNode> newOrderedMapNodeBuilder = Builders.orderedMapBuilder();
129 processMapEntries(node, depth, newOrderedMapNodeBuilder);
130 return newOrderedMapNodeBuilder.build();
133 private DataContainerChild<?, ?> processMapNode(final NormalizedNode<?, ?> node, final Integer depth) {
134 CollectionNodeBuilder<MapEntryNode, MapNode> newMapNodeBuilder = Builders.mapBuilder();
135 processMapEntries(node, depth, newMapNodeBuilder);
136 return newMapNodeBuilder.build();
139 private void processMapEntries(final NormalizedNode<?, ?> node, final Integer depth,
140 CollectionNodeBuilder<MapEntryNode, ? extends MapNode> newOrderedMapNodeBuilder) {
142 for (MapEntryNode oldMapEntryNode : ((MapNode) node).getValue()) {
143 DataContainerNodeAttrBuilder<NodeIdentifierWithPredicates, MapEntryNode> newMapEntryNodeBuilder = Builders
144 .mapEntryBuilder().withNodeIdentifier(oldMapEntryNode.getIdentifier());
145 for (DataContainerChild<? extends PathArgument, ?> mapEntryNodeValue : oldMapEntryNode.getValue()) {
146 newMapEntryNodeBuilder.withChild(pruneDataAtDepth(mapEntryNodeValue, depth - 1));
148 newOrderedMapNodeBuilder.withChild(newMapEntryNodeBuilder.build());