Scripted update of if statements
[yangtools.git] / yang / yang-data-impl / src / main / java / org / opendaylight / yangtools / yang / data / impl / schema / transform / dom / DomUtils.java
index eb1939604a237054c825da4e78ad9428f24e430e..75372ed4f6336027be9b9320f4069f8204317e27 100644 (file)
@@ -9,25 +9,30 @@ package org.opendaylight.yangtools.yang.data.impl.schema.transform.dom;
 
 import com.google.common.collect.LinkedListMultimap;
 import com.google.common.collect.Lists;
-
 import java.net.URI;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
-
 import javax.xml.XMLConstants;
 import javax.xml.stream.XMLOutputFactory;
 import javax.xml.stream.XMLStreamException;
 import javax.xml.stream.XMLStreamWriter;
 import javax.xml.transform.dom.DOMResult;
-
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.data.impl.codec.TypeDefinitionAwareCodec;
+import org.opendaylight.yangtools.yang.data.impl.codec.xml.InstanceIdentifierForXmlCodec;
 import org.opendaylight.yangtools.yang.data.impl.codec.xml.XmlCodecProvider;
 import org.opendaylight.yangtools.yang.data.impl.codec.xml.XmlDocumentUtils;
 import org.opendaylight.yangtools.yang.data.impl.codec.xml.XmlStreamUtils;
 import org.opendaylight.yangtools.yang.data.impl.codec.xml.XmlUtils;
+import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
+import org.opendaylight.yangtools.yang.model.api.SchemaContext;
 import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
+import org.opendaylight.yangtools.yang.model.api.type.IdentityrefTypeDefinition;
+import org.opendaylight.yangtools.yang.model.api.type.InstanceIdentifierTypeDefinition;
+import org.opendaylight.yangtools.yang.model.api.type.LeafrefTypeDefinition;
+import org.opendaylight.yangtools.yang.model.util.DerivedType;
+import org.opendaylight.yangtools.yang.model.util.SchemaContextUtil;
 import org.w3c.dom.Element;
 import org.w3c.dom.NamedNodeMap;
 import org.w3c.dom.Node;
@@ -43,7 +48,7 @@ public final class DomUtils {
     }
 
     public static Object parseXmlValue(final Element xml, final XmlCodecProvider codecProvider, final TypeDefinition<?> type) {
-        TypeDefinitionAwareCodec<Object, ? extends TypeDefinition<?>> codec = codecProvider.codecFor(type);
+        final TypeDefinitionAwareCodec<Object, ? extends TypeDefinition<?>> codec = codecProvider.codecFor(type);
 
         String text = xml.getTextContent();
         text = text.trim();
@@ -60,18 +65,18 @@ public final class DomUtils {
 
     public static void serializeXmlValue(final Element element, final TypeDefinition<? extends TypeDefinition<?>> type, final XmlCodecProvider codecProvider, final Object value) {
         try {
-            XMLStreamWriter writer = XMLOutputFactory.newFactory().createXMLStreamWriter(new DOMResult(element));
+            final XMLStreamWriter writer = XMLOutputFactory.newFactory().createXMLStreamWriter(new DOMResult(element));
             XmlStreamUtils.create(codecProvider).writeValue(writer, type, value);
-        } catch (XMLStreamException e) {
+        } catch (final XMLStreamException e) {
             throw new IllegalStateException("XML encoding failed", e);
         }
     }
 
     public static LinkedListMultimap<QName, Element> mapChildElementsForSingletonNode(final Element node) {
-        List<Element> childNodesCollection = Lists.newArrayList();
-        NodeList childNodes = node.getChildNodes();
+        final List<Element> childNodesCollection = Lists.newArrayList();
+        final NodeList childNodes = node.getChildNodes();
         for (int i = 0; i < childNodes.getLength(); i++) {
-            if(childNodes.item(i) instanceof Element) {
+            if (childNodes.item(i) instanceof Element) {
                 childNodesCollection.add((Element) childNodes.item(i));
             }
         }
@@ -80,10 +85,10 @@ public final class DomUtils {
     }
 
     public static LinkedListMultimap<QName, Element> mapChildElements(final Iterable<Element> childNodesCollection) {
-        LinkedListMultimap<QName, Element> mappedChildElements = LinkedListMultimap.create();
+        final LinkedListMultimap<QName, Element> mappedChildElements = LinkedListMultimap.create();
 
-        for (Element element : childNodesCollection) {
-            QName childQName = XmlDocumentUtils.qNameFromElement(element);
+        for (final Element element : childNodesCollection) {
+            final QName childQName = XmlDocumentUtils.qNameFromElement(element);
             mappedChildElements.put(childQName, element);
         }
 
@@ -92,23 +97,45 @@ public final class DomUtils {
 
 
     public static Map<QName, String> toAttributes(final NamedNodeMap xmlAttributes) {
-        Map<QName, String> attributes = new HashMap<>();
+        final Map<QName, String> attributes = new HashMap<>();
 
         for (int i = 0; i < xmlAttributes.getLength(); i++) {
-            Node node = xmlAttributes.item(i);
+            final Node node = xmlAttributes.item(i);
             String namespace = node.getNamespaceURI();
             if (namespace == null) {
                 namespace = "";
             }
 
             // Skip namespace definitions
-            if(namespace.equals(XMLConstants.XMLNS_ATTRIBUTE_NS_URI)) {
+            if (namespace.equals(XMLConstants.XMLNS_ATTRIBUTE_NS_URI)) {
                 continue;
             }
 
-            QName qName = new QName(URI.create(namespace), node.getLocalName());
+            final QName qName = new QName(URI.create(namespace), node.getLocalName());
             attributes.put(qName, node.getNodeValue());
         }
         return attributes;
     }
+
+    public static Object parseXmlValue(final Element xml, final XmlCodecProvider codecProvider, final DataSchemaNode schema, final TypeDefinition<?> type, final SchemaContext schemaCtx) {
+        TypeDefinition<?> baseType = DerivedType.from(type);
+
+        String text = xml.getTextContent();
+        text = text.trim();
+        final Object value;
+
+        if (baseType instanceof LeafrefTypeDefinition) {
+            final LeafrefTypeDefinition leafrefTypeDefinition = (LeafrefTypeDefinition) baseType;
+            baseType = SchemaContextUtil.getBaseTypeForLeafRef(leafrefTypeDefinition, schemaCtx, schema);
+            value = parseXmlValue(xml, codecProvider, schema, baseType, schemaCtx);
+        } else if (baseType instanceof InstanceIdentifierTypeDefinition) {
+            value = InstanceIdentifierForXmlCodec.deserialize(xml, schemaCtx);
+        } else if (baseType instanceof IdentityrefTypeDefinition) {
+            value = InstanceIdentifierForXmlCodec.toIdentity(text, xml, schemaCtx);
+        } else {
+            value = parseXmlValue(xml, codecProvider, type);
+        }
+
+        return value;
+    }
 }