BUG-1718 Fix hasAttributes method in XmlStreamUtils 08/10908/1
authorMaros Marsalek <mmarsale@cisco.com>
Mon, 8 Sep 2014 15:24:23 +0000 (17:24 +0200)
committerMaros Marsalek <mmarsale@cisco.com>
Mon, 8 Sep 2014 15:24:23 +0000 (17:24 +0200)
Change-Id: I5aefa3532f6b43ec746b4a1c1a11c9aa26820104
Signed-off-by: Maros Marsalek <mmarsale@cisco.com>
yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/codec/xml/XmlStreamUtils.java
yang/yang-data-impl/src/test/java/org/opendaylight/yangtools/yang/data/impl/codec/xml/XmlStreamUtilsTest.java

index 4527e75ef9d1291cb3811bf9e8910ca4e62b0aef..b60cf2bc19e878fda63c1cc57d372b75087a3fc9 100644 (file)
@@ -147,7 +147,7 @@ public class XmlStreamUtils {
         if (isEmptyElement(data)) {
             if (hasAttributes(data)) {
                 writer.writeStartElement(pfx, qname.getLocalName(), ns);
-                RandomPrefix randomPrefix = new RandomPrefix();
+                final RandomPrefix randomPrefix = new RandomPrefix();
                 writeAttributes(writer, (AttributesContainer) data, randomPrefix);
                 writer.writeEndElement();
             } else {
@@ -215,7 +215,7 @@ public class XmlStreamUtils {
     private static boolean hasAttributes(final Node<?> data) {
         if (data instanceof AttributesContainer) {
             final Map<QName, String> c = ((AttributesContainer) data).getAttributes();
-            return c == null || c.isEmpty();
+            return c != null && !c.isEmpty();
         } else {
             return false;
         }
index 479a47f1069fb12d55d12ce8201b96f5c6b785fe..6832748bdaf49656883a864a016b7b60d670e1f2 100644 (file)
@@ -12,11 +12,14 @@ import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
 
 import com.google.common.base.Optional;
+import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
 
 import java.io.ByteArrayOutputStream;
+import java.io.File;
 import java.net.URI;
 import java.util.AbstractMap;
+import java.util.Collections;
 import java.util.Map;
 
 import javax.xml.stream.XMLOutputFactory;
@@ -27,6 +30,13 @@ import org.custommonkey.xmlunit.XMLUnit;
 import org.junit.Test;
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.common.QNameModule;
+import org.opendaylight.yangtools.yang.data.api.Node;
+import org.opendaylight.yangtools.yang.data.api.SimpleNode;
+import org.opendaylight.yangtools.yang.data.impl.ImmutableCompositeNode;
+import org.opendaylight.yangtools.yang.data.impl.NodeFactory;
+import org.opendaylight.yangtools.yang.data.impl.SimpleNodeTOImpl;
+import org.opendaylight.yangtools.yang.model.api.SchemaContext;
+import org.opendaylight.yangtools.yang.parser.impl.YangParserImpl;
 import org.w3c.dom.Document;
 
 public class XmlStreamUtilsTest {
@@ -70,6 +80,34 @@ public class XmlStreamUtilsTest {
         assertTrue("Xml differs: " + diff.toString(), identical);
     }
 
+    @Test
+    public void testEmptyNodeWithAttribute() throws Exception {
+        final ByteArrayOutputStream out = new ByteArrayOutputStream();
+        final XMLStreamWriter writer =  XML_OUTPUT_FACTORY.createXMLStreamWriter(out);
+
+        final Map<QName, String> attrs = Maps.newHashMap();
+        attrs.put(QName.create("namespaceAttr", "2012-12-12", "attr1"), "value");
+        final QName qName = QName.create("urn:opendaylight:controller:rpc:test", "2014-07-28", "cont");
+        final ImmutableCompositeNode dataAttributes = ImmutableCompositeNode.create(qName, attrs, Collections.<Node<?>>emptyList());
+        XmlStreamUtils.create(XmlUtils.DEFAULT_XML_CODEC_PROVIDER).writeDocument(writer, dataAttributes);
+
+        writer.close();
+        out.close();
+
+        final String xmlAsString = new String(out.toByteArray());
+
+        // TODO why resulting xml does not have namespace definition ? If sending xml by e.g. netconf the namespace is there but not here in test
+        final String expectedXmlAsString = "<cont xmlns:a=\"namespaceAttr\" a:attr1=\"value\"></cont>";
+
+        XMLUnit.setIgnoreAttributeOrder(true);
+        final Document control = XMLUnit.buildControlDocument(expectedXmlAsString);
+        final Document test = XMLUnit.buildTestDocument(xmlAsString);
+        final Diff diff = XMLUnit.compareXML(control, test);
+
+        final boolean identical = diff.identical();
+        assertTrue("Xml differs: " + diff.toString(), identical);
+    }
+
     private Map<String, String> mapPrefixed(final Iterable<Map.Entry<URI, String>> prefixes) {
         final Map<String, String> mappedPrefixes = Maps.newHashMap();
         for (final Map.Entry<URI, String> prefix : prefixes) {