add serviceorder service 45/55245/1
authorromaingimbert <romain.gimbert@orange.com>
Fri, 22 Jun 2018 08:10:20 +0000 (10:10 +0200)
committerromaingimbert <romain.gimbert@orange.com>
Fri, 22 Jun 2018 08:10:20 +0000 (10:10 +0200)
- change code to have in the service all the update state

Change-Id: I01a409224984ae831da0f07edcda5bb34dc537dc
Issue-ID: EXTAPI-106
Signed-off-by: romaingimbert <romain.gimbert@orange.com>
src/main/java/org/onap/nbi/apis/serviceorder/ServiceOrderResource.java
src/main/java/org/onap/nbi/apis/serviceorder/service/ServiceOrderService.java [new file with mode: 0644]
src/main/java/org/onap/nbi/apis/serviceorder/workflow/CheckOrderConsistenceManager.java
src/main/java/org/onap/nbi/apis/serviceorder/workflow/CreateAAICustomerManager.java
src/main/java/org/onap/nbi/apis/serviceorder/workflow/CreateAAIServiceTypeManager.java
src/main/java/org/onap/nbi/apis/serviceorder/workflow/SOTaskProcessor.java

index 04a8329..12ee889 100644 (file)
  */
 package org.onap.nbi.apis.serviceorder;
 
-import java.util.Date;
 import java.util.List;
 import javax.validation.Valid;
 import org.onap.nbi.apis.serviceorder.model.ServiceOrder;
-import org.onap.nbi.apis.serviceorder.model.ServiceOrderItem;
 import org.onap.nbi.apis.serviceorder.model.StateType;
 import org.onap.nbi.apis.serviceorder.model.orchestrator.ServiceOrderInfo;
-import org.onap.nbi.apis.serviceorder.repositories.ServiceOrderRepository;
+import org.onap.nbi.apis.serviceorder.service.ServiceOrderService;
 import org.onap.nbi.apis.serviceorder.workflow.CheckOrderConsistenceManager;
 import org.onap.nbi.apis.serviceorder.workflow.CreateAAICustomerManager;
 import org.onap.nbi.apis.serviceorder.workflow.CreateAAIServiceTypeManager;
@@ -54,8 +52,10 @@ import org.springframework.web.bind.annotation.RestController;
 @EnableScheduling
 public class ServiceOrderResource extends ResourceManagement<ServiceOrder> {
 
+
+
     @Autowired
-    ServiceOrderRepository serviceOrderRepository;
+    ServiceOrderService serviceOrderService;
 
     @Autowired
     CheckOrderConsistenceManager checkOrderConsistenceManager;
@@ -80,7 +80,7 @@ public class ServiceOrderResource extends ResourceManagement<ServiceOrder> {
     public ResponseEntity<Object> getServiceOrder(@PathVariable String serviceOrderId,
             @RequestParam MultiValueMap<String, String> params) {
 
-        ServiceOrder serviceOrder = serviceOrderRepository.findOne(serviceOrderId);
+        ServiceOrder serviceOrder = serviceOrderService.findServiceOrderById(serviceOrderId);
         if (serviceOrder == null) {
             return ResponseEntity.notFound().build();
         }
@@ -95,7 +95,7 @@ public class ServiceOrderResource extends ResourceManagement<ServiceOrder> {
         Query query = multiCriteriaRequestBuilder.buildRequest(params);
         List<ServiceOrder> serviceOrders = mongoTemplate.find(query, ServiceOrder.class);
         JsonRepresentation filter = new JsonRepresentation(params);
-        long totalCount = serviceOrderRepository.count();
+        long totalCount = serviceOrderService.countServiceOrder();
         HttpHeaders headers = new HttpHeaders();
         headers.add("X-Total-Count", String.valueOf(totalCount));
         headers.add("X-Result-Count", String.valueOf(serviceOrders.size()));
@@ -107,7 +107,7 @@ public class ServiceOrderResource extends ResourceManagement<ServiceOrder> {
     @DeleteMapping(value = "/{serviceOrderId}")
     public ResponseEntity<Object> deleteServiceOrder(@PathVariable String serviceOrderId) {
 
-        serviceOrderRepository.delete(serviceOrderId);
+        serviceOrderService.deleteServiceOrder(serviceOrderId);
 
         return this.deleteResponse();
 
@@ -122,15 +122,8 @@ public class ServiceOrderResource extends ResourceManagement<ServiceOrder> {
             throw new ValidationException(errors.getAllErrors());
         }
 
-        serviceOrder.setState(StateType.ACKNOWLEDGED);
-        serviceOrder.setOrderDate(new Date());
-        for (ServiceOrderItem serviceOrderItem : serviceOrder.getOrderItem()) {
-            serviceOrderItem.setState(StateType.ACKNOWLEDGED);
-        }
-
-        ServiceOrder serviceOrderSaved = serviceOrderRepository.save(serviceOrder);
-        serviceOrderSaved.setHref("serviceOrder/" + serviceOrderSaved.getId());
-        serviceOrderRepository.save(serviceOrderSaved);
+        ServiceOrder serviceOrderSaved =serviceOrderService.updateOrderAndItemStateToAcknowledged(serviceOrder);
+        serviceOrderService.updateOrderHref(serviceOrderSaved);
         JsonRepresentation filter = new JsonRepresentation(params);
         return this.createResponse(serviceOrderSaved, filter);
 
@@ -138,15 +131,14 @@ public class ServiceOrderResource extends ResourceManagement<ServiceOrder> {
 
     @Scheduled(fixedDelay = 5000)
     public void scheduleCheckServiceOrders() {
-        List<ServiceOrder> acknowledgedOrders = serviceOrderRepository.findByState(StateType.ACKNOWLEDGED);
+        List<ServiceOrder> acknowledgedOrders = serviceOrderService.findServiceOrdersByState(StateType.ACKNOWLEDGED);
         for (ServiceOrder serviceOrder : acknowledgedOrders) {
             ServiceOrderInfo serviceOrderInfo = checkOrderConsistenceManager.checkServiceOrder(serviceOrder);
             if (serviceOrderInfo.isServiceOrderRejected()) {
-                changeServiceOrderState(serviceOrder, StateType.REJECTED);
+                serviceOrderService.updateOrderFinalState(serviceOrder, StateType.REJECTED);
             } else if (serviceOrderInfo.isAllItemsCompleted()) {
-                changeServiceOrderState(serviceOrder, StateType.COMPLETED);
+                serviceOrderService.updateOrderFinalState(serviceOrder, StateType.COMPLETED);
             } else {
-                serviceOrderRepository.save(serviceOrder);
                 createAAICustomer.createAAICustomer(serviceOrder,serviceOrderInfo);
                 if(StateType.ACKNOWLEDGED==serviceOrder.getState()) {
                     createAAIServiceType.createAAIServiceType(serviceOrder, serviceOrderInfo);
@@ -159,15 +151,4 @@ public class ServiceOrderResource extends ResourceManagement<ServiceOrder> {
         }
     }
 
-    /**
-     *
-     * @param serviceOrder
-     * @param stateType
-     */
-    private void changeServiceOrderState(ServiceOrder serviceOrder, StateType stateType) {
-        serviceOrder.setState(stateType);
-        serviceOrder.setCompletionDateTime(new Date());
-        serviceOrderRepository.save(serviceOrder);
-    }
-
 }
diff --git a/src/main/java/org/onap/nbi/apis/serviceorder/service/ServiceOrderService.java b/src/main/java/org/onap/nbi/apis/serviceorder/service/ServiceOrderService.java
new file mode 100644 (file)
index 0000000..8f9cff1
--- /dev/null
@@ -0,0 +1,81 @@
+/**
+ *     Copyright (c) 2018 Orange
+ *
+ *     Licensed under the Apache License, Version 2.0 (the "License");
+ *     you may not use this file except in compliance with the License.
+ *     You may obtain a copy of the License at
+ *
+ *         http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *     Unless required by applicable law or agreed to in writing, software
+ *     distributed under the License is distributed on an "AS IS" BASIS,
+ *     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *     See the License for the specific language governing permissions and
+ *     limitations under the License.
+ */
+package org.onap.nbi.apis.serviceorder.service;
+
+import java.util.Date;
+import java.util.List;
+import org.onap.nbi.apis.serviceorder.model.ServiceOrder;
+import org.onap.nbi.apis.serviceorder.model.ServiceOrderItem;
+import org.onap.nbi.apis.serviceorder.model.StateType;
+import org.onap.nbi.apis.serviceorder.repositories.ServiceOrderRepository;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+@Service
+public class ServiceOrderService {
+
+    @Autowired
+    ServiceOrderRepository serviceOrderRepository;
+
+    public ServiceOrder findServiceOrderById(String serviceOrderId){
+        return serviceOrderRepository.findOne(serviceOrderId);
+    }
+
+    public List<ServiceOrder> findServiceOrdersByState(StateType state){
+        return serviceOrderRepository.findByState(state);
+    }
+
+    public void updateOrderState(ServiceOrder serviceOrder,StateType state){
+        serviceOrder.setState(state);
+        serviceOrderRepository.save(serviceOrder);
+    }
+
+    public void updateOrderFinalState(ServiceOrder serviceOrder,StateType state){
+        serviceOrder.setState(state);
+        serviceOrder.setCompletionDateTime(new Date());
+        serviceOrderRepository.save(serviceOrder);
+    }
+
+    public void updateOrderItemState(ServiceOrder serviceOrder,ServiceOrderItem serviceOrderItem, StateType state){
+        serviceOrderItem.setState(state);
+        serviceOrderRepository.save(serviceOrder);
+    }
+
+    public ServiceOrder updateOrderAndItemStateToAcknowledged(ServiceOrder serviceOrder){
+        serviceOrder.setState(StateType.ACKNOWLEDGED);
+        serviceOrder.setOrderDate(new Date());
+        for (ServiceOrderItem serviceOrderItem : serviceOrder.getOrderItem()) {
+            serviceOrderItem.setState(StateType.ACKNOWLEDGED);
+        }
+        return serviceOrderRepository.save(serviceOrder);
+    }
+
+    public void updateOrderHref(ServiceOrder serviceOrder){
+        serviceOrder.setHref("serviceOrder/" + serviceOrder.getId());
+        serviceOrderRepository.save(serviceOrder);
+    }
+
+
+    public void deleteServiceOrder(String serviceOrderId){
+        serviceOrderRepository.delete(serviceOrderId);
+    }
+
+    public long countServiceOrder(){
+        return serviceOrderRepository.count();
+    }
+
+
+}
index 580a606..7ee3a0e 100644 (file)
@@ -17,6 +17,7 @@ import org.onap.nbi.apis.serviceorder.model.StateType;
 import org.onap.nbi.apis.serviceorder.model.consumer.SubscriberInfo;
 import org.onap.nbi.apis.serviceorder.model.orchestrator.ServiceOrderInfo;
 import org.onap.nbi.apis.serviceorder.model.orchestrator.ServiceOrderItemInfo;
+import org.onap.nbi.apis.serviceorder.service.ServiceOrderService;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -32,6 +33,9 @@ public class CheckOrderConsistenceManager {
     @Autowired
     private MultiClient serviceOrderConsumerService;
 
+    @Autowired
+    private ServiceOrderService serviceOrderService;
+
     private static final Logger LOGGER = LoggerFactory.getLogger(CheckOrderConsistenceManager.class);
 
     public ServiceOrderInfo checkServiceOrder(ServiceOrder serviceOrder) {
@@ -45,7 +49,7 @@ public class CheckOrderConsistenceManager {
             handleServiceFromCatalog(serviceOrderItem, serviceOrderItemInfo);
             if (!existServiceInCatalog(serviceOrderItemInfo)) {
                 serviceOrderInfo.setIsServiceOrderRejected(true);
-                serviceOrderItem.setState(StateType.REJECTED);
+                serviceOrderService.updateOrderItemState(serviceOrder,serviceOrderItem,StateType.REJECTED);
                 LOGGER.warn(
                     "service order item {} of service order {} rejected cause no service catalog found for id {}",
                     serviceOrderItem.getId(), serviceOrder.getId(),
@@ -53,15 +57,15 @@ public class CheckOrderConsistenceManager {
             } else {
                 switch (serviceOrderItem.getAction()) {
                     case ADD:
-                        handleServiceOrderItemInAdd(serviceOrderInfo, serviceOrderItem, serviceOrderItemInfo);
+                        handleServiceOrderItemInAdd(serviceOrderInfo,serviceOrder, serviceOrderItem, serviceOrderItemInfo);
                         break;
                     case MODIFY:
                     case DELETE:
-                        handleServiceOrderItemInChange(serviceOrderInfo, serviceOrderItem, serviceOrderItemInfo);
+                        handleServiceOrderItemInChange(serviceOrderInfo,serviceOrder, serviceOrderItem, serviceOrderItemInfo);
                         break;
                     case NOCHANGE:
                         serviceOrderInfo.setAllItemsInAdd(false);
-                        serviceOrderItem.setState(StateType.COMPLETED);
+                        serviceOrderService.updateOrderItemState(serviceOrder,serviceOrderItem,StateType.COMPLETED);
                         nbItemsCompleted++;
                         break;
                 }
@@ -79,7 +83,8 @@ public class CheckOrderConsistenceManager {
 
     }
 
-    private void handleServiceOrderItemInChange(ServiceOrderInfo serviceOrderInfo, ServiceOrderItem serviceOrderItem,
+    private void handleServiceOrderItemInChange(ServiceOrderInfo serviceOrderInfo,
+        ServiceOrder serviceOrder, ServiceOrderItem serviceOrderItem,
         ServiceOrderItemInfo serviceOrderItemInfo) {
         serviceOrderInfo.setAllItemsInAdd(false);
         if (shouldAcceptServiceOrderItemToChange(serviceOrderInfo, serviceOrderItem,
@@ -87,17 +92,18 @@ public class CheckOrderConsistenceManager {
             serviceOrderInfo.addServiceOrderItemInfos(serviceOrderItem.getId(), serviceOrderItemInfo);
         } else {
             serviceOrderInfo.setIsServiceOrderRejected(true);
-            serviceOrderItem.setState(StateType.REJECTED);
+            serviceOrderService.updateOrderItemState(serviceOrder,serviceOrderItem,StateType.REJECTED);
         }
     }
 
-    private void handleServiceOrderItemInAdd(ServiceOrderInfo serviceOrderInfo, ServiceOrderItem serviceOrderItem,
+    private void handleServiceOrderItemInAdd(ServiceOrderInfo serviceOrderInfo,
+        ServiceOrder serviceOrder, ServiceOrderItem serviceOrderItem,
         ServiceOrderItemInfo serviceOrderItemInfo) {
         if (shouldAcceptServiceOrderItemToAdd(serviceOrderItem, serviceOrderInfo.getServiceOrderId())) {
             serviceOrderInfo.addServiceOrderItemInfos(serviceOrderItem.getId(), serviceOrderItemInfo);
         } else {
             serviceOrderInfo.setIsServiceOrderRejected(true);
-            serviceOrderItem.setState(StateType.REJECTED);
+            serviceOrderService.updateOrderItemState(serviceOrder,serviceOrderItem,StateType.REJECTED);
         }
     }
 
index f3c77d6..69bbd83 100644 (file)
  */
 package org.onap.nbi.apis.serviceorder.workflow;
 
-import java.util.Date;
 import org.onap.nbi.apis.serviceorder.MultiClient;
 import org.onap.nbi.apis.serviceorder.model.ServiceOrder;
 import org.onap.nbi.apis.serviceorder.model.StateType;
 import org.onap.nbi.apis.serviceorder.model.orchestrator.ServiceOrderInfo;
-import org.onap.nbi.apis.serviceorder.repositories.ServiceOrderRepository;
+import org.onap.nbi.apis.serviceorder.service.ServiceOrderService;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -31,7 +30,7 @@ public class CreateAAICustomerManager {
     private MultiClient serviceOrderConsumerService;
 
     @Autowired
-    ServiceOrderRepository serviceOrderRepository;
+    ServiceOrderService serviceOrderService;
 
     private static final Logger LOGGER = LoggerFactory.getLogger(CreateAAICustomerManager.class);
 
@@ -46,9 +45,7 @@ public class CreateAAICustomerManager {
 
             boolean customerCreated = serviceOrderConsumerService.putCustomer(serviceOrderInfo.getSubscriberInfo());
             if (!customerCreated) {
-                serviceOrder.setState(StateType.REJECTED);
-                serviceOrder.setCompletionDateTime(new Date());
-                serviceOrderRepository.save(serviceOrder);
+                serviceOrderService.updateOrderFinalState(serviceOrder,StateType.REJECTED);
                 LOGGER.warn("serviceOrder {} rejected : cannot create customer", serviceOrder.getId());
             }
         }
index 9ae0550..7f150fe 100644 (file)
@@ -12,7 +12,8 @@
  */
 package org.onap.nbi.apis.serviceorder.workflow;
 
-import java.util.Date;
+import java.util.LinkedHashMap;
+import java.util.List;
 import java.util.Map;
 import org.onap.nbi.apis.serviceorder.MultiClient;
 import org.onap.nbi.apis.serviceorder.model.ActionType;
@@ -21,13 +22,11 @@ import org.onap.nbi.apis.serviceorder.model.ServiceOrderItem;
 import org.onap.nbi.apis.serviceorder.model.StateType;
 import org.onap.nbi.apis.serviceorder.model.orchestrator.ServiceOrderInfo;
 import org.onap.nbi.apis.serviceorder.model.orchestrator.ServiceOrderItemInfo;
-import org.onap.nbi.apis.serviceorder.repositories.ServiceOrderRepository;
+import org.onap.nbi.apis.serviceorder.service.ServiceOrderService;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
-import java.util.LinkedHashMap;
-import java.util.List;
 
 @Service
 public class CreateAAIServiceTypeManager {
@@ -36,7 +35,7 @@ public class CreateAAIServiceTypeManager {
     private MultiClient serviceOrderConsumerService;
 
     @Autowired
-    ServiceOrderRepository serviceOrderRepository;
+    ServiceOrderService serviceOrderService;
 
     private static final Logger LOGGER = LoggerFactory.getLogger(CreateAAIServiceTypeManager.class);
 
@@ -54,9 +53,7 @@ public class CreateAAIServiceTypeManager {
                     boolean serviceCreated = serviceOrderConsumerService.putServiceType(
                         serviceOrderInfo.getSubscriberInfo().getGlobalSubscriberId(), sdcServiceName);
                     if (!serviceCreated) {
-                        serviceOrder.setState(StateType.REJECTED);
-                        serviceOrder.setCompletionDateTime(new Date());
-                        serviceOrderRepository.save(serviceOrder);
+                        serviceOrderService.updateOrderFinalState(serviceOrder,StateType.REJECTED);
                         LOGGER.warn("serviceOrder {} rejected : cannot create service type {} for customer {}",
                             serviceOrder.getId(), sdcServiceName,
                             serviceOrderInfo.getSubscriberInfo().getGlobalSubscriberId());
index 24e137b..67c9b93 100644 (file)
  */
 package org.onap.nbi.apis.serviceorder.workflow;
 
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
 import org.onap.nbi.apis.serviceorder.SoClient;
 import org.onap.nbi.apis.serviceorder.model.ServiceCharacteristic;
 import org.onap.nbi.apis.serviceorder.model.ServiceOrder;
 import org.onap.nbi.apis.serviceorder.model.ServiceOrderItem;
 import org.onap.nbi.apis.serviceorder.model.StateType;
-import org.onap.nbi.apis.serviceorder.model.consumer.*;
+import org.onap.nbi.apis.serviceorder.model.consumer.CloudConfiguration;
+import org.onap.nbi.apis.serviceorder.model.consumer.CreateServiceInstanceResponse;
+import org.onap.nbi.apis.serviceorder.model.consumer.GetRequestStatusResponse;
+import org.onap.nbi.apis.serviceorder.model.consumer.MSOPayload;
+import org.onap.nbi.apis.serviceorder.model.consumer.ModelInfo;
+import org.onap.nbi.apis.serviceorder.model.consumer.RequestDetails;
+import org.onap.nbi.apis.serviceorder.model.consumer.RequestInfo;
+import org.onap.nbi.apis.serviceorder.model.consumer.RequestParameters;
+import org.onap.nbi.apis.serviceorder.model.consumer.RequestState;
+import org.onap.nbi.apis.serviceorder.model.consumer.SubscriberInfo;
+import org.onap.nbi.apis.serviceorder.model.consumer.UserParams;
 import org.onap.nbi.apis.serviceorder.model.orchestrator.ExecutionTask;
 import org.onap.nbi.apis.serviceorder.model.orchestrator.ServiceOrderInfo;
 import org.onap.nbi.apis.serviceorder.repositories.ExecutionTaskRepository;
-import org.onap.nbi.apis.serviceorder.repositories.ServiceOrderRepository;
+import org.onap.nbi.apis.serviceorder.service.ServiceOrderService;
 import org.onap.nbi.apis.serviceorder.utils.JsonEntityConverter;
 import org.onap.nbi.exceptions.TechnicalException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
-import org.springframework.http.HttpStatus;
 import org.springframework.http.ResponseEntity;
 import org.springframework.stereotype.Service;
 import org.springframework.util.CollectionUtils;
 
-import java.io.IOException;
-import java.util.*;
-
 @Service
 public class SOTaskProcessor {
 
@@ -48,8 +60,9 @@ public class SOTaskProcessor {
     @Value("${onap.tenantId}")
     private String tenantId;
 
+
     @Autowired
-    private ServiceOrderRepository serviceOrderRepository;
+    private ServiceOrderService serviceOrderService;
 
     @Autowired
     private ExecutionTaskRepository executionTaskRepository;
@@ -69,7 +82,7 @@ public class SOTaskProcessor {
 
         ServiceOrderInfo serviceOrderInfo = getServiceOrderInfo(executionTask);
 
-        ServiceOrder serviceOrder = serviceOrderRepository.findOne(serviceOrderInfo.getServiceOrderId());
+        ServiceOrder serviceOrder = serviceOrderService.findServiceOrderById(serviceOrderInfo.getServiceOrderId());
         ServiceOrderItem serviceOrderItem = getServiceOrderItem(executionTask, serviceOrder);
 
         if (StateType.ACKNOWLEDGED == serviceOrderItem.getState()) {
@@ -82,7 +95,7 @@ public class SOTaskProcessor {
         if (executionTask.getNbRetries() > 0 && StateType.FAILED != serviceOrderItem.getState()
             ) {
             // TODO lancer en asynchrone
-            pollSoRequestStatus(serviceOrderItem);
+            pollSoRequestStatus(serviceOrder,serviceOrderItem);
             if (serviceOrderItem.getState().equals(StateType.COMPLETED)) {
                 updateSuccessTask(executionTask);
             } else {
@@ -180,27 +193,28 @@ public class SOTaskProcessor {
         }
 
         if (atLeastOneNotFinished) {
-            serviceOrder.setState(StateType.INPROGRESS);
+            serviceOrderService.updateOrderState(serviceOrder,StateType.INPROGRESS);
         } else {
-            serviceOrder.setCompletionDateTime(new Date());
+            StateType finalState;
             if (atLeastOneFailed) {
                 if (!atLeastOneCompleted) {
-                    serviceOrder.setState(StateType.FAILED);
+                    finalState=StateType.FAILED;
                 } else {
-                    serviceOrder.setState(StateType.PARTIAL);
+                    finalState=StateType.PARTIAL;
                 }
             } else {
-                serviceOrder.setState(StateType.COMPLETED);
+                finalState=StateType.COMPLETED;
             }
+            serviceOrderService.updateOrderFinalState(serviceOrder,finalState);
         }
-        serviceOrderRepository.save(serviceOrder);
     }
 
 
     /**
      * * @param orderItem
      */
-    private void pollSoRequestStatus(ServiceOrderItem orderItem) throws InterruptedException {
+    private void pollSoRequestStatus(ServiceOrder serviceOrder,
+        ServiceOrderItem orderItem) throws InterruptedException {
         boolean stopPolling = false;
         String requestId = orderItem.getRequestId();
         GetRequestStatusResponse response = null;
@@ -211,20 +225,20 @@ public class SOTaskProcessor {
             if (response != null) {
                 if (response.getRequest().getRequestStatus().getPercentProgress() != 100) {
                     nbRetries++;
-                    orderItem.setState(StateType.INPROGRESS);
+                    serviceOrderService.updateOrderItemState(serviceOrder,orderItem,StateType.INPROGRESS);
                     Thread.sleep(1000);
                     LOGGER.debug("orderitem id {} still in progress from so",orderItem.getId());
                 } else if (RequestState.COMPLETE != response.getRequest().getRequestStatus().getRequestState()) {
-                    orderItem.setState(StateType.FAILED);
+                    serviceOrderService.updateOrderItemState(serviceOrder,orderItem,StateType.FAILED);
                     stopPolling = true;
                     LOGGER.debug("orderitem id {} failed, response from request status {}",orderItem.getId(),response.getRequest().getRequestStatus().getRequestState());
                 } else {
-                    orderItem.setState(StateType.COMPLETED);
+                    serviceOrderService.updateOrderItemState(serviceOrder,orderItem,StateType.COMPLETED);
                     stopPolling = true;
                     LOGGER.debug("orderitem id {} completed");
                 }
             } else {
-                orderItem.setState(StateType.INPROGRESS);
+                serviceOrderService.updateOrderItemState(serviceOrder,orderItem,StateType.INPROGRESS);
                 stopPolling = true;
                 LOGGER.debug("orderitem id {} still in progress from so",orderItem.getId());
             }
@@ -307,7 +321,7 @@ public class SOTaskProcessor {
 
         if (response == null) {
             LOGGER.warn("response=null for serviceOrderItem.id=" + orderItem.getId());
-            orderItem.setState(StateType.FAILED);
+            serviceOrderService.updateOrderItemState(serviceOrder,orderItem,StateType.FAILED);
         }
         else {
             CreateServiceInstanceResponse createServiceInstanceResponse = response.getBody();
@@ -318,13 +332,12 @@ public class SOTaskProcessor {
 
             if (!response.getStatusCode().is2xxSuccessful() || response.getBody() == null
                 || response.getBody().getRequestReferences() == null) {
-                orderItem.setState(StateType.FAILED);
+                serviceOrderService.updateOrderItemState(serviceOrder,orderItem,StateType.FAILED);
                 LOGGER.warn("order item {} failed , status {} , response {}",orderItem.getId(),response.getStatusCode(),response.getBody());
             } else {
-                orderItem.setState(StateType.INPROGRESS);
+                serviceOrderService.updateOrderItemState(serviceOrder,orderItem,StateType.INPROGRESS);
             }
         }
-        serviceOrderRepository.save(serviceOrder);
     }
 
     /**
@@ -351,7 +364,7 @@ public class SOTaskProcessor {
         for (ServiceOrderItem item : serviceOrder.getOrderItem()) {
             for (ExecutionTask taskToDelete : executionTasksToDelete) {
                 if (taskToDelete.getOrderItemId().equals(item.getId())) {
-                    item.setState(StateType.FAILED);
+                    serviceOrderService.updateOrderItemState(serviceOrder,item,StateType.FAILED);
                     LOGGER.warn("task {} with orderitem id {}  to failed cause orderitem id {} failed ",taskToDelete.getInternalId(),taskToDelete.getOrderItemId(),executionTask.getOrderItemId());
 
                 }