Move XmlDocumentUtils.writeValueByType() 74/8874/6
authorRobert Varga <rovarga@cisco.com>
Wed, 9 Jul 2014 18:39:04 +0000 (20:39 +0200)
committerTony Tkacik <ttkacik@cisco.com>
Mon, 21 Jul 2014 10:32:49 +0000 (12:32 +0200)
Now that we're using XMLStreamWriter, the only user lives in DomUtils,
so let's move the functionality over there.

Change-Id: Ia3cb69f5222ffb9c645bc91f79d1aa908b4fe971
Signed-off-by: Robert Varga <rovarga@cisco.com>
yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/codec/xml/XmlDocumentUtils.java
yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/codec/xml/XmlUtils.java
yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/transform/dom/DomUtils.java

index 4b65eae332be2c6465be66d81f5605058a53e54d..a3a2a86e886c5ebcdb2b3e3bc8af1bd81e857332 100644 (file)
@@ -28,10 +28,8 @@ import javax.xml.transform.dom.DOMResult;
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.data.api.AttributesContainer;
 import org.opendaylight.yangtools.yang.data.api.CompositeNode;
-import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier;
 import org.opendaylight.yangtools.yang.data.api.ModifyAction;
 import org.opendaylight.yangtools.yang.data.api.Node;
-import org.opendaylight.yangtools.yang.data.api.SimpleNode;
 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
 import org.opendaylight.yangtools.yang.data.impl.ImmutableCompositeNode;
 import org.opendaylight.yangtools.yang.data.impl.SimpleNodeTOImpl;
@@ -50,7 +48,6 @@ import org.opendaylight.yangtools.yang.model.api.SchemaContext;
 import org.opendaylight.yangtools.yang.model.api.SchemaNode;
 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.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.w3c.dom.Attr;
@@ -193,72 +190,6 @@ public class XmlDocumentUtils {
         return createElementFor(doc, data.getNodeType(), data);
     }
 
-    public static void writeValueByType(final Element element, final SimpleNode<?> node, final TypeDefinition<?> type,
-            final DataSchemaNode schema, final XmlCodecProvider codecProvider) {
-
-        Object nodeValue = node.getValue();
-
-        writeValueByType(element, type, codecProvider, nodeValue);
-    }
-
-    public static void writeValueByType(final Element element, final TypeDefinition<?> type, final XmlCodecProvider codecProvider, final Object nodeValue) {
-        TypeDefinition<?> baseType = resolveBaseTypeFrom(type);
-        if (baseType instanceof IdentityrefTypeDefinition) {
-            if (nodeValue instanceof QName) {
-                QName value = (QName) nodeValue;
-                String prefix = "x";
-                if (value.getPrefix() != null && !value.getPrefix().isEmpty()) {
-                    prefix = value.getPrefix();
-                }
-                element.setAttribute("xmlns:" + prefix, value.getNamespace().toString());
-                element.setTextContent(prefix + ":" + value.getLocalName());
-            } else {
-                Object value = nodeValue;
-                logger.debug("Value of {}:{} is not instance of QName but is {}", baseType.getQName().getNamespace(),
-                        baseType.getQName().getLocalName(), value != null ? value.getClass() : "null");
-                if (value != null) {
-                    element.setTextContent(String.valueOf(value));
-                }
-            }
-        } else if (baseType instanceof InstanceIdentifierTypeDefinition) {
-            if (nodeValue instanceof InstanceIdentifier) {
-                InstanceIdentifierForXmlCodec.serialize((InstanceIdentifier)nodeValue,element);
-            } else {
-                Object value = nodeValue;
-                logger.debug("Value of {}:{} is not instance of InstanceIdentifier but is {}", baseType.getQName()
-                        .getNamespace(), //
-                        baseType.getQName().getLocalName(), value != null ? value.getClass() : "null");
-                if (value != null) {
-                    element.setTextContent(String.valueOf(value));
-                }
-            }
-        } else {
-            if (nodeValue != null) {
-                final TypeDefinitionAwareCodec<Object, ?> codec = codecProvider.codecFor(baseType);
-                if (codec != null) {
-                    try {
-                        final String text = codec.serialize(nodeValue);
-                        element.setTextContent(text);
-                    } catch (ClassCastException e) {
-                        logger.error("Provided node value {} did not have type {} required by mapping. Using stream instead.", nodeValue, baseType, e);
-                        element.setTextContent(String.valueOf(nodeValue));
-                    }
-                } else {
-                    logger.error("Failed to find codec for {}, falling back to using stream", baseType);
-                    element.setTextContent(String.valueOf(nodeValue));
-                }
-            }
-        }
-    }
-
-    public final static TypeDefinition<?> resolveBaseTypeFrom(final TypeDefinition<?> type) {
-        TypeDefinition<?> superType = type;
-        while (superType.getBaseType() != null) {
-            superType = superType.getBaseType();
-        }
-        return superType;
-    }
-
     public static Node<?> toDomNode(final Element xmlElement, final Optional<DataSchemaNode> schema,
             final Optional<XmlCodecProvider> codecProvider) {
         if (schema.isPresent()) {
index 052c250099ebae4a69857d70eb6c174aaf6ee472..7dda2739252ba6e8af18a52b9b38fe97da56146f 100644 (file)
@@ -22,10 +22,9 @@ import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
  * Common XML-related utility methods, which are not specific to a particular
  * JAXP API.
  */
-final class XmlUtils {
+public final class XmlUtils {
 
     private XmlUtils() {
-
     }
 
     public static TypeDefinition<?> resolveBaseTypeFrom(final @Nonnull TypeDefinition<?> type) {
index afcbe358c48c9bf717623e95a759d38640759eb8..4c3b05bd2257274088ac4f2833bc095f038e80bf 100644 (file)
@@ -7,44 +7,48 @@
  */
 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.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.model.api.TypeDefinition;
 import org.w3c.dom.Element;
 import org.w3c.dom.NamedNodeMap;
 import org.w3c.dom.Node;
 import org.w3c.dom.NodeList;
 
-import com.google.common.collect.LinkedListMultimap;
-import com.google.common.collect.Lists;
-
-public class DomUtils {
-
-    private DomUtils() {
-    }
+public final class DomUtils {
 
     private static final XmlCodecProvider DEFAULT_XML_VALUE_CODEC_PROVIDER = new XmlCodecProvider() {
-
         @Override
-        public TypeDefinitionAwareCodec<Object, ? extends TypeDefinition<?>> codecFor(TypeDefinition<?> baseType) {
+        public TypeDefinitionAwareCodec<Object, ? extends TypeDefinition<?>> codecFor(final TypeDefinition<?> baseType) {
             return TypeDefinitionAwareCodec.from(baseType);
         }
     };
 
+    private DomUtils() {
+    }
+
     public static XmlCodecProvider defaultValueCodecProvider() {
         return DEFAULT_XML_VALUE_CODEC_PROVIDER;
     }
 
-    public static Object parseXmlValue(Element xml, XmlCodecProvider codecProvider, TypeDefinition<?> type) {
+    public static Object parseXmlValue(final Element xml, final XmlCodecProvider codecProvider, final TypeDefinition<?> type) {
         TypeDefinitionAwareCodec<Object, ? extends TypeDefinition<?>> codec = codecProvider.codecFor(type);
 
         String text = xml.getTextContent();
@@ -60,11 +64,16 @@ public class DomUtils {
         return value;
     }
 
-    public static void serializeXmlValue(Element itemEl, TypeDefinition<? extends TypeDefinition<?>> type, XmlCodecProvider codecProvider, Object value) {
-        XmlDocumentUtils.writeValueByType(itemEl, type, codecProvider, value);
+    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));
+            XmlStreamUtils.create(codecProvider).writeValue(writer, type, value);
+        } catch (XMLStreamException e) {
+            throw new IllegalStateException("XML encoding failed", e);
+        }
     }
 
-    public static LinkedListMultimap<QName, Element> mapChildElementsForSingletonNode(Element node) {
+    public static LinkedListMultimap<QName, Element> mapChildElementsForSingletonNode(final Element node) {
         List<Element> childNodesCollection = Lists.newArrayList();
         NodeList childNodes = node.getChildNodes();
         for (int i = 0; i < childNodes.getLength(); i++) {
@@ -76,7 +85,7 @@ public class DomUtils {
         return mapChildElements(childNodesCollection);
     }
 
-    public static LinkedListMultimap<QName, Element> mapChildElements(Iterable<Element> childNodesCollection) {
+    public static LinkedListMultimap<QName, Element> mapChildElements(final Iterable<Element> childNodesCollection) {
         LinkedListMultimap<QName, Element> mappedChildElements = LinkedListMultimap.create();
 
         for (Element element : childNodesCollection) {
@@ -88,7 +97,7 @@ public class DomUtils {
     }
 
 
-    public static Map<QName, String> toAttributes(NamedNodeMap xmlAttributes) {
+    public static Map<QName, String> toAttributes(final NamedNodeMap xmlAttributes) {
         Map<QName, String> attributes = new HashMap<>();
 
         for (int i = 0; i < xmlAttributes.getLength(); i++) {