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
11 * http://www.apache.org/licenses/LICENSE-2.0
\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
19 package org.commscope.tr069adapter.acs.requestprocessor.custom;
\r
21 import static org.commscope.tr069adapter.acs.common.utils.AcsConstants.NUMBER_REGEX;
\r
22 import static org.commscope.tr069adapter.acs.common.utils.AcsConstants.SUCCESS;
\r
23 import java.util.ArrayList;
\r
24 import java.util.List;
\r
25 import java.util.regex.Matcher;
\r
26 import java.util.regex.Pattern;
\r
27 import org.commscope.tr069adapter.acs.common.DeviceRPCRequest;
\r
28 import org.commscope.tr069adapter.acs.common.DeviceRPCResponse;
\r
29 import org.commscope.tr069adapter.acs.common.OperationDetails;
\r
30 import org.commscope.tr069adapter.acs.common.OperationResponse;
\r
31 import org.commscope.tr069adapter.acs.common.ParameterDTO;
\r
32 import org.commscope.tr069adapter.acs.common.dto.TR069DeviceDetails;
\r
33 import org.commscope.tr069adapter.acs.common.dto.TR069OperationCode;
\r
34 import org.commscope.tr069adapter.acs.common.dto.TR069OperationDetails;
\r
35 import org.commscope.tr069adapter.acs.common.exception.TR069EventProcessingException;
\r
36 import org.commscope.tr069adapter.acs.common.response.AddObjectResponse;
\r
37 import org.commscope.tr069adapter.acs.common.response.DeleteObjectResponse;
\r
38 import org.commscope.tr069adapter.acs.common.response.GetParameterValueResponse;
\r
39 import org.commscope.tr069adapter.acs.common.response.SetParameterValueResponse;
\r
40 import org.commscope.tr069adapter.acs.requestprocessor.dao.DeviceRPCRequestRepositoryHelper;
\r
41 import org.commscope.tr069adapter.acs.requestprocessor.dto.CustomOperationData;
\r
42 import org.commscope.tr069adapter.acs.requestprocessor.entity.TR069DeviceRPCRequestEntity;
\r
43 import org.commscope.tr069adapter.acs.requestprocessor.impl.TR069RequestProcessEngine;
\r
44 import org.commscope.tr069adapter.acs.requestprocessor.util.TR069RequestProcessorUtility;
\r
45 import org.slf4j.Logger;
\r
46 import org.slf4j.LoggerFactory;
\r
47 import org.springframework.beans.factory.annotation.Autowired;
\r
48 import org.springframework.stereotype.Component;
\r
50 @Component("ConfigureMultipleObject")
\r
51 public class ConfigureMultipleObject implements CustomOperation {
\r
53 private static final Logger logger = LoggerFactory.getLogger(ConfigureMultipleObject.class);
\r
56 TR069RequestProcessEngine tr069ProcessEngine;
\r
59 protected DeviceRPCRequestRepositoryHelper deviceRPCRequestRepositoryHelper;
\r
61 public CustomOperationData executeCustomLogic(CustomOperationData customOperationData)
\r
62 throws TR069EventProcessingException {
\r
64 TR069DeviceDetails deviceDetails = customOperationData.getDeviceDetails();
\r
65 DeviceRPCResponse deviceRPCResponse = customOperationData.getDeviceRPCResponse();
\r
66 DeviceRPCRequest nbiDeviceOperationRequest = customOperationData.getDeviceRPCRequest();
\r
68 logger.debug("Started processing Configure multiple object");
\r
69 DeviceRPCRequest operRequest = null;
\r
70 Long responseOperationId = null;
\r
71 if (deviceRPCResponse != null && deviceRPCResponse.getOperationId() != null) {
\r
72 responseOperationId = deviceRPCResponse.getOperationId();
\r
73 if (deviceRPCResponse.getFaultKey() != null && responseOperationId != null
\r
74 && responseOperationId.equals(nbiDeviceOperationRequest.getOperationId())) {
\r
75 logger.error("The Configure Multiple Object operation has failed, Reason: {}",
\r
76 deviceRPCResponse.getFaultString());
\r
79 "Deleting the NBI operation request for custom operation configureMultipleObjects with operation ID: {}",
\r
80 responseOperationId);
\r
81 List<TR069DeviceRPCRequestEntity> tr069DeviceRPCRequestEntityList =
\r
82 deviceRPCRequestRepositoryHelper
\r
83 .findByDeviceIdAndOperationId(deviceDetails.getDeviceId(), responseOperationId);
\r
84 for (TR069DeviceRPCRequestEntity tr069DeviceRPCRequestEntity : tr069DeviceRPCRequestEntityList) {
\r
85 tr069DeviceRPCRequestEntity.setIsProcessed(Integer.valueOf(1));
\r
87 deviceRPCRequestRepositoryHelper.saveAll(tr069DeviceRPCRequestEntityList);
\r
89 OperationResponse operationResponse = new GetParameterValueResponse();
\r
90 operationResponse.setParameterDTOs(new ArrayList<ParameterDTO>());
\r
91 operationResponse.setStatus(1);
\r
92 deviceRPCResponse.setOperationResponse(operationResponse);
\r
94 customOperationData.setDeviceRPCResponse(deviceRPCResponse);
\r
95 customOperationData.setDeviceRPCRequest(null);
\r
96 logger.debug("Finished processing Configure multiple object");
\r
97 return customOperationData;
\r
101 TR069OperationDetails tr069OperationDetails =
\r
102 (TR069OperationDetails) nbiDeviceOperationRequest.getOpDetails();
\r
103 List<ParameterDTO> tr069deleteParamList = tr069OperationDetails.getDeleteParamList();
\r
104 List<ParameterDTO> tr069modifyParamList = tr069OperationDetails.getModifyParamList();
\r
105 List<ParameterDTO> tr069setParamList = tr069OperationDetails.getSetParamList();
\r
107 OperationOrder nextOperation = null;
\r
108 boolean isPendingOperationExists = true;
\r
109 final String NXT_OPERATION = "Next operation to be executed is : ";
\r
111 if ((responseOperationId == null) || (responseOperationId != null
\r
112 && !responseOperationId.equals(nbiDeviceOperationRequest.getOperationId()))) {
\r
113 // Must be called from Empty HTTP request, First operation to be called
\r
115 // Must be called from a different user operation, First operation to be called
\r
116 // if response operation id is different from current
\r
117 // nbiDevOperRequest operation id then first step is deleteObject
\r
119 nextOperation = OperationOrder.DELETE_OBJECT;
\r
120 logger.debug(NXT_OPERATION, nextOperation);
\r
122 // Since the responseOperation is not null and equivalent, find the
\r
123 // response type and the take next action
\r
124 OperationResponse opResponse = deviceRPCResponse.getOperationResponse();
\r
125 if (opResponse instanceof DeleteObjectResponse) {
\r
126 logger.debug("Received delete object response");
\r
127 if (null != tr069deleteParamList && !tr069deleteParamList.isEmpty()) {
\r
129 for (ParameterDTO deleteParam : tr069deleteParamList) {
\r
131 if (!deleteParam.isProcessed()) {
\r
132 deleteParam.setProcessed(true);
\r
136 logger.debug("Persisting the NBI request for deleteObject");
\r
137 // Update the existing NBI request
\r
138 List<TR069DeviceRPCRequestEntity> entityList =
\r
139 deviceRPCRequestRepositoryHelper.findByDeviceIdAndOperationId(
\r
140 deviceDetails.getDeviceId(), nbiDeviceOperationRequest.getOperationId());
\r
141 List<TR069DeviceRPCRequestEntity> tr069DeviceRPCRequestEntityList =
\r
142 TR069RequestProcessorUtility.convertToEntity(nbiDeviceOperationRequest);
\r
143 for (int j = 0; j < entityList.size(); j++) {
\r
144 tr069DeviceRPCRequestEntityList.get(j).setId(entityList.get(j).getId());
\r
146 deviceRPCRequestRepositoryHelper.saveAll(tr069DeviceRPCRequestEntityList);
\r
148 if (tr069deleteParamList.size() > i) {
\r
149 nextOperation = OperationOrder.DELETE_OBJECT;
\r
150 logger.debug(NXT_OPERATION, nextOperation);
\r
153 nextOperation = OperationOrder.ADD_OBJECT;
\r
154 logger.debug(NXT_OPERATION, nextOperation);
\r
158 nextOperation = OperationOrder.ADD_OBJECT;
\r
159 logger.debug(NXT_OPERATION, nextOperation);
\r
161 } else if (opResponse instanceof AddObjectResponse) {
\r
162 logger.debug("Received Add object response");
\r
163 if (null != tr069setParamList && !tr069setParamList.isEmpty()) {
\r
164 long instanceNumber;
\r
165 boolean addParamExist = false;
\r
166 AddObjectResponse addObjResponse =
\r
167 (AddObjectResponse) deviceRPCResponse.getOperationResponse();
\r
168 List<ParameterDTO> modifyParamList = new ArrayList<>();
\r
169 List<ParameterDTO> removeParamList = new ArrayList<>();
\r
170 ParameterDTO addParam = null;
\r
172 if (null != addObjResponse) {
\r
173 instanceNumber = addObjResponse.getInstanceNumber();
\r
174 String replaceIndex = null;
\r
175 String replaceParam = null;
\r
177 for (ParameterDTO setParam : tr069setParamList) {
\r
178 if (!setParam.isProcessed()) {
\r
179 String paramName = setParam.getParamName();
\r
180 final Matcher matcher = Pattern.compile(NUMBER_REGEX).matcher(paramName);
\r
181 String index = null;
\r
182 String modifyParamName = null;
\r
183 String subString = null;
\r
184 while (matcher.find()) {
\r
185 index = matcher.group().substring(1, matcher.group().length() - 1);
\r
186 StringBuilder sb = new StringBuilder(paramName);
\r
187 int lastIndex = paramName.lastIndexOf(matcher.group());
\r
188 modifyParamName = (sb.replace(lastIndex, lastIndex + matcher.group().length(),
\r
189 "." + instanceNumber + ".")).toString();
\r
190 subString = paramName.substring(0, matcher.start()) + ".";
\r
192 if (null == replaceIndex)
\r
193 replaceIndex = index;
\r
194 if (null == replaceParam)
\r
195 replaceParam = subString;
\r
196 if (null != replaceIndex && null != index && replaceIndex.equals(index)
\r
197 && replaceParam.equalsIgnoreCase(subString)) {
\r
198 setParam.setProcessed(true);
\r
199 modifyParamList.add(prepareParamDTO(modifyParamName, null, setParam));
\r
200 removeParamList.add(prepareParamDTO(null, null, setParam));
\r
202 addParamExist = true;
\r
204 if (null == addParam) {
\r
206 "The device index chosen is {} for adding the NBI tab parameter with index {}",
\r
207 instanceNumber, replaceIndex);
\r
208 addParam = prepareParamDTO(subString + replaceIndex,
\r
209 String.valueOf(instanceNumber), setParam);
\r
214 // Replace index with instance number and add in modify param list
\r
215 if (!modifyParamList.isEmpty()) {
\r
216 tr069modifyParamList.addAll(modifyParamList);
\r
218 // Prepare add object param and add in set param list
\r
219 if (null != addParam) {
\r
220 addParam.setDataType("1");
\r
221 tr069setParamList.add(addParam);
\r
223 // Remove all processed set params from set param list
\r
224 if (!removeParamList.isEmpty()) {
\r
225 tr069setParamList.removeAll(removeParamList);
\r
228 logger.debug("Persisting the NBI request for addObject");
\r
229 List<TR069DeviceRPCRequestEntity> entityList =
\r
230 deviceRPCRequestRepositoryHelper.findByDeviceIdAndOperationId(
\r
231 deviceDetails.getDeviceId(), nbiDeviceOperationRequest.getOperationId());
\r
232 List<TR069DeviceRPCRequestEntity> tr069DeviceRPCRequestEntityList =
\r
233 TR069RequestProcessorUtility.convertToEntity(nbiDeviceOperationRequest);
\r
234 for (int i = 0; i < entityList.size(); i++) {
\r
235 tr069DeviceRPCRequestEntityList.get(i).setId(entityList.get(i).getId());
\r
237 deviceRPCRequestRepositoryHelper.saveAll(tr069DeviceRPCRequestEntityList);
\r
239 if (addParamExist) {
\r
240 nextOperation = OperationOrder.ADD_OBJECT;
\r
241 logger.debug(NXT_OPERATION, nextOperation);
\r
243 nextOperation = OperationOrder.SET_PARAMETER_VALUE;
\r
244 logger.debug(NXT_OPERATION, nextOperation);
\r
247 nextOperation = OperationOrder.SET_PARAMETER_VALUE;
\r
248 logger.debug(NXT_OPERATION, nextOperation);
\r
250 } else if (opResponse instanceof SetParameterValueResponse) {
\r
251 logger.debug("Received Set parameter value response");
\r
252 isPendingOperationExists = false;
\r
253 for (ParameterDTO setParam : tr069modifyParamList) {
\r
254 if (Boolean.TRUE.equals(setParam.isInitiated())
\r
255 && Boolean.FALSE.equals(setParam.isProcessed())) {
\r
256 setParam.setInitiated(Boolean.FALSE);
\r
257 setParam.setProcessed(Boolean.TRUE);
\r
258 } else if (Boolean.FALSE.equals(setParam.isInitiated())
\r
259 && Boolean.FALSE.equals(setParam.isProcessed())) {
\r
260 isPendingOperationExists = true;
\r
261 nextOperation = OperationOrder.SET_PARAMETER_VALUE;
\r
265 updateParamChangedFlagInDb(deviceDetails.getDeviceId(), nbiDeviceOperationRequest);
\r
266 logger.debug("Next operation to be executed is : {}", nextOperation);
\r
270 if (isPendingOperationExists) {
\r
271 boolean checkForNextoperation = true;
\r
272 while (checkForNextoperation) {
\r
273 switch (nextOperation) {
\r
274 case DELETE_OBJECT:
\r
275 if (null != tr069deleteParamList && !tr069deleteParamList.isEmpty()) {
\r
276 logger.debug("Started executing delete object request");
\r
277 checkForNextoperation = false;
\r
278 DeviceRPCRequest clonedOpRequest = cloneNBIRequest(nbiDeviceOperationRequest);
\r
279 List<ParameterDTO> deleteParamList = new ArrayList<>();
\r
280 // Just take the first not processed delete object from the list
\r
281 for (ParameterDTO deleteParam : tr069deleteParamList) {
\r
282 if (!deleteParam.isProcessed()) {
\r
283 deleteParamList.add(deleteParam);
\r
287 clonedOpRequest.setOpDetails(null);
\r
288 OperationDetails opDetails = new OperationDetails();
\r
289 opDetails.setOpCode(TR069OperationCode.DELETE_OBJECT);
\r
290 opDetails.setParmeters(deleteParamList);
\r
291 clonedOpRequest.setOpDetails(opDetails);
\r
292 operRequest = clonedOpRequest;
\r
294 nextOperation = OperationOrder.ADD_OBJECT;
\r
295 logger.debug(NXT_OPERATION, nextOperation);
\r
299 if (null != tr069setParamList && !tr069setParamList.isEmpty()) {
\r
300 logger.debug("Started executing Add object request");
\r
301 checkForNextoperation = false;
\r
302 DeviceRPCRequest clonedOpRequest = cloneNBIRequest(nbiDeviceOperationRequest);
\r
303 List<ParameterDTO> addParamList = new ArrayList<>();
\r
304 // Just take the first not processed delete object from the list
\r
305 for (ParameterDTO addParam : tr069setParamList) {
\r
306 if (!addParam.isProcessed()) {
\r
307 String addParamMO = null;
\r
308 final Matcher matcher =
\r
309 Pattern.compile(NUMBER_REGEX).matcher(addParam.getParamName());
\r
310 while (matcher.find()) {
\r
311 addParamMO = addParam.getParamName().substring(0, matcher.start()) + ".";
\r
313 if (null != addParamMO) {
\r
314 addParamList.add(prepareParamDTO(addParamMO, null, addParam));
\r
319 clonedOpRequest.setOpDetails(null);
\r
320 OperationDetails opDetails = new OperationDetails();
\r
321 opDetails.setOpCode(TR069OperationCode.ADD_OBJECT);
\r
322 opDetails.setParmeters(addParamList);
\r
323 clonedOpRequest.setOpDetails(opDetails);
\r
324 operRequest = clonedOpRequest;
\r
326 nextOperation = OperationOrder.SET_PARAMETER_VALUE;
\r
327 logger.debug(NXT_OPERATION, nextOperation);
\r
330 case SET_PARAMETER_VALUE:
\r
331 checkForNextoperation = false;
\r
332 if (null != tr069modifyParamList && !tr069modifyParamList.isEmpty()) {
\r
333 logger.debug("Started executing SPV request");
\r
334 DeviceRPCRequest clonedOpRequest = cloneNBIRequest(nbiDeviceOperationRequest);
\r
335 clonedOpRequest.setOpDetails(null);
\r
336 OperationDetails opDetails = new OperationDetails();
\r
337 opDetails.setOpCode(TR069OperationCode.SET_PARAMETER_VALUES);
\r
338 List<ParameterDTO> unprocessedParamList = new ArrayList<>();
\r
339 ParameterDTO adminStateParam = null;
\r
340 for (ParameterDTO paramDTO : tr069modifyParamList) {
\r
341 if (!paramDTO.isProcessed()) {
\r
342 if (isAdminStateExists(paramDTO)) {
\r
343 adminStateParam = paramDTO;
\r
345 unprocessedParamList.add(paramDTO);
\r
350 if (null != adminStateParam && isAdminStateFalse(adminStateParam.getParamValue())) {
\r
351 List<ParameterDTO> adminStateParamList = new ArrayList<>();
\r
352 adminStateParam.setInitiated(Boolean.TRUE);
\r
353 adminStateParamList.add(adminStateParam);
\r
354 opDetails.setParmeters(adminStateParamList);
\r
355 updateParamChangedFlagInDb(deviceDetails.getDeviceId(), nbiDeviceOperationRequest);
\r
356 } else if (!unprocessedParamList.isEmpty()) {
\r
357 setInititedFlagTrue(unprocessedParamList);
\r
358 opDetails.setParmeters(unprocessedParamList);
\r
359 updateParamChangedFlagInDb(deviceDetails.getDeviceId(), nbiDeviceOperationRequest);
\r
360 } else if (null != adminStateParam
\r
361 && isAdminStateTrue(adminStateParam.getParamValue())) {
\r
362 List<ParameterDTO> paramList = new ArrayList<>();
\r
363 adminStateParam.setInitiated(Boolean.TRUE);
\r
364 paramList.add(adminStateParam);
\r
365 opDetails.setParmeters(paramList);
\r
366 updateParamChangedFlagInDb(deviceDetails.getDeviceId(), nbiDeviceOperationRequest);
\r
368 isPendingOperationExists = false;
\r
371 clonedOpRequest.setOpDetails(opDetails);
\r
372 operRequest = clonedOpRequest;
\r
374 isPendingOperationExists = false;
\r
375 operRequest = null;
\r
379 isPendingOperationExists = false;
\r
380 operRequest = null;
\r
385 if (!isPendingOperationExists) {
\r
387 "No pending operation exists, hence marking the operation as processed with id {} "
\r
388 + "and sending GetParameterValueResponse for ConfigureMultipleObjects",
\r
389 responseOperationId);
\r
390 List<ParameterDTO> responseParamList = new ArrayList<>();
\r
392 if (tr069deleteParamList != null) {
\r
393 for (ParameterDTO delete : tr069deleteParamList) {
\r
394 delete.setParamValue(SUCCESS);
\r
395 delete.setDataType("2");
\r
396 responseParamList.add(delete);
\r
400 if (tr069modifyParamList != null) {
\r
401 for (ParameterDTO modify : tr069modifyParamList) {
\r
402 modify.setParamValue(SUCCESS);
\r
403 modify.setDataType("4");
\r
404 responseParamList.add(modify);
\r
408 responseParamList.addAll(tr069setParamList);
\r
410 OperationResponse operationResponse = new GetParameterValueResponse();
\r
411 operationResponse.setParameterDTOs(responseParamList);
\r
412 if (deviceRPCResponse != null) {
\r
413 deviceRPCResponse.setDeviceDetails(deviceDetails);
\r
414 deviceRPCResponse.setOperationResponse(operationResponse);
\r
415 deviceRPCResponse.setOperationId(responseOperationId);
\r
419 "Prepared operation result for custom operation Configure Multiple Objects, hence marking as processed the corresponding NBI Operation request record");
\r
420 deviceRPCRequestRepositoryHelper.markDeviceRPCRequestAsProcessed(deviceDetails.getDeviceId(),
\r
421 responseOperationId);
\r
424 customOperationData.setDeviceRPCResponse(deviceRPCResponse);
\r
425 customOperationData.setDeviceRPCRequest(operRequest);
\r
426 logger.debug("Finished processing Configure multiple object");
\r
427 return customOperationData;
\r
431 enum OperationOrder {
\r
433 SET_PARAMETER_VALUE(null), ADD_OBJECT(SET_PARAMETER_VALUE), DELETE_OBJECT(ADD_OBJECT);
\r
435 OperationOrder nextOperation;
\r
437 OperationOrder(OperationOrder nextOperation) {
\r
438 this.nextOperation = nextOperation;
\r
441 public OperationOrder getNextOperation() {
\r
442 return nextOperation;
\r
447 private DeviceRPCRequest cloneNBIRequest(DeviceRPCRequest nbiDeviceOperationRequest) {
\r
448 return new DeviceRPCRequest(nbiDeviceOperationRequest);
\r
451 private ParameterDTO prepareParamDTO(String name, String value, ParameterDTO paramDTO) {
\r
452 ParameterDTO parameterDTO = new ParameterDTO();
\r
453 if (null != name) {
\r
454 parameterDTO.setParamName(name);
\r
456 parameterDTO.setParamName(paramDTO.getParamName());
\r
458 if (null != value) {
\r
459 parameterDTO.setParamValue(value);
\r
461 parameterDTO.setParamValue(paramDTO.getParamValue());
\r
463 parameterDTO.setDataType(paramDTO.getDataType());
\r
464 parameterDTO.setProcessed(paramDTO.isProcessed());
\r
466 return parameterDTO;
\r
469 private boolean isAdminStateExists(ParameterDTO paramDTO) {
\r
470 return (paramDTO.getParamName().contains(TR069RequestProcessorUtility.ADMIN_STATE)
\r
471 || paramDTO.getParamName().contains(TR069RequestProcessorUtility.ADMIN_STATUS));
\r
474 private void updateParamChangedFlagInDb(String deviceId,
\r
475 DeviceRPCRequest nbiDeviceOperationRequest) throws TR069EventProcessingException {
\r
476 List<TR069DeviceRPCRequestEntity> entityList = deviceRPCRequestRepositoryHelper
\r
477 .findByDeviceIdAndOperationId(deviceId, nbiDeviceOperationRequest.getOperationId());
\r
478 List<TR069DeviceRPCRequestEntity> tr069DeviceRPCRequestEntityList =
\r
479 TR069RequestProcessorUtility.convertToEntity(nbiDeviceOperationRequest);
\r
480 for (int i = 0; i < entityList.size(); i++) {
\r
481 tr069DeviceRPCRequestEntityList.get(i).setId(entityList.get(i).getId());
\r
483 deviceRPCRequestRepositoryHelper.saveAll(tr069DeviceRPCRequestEntityList);
\r
486 private void setInititedFlagTrue(List<ParameterDTO> unprocessedParamList) {
\r
487 for (ParameterDTO paramDTO : unprocessedParamList) {
\r
488 paramDTO.setInitiated(Boolean.TRUE);
\r
492 private boolean isAdminStateFalse(String adminState) {
\r
493 return (null != adminState && (adminState.equalsIgnoreCase(Boolean.FALSE.toString())
\r
494 || adminState.equalsIgnoreCase("0")));
\r
497 private boolean isAdminStateTrue(String adminState) {
\r
498 return (null != adminState && (adminState.equalsIgnoreCase(Boolean.TRUE.toString())
\r
499 || adminState.equalsIgnoreCase("1")));
\r