Merge changes Ic434bf4a,I05a3fb18,I47a3783d,I8234bbfd
[controller.git] / opendaylight / netconf / netconf-cli / src / main / java / org / opendaylight / controller / netconf / cli / writer / impl / NormalizedNodeWriter.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.writer.impl;
9
10 import java.io.IOException;
11 import java.util.Iterator;
12 import java.util.List;
13 import org.opendaylight.controller.netconf.cli.io.ConsoleIO;
14 import org.opendaylight.controller.netconf.cli.writer.OutFormatter;
15 import org.opendaylight.controller.netconf.cli.writer.WriteException;
16 import org.opendaylight.yangtools.yang.data.api.Node;
17 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument;
18 import org.opendaylight.yangtools.yang.data.api.schema.DataContainerChild;
19 import org.opendaylight.yangtools.yang.data.composite.node.schema.cnsn.parser.CnSnToNormalizedNodeParserFactory;
20 import org.opendaylight.yangtools.yang.data.impl.schema.transform.base.serializer.NodeSerializerDispatcher;
21 import org.opendaylight.yangtools.yang.data.impl.schema.transform.dom.DomUtils;
22 import org.opendaylight.yangtools.yang.model.api.AugmentationSchema;
23 import org.opendaylight.yangtools.yang.model.api.ChoiceNode;
24 import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode;
25 import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
26 import org.opendaylight.yangtools.yang.model.api.LeafListSchemaNode;
27 import org.opendaylight.yangtools.yang.model.api.LeafSchemaNode;
28 import org.opendaylight.yangtools.yang.model.api.ListSchemaNode;
29 import org.slf4j.Logger;
30 import org.slf4j.LoggerFactory;
31
32 public class NormalizedNodeWriter extends AbstractWriter<DataSchemaNode> {
33
34     private static final Logger LOG = LoggerFactory.getLogger(NormalizedNodeWriter.class);
35     private final OutFormatter out;
36
37     public NormalizedNodeWriter(final ConsoleIO console, final OutFormatter out) {
38         super(console);
39         this.out = out;
40     }
41
42     public void writeInner(final DataSchemaNode dataSchemaNode, final List<Node<?>> dataNodes) throws WriteException,
43             IOException {
44
45         // TODO - add getDispatcher method to CnSnToNormalizedNodeParserFactory
46         // to be able call dispatchChildElement
47         final DataContainerChild<? extends PathArgument, ?> dataContainerChild = parseToNormalizedNode(dataNodes,
48                 dataSchemaNode);
49
50         if (dataContainerChild != null) {
51             console.writeLn(serializeToCliOutput(dataContainerChild, dataSchemaNode));
52         }
53
54     }
55
56     private String serializeToCliOutput(final DataContainerChild<? extends PathArgument, ?> dataContainerChild,
57             final DataSchemaNode childSchema) {
58         final CliOutputFromNormalizedNodeSerializerFactory factorySerialization = CliOutputFromNormalizedNodeSerializerFactory
59                 .getInstance(out, DomUtils.defaultValueCodecProvider());
60         final NodeSerializerDispatcher<String> dispatcher = factorySerialization.getDispatcher();
61         final Iterable<String> result = dispatcher.dispatchChildElement(childSchema, dataContainerChild);
62
63         if (result == null) {
64             return "";
65         }
66
67         final Iterator<String> output = result.iterator();
68         if (!output.hasNext()) {
69             return "";
70         }
71
72         return output.next();
73     }
74
75     private DataContainerChild<? extends PathArgument, ?> parseToNormalizedNode(final List<Node<?>> dataNodes,
76             final DataSchemaNode dataSchemaNode) {
77         final CnSnToNormalizedNodeParserFactory factoryParsing = CnSnToNormalizedNodeParserFactory.getInstance();
78         if (dataSchemaNode instanceof ContainerSchemaNode) {
79             return factoryParsing.getContainerNodeParser().parse(dataNodes, (ContainerSchemaNode) dataSchemaNode);
80         } else if (dataSchemaNode instanceof LeafSchemaNode) {
81             return factoryParsing.getLeafNodeParser().parse(dataNodes, (LeafSchemaNode) dataSchemaNode);
82         } else if (dataSchemaNode instanceof LeafListSchemaNode) {
83             return factoryParsing.getLeafSetNodeParser().parse(dataNodes, (LeafListSchemaNode) dataSchemaNode);
84         } else if (dataSchemaNode instanceof ListSchemaNode) {
85             return factoryParsing.getMapNodeParser().parse(dataNodes, (ListSchemaNode) dataSchemaNode);
86         } else if (dataSchemaNode instanceof ChoiceNode) {
87             return factoryParsing.getChoiceNodeParser().parse(dataNodes, (ChoiceNode) dataSchemaNode);
88         } else if (dataSchemaNode instanceof AugmentationSchema) {
89             return factoryParsing.getAugmentationNodeParser().parse(dataNodes, (AugmentationSchema) dataSchemaNode);
90         }
91         return null;
92     }
93
94 }