Merge "Fixed for bug 1168 : Issue while update subnet"
[controller.git] / opendaylight / netconf / netconf-cli / src / main / java / org / opendaylight / controller / netconf / cli / reader / impl / ContainerReader.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.controller.netconf.cli.reader.impl;
9
10 import com.google.common.base.Function;
11 import com.google.common.collect.Collections2;
12 import com.google.common.collect.Lists;
13 import java.io.IOException;
14 import java.util.Collections;
15 import java.util.Comparator;
16 import java.util.List;
17 import java.util.Set;
18 import org.opendaylight.controller.netconf.cli.CommandArgHandlerRegistry;
19 import org.opendaylight.controller.netconf.cli.io.BaseConsoleContext;
20 import org.opendaylight.controller.netconf.cli.io.ConsoleContext;
21 import org.opendaylight.controller.netconf.cli.io.ConsoleIO;
22 import org.opendaylight.controller.netconf.cli.reader.AbstractReader;
23 import org.opendaylight.controller.netconf.cli.reader.ReadingException;
24 import org.opendaylight.yangtools.yang.data.api.Node;
25 import org.opendaylight.yangtools.yang.data.impl.ImmutableCompositeNode;
26 import org.opendaylight.yangtools.yang.data.impl.util.CompositeNodeBuilder;
27 import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode;
28 import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
29 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
30
31 public class ContainerReader extends AbstractReader<ContainerSchemaNode> {
32
33     private final CommandArgHandlerRegistry argumentHandlerRegistry;
34     private static final InputArgsLocalNameComparator CONTAINER_CHILDS_SORTER = new InputArgsLocalNameComparator();
35
36     public ContainerReader(final ConsoleIO console, final CommandArgHandlerRegistry argumentHandlerRegistry,
37             final SchemaContext schemaContext) {
38         super(console, schemaContext);
39         this.argumentHandlerRegistry = argumentHandlerRegistry;
40     }
41
42     public ContainerReader(final ConsoleIO console, final CommandArgHandlerRegistry argumentHandlerRegistry,
43             final SchemaContext schemaContext, final boolean readConfigNode) {
44         super(console, schemaContext, readConfigNode);
45         this.argumentHandlerRegistry = argumentHandlerRegistry;
46     }
47
48     @Override
49     public List<Node<?>> readWithContext(final ContainerSchemaNode containerNode) throws IOException, ReadingException {
50         console.formatLn("Submit child nodes for container: %s, %s", containerNode.getQName().getLocalName(),
51                 Collections2.transform(containerNode.getChildNodes(), new Function<DataSchemaNode, String>() {
52                     @Override
53                     public String apply(final DataSchemaNode input) {
54                         return input.getQName().getLocalName();
55                     }
56                 }));
57
58         final CompositeNodeBuilder<ImmutableCompositeNode> compositeNodeBuilder = ImmutableCompositeNode.builder();
59         compositeNodeBuilder.setQName(containerNode.getQName());
60         final SeparatedNodes separatedNodes = SeparatedNodes.separateNodes(containerNode, getReadConfigNode());
61         for (final DataSchemaNode childNode : sortChildren(separatedNodes.getMandatoryNotKey())) {
62             final List<Node<?>> redNodes = argumentHandlerRegistry.getGenericReader(getSchemaContext(),
63                     getReadConfigNode()).read(childNode);
64             if (redNodes.isEmpty()) {
65                 console.formatLn("No data specified for mandatory element %s.", childNode.getQName().getLocalName());
66                 return Collections.emptyList();
67             } else {
68                 compositeNodeBuilder.addAll(redNodes);
69             }
70         }
71
72         for (final DataSchemaNode childNode : sortChildren(separatedNodes.getOthers())) {
73             compositeNodeBuilder.addAll(argumentHandlerRegistry.getGenericReader(getSchemaContext(),
74                     getReadConfigNode()).read(childNode));
75         }
76         return Collections.<Node<?>> singletonList(compositeNodeBuilder.toInstance());
77     }
78
79     private List<DataSchemaNode> sortChildren(final Set<DataSchemaNode> unsortedNodes) {
80         final List<DataSchemaNode> childNodes = Lists.newArrayList(unsortedNodes);
81         Collections.sort(childNodes, CONTAINER_CHILDS_SORTER);
82         return childNodes;
83     }
84
85     @Override
86     protected ConsoleContext getContext(final ContainerSchemaNode schemaNode) {
87         return new BaseConsoleContext<>(schemaNode);
88     }
89
90     private static class InputArgsLocalNameComparator implements Comparator<DataSchemaNode> {
91         @Override
92         public int compare(final DataSchemaNode o1, final DataSchemaNode o2) {
93             return o1.getQName().getLocalName().compareTo(o2.getQName().getLocalName());
94         }
95     }
96
97 }