[ONOS-7302] value namespace handling by model converter

Change-Id: I75f3ec01c20de8a145f154137c0e81dce2caf6ea
diff --git a/runtime/src/main/java/org/onosproject/yang/runtime/impl/DataTreeBuilderHelper.java b/runtime/src/main/java/org/onosproject/yang/runtime/impl/DataTreeBuilderHelper.java
index 0f56b4b..80fc2f3 100644
--- a/runtime/src/main/java/org/onosproject/yang/runtime/impl/DataTreeBuilderHelper.java
+++ b/runtime/src/main/java/org/onosproject/yang/runtime/impl/DataTreeBuilderHelper.java
@@ -32,6 +32,8 @@
 import org.onosproject.yang.model.DataNode;
 import org.onosproject.yang.model.InnerNode;
 import org.onosproject.yang.model.LeafNode;
+import org.onosproject.yang.model.LeafSchemaContext;
+import org.onosproject.yang.model.YangNamespace;
 
 import java.util.ArrayList;
 import java.util.HashMap;
@@ -906,9 +908,10 @@
                                        YangLeafList leafList) {
         if (extBuilder != null) {
             for (Object val : leafListVal) {
+                String valNamespace = getValNamespace(val, leafList);
                 DataNode.Builder leaf = extBuilder.createChildBuilder(
                         leafList.getName(), leafList.getNameSpace()
-                                .getModuleNamespace(), val);
+                                .getModuleNamespace(), val, valNamespace);
                 leaf.type(MULTI_INSTANCE_LEAF_VALUE_NODE);
                 leaf.addLeafListValue(val);
                 extBuilder = leaf.exitNode();
@@ -918,9 +921,11 @@
         //In case of root node leaf lists.
         List<DataNode.Builder> builders = new ArrayList<>();
         for (Object val : leafListVal) {
+            String valNamespace = getValNamespace(val, leafList);
             DataNode.Builder leaf = LeafNode.builder(
                     leafList.getName(), leafList.getNameSpace()
-                            .getModuleNamespace()).value(val);
+                            .getModuleNamespace()).value(val)
+                    .valueNamespace(valNamespace);
             leaf.type(MULTI_INSTANCE_LEAF_VALUE_NODE);
             leaf.addLeafListValue(val);
             builders.add(leaf);
@@ -962,6 +967,7 @@
      * @param val      value for the leaf
      */
     DataNode.Builder createLeafNode(YangLeaf yangLeaf, Object val) {
+        String valNamespace = getValNamespace(val, yangLeaf);
         if (extBuilder != null) {
             //Add leaf to key leaves.
             if (yangLeaf.isKeyLeaf()) {
@@ -971,7 +977,7 @@
             //build leaf node and add to parent node.
             DataNode.Builder leaf = extBuilder.createChildBuilder(
                     yangLeaf.getName(), yangLeaf.getNameSpace()
-                            .getModuleNamespace(), val);
+                            .getModuleNamespace(), val, valNamespace);
             leaf.type(SINGLE_INSTANCE_LEAF_VALUE_NODE);
 
             extBuilder = leaf.exitNode();
@@ -980,7 +986,7 @@
         return LeafNode.builder(yangLeaf.getName(), yangLeaf.getNameSpace()
                 .getModuleNamespace())
                 .type(SINGLE_INSTANCE_LEAF_VALUE_NODE)
-                .value(val);
+                .value(val).valueNamespace(valNamespace);
     }
 
     /**
@@ -1007,4 +1013,15 @@
         }
         return new ModelConverterTraversalInfo((YangNode) exitBuilderSchema, PARENT);
     }
+
+    public static String getValNamespace(Object val, LeafSchemaContext lsc) {
+        String valNamespace = null;
+        if (val != null) {
+            YangNamespace yn = lsc.getValueNamespace(val.toString());
+            if (yn != null) {
+                valNamespace = yn.getModuleNamespace();
+            }
+        }
+        return valNamespace;
+    }
 }
diff --git a/runtime/src/main/java/org/onosproject/yang/runtime/impl/DefaultDataTreeBuilder.java b/runtime/src/main/java/org/onosproject/yang/runtime/impl/DefaultDataTreeBuilder.java
index 7953ee5..264688f 100644
--- a/runtime/src/main/java/org/onosproject/yang/runtime/impl/DefaultDataTreeBuilder.java
+++ b/runtime/src/main/java/org/onosproject/yang/runtime/impl/DefaultDataTreeBuilder.java
@@ -58,6 +58,7 @@
 import static org.onosproject.yang.runtime.RuntimeHelper.DEFAULT_CAPS;
 import static org.onosproject.yang.runtime.RuntimeHelper.PERIOD;
 import static org.onosproject.yang.runtime.RuntimeHelper.getCapitalCase;
+import static org.onosproject.yang.runtime.impl.DataTreeBuilderHelper.getValNamespace;
 import static org.onosproject.yang.runtime.impl.ModelConverterUtil.TRUE;
 import static org.onosproject.yang.runtime.impl.ModelConverterUtil.getAttributeOfObject;
 import static org.onosproject.yang.runtime.impl.ModelConverterUtil.getJavaName;
@@ -224,8 +225,8 @@
                 child = child.getNextSibling();
             }
             while (child != null && child instanceof YangRpc &&
-                    !name.contains(child.getJavaPackage() + "."
-                    + child.getJavaClassNameOrBuiltInType().toLowerCase())) {
+                    !name.contains(child.getJavaPackage() + "." +
+                    child.getJavaClassNameOrBuiltInType().toLowerCase())) {
                 child = child.getNextSibling();
             }
             if (child != null) {
@@ -477,11 +478,13 @@
                         objects.add(null);
                     }
                     for (Object obj : objects) {
+                        String valNamespace = getValNamespace(obj, leafList);
                         DataNode node = LeafNode
                                 .builder(leafList.getName(), leafList
                                         .getNameSpace().getModuleNamespace())
                                 .value(obj)
-                                .type(MULTI_INSTANCE_LEAF_VALUE_NODE).build();
+                                .type(MULTI_INSTANCE_LEAF_VALUE_NODE)
+                                .valueNamespace(valNamespace).build();
                         rscData.addDataNode(node);
                     }
                 }
@@ -515,10 +518,12 @@
                         }
                         obj = null;
                     }
+                    String valNamespace = getValNamespace(obj, leaf);
                     DataNode node = LeafNode.builder(leaf.getName(), leaf
                             .getNameSpace().getModuleNamespace())
                             .value(obj)
-                            .type(SINGLE_INSTANCE_LEAF_VALUE_NODE).build();
+                            .type(SINGLE_INSTANCE_LEAF_VALUE_NODE)
+                            .valueNamespace(valNamespace).build();
                     rscData.addDataNode(node);
                     break;
                 }