2cb897fe03c904c278ee63b8a4a6dc04dec254eb
[sdc/sdc-workflow-designer.git] /
1 package org.onap.sdc.workflow.services.impl;
2
3 import static org.onap.sdc.workflow.api.RestConstants.SORT_FIELD_NAME;
4
5 import java.util.ArrayList;
6 import java.util.Collection;
7 import java.util.Collections;
8 import java.util.Comparator;
9 import java.util.List;
10 import java.util.function.Predicate;
11 import java.util.stream.Collectors;
12 import org.onap.sdc.workflow.persistence.types.Workflow;
13 import org.onap.sdc.workflow.services.UniqueValueService;
14 import org.onap.sdc.workflow.services.WorkflowManager;
15 import org.onap.sdc.workflow.services.WorkflowNameComparator;
16 import org.onap.sdc.workflow.services.exceptions.EntityNotFoundException;
17 import org.onap.sdc.workflow.services.impl.mappers.WorkflowMapper;
18 import org.openecomp.sdc.versioning.ItemManager;
19 import org.openecomp.sdc.versioning.types.Item;
20 import org.openecomp.sdc.versioning.types.ItemStatus;
21 import org.springframework.beans.factory.annotation.Autowired;
22 import org.springframework.beans.factory.annotation.Qualifier;
23 import org.springframework.data.domain.Pageable;
24 import org.springframework.data.domain.Sort;
25 import org.springframework.stereotype.Service;
26
27 @Service("workflowManager")
28 public class WorkflowManagerImpl implements WorkflowManager {
29
30     public static final String WORKFLOW_TYPE = "WORKFLOW";
31     private static final String WORKFLOW_NOT_FOUND_ERROR_MSG = "Workflow with id '%s' does not exist";
32     private static final String WORKFLOW_NAME_UNIQUE_TYPE = "WORKFLOW_NAME";
33     static final Predicate<Item> ITEM_PREDICATE = item -> WORKFLOW_TYPE.equals(item.getType());
34
35     private final ItemManager itemManager;
36     private final UniqueValueService uniqueValueService;
37     private final WorkflowMapper workflowMapper;
38
39     @Autowired
40     public WorkflowManagerImpl(ItemManager itemManager,
41             @Qualifier("uniqueValueService") UniqueValueService uniqueValueService, WorkflowMapper workflowMapper) {
42         this.itemManager = itemManager;
43         this.uniqueValueService = uniqueValueService;
44         this.workflowMapper = workflowMapper;
45     }
46
47     @Override
48     public Collection<Workflow> list(Pageable pageRequest) {
49         List<Workflow> workflowList = itemManager.list(ITEM_PREDICATE).stream()
50                 .map( workflowMapper::itemToWorkflow).collect(Collectors.toList());
51         sortWorkflowList(workflowList, pageRequest);
52         return applyLimitAndOffset(workflowList, pageRequest);
53     }
54
55     @Override
56     public Workflow get(Workflow workflow) {
57         Item retrievedItem = itemManager.get(workflow.getId());
58         if (retrievedItem == null) {
59             throw new EntityNotFoundException(String.format(WORKFLOW_NOT_FOUND_ERROR_MSG, workflow.getId()));
60         }
61         return this.workflowMapper.itemToWorkflow(retrievedItem);
62     }
63
64     @Override
65     public Workflow create(Workflow workflow) {
66         Item item = workflowMapper.workflowToItem(workflow);
67         item.setStatus(ItemStatus.ACTIVE);
68
69         uniqueValueService.validateUniqueValue(WORKFLOW_NAME_UNIQUE_TYPE, new String[] {workflow.getName()});
70         workflow.setId(itemManager.create(item).getId());
71         uniqueValueService.createUniqueValue(WORKFLOW_NAME_UNIQUE_TYPE, new String[] {workflow.getName()});
72         return workflow;
73     }
74
75     @Override
76     public void update(Workflow workflow) {
77         Item retrievedItem = itemManager.get(workflow.getId());
78         if (retrievedItem == null) {
79             throw new EntityNotFoundException(String.format(WORKFLOW_NOT_FOUND_ERROR_MSG, workflow.getId()));
80         }
81
82         uniqueValueService.updateUniqueValue(WORKFLOW_NAME_UNIQUE_TYPE, retrievedItem.getName(), workflow.getName());
83
84         Item item = workflowMapper.workflowToItem(workflow);
85         item.setId(workflow.getId());
86         item.setStatus(retrievedItem.getStatus());
87         item.setVersionStatusCounters(retrievedItem.getVersionStatusCounters());
88         itemManager.update(item);
89     }
90
91     private List<Workflow> applyLimitAndOffset(List<Workflow> workflowList, Pageable pageRequest) {
92         int limit = pageRequest.getPageSize();
93         int offset = pageRequest.getPageNumber();
94         int totalNumOfWorkflows = workflowList.size();
95         List<Workflow> selectedWorkflows;
96         try {
97             if (limit > totalNumOfWorkflows) {
98                 limit = totalNumOfWorkflows;
99             }
100             int startIndex = offset * limit;
101             int endIndex = startIndex + limit;
102             if (endIndex > totalNumOfWorkflows) {
103                 endIndex = totalNumOfWorkflows;
104             }
105             selectedWorkflows = workflowList.subList(startIndex, endIndex);
106         } catch (IndexOutOfBoundsException | IllegalArgumentException ex) {
107             selectedWorkflows = new ArrayList<>();
108         }
109         return selectedWorkflows;
110     }
111
112     private void sortWorkflowList(List<Workflow> workflowList, Pageable pageRequest) {
113         Comparator<Workflow> comparator = getWorkflowListComparator();
114         if (pageRequest.getSort().getOrderFor(SORT_FIELD_NAME).getDirection() == Sort.Direction.ASC) {
115             workflowList.sort(comparator);
116         } else {
117             workflowList.sort(Collections.reverseOrder(comparator));
118         }
119     }
120
121     private Comparator<Workflow> getWorkflowListComparator() {
122         //More comparators can be added if required based on sort field name
123         return new WorkflowNameComparator();
124     }
125 }