From 5b7f0f3f654a80bb4d96804e695d2d17f660fe0b Mon Sep 17 00:00:00 2001
From: Jayaprakash8887 <Jayaprakash.narayanaswamy@tarento.com>
Date: Wed, 2 Feb 2022 11:29:16 +0530
Subject: [PATCH] Issue #SB-28558 fix: key not found error

---
 .../sunbird/managers/HierarchyManager.scala   | 48 ++++++++++---------
 1 file changed, 26 insertions(+), 22 deletions(-)

diff --git a/content-api/hierarchy-manager/src/main/scala/org/sunbird/managers/HierarchyManager.scala b/content-api/hierarchy-manager/src/main/scala/org/sunbird/managers/HierarchyManager.scala
index 37d0bfa2a..186232d39 100644
--- a/content-api/hierarchy-manager/src/main/scala/org/sunbird/managers/HierarchyManager.scala
+++ b/content-api/hierarchy-manager/src/main/scala/org/sunbird/managers/HierarchyManager.scala
@@ -67,11 +67,11 @@ object HierarchyManager {
                                 val updateResponse = updateHierarchy(unitId, hierarchy, leafNodes, node, request, "add")
                                 updateResponse.map(response => {
                                     if(!ResponseHandler.checkError(response)) {
-                                            ResponseHandler.OK
-                                                .put("rootId", node.getIdentifier.replaceAll(imgSuffix, ""))
-                                                .put(unitId, request.get("children"))
+                                        ResponseHandler.OK
+                                          .put("rootId", node.getIdentifier.replaceAll(imgSuffix, ""))
+                                          .put(unitId, request.get("children"))
                                     }else {
-                                        response 
+                                        response
                                     }
                                 })
                             }).flatMap(f => f)
@@ -331,31 +331,35 @@ object HierarchyManager {
         fetchRelationalMetadata(request, rootNode.getIdentifier).map(collRelationalMetadata => {
             val children = hierarchy.get("children").asInstanceOf[java.util.List[java.util.Map[String, AnyRef]]]
             val leafNodeIds = request.get("children").asInstanceOf[java.util.List[String]]
-            val unitsHierarchyMetadata = collRelationalMetadata(unitId).asInstanceOf[java.util.Map[String, AnyRef]]
+            val unitsHierarchyMetadata = if(collRelationalMetadata.contains(unitId)) collRelationalMetadata(unitId).asInstanceOf[java.util.Map[String, AnyRef]] else new java.util.HashMap[String, AnyRef]()
             if ("add".equalsIgnoreCase(operation)) {
                 val leafNodesMap: java.util.List[java.util.Map[String, AnyRef]] = convertNodeToMap(leafNodes)
                 addChildrenToUnit(children, unitId, leafNodesMap, leafNodeIds, request)
                 //add relationalMetadata for unit
-                unitsHierarchyMetadata.get("children").asInstanceOf[java.util.List[String]].addAll(leafNodeIds)
-                if(request.get("relationalMetadata") != null) {
-                    val rmSchemaValidator = SchemaValidatorFactory.getInstance(HierarchyConstants.RELATIONAL_METADATA.toLowerCase(), "1.0")
-                    val requestRM = request.get("relationalMetadata").asInstanceOf[java.util.Map[String, AnyRef]]
-                    requestRM.foreach(rmChild=>{
-                        rmSchemaValidator.validate(rmChild._2.asInstanceOf[Map[String, AnyRef]])
-                    })
-                    if (unitsHierarchyMetadata.containsKey("relationalMetadata")) {
-                        unitsHierarchyMetadata.get("relationalMetadata").asInstanceOf[java.util.Map[String, AnyRef]].putAll(requestRM)
-                    } else {
-                        unitsHierarchyMetadata.put("relationalMetadata", requestRM)
+                if(collRelationalMetadata.nonEmpty && unitsHierarchyMetadata.nonEmpty) {
+                    unitsHierarchyMetadata.get("children").asInstanceOf[java.util.List[String]].addAll(leafNodeIds)
+                    if (request.get("relationalMetadata") != null) {
+                        val rmSchemaValidator = SchemaValidatorFactory.getInstance(HierarchyConstants.RELATIONAL_METADATA.toLowerCase(), "1.0")
+                        val requestRM = request.get("relationalMetadata").asInstanceOf[java.util.Map[String, AnyRef]]
+                        requestRM.foreach(rmChild => {
+                            rmSchemaValidator.validate(rmChild._2.asInstanceOf[Map[String, AnyRef]])
+                        })
+                        if (unitsHierarchyMetadata.containsKey("relationalMetadata")) {
+                            unitsHierarchyMetadata.get("relationalMetadata").asInstanceOf[java.util.Map[String, AnyRef]].putAll(requestRM)
+                        } else {
+                            unitsHierarchyMetadata.put("relationalMetadata", requestRM)
+                        }
                     }
                 }
             }
             if ("remove".equalsIgnoreCase(operation)) {
                 removeChildrenFromUnit(children, unitId, leafNodeIds)
                 //remove relationalMetadata for unit
-                unitsHierarchyMetadata.get("children").asInstanceOf[java.util.List[String]].removeAll(leafNodeIds)
-                leafNodeIds.foreach(rec => unitsHierarchyMetadata.get("relationalMetadata").asInstanceOf[java.util.Map[String, AnyRef]].remove(rec))
-                if(unitsHierarchyMetadata.get("relationalMetadata").asInstanceOf[java.util.Map[String, AnyRef]].size()==0) unitsHierarchyMetadata.remove("relationalMetadata")
+                if(collRelationalMetadata.nonEmpty && unitsHierarchyMetadata.nonEmpty) {
+                    unitsHierarchyMetadata.get("children").asInstanceOf[java.util.List[String]].removeAll(leafNodeIds)
+                    leafNodeIds.foreach(rec => unitsHierarchyMetadata.get("relationalMetadata").asInstanceOf[java.util.Map[String, AnyRef]].remove(rec))
+                    if (unitsHierarchyMetadata.get("relationalMetadata").asInstanceOf[java.util.Map[String, AnyRef]].size() == 0) unitsHierarchyMetadata.remove("relationalMetadata")
+                }
             }
             val rootId = rootNode.getIdentifier.replaceAll(imgSuffix, "")
             val updatedHierarchy = new java.util.HashMap[String, AnyRef]()
@@ -386,9 +390,9 @@ object HierarchyManager {
         if(null != childList && !childList.isEmpty) {
             val childMap:Map[String, java.util.Map[String, AnyRef]] = childList.toList.map(f => f.get("identifier").asInstanceOf[String] -> f).toMap
             val existingLeafNodes = childMap.filter(p => leafNodeIds.contains(p._1))
-                existingLeafNodes.map(en => {
-                    leafNodeMap.get(en._1).put("index", en._2.get("index").asInstanceOf[Integer])
-                })
+            existingLeafNodes.map(en => {
+                leafNodeMap.get(en._1).put("index", en._2.get("index").asInstanceOf[Integer])
+            })
             filteredLeafNodes = bufferAsJavaList(childList.filter(existingLeafNode => {
                 !leafNodeIds.contains(existingLeafNode.get("identifier").asInstanceOf[String])
             }))
-- 
GitLab