2 * Copyright (c) 2018 Orange
4 * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
5 * in compliance with the License. You may obtain a copy of the License at
7 * http://www.apache.org/licenses/LICENSE-2.0
9 * Unless required by applicable law or agreed to in writing, software distributed under the License
10 * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
11 * or implied. See the License for the specific language governing permissions and limitations under
15 package org.onap.nbi.apis.serviceorder.workflow;
17 import java.io.IOException;
18 import java.util.ArrayList;
19 import java.util.HashMap;
20 import java.util.Iterator;
21 import java.util.List;
24 import org.onap.nbi.apis.servicecatalog.ServiceSpecificationService;
25 import org.onap.nbi.apis.serviceorder.SoClient;
26 import org.onap.nbi.apis.serviceorder.model.ServiceCharacteristic;
27 import org.onap.nbi.apis.serviceorder.model.ServiceOrder;
28 import org.onap.nbi.apis.serviceorder.model.ServiceOrderItem;
29 import org.onap.nbi.apis.serviceorder.model.StateType;
30 import org.onap.nbi.apis.serviceorder.model.ServiceStateType;
31 import org.onap.nbi.apis.serviceorder.model.consumer.CloudConfiguration;
32 import org.onap.nbi.apis.serviceorder.model.consumer.CreateE2EServiceInstanceResponse;
33 import org.onap.nbi.apis.serviceorder.model.consumer.CreateMacroServiceInstanceResponse;
34 import org.onap.nbi.apis.serviceorder.model.consumer.CreateServiceInstanceResponse;
35 import org.onap.nbi.apis.serviceorder.model.consumer.MSOE2EPayload;
36 import org.onap.nbi.apis.serviceorder.model.consumer.MSOPayload;
37 import org.onap.nbi.apis.serviceorder.model.consumer.ModelInfo;
38 import org.onap.nbi.apis.serviceorder.model.consumer.OwningEntity;
39 import org.onap.nbi.apis.serviceorder.model.consumer.ParametersModel;
40 import org.onap.nbi.apis.serviceorder.model.consumer.Project;
41 import org.onap.nbi.apis.serviceorder.model.consumer.RequestDetails;
42 import org.onap.nbi.apis.serviceorder.model.consumer.RequestInfo;
43 import org.onap.nbi.apis.serviceorder.model.consumer.RequestParameters;
44 import org.onap.nbi.apis.serviceorder.model.consumer.ResourceModel;
45 import org.onap.nbi.apis.serviceorder.model.consumer.ServiceModel;
46 import org.onap.nbi.apis.serviceorder.model.consumer.SubscriberInfo;
47 import org.onap.nbi.apis.serviceorder.model.consumer.UserParams;
48 import org.onap.nbi.apis.serviceorder.model.consumer.VFModelInfo;
49 import org.onap.nbi.apis.serviceorder.model.orchestrator.ServiceOrderInfo;
50 import org.onap.nbi.apis.serviceorder.service.ServiceOrderService;
51 import org.slf4j.Logger;
52 import org.slf4j.LoggerFactory;
53 import org.springframework.beans.factory.annotation.Autowired;
54 import org.springframework.beans.factory.annotation.Value;
55 import org.springframework.http.ResponseEntity;
56 import org.springframework.stereotype.Service;
57 import org.springframework.util.CollectionUtils;
58 import com.fasterxml.jackson.databind.JsonNode;
59 import com.fasterxml.jackson.databind.ObjectMapper;
60 import com.fasterxml.jackson.databind.node.ArrayNode;
61 import com.fasterxml.jackson.databind.node.ObjectNode;
64 public class PostSoProcessor {
66 private static final Logger LOGGER = LoggerFactory.getLogger(PostSoProcessor.class);
68 @Value("${onap.lcpCloudRegionId}")
69 private String lcpCloudRegionId;
71 @Value("${onap.tenantId}")
72 private String tenantId;
74 @Value("${so.owning.entity.id}")
75 private String soOwningEntityId;
77 @Value("${so.owning.entity.name}")
78 private String soOwningEntityName;
80 @Value("${so.project.name}")
81 private String soProjectName;
83 @Value("${onap.cloudOwner}")
84 private String cloudOwner;
86 @Value("${onap.k8sCloudOwner}")
87 private String k8sCloudOwner;
89 @Value("${onap.k8sCloudRegionId}")
90 private String k8sCloudRegionId;
92 @Value("${k8s-rb-profile-name}")
93 private String k8sRbProfileName;
96 private ServiceOrderService serviceOrderService;
99 private SoClient soClient;
102 ServiceSpecificationService serviceSpecificationService;
104 public ResponseEntity<CreateServiceInstanceResponse> postServiceOrderItem(ServiceOrderInfo serviceOrderInfo,
105 ServiceOrderItem serviceOrderItem) {
106 ResponseEntity<CreateServiceInstanceResponse> response = null;
108 response = postSORequest(serviceOrderItem, serviceOrderInfo);
109 } catch (NullPointerException e) {
110 LOGGER.error("Unable to create service instance for serviceOrderItem.id=" + serviceOrderItem.getId(), e);
116 public ResponseEntity<CreateE2EServiceInstanceResponse> postE2EServiceOrderItem(ServiceOrderInfo serviceOrderInfo,
117 ServiceOrderItem serviceOrderItem, ServiceOrder serviceOrder) {
118 ResponseEntity<CreateE2EServiceInstanceResponse> response;
120 response = postE2ESORequest(serviceOrderItem, serviceOrderInfo, serviceOrder);
121 } catch (NullPointerException e) {
122 LOGGER.error("Unable to create service instance for serviceOrderItem.id=" + serviceOrderItem.getId(), e);
128 public ResponseEntity<CreateMacroServiceInstanceResponse> postMacroServiceOrderItem(ServiceOrderInfo serviceOrderInfo,
129 ServiceOrderItem serviceOrderItem) {
130 ResponseEntity<CreateMacroServiceInstanceResponse> response = null;
133 response = postSOMacroRequest(serviceOrderItem, serviceOrderInfo);
134 } catch (NullPointerException e) {
135 LOGGER.error("Unable to create service instance for serviceOrderItem.id=" + serviceOrderItem.getId(), e);
141 private ResponseEntity<CreateServiceInstanceResponse> postSORequest(ServiceOrderItem serviceOrderItem,
142 ServiceOrderInfo serviceOrderInfo) {
143 RequestDetails requestDetails = buildSoRequest(serviceOrderItem, serviceOrderInfo);
144 MSOPayload msoPayload = new MSOPayload(requestDetails);
145 ResponseEntity<CreateServiceInstanceResponse> response = null;
147 switch (serviceOrderItem.getAction()) {
149 response = soClient.callCreateServiceInstance(msoPayload);
152 response = soClient.callDeleteServiceInstance(msoPayload, serviceOrderItem.getService().getId());
155 if (StateType.INPROGRESS_MODIFY_ITEM_TO_CREATE == serviceOrderItem.getState()) {
156 response = soClient.callCreateServiceInstance(msoPayload);
158 if (StateType.ACKNOWLEDGED == serviceOrderItem.getState()) {
159 response = soClient.callDeleteServiceInstance(msoPayload, serviceOrderItem.getService().getId());
168 private ResponseEntity<CreateE2EServiceInstanceResponse> postE2ESORequest(ServiceOrderItem serviceOrderItem,
169 ServiceOrderInfo serviceOrderInfo, ServiceOrder serviceOrder) {
170 ServiceModel service = buildE2ESoRequest(serviceOrderItem,
171 serviceOrderInfo.getServiceOrderItemInfos().get(serviceOrderItem.getId()).getCatalogResponse(),
172 serviceOrderInfo.getSubscriberInfo(), serviceOrder);
173 MSOE2EPayload msoE2EPayload = new MSOE2EPayload(service);
174 ResponseEntity<CreateE2EServiceInstanceResponse> response = null;
175 switch (serviceOrderItem.getAction()) {
177 response = soClient.callE2ECreateServiceInstance(msoE2EPayload);
180 response = soClient.callE2EDeleteServiceInstance(service.getGlobalSubscriberId(),
181 service.getServiceType(), serviceOrderItem.getService().getId());
184 //EXT-API supports E2E service activation/deactivation with action=modify and seviceState=active/inactive
185 boolean isActivateReq = ServiceStateType.ACTIVE == serviceOrderItem.getService().getServiceState() ||
186 ServiceStateType.INACTIVE == serviceOrderItem.getService().getServiceState();
188 if (ServiceStateType.ACTIVE == serviceOrderItem.getService().getServiceState()) {
189 response = soClient.callServiceActivationE2EService(service.getGlobalSubscriberId(),
190 service.getServiceType(), serviceOrderItem.getService().getId(),"activate");
192 if (ServiceStateType.INACTIVE == serviceOrderItem.getService().getServiceState()) {
193 response = soClient.callServiceActivationE2EService(service.getGlobalSubscriberId(),
194 service.getServiceType(), serviceOrderItem.getService().getId(),"deactivate");
196 //Other E2E service modification follows Deletion followed by activation.
197 //For service modification, do not send serviceState=active/inactive
198 if (!isActivateReq && StateType.INPROGRESS_MODIFY_ITEM_TO_CREATE == serviceOrderItem.getState()) {
199 response = soClient.callE2ECreateServiceInstance(msoE2EPayload);
201 if (!isActivateReq && StateType.ACKNOWLEDGED == serviceOrderItem.getState()) {
202 response = soClient.callE2EDeleteServiceInstance(service.getGlobalSubscriberId(),
203 service.getServiceType(), serviceOrderItem.getService().getId());
212 private ResponseEntity<CreateMacroServiceInstanceResponse> postSOMacroRequest(ServiceOrderItem serviceOrderItem,
213 ServiceOrderInfo serviceOrderInfo) {
215 String serviceModuleName = (String) serviceOrderInfo.getServiceOrderItemInfos().get(serviceOrderItem.getId())
216 .getCatalogResponse().get("name");
218 RequestDetails requestDetails = buildSoMacroRequest(serviceOrderItem, serviceOrderInfo);
219 MSOPayload msoMacroPayload = new MSOPayload(requestDetails);
220 ResponseEntity<CreateMacroServiceInstanceResponse> response = null;
222 switch (serviceOrderItem.getAction()) {
224 response = soClient.callMacroCreateServiceInstance(msoMacroPayload);
227 // response = soClient.callDeleteServiceInstance(msoPayload,
228 // serviceOrderItem.getService().getId());
231 if (StateType.INPROGRESS_MODIFY_ITEM_TO_CREATE == serviceOrderItem.getState()) {
232 // response = soClient.callCreateServiceInstance(msoPayload);
234 if (StateType.ACKNOWLEDGED == serviceOrderItem.getState()) {
235 // response = soClient.callDeleteServiceInstance(msoPayload,
236 // serviceOrderItem.getService().getId());
246 * Build SO MACRO CREATE request from the ServiceOrder and catalog informations from SDC
249 * @param serviceOrderInfo
250 * @param subscriberInfo
253 private RequestDetails buildSoMacroRequest(ServiceOrderItem orderItem, ServiceOrderInfo serviceOrderInfo) {
255 RequestDetails requestDetails = new RequestDetails();
256 Map<String, Object> sdcInfos = serviceOrderInfo.getServiceOrderItemInfos().get(orderItem.getId())
257 .getCatalogResponse();
259 String id = orderItem.getService().getServiceSpecification().getId();
260 Map responseChildRes = serviceSpecificationService.get(id);
261 ArrayList<Map<String, Object>> resourseSpecificationArray = (ArrayList<Map<String, Object>>) responseChildRes
262 .get("resourceSpecification");
264 Map<String, Object> resourseSpecificationMap = resourseSpecificationArray.get(0);
266 Map instanceSpecification = (Map) resourseSpecificationMap.get("InstanceSpecification");
267 ArrayList<VFModelInfo> childResourceSpecification = (ArrayList<VFModelInfo>) resourseSpecificationMap
268 .get("childResourceSpecification");
270 List<Object> serviceObject = new ArrayList<>();
272 ArrayList<Object> vnfInstanceParam = new ArrayList<>();
274 //Differentiating vnf with cnf(Can be discussed and improved)
275 if (instanceSpecification.get("public_net_id") != null) {
276 vnfInstanceParam.add(instanceSpecification);
278 Map<String, Object> instanceParam = new HashMap<>();
279 instanceParam.put("k8s-rb-profile-name", k8sRbProfileName);
280 vnfInstanceParam.add(instanceParam);
283 List resSpec = (ArrayList) sdcInfos.get("resourceSpecification");
284 Map resSpecMap = (Map) resSpec.get(0);
286 Map<String, String> vnfInfoObject = new HashMap<>();
287 vnfInfoObject.put("modelName", (String) resSpecMap.get("name"));
288 vnfInfoObject.put("modelVersionId", (String) resSpecMap.get("id"));
289 vnfInfoObject.put("modelInvariantUuid", (String) resSpecMap.get("resourceInvariantUUID"));
290 vnfInfoObject.put("modelVersion", (String) resSpecMap.get("version"));
291 vnfInfoObject.put("modelCustomizationId", (String) resSpecMap.get("modelCustomizationId"));
292 vnfInfoObject.put("modelInstanceName", (String) resSpecMap.get("resourceInstanceName"));
295 CloudConfiguration cloudConfiguration = null;
297 //Differentiating vnf with cnf(Can be discussed and improved)
298 if (instanceSpecification.get("public_net_id") != null) {
299 cloudConfiguration = new CloudConfiguration(lcpCloudRegionId, tenantId, cloudOwner);
301 cloudConfiguration = new CloudConfiguration(k8sCloudRegionId, tenantId, k8sCloudOwner);
304 Map<String, String> platformName = new HashMap<>();
305 platformName.put("platformName", "test");
307 Map<String, String> lob = new HashMap<>();
308 lob.put("lineOfBusinessName", "LOB-Demonstration");
310 Map<String, Object> vnfModel = new HashMap<>();
311 vnfModel.put("modelInfo", vnfInfoObject);
312 vnfModel.put("cloudConfiguration", cloudConfiguration);
313 vnfModel.put("platform", platformName);
314 vnfModel.put("lineOfBusiness", lob);
315 vnfModel.put("productFamilyId", "a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb");
316 vnfModel.put("instanceName", (String) resSpecMap.get("resourceInstanceName"));
317 vnfModel.put("instanceParams", vnfInstanceParam);
319 List<Object> vfModulesObjects = new ArrayList<>();
320 ArrayList<Map<String, Object>> vfInstanceParam = new ArrayList<>();
322 //Differentiate CNF from VNF
323 if (instanceSpecification.get("public_net_id") != null) {
324 vfInstanceParam.add(instanceSpecification);
327 Map<String, Object> instanceParam = new HashMap<>();
328 instanceParam.put("k8s-rb-profile-name", k8sRbProfileName);
329 vfInstanceParam.add(instanceParam);
332 for (VFModelInfo crsObject : childResourceSpecification) {
333 Map<String, Object> vfModuleObject = new HashMap<>();
334 Map<String, String> vfModuleInfo = new HashMap<>();
336 vfModuleInfo.put("modelName", crsObject.getModelName());
337 vfModuleInfo.put("modelVersionId", crsObject.getModelUuid());
338 vfModuleInfo.put("modelInvariantUuid", crsObject.getModelInvariantUuid());
339 vfModuleInfo.put("modelVersion", crsObject.getModelVersion());
340 vfModuleInfo.put("modelCustomizationId", crsObject.getModelCustomizationUuid());
341 vfModuleObject.put("modelInfo", vfModuleInfo);
342 vfModuleObject.put("instanceName", crsObject.getModelName());
343 vfModuleObject.put("instanceParams", vfInstanceParam);
345 vfModulesObjects.add(vfModuleObject);
347 vnfModel.put("vfModules", vfModulesObjects);
349 List<Object> vnfObjects = new ArrayList<>();
350 vnfObjects.add(vnfModel);
352 Map<String, Object> vnfData = new HashMap<>();
353 vnfData.put("vnfs", vnfObjects);
355 ModelInfo serviceModelInfo = new ModelInfo();
356 serviceModelInfo.setModelType("service");
357 serviceModelInfo.setModelInvariantId((String) sdcInfos.get("invariantUUID"));
358 serviceModelInfo.setModelVersionId(orderItem.getService().getServiceSpecification().getId());
359 serviceModelInfo.setModelName((String) sdcInfos.get("name"));
360 serviceModelInfo.setModelVersion((String) sdcInfos.get("version"));
362 // Adding List of instanceParams for service
363 // We can add instanceParams Key Value in Map Object and add it to the List, for
364 // For now it is empty to comply with so request
366 List<Map<String, String>> listOfServiceLevelInstanceParams = new ArrayList<>();
367 Map<String, String> serviceInstanceParams= new HashMap<>();
368 listOfServiceLevelInstanceParams.add(serviceInstanceParams);
370 Map<String, Object> serviceData = new HashMap<>();
371 serviceData.put("instanceParams", listOfServiceLevelInstanceParams);
372 serviceData.put("instanceName", orderItem.getService().getName());
373 serviceData.put("resources", vnfData);
374 serviceData.put("modelInfo", serviceModelInfo);
376 Map<String, String> homingObject = new HashMap<>();
377 homingObject.put("Homing_Solution", "none");
378 serviceObject.add(homingObject);
380 Map<String, Object> serviceObject1 = new HashMap<>();
381 serviceObject1.put("service", serviceData);
382 serviceObject.add(serviceObject1);
383 requestDetails.setSubscriberInfo(serviceOrderInfo.getSubscriberInfo());
385 ModelInfo modelInfo = new ModelInfo();
386 modelInfo.setModelType("service");
387 modelInfo.setModelInvariantId((String) sdcInfos.get("invariantUUID"));
388 modelInfo.setModelVersionId(orderItem.getService().getServiceSpecification().getId());
389 modelInfo.setModelName((String) sdcInfos.get("name"));
390 modelInfo.setModelVersion((String) sdcInfos.get("version"));
391 requestDetails.setModelInfo(modelInfo);
393 RequestInfo requestInfo = new RequestInfo();
394 requestInfo.setInstanceName(orderItem.getService().getName());
395 requestInfo.setSource("VID");
396 requestInfo.setSuppressRollback(false);
397 requestInfo.setRequestorId("NBI");
398 requestInfo.setProductFamilyId("a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb");
399 requestDetails.setRequestInfo(requestInfo);
401 // We are taking RequestParameters as map because it has UserParams which gives value as
402 // "name" : "service"
403 // "value" : "", which SO is not accepting
404 Map<String, Object> requestParameters = new HashMap<>();
406 // Get value from serviceOrder request or generate one
407 String serviceTypeFromJson = orderItem.getService().getServicetype();
408 requestParameters.put("subscriptionServiceType",
409 serviceTypeFromJson != null ? serviceTypeFromJson : (String) sdcInfos.get("name"));
410 requestParameters.put("userParams", serviceObject);
411 requestParameters.put("aLaCarte", false);
412 requestDetails.setRequestParameters(requestParameters);
413 requestDetails.setCloudConfiguration(cloudConfiguration);
415 OwningEntity owningEntity = new OwningEntity();
416 owningEntity.setOwningEntityId(soOwningEntityId);
417 owningEntity.setOwningEntityName(soOwningEntityName);
418 requestDetails.setOwningEntity(owningEntity);
420 Project project = new Project();
421 project.setProjectName(soProjectName);
423 requestDetails.setProject(project);
424 return requestDetails;
428 * Build SO CREATE request from the ServiceOrder and catalog informations from SDC
431 * @param serviceOrderInfo
434 private RequestDetails buildSoRequest(ServiceOrderItem orderItem, ServiceOrderInfo serviceOrderInfo) {
435 RequestDetails requestDetails = new RequestDetails();
437 requestDetails.setSubscriberInfo(serviceOrderInfo.getSubscriberInfo());
438 Map<String, Object> sdcInfos =
439 serviceOrderInfo.getServiceOrderItemInfos().get(orderItem.getId()).getCatalogResponse();
440 ModelInfo modelInfo = new ModelInfo();
441 modelInfo.setModelType("service");
442 modelInfo.setModelInvariantId((String) sdcInfos.get("invariantUUID"));
443 modelInfo.setModelNameVersionId(orderItem.getService().getServiceSpecification().getId());
444 modelInfo.setModelVersionId(orderItem.getService().getServiceSpecification().getId());
445 modelInfo.setModelName((String) sdcInfos.get("name"));
446 modelInfo.setModelVersion((String) sdcInfos.get("version"));
447 requestDetails.setModelInfo(modelInfo);
449 RequestInfo requestInfo = new RequestInfo();
450 requestInfo.setInstanceName(orderItem.getService().getName());
451 requestInfo.setSource("VID");
452 requestInfo.setSuppressRollback(false);
453 requestInfo.setRequestorId("NBI");
454 requestDetails.setRequestInfo(requestInfo);
456 RequestParameters requestParameters = new RequestParameters();
458 String serviceTypeFromJson = orderItem.getService().getServicetype();
459 requestParameters.setSubscriptionServiceType(serviceTypeFromJson != null ? serviceTypeFromJson:(String) sdcInfos.get("name"));
460 requestParameters.setUserParams(
461 retrieveUserParamsFromServiceCharacteristics(orderItem.getService().getServiceCharacteristic()));
462 requestParameters.setaLaCarte(true);
463 requestParameters.setTestApi("GR_API");
464 requestDetails.setRequestParameters(requestParameters);
466 CloudConfiguration cloudConfiguration = new CloudConfiguration(lcpCloudRegionId, tenantId, cloudOwner);
467 requestDetails.setCloudConfiguration(cloudConfiguration);
469 OwningEntity owningEntity = new OwningEntity();
470 owningEntity.setOwningEntityId(serviceOrderInfo.getOwningEntityId());
471 owningEntity.setOwningEntityName(soOwningEntityName);
472 requestDetails.setOwningEntity(owningEntity);
474 Project project = new Project();
475 project.setProjectName(soProjectName);
477 requestDetails.setProject(project);
479 return requestDetails;
483 * Build E2E SO CREATE request from the ServiceOrder and catalog informations from SDC
485 * @param serviceOrderItem
486 * @param serviceOrder
490 // ServiceOrderItem serviceOrderItem --> orderItem?
491 private ServiceModel buildE2ESoRequest(ServiceOrderItem serviceOrderItem, Map<String, Object> sdcInfos,
492 SubscriberInfo subscriberInfo, ServiceOrder serviceOrder) {
494 subscriberInfo.getGlobalSubscriberId();
495 ServiceModel service = new ServiceModel();
496 service.setName(serviceOrderItem.getService().getName());
497 service.setDescription(serviceOrder.getDescription());
498 service.setServiceUuid(serviceOrderItem.getService().getServiceSpecification().getId());
499 service.setServiceInvariantUuid((String) sdcInfos.get("invariantUUID"));
500 service.setGlobalSubscriberId(subscriberInfo.getGlobalSubscriberId());
501 String serviceTypeFromJson = serviceOrderItem.getService().getServicetype();
502 service.setServiceType(serviceTypeFromJson != null ? serviceTypeFromJson : (String) sdcInfos.get("name"));
503 ParametersModel parameters = new ParametersModel();
504 ArrayList<ResourceModel> resources = new ArrayList();
506 ArrayList<Object> resourceObjects = (ArrayList<Object>) sdcInfos.get("resourceSpecification");
508 for (int i = 0; i < resourceObjects.size(); i++) {
510 ResourceModel resourceModel = new ResourceModel((Map<String, Object>) resourceObjects.get(i));
511 ParametersModel resourceParameters = new ParametersModel();
512 resourceModel.setParameters(resourceParameters);
513 resources.add(resourceModel);
516 parameters.setResources(resources);
517 List<UserParams> userParams =
518 retrieveUserParamsFromServiceCharacteristics(serviceOrderItem.getService().getServiceCharacteristic());
520 // If there are ServiceCharacteristics add them to requestInputs
521 if (!userParams.isEmpty()) {
522 Map<String, String> requestInputs = new HashMap<String, String>();
523 for (int i = 0; i < userParams.size(); i++) {
524 requestInputs.put(userParams.get(i).getName(), (String) userParams.get(i).getValue());
527 parameters.setRequestInputs(requestInputs);
529 service.setParameters(parameters);
535 * Build a list of UserParams for the SO request by browsing a list of ServiceCharacteristics from
538 private List<UserParams> retrieveUserParamsFromServiceCharacteristics(List<ServiceCharacteristic> characteristics) {
539 List<UserParams> userParams = new ArrayList<>();
540 UserParams userParam;
542 if (!CollectionUtils.isEmpty(characteristics)) {
543 for (ServiceCharacteristic characteristic : characteristics) {
544 // Check is the characteristic is of type object, if proceed as before to allow for
545 // backwards compatibility.
546 if (characteristic.getValueType() != null && !characteristic.getValueType().isEmpty()
547 && characteristic.getValueType().equals("object")) {
548 ObjectMapper mapper = new ObjectMapper();
549 JsonNode jsonNode = null;
551 jsonNode = mapper.readTree(characteristic.getValue().getServiceCharacteristicValue());
552 } catch (IOException e) {
553 LOGGER.error("Failed to read object json {} , exception is ",
554 characteristic.getValue().getServiceCharacteristicValue(), e.getMessage());
556 ObjectNode objectNode = (ObjectNode) jsonNode;
557 Iterator<Map.Entry<String, JsonNode>> iter = objectNode.fields();
558 while (iter.hasNext()) {
559 Map.Entry<String, JsonNode> entry = iter.next();
560 if (!entry.getValue().isArray()) {
561 userParam = new UserParams(entry.getKey(), entry.getValue().asText());
563 ArrayNode arrayNode = (ArrayNode) entry.getValue();
564 String arrayNodeValueString = arrayNode.toString();
565 userParam = new UserParams(entry.getKey(), arrayNodeValueString);
567 userParams.add(userParam);
570 // as UserParams for all other types, boolean, string, integer etc
572 userParam = new UserParams(characteristic.getName(),
573 characteristic.getValue().getServiceCharacteristicValue());
574 userParams.add(userParam);