Merge changes I6575ddd8,I4b78f51d,I0a0441e6
[netconf.git] / netconf / tools / netconf-cli / src / main / java / org / opendaylight / netconf / cli / reader / impl / AnyXmlReader.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.netconf.cli.reader.impl;
9
10 import static org.opendaylight.netconf.cli.io.IOUtil.isSkipInput;
11 import static org.opendaylight.netconf.cli.io.IOUtil.listType;
12
13 import com.google.common.base.Optional;
14 import java.io.IOException;
15 import java.io.StringReader;
16 import java.util.ArrayList;
17 import java.util.List;
18 import org.opendaylight.netconf.cli.io.BaseConsoleContext;
19 import org.opendaylight.netconf.cli.io.ConsoleContext;
20 import org.opendaylight.netconf.cli.io.ConsoleIO;
21 import org.opendaylight.netconf.cli.reader.AbstractReader;
22 import org.opendaylight.netconf.cli.reader.ReadingException;
23 import org.opendaylight.yangtools.util.xml.UntrustedXML;
24 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
25 import org.opendaylight.yangtools.yang.data.api.schema.DataContainerChild;
26 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
27 import org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeStreamWriter;
28 import org.opendaylight.yangtools.yang.data.codec.xml.XmlParserStream;
29 import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNormalizedNodeStreamWriter;
30 import org.opendaylight.yangtools.yang.data.impl.schema.NormalizedNodeResult;
31 import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableContainerNodeBuilder;
32 import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableLeafNodeBuilder;
33 import org.opendaylight.yangtools.yang.model.api.AnyXmlSchemaNode;
34 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
35
36 public class AnyXmlReader extends AbstractReader<AnyXmlSchemaNode> {
37
38     public AnyXmlReader(final ConsoleIO console, final SchemaContext schemaContext) {
39         super(console, schemaContext);
40     }
41
42     public AnyXmlReader(final ConsoleIO console, final SchemaContext schemaContext, final boolean readConfigNode) {
43         super(console, schemaContext, readConfigNode);
44     }
45
46     @Override
47     protected List<NormalizedNode<?, ?>> readWithContext(final AnyXmlSchemaNode schemaNode)
48             throws IOException, ReadingException {
49         console.writeLn(listType(schemaNode) + " " + schemaNode.getQName().getLocalName());
50
51         final String rawValue = console.read();
52
53         DataContainerChild<?, ?> newNode = null;
54         if (!isSkipInput(rawValue)) {
55             final Optional<DataContainerChild<?, ?>> value = tryParse(rawValue, schemaNode);
56
57             if (value.isPresent()) {
58                 newNode = ImmutableContainerNodeBuilder.create()
59                         .withNodeIdentifier(new NodeIdentifier(schemaNode.getQName()))
60                         .withChild(value.get()).build();
61             } else {
62                 newNode = ImmutableLeafNodeBuilder.create().withNodeIdentifier(
63                     new NodeIdentifier(schemaNode.getQName())).withValue(rawValue).build();
64             }
65         }
66
67         final List<NormalizedNode<?, ?>> newNodes = new ArrayList<>();
68         newNodes.add(newNode);
69         return newNodes;
70     }
71
72     @SuppressWarnings("checkstyle:IllegalCatch")
73     private Optional<DataContainerChild<?, ?>> tryParse(final String rawValue, final AnyXmlSchemaNode schemaNode) {
74         try {
75             final NormalizedNodeResult resultHolder = new NormalizedNodeResult();
76             final NormalizedNodeStreamWriter writer = ImmutableNormalizedNodeStreamWriter.from(resultHolder);
77             final XmlParserStream xmlParser = XmlParserStream.create(writer, getSchemaContext(), schemaNode);
78
79             xmlParser.parse(UntrustedXML.createXMLStreamReader(new StringReader(rawValue)));
80             return Optional.of((DataContainerChild<?, ?>) resultHolder.getResult());
81         } catch (final Exception e) {
82             // TODO log
83             return Optional.absent();
84         }
85     }
86
87     @Override
88     protected ConsoleContext getContext(final AnyXmlSchemaNode schemaNode) {
89         return new BaseConsoleContext<>(schemaNode);
90     }
91 }