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;
10 import com.google.common.collect.LinkedListMultimap;
11 import com.google.common.collect.Lists;
13 import java.util.HashMap;
14 import java.util.List;
16 import javax.xml.XMLConstants;
17 import javax.xml.stream.XMLOutputFactory;
18 import javax.xml.stream.XMLStreamException;
19 import javax.xml.stream.XMLStreamWriter;
20 import javax.xml.transform.dom.DOMResult;
21 import org.opendaylight.yangtools.yang.common.QName;
22 import org.opendaylight.yangtools.yang.data.impl.codec.TypeDefinitionAwareCodec;
23 import org.opendaylight.yangtools.yang.data.impl.codec.xml.InstanceIdentifierForXmlCodec;
24 import org.opendaylight.yangtools.yang.data.impl.codec.xml.XmlCodecProvider;
25 import org.opendaylight.yangtools.yang.data.impl.codec.xml.XmlDocumentUtils;
26 import org.opendaylight.yangtools.yang.data.impl.codec.xml.XmlStreamUtils;
27 import org.opendaylight.yangtools.yang.data.impl.codec.xml.XmlUtils;
28 import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
29 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
30 import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
31 import org.opendaylight.yangtools.yang.model.api.type.IdentityrefTypeDefinition;
32 import org.opendaylight.yangtools.yang.model.api.type.LeafrefTypeDefinition;
33 import org.opendaylight.yangtools.yang.model.util.InstanceIdentifierType;
34 import org.opendaylight.yangtools.yang.model.util.SchemaContextUtil;
35 import org.w3c.dom.Element;
36 import org.w3c.dom.NamedNodeMap;
37 import org.w3c.dom.Node;
38 import org.w3c.dom.NodeList;
40 public final class DomUtils {
45 public static XmlCodecProvider defaultValueCodecProvider() {
46 return XmlUtils.DEFAULT_XML_CODEC_PROVIDER;
49 public static Object parseXmlValue(final Element xml, final XmlCodecProvider codecProvider, final TypeDefinition<?> type) {
50 TypeDefinitionAwareCodec<Object, ? extends TypeDefinition<?>> codec = codecProvider.codecFor(type);
52 String text = xml.getTextContent();
57 value = codec.deserialize(text);
65 public static void serializeXmlValue(final Element element, final TypeDefinition<? extends TypeDefinition<?>> type, final XmlCodecProvider codecProvider, final Object value) {
67 XMLStreamWriter writer = XMLOutputFactory.newFactory().createXMLStreamWriter(new DOMResult(element));
68 XmlStreamUtils.create(codecProvider).writeValue(writer, type, value);
69 } catch (XMLStreamException e) {
70 throw new IllegalStateException("XML encoding failed", e);
74 public static LinkedListMultimap<QName, Element> mapChildElementsForSingletonNode(final Element node) {
75 List<Element> childNodesCollection = Lists.newArrayList();
76 NodeList childNodes = node.getChildNodes();
77 for (int i = 0; i < childNodes.getLength(); i++) {
78 if(childNodes.item(i) instanceof Element) {
79 childNodesCollection.add((Element) childNodes.item(i));
83 return mapChildElements(childNodesCollection);
86 public static LinkedListMultimap<QName, Element> mapChildElements(final Iterable<Element> childNodesCollection) {
87 LinkedListMultimap<QName, Element> mappedChildElements = LinkedListMultimap.create();
89 for (Element element : childNodesCollection) {
90 QName childQName = XmlDocumentUtils.qNameFromElement(element);
91 mappedChildElements.put(childQName, element);
94 return mappedChildElements;
98 public static Map<QName, String> toAttributes(final NamedNodeMap xmlAttributes) {
99 Map<QName, String> attributes = new HashMap<>();
101 for (int i = 0; i < xmlAttributes.getLength(); i++) {
102 Node node = xmlAttributes.item(i);
103 String namespace = node.getNamespaceURI();
104 if (namespace == null) {
108 // Skip namespace definitions
109 if(namespace.equals(XMLConstants.XMLNS_ATTRIBUTE_NS_URI)) {
113 QName qName = new QName(URI.create(namespace), node.getLocalName());
114 attributes.put(qName, node.getNodeValue());
119 public static Object parseXmlValue(final Element xml, final XmlCodecProvider codecProvider, final DataSchemaNode schema, final TypeDefinition<?> type, final SchemaContext schemaCtx) {
120 TypeDefinition<?> baseType = XmlUtils.resolveBaseTypeFrom(type);
122 String text = xml.getTextContent();
126 if (baseType instanceof LeafrefTypeDefinition) {
127 final LeafrefTypeDefinition leafrefTypeDefinition = (LeafrefTypeDefinition) baseType;
128 baseType = SchemaContextUtil.getBaseTypeForLeafRef(leafrefTypeDefinition, schemaCtx, schema);
129 value = parseXmlValue(xml, codecProvider, schema, baseType, schemaCtx);
130 } else if (baseType instanceof InstanceIdentifierType) {
131 value = InstanceIdentifierForXmlCodec.deserialize(xml, schemaCtx);
132 } else if (baseType instanceof IdentityrefTypeDefinition) {
133 value = InstanceIdentifierForXmlCodec.toIdentity(text, xml, schemaCtx);
135 value = parseXmlValue(xml, codecProvider, type);