Fix: Update Sonar needed parameters
[oam/tr069-adapter.git] / acs / requestprocessor / src / main / java / org / commscope / tr069adapter / acs / requestprocessor / dao / DeviceRPCRequestRepositoryHelper.java
1 /*\r
2  * ============LICENSE_START========================================================================\r
3  * ONAP : tr-069-adapter\r
4  * =================================================================================================\r
5  * Copyright (C) 2020 CommScope Inc Intellectual Property.\r
6  * =================================================================================================\r
7  * This tr-069-adapter software file is distributed by CommScope Inc under the Apache License,\r
8  * Version 2.0 (the "License"); you may not use this file except in compliance with the License. You\r
9  * may obtain a copy of the License at\r
10  *\r
11  * http://www.apache.org/licenses/LICENSE-2.0\r
12  *\r
13  * This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,\r
14  * either express or implied. See the License for the specific language governing permissions and\r
15  * limitations under the License.\r
16  * ===============LICENSE_END=======================================================================\r
17  */\r
18 \r
19 package org.commscope.tr069adapter.acs.requestprocessor.dao;\r
20 \r
21 import java.util.ArrayList;\r
22 import java.util.Collections;\r
23 import java.util.Comparator;\r
24 import java.util.HashMap;\r
25 import java.util.Iterator;\r
26 import java.util.List;\r
27 import java.util.Map;\r
28 \r
29 import org.commscope.tr069adapter.acs.common.DeviceRPCRequest;\r
30 import org.commscope.tr069adapter.acs.common.exception.TR069EventProcessingException;\r
31 import org.commscope.tr069adapter.acs.common.utils.ErrorCode;\r
32 import org.commscope.tr069adapter.acs.requestprocessor.entity.TR069DeviceRPCRequestEntity;\r
33 import org.commscope.tr069adapter.acs.requestprocessor.util.TR069RequestProcessorUtility;\r
34 import org.slf4j.Logger;\r
35 import org.slf4j.LoggerFactory;\r
36 import org.springframework.beans.factory.annotation.Autowired;\r
37 import org.springframework.stereotype.Component;\r
38 \r
39 @Component\r
40 public class DeviceRPCRequestRepositoryHelper {\r
41 \r
42   private static final Logger logger =\r
43       LoggerFactory.getLogger(DeviceRPCRequestRepositoryHelper.class);\r
44 \r
45   @Autowired\r
46   protected DeviceRPCRequestRepository deviceRPCRequestRepository;\r
47 \r
48   /**\r
49    * @param tr069DeviceRPCRequestEntities\r
50    */\r
51   public void saveAll(List<TR069DeviceRPCRequestEntity> tr069DeviceRPCRequestEntities) {\r
52     deviceRPCRequestRepository.saveAll(tr069DeviceRPCRequestEntities);\r
53   }\r
54 \r
55   /**\r
56    * @param deviceId\r
57    * @return\r
58    */\r
59   public List<TR069DeviceRPCRequestEntity> findByDeviceId(String deviceId) {\r
60     List<TR069DeviceRPCRequestEntity> deviceRPCRequestEntities =\r
61         deviceRPCRequestRepository.findByDeviceId(deviceId);\r
62     Collections.sort(deviceRPCRequestEntities, idComparator);\r
63     return deviceRPCRequestEntities;\r
64   }\r
65 \r
66   /**\r
67    * @param deviceId\r
68    * @param operationId\r
69    * @return\r
70    */\r
71   public List<TR069DeviceRPCRequestEntity> findByDeviceIdAndOperationId(String deviceId,\r
72       Long operationId) {\r
73     List<TR069DeviceRPCRequestEntity> deviceRPCRequestEntities =\r
74         deviceRPCRequestRepository.findByDeviceIdAndOperationId(deviceId, operationId);\r
75     Collections.sort(deviceRPCRequestEntities, idComparator);\r
76     return deviceRPCRequestEntities;\r
77   }\r
78 \r
79   /**\r
80    * @param deviceId\r
81    * @return\r
82    * @throws TR069EventProcessingException\r
83    */\r
84   public List<DeviceRPCRequest> findAllDeviceRPCRequests(String deviceId) {\r
85     logger.debug("Retrieving all the pending Device RPC requests");\r
86     List<DeviceRPCRequest> deviceRPCRequestList = new ArrayList<>();\r
87     List<TR069DeviceRPCRequestEntity> deviceRPCRequestEntities =\r
88         deviceRPCRequestRepository.findByDeviceIdAndIsProcessed(deviceId, 0);\r
89     if (deviceRPCRequestEntities == null) {\r
90       logger.debug("There exists no pending RPC requests for the device: {}", deviceId);\r
91       return deviceRPCRequestList;\r
92     }\r
93 \r
94     logger.debug("Grouping the records based on operationId");\r
95     Map<Long, List<TR069DeviceRPCRequestEntity>> opIdEntityMap = new HashMap<>();\r
96     for (TR069DeviceRPCRequestEntity entity : deviceRPCRequestEntities) {\r
97       List<TR069DeviceRPCRequestEntity> entityList = opIdEntityMap.get(entity.getOperationId());\r
98       if (entityList == null) {\r
99         entityList = new ArrayList<>();\r
100         opIdEntityMap.put(entity.getOperationId(), entityList);\r
101       }\r
102       entityList.add(entity);\r
103     }\r
104 \r
105     logger.debug("There exists {} pending NBI requests for the device", opIdEntityMap.size());\r
106     Iterator<Long> opIdIterator = opIdEntityMap.keySet().iterator();\r
107     while (opIdIterator.hasNext()) {\r
108       Long operationId = opIdIterator.next();\r
109       List<TR069DeviceRPCRequestEntity> entityList = opIdEntityMap.get(operationId);\r
110       Collections.sort(entityList, idComparator);\r
111       deviceRPCRequestList.add(TR069RequestProcessorUtility.convertToDTO(entityList));\r
112     }\r
113 \r
114     return deviceRPCRequestList;\r
115   }\r
116 \r
117   /**\r
118    * @param deviceId\r
119    * @return\r
120    * @throws TR069EventProcessingException\r
121    */\r
122 \r
123   public DeviceRPCRequest findOldestDeviceRPCRequest(String deviceId) {\r
124     logger.debug("Retrieving the oldest pending Device RPC request");\r
125 \r
126     List<TR069DeviceRPCRequestEntity> deviceRPCRequestEntities =\r
127         deviceRPCRequestRepository.findByDeviceIdAndIsProcessed(deviceId, 0);\r
128     if (deviceRPCRequestEntities == null || deviceRPCRequestEntities.isEmpty()) {\r
129       logger.debug("There exists no pending Device RPC requests for the device: {}", deviceId);\r
130       return null;\r
131     }\r
132 \r
133     List<TR069DeviceRPCRequestEntity> deviceRPCRequestEntityList =\r
134         getOldestDeviceRPCRequestList(deviceRPCRequestEntities);\r
135 \r
136     if (deviceRPCRequestEntityList != null) {\r
137       Collections.sort(deviceRPCRequestEntityList, idComparator);\r
138       return TR069RequestProcessorUtility.convertToDTO(deviceRPCRequestEntityList);\r
139     } else {\r
140       logger.debug("Empty deviceRPCRequestEntityList");\r
141       return null;\r
142     }\r
143 \r
144   }\r
145 \r
146   private List<TR069DeviceRPCRequestEntity> getOldestDeviceRPCRequestList(\r
147       List<TR069DeviceRPCRequestEntity> deviceRPCRequestEntities) {\r
148     List<TR069DeviceRPCRequestEntity> deviceRPCRequestEntityList = null;\r
149 \r
150     logger.debug("Grouping the records based on operationId");\r
151     Map<Long, List<TR069DeviceRPCRequestEntity>> opIdEntityMap = new HashMap<>();\r
152     for (TR069DeviceRPCRequestEntity entity : deviceRPCRequestEntities) {\r
153       List<TR069DeviceRPCRequestEntity> entityList = opIdEntityMap.get(entity.getOperationId());\r
154       if (entityList == null) {\r
155         entityList = new ArrayList<>();\r
156         opIdEntityMap.put(entity.getOperationId(), entityList);\r
157       }\r
158       entityList.add(entity);\r
159     }\r
160 \r
161     Iterator<Long> opIdIterator = opIdEntityMap.keySet().iterator();\r
162     while (opIdIterator.hasNext()) {\r
163       Long operationId = opIdIterator.next();\r
164       List<TR069DeviceRPCRequestEntity> entityList = opIdEntityMap.get(operationId);\r
165       TR069DeviceRPCRequestEntity entity = entityList.get(0);\r
166       if (deviceRPCRequestEntityList == null) {\r
167         deviceRPCRequestEntityList = entityList;\r
168       } else {\r
169         if (entity.getCreateTime().before(deviceRPCRequestEntityList.get(0).getCreateTime()))\r
170           deviceRPCRequestEntityList = entityList;\r
171       }\r
172     }\r
173 \r
174     return deviceRPCRequestEntityList;\r
175   }\r
176 \r
177   /**\r
178    * @param operationId\r
179    * @throws TR069EventProcessingException\r
180    */\r
181   public void markDeviceRPCRequestAsProcessed(String deviceId, Long operationId)\r
182       throws TR069EventProcessingException {\r
183     logger.debug("Marking the Device RPC request for device: {} and operationId: {} as processed",\r
184         deviceId, operationId);\r
185     List<TR069DeviceRPCRequestEntity> deviceRPCRequestEntityList =\r
186         deviceRPCRequestRepository.findByDeviceIdAndOperationId(deviceId, operationId);\r
187     if (deviceRPCRequestEntityList == null) {\r
188       TR069EventProcessingException ex =\r
189           new TR069EventProcessingException(ErrorCode.MISSING_OPERATION_DETAILS);\r
190       logger.error(ex.getMessage());\r
191       throw ex;\r
192     }\r
193 \r
194     for (TR069DeviceRPCRequestEntity deviceRPCRequestEntity : deviceRPCRequestEntityList) {\r
195       deviceRPCRequestEntity.setIsProcessed(Integer.valueOf(1));\r
196     }\r
197     deviceRPCRequestRepository.saveAll(deviceRPCRequestEntityList);\r
198   }\r
199 \r
200 \r
201   public static final Comparator<TR069DeviceRPCRequestEntity> idComparator =\r
202       (TR069DeviceRPCRequestEntity e1, TR069DeviceRPCRequestEntity e2) -> e1.getId()\r
203           .compareTo(e2.getId());\r
204 \r
205 }\r