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