Merge "Re-added config.version to config-module-archetype."
[controller.git] / opendaylight / netconf / netconf-cli / src / main / java / org / opendaylight / controller / 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.controller.netconf.cli.reader.impl;
9
10 import static org.opendaylight.controller.netconf.cli.io.IOUtil.isSkipInput;
11 import static org.opendaylight.controller.netconf.cli.io.IOUtil.listType;
12
13 import com.google.common.base.Optional;
14 import java.io.IOException;
15 import java.util.ArrayList;
16 import java.util.Collections;
17 import java.util.List;
18 import org.opendaylight.controller.netconf.cli.io.BaseConsoleContext;
19 import org.opendaylight.controller.netconf.cli.io.ConsoleContext;
20 import org.opendaylight.controller.netconf.cli.io.ConsoleIO;
21 import org.opendaylight.controller.netconf.cli.reader.AbstractReader;
22 import org.opendaylight.controller.netconf.cli.reader.ReadingException;
23 import org.opendaylight.controller.netconf.util.xml.XmlUtil;
24 import org.opendaylight.yangtools.yang.data.api.Node;
25 import org.opendaylight.yangtools.yang.data.impl.NodeFactory;
26 import org.opendaylight.yangtools.yang.data.impl.codec.xml.XmlDocumentUtils;
27 import org.opendaylight.yangtools.yang.model.api.AnyXmlSchemaNode;
28 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
29 import org.w3c.dom.Document;
30 import org.xml.sax.SAXException;
31
32 public class AnyXmlReader extends AbstractReader<AnyXmlSchemaNode> {
33
34     public AnyXmlReader(final ConsoleIO console, final SchemaContext schemaContext) {
35         super(console, schemaContext);
36     }
37
38     public AnyXmlReader(final ConsoleIO console, final SchemaContext schemaContext, final boolean readConfigNode) {
39         super(console, schemaContext, readConfigNode);
40     }
41
42     @Override
43     protected List<Node<?>> readWithContext(final AnyXmlSchemaNode schemaNode) throws IOException, ReadingException {
44         console.writeLn(listType(schemaNode) + " " + schemaNode.getQName().getLocalName());
45
46         final String rawValue = console.read();
47
48         Node<?> newNode = null;
49         if (!isSkipInput(rawValue)) {
50             final Optional<Node<?>> value = tryParse(rawValue);
51
52             if (value.isPresent()) {
53                 newNode = NodeFactory.createImmutableCompositeNode(schemaNode.getQName(), null,
54                         Collections.<Node<?>> singletonList(value.get()));
55             } else {
56                 newNode = NodeFactory.createImmutableSimpleNode(schemaNode.getQName(), null, rawValue);
57             }
58         }
59
60         final List<Node<?>> newNodes = new ArrayList<>();
61         newNodes.add(newNode);
62         return newNodes;
63     }
64
65     private Optional<Node<?>> tryParse(final String rawValue) {
66         try {
67             final Document dom = XmlUtil.readXmlToDocument(rawValue);
68             return Optional.<Node<?>> of(XmlDocumentUtils.toDomNode(dom));
69         } catch (SAXException | IOException e) {
70             // TODO log
71             return Optional.absent();
72         }
73     }
74
75     @Override
76     protected ConsoleContext getContext(final AnyXmlSchemaNode schemaNode) {
77         return new BaseConsoleContext<>(schemaNode);
78     }
79 }