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