netconf response preparing for 2sector
[oam/tr069-adapter.git] / mapper / src / main / java / org / commscope / tr069adapter / mapper / util / NetconfToTr069MapperUtil.java
index 680495e..81245d0 100644 (file)
@@ -28,7 +28,6 @@ import java.util.HashMap;
 import java.util.List;\r
 import java.util.Map;\r
 import java.util.StringTokenizer;\r
-\r
 import javax.xml.XMLConstants;\r
 import javax.xml.parsers.DocumentBuilder;\r
 import javax.xml.parsers.DocumentBuilderFactory;\r
@@ -37,7 +36,6 @@ import javax.xml.transform.Transformer;
 import javax.xml.transform.TransformerFactory;\r
 import javax.xml.transform.dom.DOMSource;\r
 import javax.xml.transform.stream.StreamResult;\r
-\r
 import org.commscope.tr069adapter.acs.common.DeviceRPCRequest;\r
 import org.commscope.tr069adapter.acs.common.DeviceRPCResponse;\r
 import org.commscope.tr069adapter.acs.common.OperationOptions;\r
@@ -45,7 +43,7 @@ import org.commscope.tr069adapter.acs.common.ParameterDTO;
 import org.commscope.tr069adapter.acs.common.dto.TR069DeviceDetails;\r
 import org.commscope.tr069adapter.acs.common.dto.TR069OperationCode;\r
 import org.commscope.tr069adapter.acs.common.dto.TR069OperationDetails;\r
-import org.commscope.tr069adapter.mapper.ErrorCodeMetaData;\r
+import org.commscope.tr069adapter.mapper.MapperConfigProperties;\r
 import org.commscope.tr069adapter.mapper.model.ErrorCodeDetails;\r
 import org.commscope.tr069adapter.mapper.model.NetConfResponse;\r
 import org.slf4j.Logger;\r
@@ -64,6 +62,9 @@ public class NetconfToTr069MapperUtil {
   @Autowired\r
   MOMetaDataUtil metaDataUtil;\r
 \r
+  @Autowired\r
+  MapperConfigProperties config;\r
+\r
   private static final Logger logger = LoggerFactory.getLogger(NetconfToTr069MapperUtil.class);\r
   private static final String INDEX_STR = "index";\r
   private static final String INDEX_REGEX = "[0-9]{1,}";\r
@@ -96,6 +97,13 @@ public class NetconfToTr069MapperUtil {
     return null;\r
   }\r
 \r
+  public static Map<String, String> extractRequestParamters(Document operationElement,\r
+      String netconfTag, String filterElement) {\r
+    Node requestDataNode = getParameterDataNode(operationElement, netconfTag, filterElement);\r
+    Map<String, String> map = getParameterMapForNode(requestDataNode, -1);\r
+    return map;\r
+  }\r
+\r
   public static DeviceRPCRequest prepareTR069Request(String deviceId, Element operationElement,\r
       String netconfTag, TR069OperationCode opCode) {\r
     Node requestDataNode = getDeviceDataNode(operationElement, netconfTag);\r
@@ -126,6 +134,11 @@ public class NetconfToTr069MapperUtil {
 \r
     TR069OperationDetails opDetails = new TR069OperationDetails();\r
     opDetails.setOpCode(opCode);\r
+    return handleParamsOperation(params, opDetails, deviceId);\r
+  }\r
+\r
+  public static DeviceRPCRequest handleParamsOperation(List<ParameterDTO> params,\r
+      TR069OperationDetails opDetails, String deviceId) {\r
     opDetails.setParmeters(params);\r
 \r
     DeviceRPCRequest deviceRPCRequest = new DeviceRPCRequest();\r
@@ -139,17 +152,17 @@ public class NetconfToTr069MapperUtil {
     return deviceRPCRequest;\r
   }\r
 \r
-  public NetConfResponse getNetconfResponse(DeviceRPCResponse opResult) {\r
+  public NetConfResponse getNetconfResponse(DeviceRPCResponse opResult, String swVersion,\r
+      String hwVersion, boolean isCustomparameter) {\r
     NetConfResponse netConfResponse = new NetConfResponse();\r
-    ErrorCodeMetaData errorCodeMetaData =\r
-        errorCodeUtil.getErrorCodeMetaData(opResult.getFaultKey());\r
+    ErrorCodeDetails errorCodeDetails = errorCodeUtil.getErrorCodeMetaData(opResult.getFaultKey());\r
     ErrorCodeDetails errorCode = new ErrorCodeDetails();\r
-    if (errorCodeMetaData != null) {\r
+    if (errorCodeDetails != null) {\r
       errorCode.setFaultCode(opResult.getFaultKey());\r
-      errorCode.setErrorMessage(errorCodeMetaData.getErrorMessage());\r
-      errorCode.setErrorType(errorCodeMetaData.getErrorType());\r
-      errorCode.setErrorTag(errorCodeMetaData.getErrorTag());\r
-      errorCode.setErrorSeverity(errorCodeMetaData.getErrorSeverity());\r
+      errorCode.setErrorMessage(errorCodeDetails.getErrorMessage());\r
+      errorCode.setErrorType(errorCodeDetails.getErrorType());\r
+      errorCode.setErrorTag(errorCodeDetails.getErrorTag());\r
+      errorCode.setErrorSeverity(errorCodeDetails.getErrorSeverity());\r
       netConfResponse.setErrorCode(errorCode);\r
       netConfResponse.setErrorMessage(opResult.getFaultString());\r
     } else if (opResult.getFaultKey() != null && opResult.getFaultString() != null) {\r
@@ -162,13 +175,133 @@ public class NetconfToTr069MapperUtil {
       netConfResponse.setErrorMessage(opResult.getFaultString());\r
     }\r
     netConfResponse.setNetconfResponseXml(\r
-        getNetconfResponseXML(opResult.getOperationResponse().getParameterDTOs()));\r
+        getNetconfResponseXML(opResult.getOperationResponse().getParameterDTOs(), swVersion,\r
+            hwVersion, isCustomparameter));\r
     return netConfResponse;\r
   }\r
 \r
-  private String getNetconfResponseXML(List<ParameterDTO> parameters) {\r
-    if (null == parameters || parameters.isEmpty()) {\r
+  public NetConfResponse getNetconfResponseForSoftwareInventory(DeviceRPCResponse opResult,\r
+      String swVersion, String hwVersion) {\r
+\r
+    NetConfResponse netConfResponse = new NetConfResponse();\r
+    ErrorCodeDetails errorCodeDetails = errorCodeUtil.getErrorCodeMetaData(opResult.getFaultKey());\r
+    ErrorCodeDetails errorCode = new ErrorCodeDetails();\r
+    if (errorCodeDetails != null) {\r
+      errorCode.setFaultCode(opResult.getFaultKey());\r
+      errorCode.setErrorMessage(errorCodeDetails.getErrorMessage());\r
+      errorCode.setErrorType(errorCodeDetails.getErrorType());\r
+      errorCode.setErrorTag(errorCodeDetails.getErrorTag());\r
+      errorCode.setErrorSeverity(errorCodeDetails.getErrorSeverity());\r
+      netConfResponse.setErrorCode(errorCode);\r
+      netConfResponse.setErrorMessage(opResult.getFaultString());\r
+      return netConfResponse;\r
+    } else if (opResult.getFaultKey() != null && opResult.getFaultString() != null) {\r
+      errorCode.setFaultCode(opResult.getFaultKey());\r
+      errorCode.setErrorMessage(opResult.getFaultString());\r
+      errorCode.setErrorType("application");\r
+      errorCode.setErrorTag("operation-failed");\r
+      errorCode.setErrorSeverity("ERROR");\r
+      netConfResponse.setErrorCode(errorCode);\r
+      netConfResponse.setErrorMessage(opResult.getFaultString());\r
+      return netConfResponse;\r
+    }\r
+    List<ParameterDTO> paramDTOList = new ArrayList<>();\r
+\r
+    String build = null;\r
+    String productClass = null;\r
+    for (ParameterDTO paramDto : opResult.getOperationResponse().getParameterDTOs()) {\r
+      if (paramDto.getParamName().equals("Device.DeviceInfo.SoftwareVersion"))\r
+        build = paramDto.getParamValue();\r
+      else if (paramDto.getParamName().equals("Device.DeviceInfo.ProductClass"))\r
+        productClass = paramDto.getParamValue();\r
+    }\r
+\r
+    String[] arrOfBuild = build.split("\\.");\r
+    String buildId = arrOfBuild[arrOfBuild.length - 1];\r
+    StringBuilder buildVersion = new StringBuilder();\r
+    for (int i = 0; i < arrOfBuild.length - 1; i++) {\r
+      if (i == arrOfBuild.length - 2) {\r
+        buildVersion.append(arrOfBuild[i]);\r
+      } else {\r
+        buildVersion.append(arrOfBuild[i]);\r
+        buildVersion.append(".");\r
+      }\r
+    }\r
+\r
+    paramDTOList.add(new ParameterDTO("software-inventory.software-slot.name", "Active Partition"));\r
+    paramDTOList.add(new ParameterDTO("software-inventory.software-slot.status", "VALID"));\r
+    paramDTOList.add(new ParameterDTO("software-inventory.software-slot.active", "true"));\r
+    paramDTOList.add(new ParameterDTO("software-inventory.software-slot.running", "true"));\r
+    paramDTOList.add(new ParameterDTO("software-inventory.software-slot.access", "READ_ONLY"));\r
+    paramDTOList\r
+        .add(new ParameterDTO("software-inventory.software-slot.product-code", productClass));\r
+    paramDTOList.add(\r
+        new ParameterDTO("software-inventory.software-slot.vendor-code", config.getVendorName()));\r
+    paramDTOList.add(new ParameterDTO("software-inventory.software-slot.build-id", buildId));\r
+    paramDTOList.add(new ParameterDTO("software-inventory.software-slot.build-version",\r
+        buildVersion.toString()));\r
+    paramDTOList.add(new ParameterDTO("software-inventory.software-slot.files.name", "BC_ONE"));\r
+    paramDTOList.add(new ParameterDTO("software-inventory.software-slot.files.integrity", "OK"));\r
+\r
+    String XmlStr = getNetconfResponseXML(paramDTOList, swVersion, hwVersion, true);\r
+\r
+    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();\r
+    DocumentBuilder builder;\r
+    Document doc = null;\r
+    try {\r
+      builder = factory.newDocumentBuilder();\r
+      doc = builder.parse(new InputSource(new StringReader(XmlStr)));\r
+    } catch (Exception e) {\r
+      logger.error("Error while converting String to element" + e);\r
+      errorCode.setFaultCode("8002");\r
+      errorCode.setErrorMessage("Operation Aborted");\r
+      errorCode.setErrorType("application");\r
+      errorCode.setErrorTag("operation-failed");\r
+      errorCode.setErrorSeverity("ERROR");\r
+      netConfResponse.setErrorCode(errorCode);\r
+      netConfResponse.setErrorMessage("Operation Aborted");\r
+      return netConfResponse;\r
+    }\r
+\r
+    Element originalDocumentElement = doc.getDocumentElement();\r
+    Element newDocumentElement = doc.createElementNS("urn:o-ran:software-management:1.0",\r
+        originalDocumentElement.getNodeName());\r
+    NodeList list = originalDocumentElement.getChildNodes();\r
+    while (list.getLength() != 0) {\r
+      newDocumentElement.appendChild(list.item(0));\r
+    }\r
+    // Replace the original element\r
+    doc.replaceChild(newDocumentElement, originalDocumentElement);\r
+\r
+    String strxml = null;\r
+    try {\r
+      TransformerFactory transformerFactory = TransformerFactory.newInstance();\r
+      Transformer transformer = transformerFactory.newTransformer();\r
+      DOMSource source = new DOMSource(doc);\r
+      StreamResult result = new StreamResult(new StringWriter());\r
+      transformer.transform(source, result);\r
+      strxml = result.getWriter().toString();\r
+    } catch (Exception e) {\r
+      logger.error("Error while converting Element to String" + e);\r
+      errorCode.setFaultCode("8002");\r
+      errorCode.setErrorMessage("Operation Aborted");\r
+      errorCode.setErrorType("application");\r
+      errorCode.setErrorTag("operation-failed");\r
+      errorCode.setErrorSeverity("ERROR");\r
+      netConfResponse.setErrorCode(errorCode);\r
+      netConfResponse.setErrorMessage("Operation Aborted");\r
+      return netConfResponse;\r
+    }\r
+\r
+    netConfResponse.setNetconfResponseXml(strxml);\r
+    logger.debug("NetConf Response XML String for software inventory: " + strxml);\r
+    return netConfResponse;\r
+  }\r
 \r
+  private String getNetconfResponseXML(List<ParameterDTO> parameters, String swVersion,\r
+      String hwVersion, boolean isCustomparameter) {\r
+    if (null == parameters || parameters.isEmpty()) {\r
+      // LOG.debug("There are no parameters found in the response.");\r
       return null;\r
     }\r
     Collections.sort(parameters, new SortByParamterName());\r
@@ -176,8 +309,6 @@ public class NetconfToTr069MapperUtil {
     String result = null;\r
     try {\r
       DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();\r
-      docFactory.setAttribute(XMLConstants.ACCESS_EXTERNAL_DTD, "");\r
-      docFactory.setAttribute(XMLConstants.ACCESS_EXTERNAL_SCHEMA, "");\r
       DocumentBuilder docBuilder = docFactory.newDocumentBuilder();\r
       Document doc = docBuilder.newDocument();\r
 \r
@@ -185,11 +316,13 @@ public class NetconfToTr069MapperUtil {
       Element dataNode = null; // root of all nodes\r
 \r
       for (ParameterDTO paramDto : parameters) {\r
-        String paramName =\r
-            metaDataUtil.getNetconfNameByTR69NameWithIndexes(paramDto.getParamName());\r
+        String paramName = metaDataUtil.getNetconfNameByTR69NameWithIndexes(paramDto.getParamName(),\r
+            swVersion, hwVersion);\r
+        if (paramName == null && isCustomparameter) {\r
+          paramName = paramDto.getParamName();\r
+        }\r
         String paramValue = paramDto.getParamValue();\r
         if (paramValue == null || paramValue.trim().isEmpty()) {\r
-          logger.debug("Values is empty so skipping this parameter.");\r
           continue;\r
         }\r
         StringTokenizer tokenizer = new StringTokenizer(paramName, ".");\r
@@ -207,24 +340,24 @@ public class NetconfToTr069MapperUtil {
             if (null == dataNode) {\r
               dataNode = parentNode;\r
             }\r
-\r
+            continue;\r
           } else if (nodeName.matches(INDEX_REGEX)) { // construct\r
                                                       // tabular and\r
                                                       // index nodes\r
 \r
             // get parent tabular node from parent MAP\r
-            StringBuilder bld = new StringBuilder(parentNodeKey);\r
-            bld.append(".");\r
-            bld.append(nodeName);\r
-            parentNodeKey = bld.toString();\r
+            parentNodeKey = parentNodeKey + "." + nodeName;\r
             Element node = parentNodeMap.get(parentNodeKey);\r
 \r
             // create a tabular parent node if doesn't exit in MAP\r
             if (null == node) {\r
-              if (metaDataUtil.getMetaDataByNetConfName(parentNodeKey + ".") != null\r
-                  && metaDataUtil.getMetaDataByNetConfName(parentNodeKey + ".").getURI() != null) {\r
-                node = doc.createElementNS(\r
-                    metaDataUtil.getMetaDataByNetConfName(parentNodeKey + ".").getURI(),\r
+              if (metaDataUtil.getMetaDataByNetConfName(parentNodeKey + ".", swVersion,\r
+                  hwVersion) != null\r
+                  && metaDataUtil\r
+                      .getMetaDataByNetConfName(parentNodeKey + ".", swVersion, hwVersion)\r
+                      .getURI() != null) {\r
+                node = doc.createElementNS(metaDataUtil\r
+                    .getMetaDataByNetConfName(parentNodeKey + ".", swVersion, hwVersion).getURI(),\r
                     parentNodeName);\r
               } else {\r
                 node = doc.createElement(parentNodeName);\r
@@ -250,19 +383,18 @@ public class NetconfToTr069MapperUtil {
                                                             // attribute\r
                                                             // is\r
                                                             // found\r
-            StringBuilder bld = new StringBuilder(parentNodeName);\r
-            bld.append(".");\r
-            bld.append(nodeName);\r
-            parentNodeKey = bld.toString();\r
+            parentNodeKey = parentNodeKey + "." + nodeName;\r
             parentNodeName = nodeName;\r
           } else {\r
             // construct intermediate nodes\r
             Element node = parentNodeMap.get(parentNodeKey);\r
             if (null == node) {\r
-              if (metaDataUtil.getMetaDataByNetConfName(parentNodeKey) != null\r
-                  && metaDataUtil.getMetaDataByNetConfName(parentNodeKey).getURI() != null) {\r
-                node = doc.createElementNS(\r
-                    metaDataUtil.getMetaDataByNetConfName(parentNodeKey).getURI(), parentNodeName);\r
+              if (metaDataUtil.getMetaDataByNetConfName(parentNodeKey, swVersion, hwVersion) != null\r
+                  && metaDataUtil.getMetaDataByNetConfName(parentNodeKey, swVersion, hwVersion)\r
+                      .getURI() != null) {\r
+                node = doc.createElementNS(metaDataUtil\r
+                    .getMetaDataByNetConfName(parentNodeKey, swVersion, hwVersion).getURI(),\r
+                    parentNodeName);\r
                 if (dataNode == null)\r
                   dataNode = node;\r
               } else {\r
@@ -273,10 +405,7 @@ public class NetconfToTr069MapperUtil {
                 parentNode.appendChild(node);\r
 \r
             }\r
-            StringBuilder bld = new StringBuilder(parentNodeKey);\r
-            bld.append(".");\r
-            bld.append(nodeName);\r
-            parentNodeKey = bld.toString();\r
+            parentNodeKey = parentNodeKey + "." + nodeName;\r
             parentNodeName = nodeName;\r
             parentNode = node;\r
           }\r
@@ -284,15 +413,15 @@ public class NetconfToTr069MapperUtil {
         // construct leaf node\r
         Element leafNode = doc.createElement(parentNodeName);\r
         leafNode.setTextContent(paramValue);\r
-        if (null != parentNode)\r
+        if (parentNode != null)\r
           parentNode.appendChild(leafNode);\r
       }\r
 \r
       if (null != dataNode) {\r
-        result = NetconfToTr069MapperUtil.convertDocumentToString(dataNode);\r
+        result = convertDocumentToString(dataNode);\r
       }\r
     } catch (ParserConfigurationException pce) {\r
-      logger.error("Exception : {}", pce.getMessage());\r
+      logger.error("Response xml formatting is failed : {} ", pce.toString());\r
     }\r
 \r
     return result;\r
@@ -322,28 +451,15 @@ public class NetconfToTr069MapperUtil {
     if (moRNode.getNodeType() == Node.ELEMENT_NODE) {\r
       NodeList childs = moRNode.getChildNodes();\r
       boolean hasChildElements = false;\r
-      if (childs.getLength() > 0) {\r
-        int counter = 0;\r
-        for (int i = 0; i < childs.getLength(); i++) {\r
-          Node cNode = childs.item(i);\r
-          if (cNode != null && cNode.getNodeType() == Node.ELEMENT_NODE) {\r
-            counter++;\r
-          }\r
-        }\r
-\r
-        for (int i = 0; i < childs.getLength(); i++) {\r
-          Node cNode = childs.item(i);\r
-          if (cNode != null && cNode.getNodeType() == Node.ELEMENT_NODE) {\r
-            hasChildElements = true;\r
-            Map<String, String> subResult = getParameterMapForNode(cNode, counter);\r
-            result.putAll(subResult);\r
-          }\r
-        }\r
-      }\r
+      hasChildElements = checkMoreElements(result, childs, hasChildElements);\r
       if (!hasChildElements) {\r
         String moName = getMOName(moRNode);\r
-        if ((null != moName && !moName.endsWith("." + INDEX_STR))\r
-            || (null != moName && numberOfChilds == 1)) {\r
+        if (moName.equals("software-inventory")) {\r
+          result.put("device.device-info.software-version", moRNode.getTextContent());\r
+          result.put("device.device-info.product-class", moRNode.getTextContent());\r
+        } else if (!moName.endsWith("." + INDEX_STR)) {\r
+          result.put(moName, moRNode.getTextContent());\r
+        } else if (numberOfChilds == 1) {\r
           result.put(moName, moRNode.getTextContent());\r
         }\r
       }\r
@@ -352,6 +468,29 @@ public class NetconfToTr069MapperUtil {
     return result;\r
   }\r
 \r
+  private static boolean checkMoreElements(Map<String, String> result, NodeList childs,\r
+      boolean hasChildElements) {\r
+    if (childs.getLength() > 0) {\r
+      int counter = 0;\r
+      for (int i = 0; i < childs.getLength(); i++) {\r
+        Node cNode = childs.item(i);\r
+        if (cNode != null && cNode.getNodeType() == Node.ELEMENT_NODE) {\r
+          counter++;\r
+        }\r
+      }\r
+\r
+      for (int i = 0; i < childs.getLength(); i++) {\r
+        Node cNode = childs.item(i);\r
+        if (cNode != null && cNode.getNodeType() == Node.ELEMENT_NODE) {\r
+          hasChildElements = true;\r
+          Map<String, String> subResult = getParameterMapForNode(cNode, counter);\r
+          result.putAll(subResult);\r
+        }\r
+      }\r
+    }\r
+    return hasChildElements;\r
+  }\r
+\r
   private static String getMOName(Node moRNode) {\r
     String result = removeNS(moRNode.getNodeName());\r
     Node pNode = moRNode;\r
@@ -379,6 +518,21 @@ public class NetconfToTr069MapperUtil {
     }\r
   }\r
 \r
+  private static Node getParameterDataNode(Document el, String docStart, String filterElement) {\r
+    NodeList nodeList = el.getElementsByTagName(docStart);\r
+    if (nodeList.getLength() > 0) {\r
+      nodeList = nodeList.item(0).getChildNodes();\r
+      for (int i = 0; i < nodeList.getLength(); i++) {\r
+        Node node = nodeList.item(i);\r
+        String nodeName = removeNS(node.getNodeName());\r
+        if (nodeName.equals(filterElement)) {\r
+          return node;\r
+        }\r
+      }\r
+    }\r
+    return null;\r
+  }\r
+\r
   private static Node getDeviceDataNode(Element el, String filter) {\r
     try {\r
       NodeList nodeList = el.getElementsByTagName(filter);\r