[ONOS-5085][ONOS-5086][ONOS-5199][ONOS-5212] Yang application broker implemetation

Change-Id: I22f2ab0d98ae43fc8c0ab65d6dbf581fcd76bd47
diff --git a/apps/yms/app/src/main/java/org/onosproject/yms/app/yob/YobHandler.java b/apps/yms/app/src/main/java/org/onosproject/yms/app/yob/YobHandler.java
index 7e12be3..e2190f0 100755
--- a/apps/yms/app/src/main/java/org/onosproject/yms/app/yob/YobHandler.java
+++ b/apps/yms/app/src/main/java/org/onosproject/yms/app/yob/YobHandler.java
@@ -21,6 +21,7 @@
 import org.onosproject.yangutils.datamodel.YangSchemaNode;
 import org.onosproject.yangutils.datamodel.YangType;
 import org.onosproject.yms.app.ydt.YdtExtendedContext;
+import org.onosproject.yms.app.yob.exception.YobExceptions;
 import org.onosproject.yms.app.ysr.YangSchemaRegistry;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -70,8 +71,9 @@
         YangSchemaNode node = curYdtNode.getYangSchemaNode();
 
         String qualName = getQualifiedDefaultClassName(node);
-        ClassLoader classLoader = getClassLoader(registry, qualName,
-                                                 curYdtNode);
+        ClassLoader classLoader = getClassLoader(registry,
+                                                 qualName,
+                                                 curYdtNode, rootYdtNode);
 
         if (curYdtNode != rootYdtNode) {
             setterName = node.getJavaAttributeName();
@@ -248,7 +250,7 @@
         String qualifiedClassName = packageName + PERIOD + className;
         ClassLoader classLoader = getClassLoader(registry,
                                                  qualifiedClassName,
-                                                 ydtExtendedContext);
+                                                 ydtExtendedContext, null);
         try {
             childSetClass = classLoader.loadClass(qualifiedClassName);
         } catch (ClassNotFoundException e) {
@@ -292,27 +294,35 @@
      * Updates class loader for all the classes.
      *
      * @param registry           YANG schema registry
-     * @param context            YDT context
+     * @param curNode            YDT context
      * @param qualifiedClassName qualified class name
      * @return current class loader
      */
     private ClassLoader getClassLoader(YangSchemaRegistry registry,
                                        String qualifiedClassName,
+                                       YdtExtendedContext curNode,
                                        YdtExtendedContext context) {
 
-        YangSchemaNode yangSchemaNode = context.getYangSchemaNode();
-        if (yangSchemaNode instanceof RpcNotificationContainer) {
+        if (context != null && curNode == context) {
+            YangSchemaNode yangSchemaNode = curNode.getYangSchemaNode();
+            while (!(yangSchemaNode instanceof RpcNotificationContainer)) {
+                curNode = (YdtExtendedContext) curNode.getParent();
+                if (curNode == null) {
+                    throw new YobExceptions("Invalid YANG data tree");
+                }
+                yangSchemaNode = curNode.getYangSchemaNode();
+            }
+
             Class<?> regClass = registry.getRegisteredClass(yangSchemaNode,
                                                             qualifiedClassName);
             return regClass.getClassLoader();
         } else {
-
             YdtExtendedContext parent =
-                    (YdtExtendedContext) context.getParent();
+                    (YdtExtendedContext) curNode.getParent();
             YobWorkBench parentBuilderContainer =
                     (YobWorkBench) parent.getAppInfo(YOB);
             Object parentObj =
-                    parentBuilderContainer.getParentBuilder(context, registry);
+                    parentBuilderContainer.getParentBuilder(curNode, registry);
             return parentObj.getClass().getClassLoader();
         }
     }