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.Collections;
15 import java.util.Comparator;
16 import java.util.List;
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;
31 public class ContainerReader extends AbstractReader<ContainerSchemaNode> {
33 private final CommandArgHandlerRegistry argumentHandlerRegistry;
34 private static final InputArgsLocalNameComparator CONTAINER_CHILDS_SORTER = new InputArgsLocalNameComparator();
36 public ContainerReader(final ConsoleIO console, final CommandArgHandlerRegistry argumentHandlerRegistry,
37 final SchemaContext schemaContext) {
38 super(console, schemaContext);
39 this.argumentHandlerRegistry = argumentHandlerRegistry;
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;
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>() {
53 public String apply(final DataSchemaNode input) {
54 return input.getQName().getLocalName();
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();
68 compositeNodeBuilder.addAll(redNodes);
72 for (final DataSchemaNode childNode : sortChildren(separatedNodes.getOthers())) {
73 compositeNodeBuilder.addAll(argumentHandlerRegistry.getGenericReader(getSchemaContext(),
74 getReadConfigNode()).read(childNode));
76 return Collections.<Node<?>> singletonList(compositeNodeBuilder.toInstance());
79 private List<DataSchemaNode> sortChildren(final Set<DataSchemaNode> unsortedNodes) {
80 final List<DataSchemaNode> childNodes = Lists.newArrayList(unsortedNodes);
81 Collections.sort(childNodes, CONTAINER_CHILDS_SORTER);
86 protected ConsoleContext getContext(final ContainerSchemaNode schemaNode) {
87 return new BaseConsoleContext<>(schemaNode);
90 private static class InputArgsLocalNameComparator implements Comparator<DataSchemaNode> {
92 public int compare(final DataSchemaNode o1, final DataSchemaNode o2) {
93 return o1.getQName().getLocalName().compareTo(o2.getQName().getLocalName());