[ONOS-5080] YANG object builder coding

Change-Id: Ibef332b58f197a2f6626ee9b6d791b80002e2dfd
diff --git a/apps/yms/app/src/main/java/org/onosproject/yms/app/yob/YobMultiInstanceLeafHandler.java b/apps/yms/app/src/main/java/org/onosproject/yms/app/yob/YobMultiInstanceLeafHandler.java
new file mode 100755
index 0000000..9ad458b
--- /dev/null
+++ b/apps/yms/app/src/main/java/org/onosproject/yms/app/yob/YobMultiInstanceLeafHandler.java
@@ -0,0 +1,102 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.yms.app.yob;
+
+
+import org.onosproject.yangutils.datamodel.YangLeafList;
+import org.onosproject.yangutils.datamodel.YangSchemaNode;
+import org.onosproject.yangutils.datamodel.YangType;
+import org.onosproject.yangutils.datamodel.javadatamodel.JavaQualifiedTypeInfoContainer;
+import org.onosproject.yms.app.ydt.YdtExtendedContext;
+import org.onosproject.yms.app.ysr.YangSchemaRegistry;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.lang.reflect.Field;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.lang.reflect.ParameterizedType;
+import java.util.Set;
+
+import static org.onosproject.yangutils.utils.io.impl.YangIoUtils.getCapitalCase;
+import static org.onosproject.yms.app.ydt.AppType.YOB;
+import static org.onosproject.yms.app.yob.YobConstants.ADD_TO;
+import static org.onosproject.yms.app.yob.YobConstants.FAIL_TO_INVOKE_METHOD;
+
+/**
+ * Represents a multi instance leaf node handler in YANG object builder.
+ */
+class YobMultiInstanceLeafHandler
+        extends YobHandler {
+
+    private static final Logger log =
+            LoggerFactory.getLogger(YobMultiInstanceLeafHandler.class);
+
+    @Override
+    public void createYangBuilderObject(YdtExtendedContext curYdtNode,
+                                        YdtExtendedContext rootYdtNode,
+                                        YangSchemaRegistry registry) {
+        // For multi instance leaf no need to create an object.
+    }
+
+    @Override
+    public void buildObjectFromBuilder(YdtExtendedContext ydtNode,
+                                       YdtExtendedContext ydtRootNode,
+                                       YangSchemaRegistry schemaRegistry) {
+        // For multi instance leaf no need to build object.
+    }
+
+    @Override
+    public void setObjectInParent(YdtExtendedContext leafListYdtNode,
+                                  YangSchemaRegistry schemaRegistry) {
+        Class<?> parentBuilderClass = null;
+        YangSchemaNode yangSchemaNode = leafListYdtNode.getYangSchemaNode();
+        YdtExtendedContext parentYdtNode =
+                (YdtExtendedContext) leafListYdtNode.getParent();
+        YobWorkBench parentYobWorkBench =
+                (YobWorkBench) parentYdtNode.getAppInfo(YOB);
+        Set<String> valueSet = leafListYdtNode.getValueSet();
+
+        for (String value : valueSet) {
+            try {
+                String setterInParent = yangSchemaNode.getJavaAttributeName();
+                Object parentBuilderObject = parentYobWorkBench
+                        .getParentBuilder(leafListYdtNode, schemaRegistry);
+                parentBuilderClass = parentBuilderObject.getClass();
+                Field leafName = parentBuilderClass
+                        .getDeclaredField(setterInParent);
+                ParameterizedType genericListType =
+                        (ParameterizedType) leafName.getGenericType();
+                Class<?> genericListClass =
+                        (Class<?>) genericListType.getActualTypeArguments()[0];
+                Method parentSetterMethod =
+                        parentBuilderClass.getDeclaredMethod(
+                                ADD_TO + getCapitalCase(setterInParent),
+                                genericListClass);
+                JavaQualifiedTypeInfoContainer javaQualifiedType =
+                        (JavaQualifiedTypeInfoContainer) yangSchemaNode;
+                YangType<?> yangType =
+                        ((YangLeafList) javaQualifiedType).getDataType();
+                setDataFromStringValue(yangType, value, parentSetterMethod,
+                                       parentBuilderObject, leafListYdtNode);
+            } catch (NoSuchMethodException | InvocationTargetException
+                    | IllegalAccessException | NoSuchFieldException e) {
+                log.error(FAIL_TO_INVOKE_METHOD + parentBuilderClass.getName());
+            }
+        }
+    }
+}