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.netconf.cli.reader.impl;
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;
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;
34 public class ContainerReader extends AbstractReader<ContainerSchemaNode> {
36 private final CommandArgHandlerRegistry argumentHandlerRegistry;
37 private static final InputArgsLocalNameComparator CONTAINER_CHILDS_SORTER = new InputArgsLocalNameComparator();
39 public ContainerReader(final ConsoleIO console, final CommandArgHandlerRegistry argumentHandlerRegistry,
40 final SchemaContext schemaContext) {
41 super(console, schemaContext);
42 this.argumentHandlerRegistry = argumentHandlerRegistry;
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;
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>() {
56 public String apply(final DataSchemaNode input) {
57 return input.getQName().getLocalName();
60 final DataContainerNodeAttrBuilder<NodeIdentifier, ContainerNode> builder = ImmutableContainerNodeBuilder.create();
61 builder.withNodeIdentifier(new NodeIdentifier(containerNode.getQName()));
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();
72 nodesToAdd.addAll(redNodes);
76 for (final DataSchemaNode childNode : sortChildren(separatedNodes.getOthers())) {
77 nodesToAdd.addAll(argumentHandlerRegistry.getGenericReader(getSchemaContext(),
78 getReadConfigNode()).read(childNode));
80 return Collections.<NormalizedNode<?, ?>> singletonList(builder.withValue((ArrayList) nodesToAdd).build());
83 private List<DataSchemaNode> sortChildren(final Set<DataSchemaNode> unsortedNodes) {
84 final List<DataSchemaNode> childNodes = Lists.newArrayList(unsortedNodes);
85 Collections.sort(childNodes, CONTAINER_CHILDS_SORTER);
90 protected ConsoleContext getContext(final ContainerSchemaNode schemaNode) {
91 return new BaseConsoleContext<>(schemaNode);
94 private static class InputArgsLocalNameComparator implements Comparator<DataSchemaNode> {
96 public int compare(final DataSchemaNode o1, final DataSchemaNode o2) {
97 return o1.getQName().getLocalName().compareTo(o2.getQName().getLocalName());