[ONOS-6783] Data type handling in Data Node

Change-Id: I5d27e169f95e2a5af89a866c1d34281201c73c56
diff --git a/serializers/xml/src/test/java/org/onosproject/yang/serializers/xml/XmlSerializerTest.java b/serializers/xml/src/test/java/org/onosproject/yang/serializers/xml/XmlSerializerTest.java
index 7b557ce..87dcb07 100644
--- a/serializers/xml/src/test/java/org/onosproject/yang/serializers/xml/XmlSerializerTest.java
+++ b/serializers/xml/src/test/java/org/onosproject/yang/serializers/xml/XmlSerializerTest.java
@@ -66,6 +66,201 @@
     }
 
     /**
+     * Validates and returns container data node.
+     *
+     * @param parent    data node holding container
+     * @param name      name of the container
+     * @param namespace namespace of the container
+     * @return container data node
+     */
+    private static DataNode validateContainerDataNode(DataNode parent,
+                                                      String name,
+                                                      String namespace) {
+        Map<NodeKey, DataNode> childNodes = ((InnerNode) parent).childNodes();
+        NodeKey key = NodeKey.builder().schemaId(name, namespace).build();
+        DataNode dataNode = childNodes.get(key);
+        SchemaId schemaId = dataNode.key().schemaId();
+        assertThat(schemaId.name(), is(name));
+        assertThat(schemaId.namespace(), is(namespace));
+        return dataNode;
+    }
+
+    /**
+     * Validates and returns list data node.
+     *
+     * @param parent    data node holding list
+     * @param name      name of the list
+     * @param namespace namespace of the list
+     * @param keynames  list of key leaf names
+     * @param keyNs     list of key leaf namespace
+     * @param keyVal    list of key leaf values
+     * @return list data node
+     */
+    private static DataNode validateListDataNode(DataNode parent,
+                                                 String name, String namespace,
+                                                 List<String> keynames,
+                                                 List<String> keyNs,
+                                                 List<Object> keyVal) {
+        Map<NodeKey, DataNode> childNodes = ((InnerNode) parent).childNodes();
+        NodeKey key = NodeKey.builder().schemaId(name, namespace).build();
+        DataNode dataNode;
+        if (keynames != null && !keynames.isEmpty()) {
+            ListKey.ListKeyBuilder listKeyBldr = new ListKey.ListKeyBuilder();
+            listKeyBldr.schemaId(key.schemaId());
+            for (int i = 0; i < keynames.size(); i++) {
+                listKeyBldr.addKeyLeaf(keynames.get(i), keyNs.get(i),
+                                       keyVal.get(i));
+            }
+            dataNode = childNodes.get(listKeyBldr.build());
+        } else {
+            dataNode = childNodes.get(key);
+        }
+        SchemaId schemaId = dataNode.key().schemaId();
+        assertThat(schemaId.name(), is(name));
+        assertThat(schemaId.namespace(), is(namespace));
+        return dataNode;
+    }
+
+    /**
+     * Validates leaf data node.
+     *
+     * @param parent    data node holding leaf
+     * @param name      name of the leaf
+     * @param namespace namespace of the leaf
+     * @param value     leaf value
+     */
+    private static void validateLeafDataNode(DataNode parent,
+                                             String name, String namespace,
+                                             Object value) {
+        Map<NodeKey, DataNode> childNodes = ((InnerNode) parent).childNodes();
+        NodeKey key = NodeKey.builder().schemaId(name, namespace).build();
+        LeafNode dataNode = ((LeafNode) childNodes.get(key));
+        SchemaId schemaId = dataNode.key().schemaId();
+        assertThat(schemaId.name(), is(name));
+        assertThat(schemaId.namespace(), is(namespace));
+        if (dataNode.value() != null) {
+            assertThat(dataNode.value().toString(), is(value));
+        }
+    }
+
+    /**
+     * Validates an empty leaf data node.
+     *
+     * @param parent    data node holding leaf
+     * @param name      name of the leaf
+     * @param namespace namespace of the leaf
+     * @param value     leaf value
+     */
+    private static void validateNullLeafDataNode(DataNode parent,
+                                                 String name, String namespace,
+                                                 Object value) {
+        Map<NodeKey, DataNode> childNodes = ((InnerNode) parent).childNodes();
+        NodeKey key = NodeKey.builder().schemaId(name, namespace).build();
+        LeafNode dataNode = ((LeafNode) childNodes.get(key));
+        SchemaId schemaId = dataNode.key().schemaId();
+        assertThat(schemaId.name(), is(name));
+        assertThat(schemaId.namespace(), is(namespace));
+        assertThat(dataNode.value(), is(value));
+    }
+
+    /**
+     * Validates leaf-list data node.
+     *
+     * @param parent    data node holding leaf-list
+     * @param name      name of the leaf-list
+     * @param namespace namespace of the leaf-list
+     * @param value     leaf-list value
+     */
+    private static void validateLeafListDataNode(DataNode parent,
+                                                 String name, String namespace,
+                                                 Object value) {
+        Map<NodeKey, DataNode> childNodes = ((InnerNode) parent).childNodes();
+        NodeKey key = NodeKey.builder().schemaId(name, namespace).build();
+        LeafListKey.LeafListKeyBuilder leafListBldr =
+                new LeafListKey.LeafListKeyBuilder();
+        leafListBldr.schemaId(key.schemaId());
+        leafListBldr.value(value);
+        DataNode leafListNode = childNodes.get(leafListBldr.build());
+        SchemaId schemaId = leafListNode.key().schemaId();
+        assertThat(schemaId.name(), is(name));
+        assertThat(schemaId.namespace(), is(namespace));
+        assertThat(((LeafNode) leafListNode).value().toString(), is(value));
+    }
+
+    /**
+     * Validates root data node.
+     *
+     * @param resourceData resource data which holds data node
+     * @return root data node
+     */
+    private static DataNode validateRootDataNode(ResourceData resourceData) {
+        List<DataNode> dataNodes = resourceData.dataNodes();
+        DataNode rootNode = dataNodes.get(0);
+        SchemaId rootSchemaId = rootNode.key().schemaId();
+        assertThat(rootSchemaId.name(), is("/"));
+        return rootNode;
+    }
+
+    /**
+     * Reads XML contents from file path and returns input stream.
+     *
+     * @param path path of XML file
+     * @return input stream
+     */
+    private static InputStream parseInput(String path) {
+        String temp;
+        StringBuilder sb = new StringBuilder();
+        try (BufferedReader br = new BufferedReader(new FileReader(path))) {
+            while ((temp = br.readLine()) != null) {
+                sb.append(temp);
+            }
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        return IOUtils.toInputStream(sb);
+    }
+
+    /**
+     * Reads XML contents from file path and returns input stream.
+     *
+     * @param path path of XML file
+     * @return input stream
+     */
+    private static String parseXml(String path) {
+        String temp;
+        StringBuilder sb = new StringBuilder();
+        try (BufferedReader br = new BufferedReader(new FileReader(path))) {
+            while ((temp = br.readLine()) != null) {
+                sb.append(temp);
+            }
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        return sb.toString();
+    }
+
+    /**
+     * Converts input stream to string format.
+     *
+     * @param inputStream input stream of xml
+     * @return XML string
+     */
+    private static String convertInputStreamToString(InputStream inputStream) {
+        BufferedReader br;
+        StringBuilder sb = new StringBuilder();
+        String xmlData;
+        br = new BufferedReader(new InputStreamReader(inputStream));
+        try {
+            while ((xmlData = br.readLine()) != null) {
+                sb.append(xmlData);
+            }
+        } catch (IOException e) {
+            throw new XmlSerializerException(e.getMessage());
+        }
+        return sb.toString();
+    }
+
+    /**
      * Validates data node in which XML element is of type YANG container.
      */
     @Test
@@ -282,199 +477,6 @@
         assertThat(convertInputStreamToString(inputStream), is(parseXml(path)));
     }
 
-    /**
-     * Validates and returns container data node.
-     *
-     * @param parent    data node holding container
-     * @param name      name of the container
-     * @param namespace namespace of the container
-     * @return container data node
-     */
-    private static DataNode validateContainerDataNode(DataNode parent,
-                                                      String name,
-                                                      String namespace) {
-        Map<NodeKey, DataNode> childNodes = ((InnerNode) parent).childNodes();
-        NodeKey key = NodeKey.builder().schemaId(name, namespace).build();
-        DataNode dataNode = childNodes.get(key);
-        SchemaId schemaId = dataNode.key().schemaId();
-        assertThat(schemaId.name(), is(name));
-        assertThat(schemaId.namespace(), is(namespace));
-        return dataNode;
-    }
-
-    /**
-     * Validates and returns list data node.
-     *
-     * @param parent    data node holding list
-     * @param name      name of the list
-     * @param namespace namespace of the list
-     * @param keynames  list of key leaf names
-     * @param keyNs     list of key leaf namespace
-     * @param keyVal    list of key leaf values
-     * @return list data node
-     */
-    private static DataNode validateListDataNode(DataNode parent,
-                                                 String name, String namespace,
-                                                 List<String> keynames,
-                                                 List<String> keyNs,
-                                                 List<Object> keyVal) {
-        Map<NodeKey, DataNode> childNodes = ((InnerNode) parent).childNodes();
-        NodeKey key = NodeKey.builder().schemaId(name, namespace).build();
-        DataNode dataNode;
-        if (keynames != null && !keynames.isEmpty()) {
-            ListKey.ListKeyBuilder listKeyBldr = new ListKey.ListKeyBuilder();
-            listKeyBldr.schemaId(key.schemaId());
-            for (int i = 0; i < keynames.size(); i++) {
-                listKeyBldr.addKeyLeaf(keynames.get(i), keyNs.get(i),
-                                       keyVal.get(i));
-            }
-            dataNode = childNodes.get(listKeyBldr.build());
-        } else {
-            dataNode = childNodes.get(key);
-        }
-        SchemaId schemaId = dataNode.key().schemaId();
-        assertThat(schemaId.name(), is(name));
-        assertThat(schemaId.namespace(), is(namespace));
-        return dataNode;
-    }
-
-    /**
-     * Validates leaf data node.
-     *
-     * @param parent    data node holding leaf
-     * @param name      name of the leaf
-     * @param namespace namespace of the leaf
-     * @param value     leaf value
-     */
-    private static void validateLeafDataNode(DataNode parent,
-                                             String name, String namespace,
-                                             Object value) {
-        Map<NodeKey, DataNode> childNodes = ((InnerNode) parent).childNodes();
-        NodeKey key = NodeKey.builder().schemaId(name, namespace).build();
-        LeafNode dataNode = ((LeafNode) childNodes.get(key));
-        SchemaId schemaId = dataNode.key().schemaId();
-        assertThat(schemaId.name(), is(name));
-        assertThat(schemaId.namespace(), is(namespace));
-        assertThat(dataNode.value().toString(), is(value));
-    }
-
-    /**
-     * Validates an empty leaf data node.
-     *
-     * @param parent    data node holding leaf
-     * @param name      name of the leaf
-     * @param namespace namespace of the leaf
-     * @param value     leaf value
-     */
-    private static void validateNullLeafDataNode(DataNode parent,
-                                                 String name, String namespace,
-                                                 Object value) {
-        Map<NodeKey, DataNode> childNodes = ((InnerNode) parent).childNodes();
-        NodeKey key = NodeKey.builder().schemaId(name, namespace).build();
-        LeafNode dataNode = ((LeafNode) childNodes.get(key));
-        SchemaId schemaId = dataNode.key().schemaId();
-        assertThat(schemaId.name(), is(name));
-        assertThat(schemaId.namespace(), is(namespace));
-        assertThat(dataNode.value(), is(value));
-    }
-
-    /**
-     * Validates leaf-list data node.
-     *
-     * @param parent    data node holding leaf-list
-     * @param name      name of the leaf-list
-     * @param namespace namespace of the leaf-list
-     * @param value     leaf-list value
-     */
-    private static void validateLeafListDataNode(DataNode parent,
-                                                 String name, String namespace,
-                                                 Object value) {
-        Map<NodeKey, DataNode> childNodes = ((InnerNode) parent).childNodes();
-        NodeKey key = NodeKey.builder().schemaId(name, namespace).build();
-        LeafListKey.LeafListKeyBuilder leafListBldr =
-                new LeafListKey.LeafListKeyBuilder();
-        leafListBldr.schemaId(key.schemaId());
-        leafListBldr.value(value);
-        DataNode leafListNode = childNodes.get(leafListBldr.build());
-        SchemaId schemaId = leafListNode.key().schemaId();
-        assertThat(schemaId.name(), is(name));
-        assertThat(schemaId.namespace(), is(namespace));
-        assertThat(((LeafNode) leafListNode).value().toString(), is(value));
-    }
-
-    /**
-     * Validates root data node.
-     *
-     * @param resourceData resource data which holds data node
-     * @return root data node
-     */
-    private static DataNode validateRootDataNode(ResourceData resourceData) {
-        List<DataNode> dataNodes = resourceData.dataNodes();
-        DataNode rootNode = dataNodes.get(0);
-        SchemaId rootSchemaId = rootNode.key().schemaId();
-        assertThat(rootSchemaId.name(), is("/"));
-        return rootNode;
-    }
-
-    /**
-     * Reads XML contents from file path and returns input stream.
-     *
-     * @param path path of XML file
-     * @return input stream
-     */
-    private static InputStream parseInput(String path) {
-        String temp;
-        StringBuilder sb = new StringBuilder();
-        try (BufferedReader br = new BufferedReader(new FileReader(path))) {
-            while ((temp = br.readLine()) != null) {
-                sb.append(temp);
-            }
-        } catch (IOException e) {
-            e.printStackTrace();
-        }
-        return IOUtils.toInputStream(sb);
-    }
-
-    /**
-     * Reads XML contents from file path and returns input stream.
-     *
-     * @param path path of XML file
-     * @return input stream
-     */
-    private static String parseXml(String path) {
-        String temp;
-        StringBuilder sb = new StringBuilder();
-        try (BufferedReader br = new BufferedReader(new FileReader(path))) {
-            while ((temp = br.readLine()) != null) {
-                sb.append(temp);
-            }
-        } catch (IOException e) {
-            e.printStackTrace();
-        }
-        return sb.toString();
-    }
-
-    /**
-     * Converts input stream to string format.
-     *
-     * @param inputStream input stream of xml
-     * @return XML string
-     */
-    private static String convertInputStreamToString(InputStream inputStream) {
-        BufferedReader br;
-        StringBuilder sb = new StringBuilder();
-        String xmlData;
-        br = new BufferedReader(new InputStreamReader(inputStream));
-        try {
-            while ((xmlData = br.readLine()) != null) {
-                sb.append(xmlData);
-            }
-        } catch (IOException e) {
-            throw new XmlSerializerException(e.getMessage());
-        }
-        return sb.toString();
-    }
-
     private CompositeData getNewCompositeData(CompositeData data) {
         List<AnnotatedNodeInfo> annotatedNodeInfos = data
                 .annotatedNodesInfo();
diff --git a/serializers/xml/src/test/resources/food.yang b/serializers/xml/src/test/resources/food.yang
index 4c87fa0..861ef3a 100644
--- a/serializers/xml/src/test/resources/food.yang
+++ b/serializers/xml/src/test/resources/food.yang
@@ -44,7 +44,7 @@
            }
        }
        leaf p1 {
-           type string;
+           type empty;
        }
        leaf-list p2 {
            type string;
diff --git a/serializers/xml/src/test/resources/testContainer.xml b/serializers/xml/src/test/resources/testContainer.xml
index ee679b8..98d44f8 100644
--- a/serializers/xml/src/test/resources/testContainer.xml
+++ b/serializers/xml/src/test/resources/testContainer.xml
@@ -1,5 +1,5 @@
 <food xmlns="yrt:food">
-<p1>p1_value</p1>
+<p1/>
 <p2>p2_value</p2>
 <p2>p2_value1</p2>
 </food>