2 * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved.
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
8 package org.opendaylight.yangtools.yang.data.impl.schema.transform.dom;
11 import java.util.HashMap;
12 import java.util.List;
15 import javax.xml.XMLConstants;
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;
27 import com.google.common.collect.LinkedListMultimap;
28 import com.google.common.collect.Lists;
30 public class DomUtils {
35 private static final XmlCodecProvider DEFAULT_XML_VALUE_CODEC_PROVIDER = new XmlCodecProvider() {
38 public TypeDefinitionAwareCodec<Object, ? extends TypeDefinition<?>> codecFor(TypeDefinition<?> baseType) {
39 return TypeDefinitionAwareCodec.from(baseType);
43 public static XmlCodecProvider defaultValueCodecProvider() {
44 return DEFAULT_XML_VALUE_CODEC_PROVIDER;
47 public static Object parseXmlValue(Element xml, XmlCodecProvider codecProvider, TypeDefinition<?> type) {
48 TypeDefinitionAwareCodec<Object, ? extends TypeDefinition<?>> codec = codecProvider.codecFor(type);
50 String text = xml.getTextContent();
55 value = codec.deserialize(text);
63 public static void serializeXmlValue(Element itemEl, TypeDefinition<? extends TypeDefinition<?>> type, XmlCodecProvider codecProvider, Object value) {
64 XmlDocumentUtils.writeValueByType(itemEl, type, codecProvider, value);
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));
76 return mapChildElements(childNodesCollection);
79 public static LinkedListMultimap<QName, Element> mapChildElements(Iterable<Element> childNodesCollection) {
80 LinkedListMultimap<QName, Element> mappedChildElements = LinkedListMultimap.create();
82 for (Element element : childNodesCollection) {
83 QName childQName = XmlDocumentUtils.qNameFromElement(element);
84 mappedChildElements.put(childQName, element);
87 return mappedChildElements;
91 public static Map<QName, String> toAttributes(NamedNodeMap xmlAttributes) {
92 Map<QName, String> attributes = new HashMap<>();
94 for (int i = 0; i < xmlAttributes.getLength(); i++) {
95 Node node = xmlAttributes.item(i);
96 String namespace = node.getNamespaceURI();
97 if (namespace == null) {
101 // Skip namespace definitions
102 if(namespace.equals(XMLConstants.XMLNS_ATTRIBUTE_NS_URI)) {
106 QName qName = new QName(URI.create(namespace), node.getLocalName());
107 attributes.put(qName, node.getNodeValue());