eb1939604a237054c825da4e78ad9428f24e430e
[yangtools.git] / yang / yang-data-impl / src / main / java / org / opendaylight / yangtools / yang / data / impl / schema / transform / dom / DomUtils.java
1 /*
2  * Copyright (c) 2013 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.yangtools.yang.data.impl.schema.transform.dom;
9
10 import com.google.common.collect.LinkedListMultimap;
11 import com.google.common.collect.Lists;
12
13 import java.net.URI;
14 import java.util.HashMap;
15 import java.util.List;
16 import java.util.Map;
17
18 import javax.xml.XMLConstants;
19 import javax.xml.stream.XMLOutputFactory;
20 import javax.xml.stream.XMLStreamException;
21 import javax.xml.stream.XMLStreamWriter;
22 import javax.xml.transform.dom.DOMResult;
23
24 import org.opendaylight.yangtools.yang.common.QName;
25 import org.opendaylight.yangtools.yang.data.impl.codec.TypeDefinitionAwareCodec;
26 import org.opendaylight.yangtools.yang.data.impl.codec.xml.XmlCodecProvider;
27 import org.opendaylight.yangtools.yang.data.impl.codec.xml.XmlDocumentUtils;
28 import org.opendaylight.yangtools.yang.data.impl.codec.xml.XmlStreamUtils;
29 import org.opendaylight.yangtools.yang.data.impl.codec.xml.XmlUtils;
30 import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
31 import org.w3c.dom.Element;
32 import org.w3c.dom.NamedNodeMap;
33 import org.w3c.dom.Node;
34 import org.w3c.dom.NodeList;
35
36 public final class DomUtils {
37
38     private DomUtils() {
39     }
40
41     public static XmlCodecProvider defaultValueCodecProvider() {
42         return XmlUtils.DEFAULT_XML_CODEC_PROVIDER;
43     }
44
45     public static Object parseXmlValue(final Element xml, final XmlCodecProvider codecProvider, final TypeDefinition<?> type) {
46         TypeDefinitionAwareCodec<Object, ? extends TypeDefinition<?>> codec = codecProvider.codecFor(type);
47
48         String text = xml.getTextContent();
49         text = text.trim();
50
51         Object value;
52         if (codec != null) {
53             value = codec.deserialize(text);
54         } else {
55             value = text;
56         }
57
58         return value;
59     }
60
61     public static void serializeXmlValue(final Element element, final TypeDefinition<? extends TypeDefinition<?>> type, final XmlCodecProvider codecProvider, final Object value) {
62         try {
63             XMLStreamWriter writer = XMLOutputFactory.newFactory().createXMLStreamWriter(new DOMResult(element));
64             XmlStreamUtils.create(codecProvider).writeValue(writer, type, value);
65         } catch (XMLStreamException e) {
66             throw new IllegalStateException("XML encoding failed", e);
67         }
68     }
69
70     public static LinkedListMultimap<QName, Element> mapChildElementsForSingletonNode(final Element node) {
71         List<Element> childNodesCollection = Lists.newArrayList();
72         NodeList childNodes = node.getChildNodes();
73         for (int i = 0; i < childNodes.getLength(); i++) {
74             if(childNodes.item(i) instanceof Element) {
75                 childNodesCollection.add((Element) childNodes.item(i));
76             }
77         }
78
79         return mapChildElements(childNodesCollection);
80     }
81
82     public static LinkedListMultimap<QName, Element> mapChildElements(final Iterable<Element> childNodesCollection) {
83         LinkedListMultimap<QName, Element> mappedChildElements = LinkedListMultimap.create();
84
85         for (Element element : childNodesCollection) {
86             QName childQName = XmlDocumentUtils.qNameFromElement(element);
87             mappedChildElements.put(childQName, element);
88         }
89
90         return mappedChildElements;
91     }
92
93
94     public static Map<QName, String> toAttributes(final NamedNodeMap xmlAttributes) {
95         Map<QName, String> attributes = new HashMap<>();
96
97         for (int i = 0; i < xmlAttributes.getLength(); i++) {
98             Node node = xmlAttributes.item(i);
99             String namespace = node.getNamespaceURI();
100             if (namespace == null) {
101                 namespace = "";
102             }
103
104             // Skip namespace definitions
105             if(namespace.equals(XMLConstants.XMLNS_ATTRIBUTE_NS_URI)) {
106                 continue;
107             }
108
109             QName qName = new QName(URI.create(namespace), node.getLocalName());
110             attributes.put(qName, node.getNodeValue());
111         }
112         return attributes;
113     }
114 }