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