1 package org.onap.sdc.workflow.services.impl;
3 import static org.onap.sdc.workflow.api.RestConstants.SORT_FIELD_NAME;
5 import java.util.ArrayList;
6 import java.util.Collection;
7 import java.util.Collections;
8 import java.util.Comparator;
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;
27 @Service("workflowManager")
28 public class WorkflowManagerImpl implements WorkflowManager {
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());
35 private final ItemManager itemManager;
36 private final UniqueValueService uniqueValueService;
37 private final WorkflowMapper workflowMapper;
40 public WorkflowManagerImpl(ItemManager itemManager,
41 @Qualifier("uniqueValueService") UniqueValueService uniqueValueService, WorkflowMapper workflowMapper) {
42 this.itemManager = itemManager;
43 this.uniqueValueService = uniqueValueService;
44 this.workflowMapper = workflowMapper;
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);
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()));
61 return this.workflowMapper.itemToWorkflow(retrievedItem);
65 public Workflow create(Workflow workflow) {
66 Item item = workflowMapper.workflowToItem(workflow);
67 item.setStatus(ItemStatus.ACTIVE);
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()});
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()));
82 uniqueValueService.updateUniqueValue(WORKFLOW_NAME_UNIQUE_TYPE, retrievedItem.getName(), workflow.getName());
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);
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;
97 if (limit > totalNumOfWorkflows) {
98 limit = totalNumOfWorkflows;
100 int startIndex = offset * limit;
101 int endIndex = startIndex + limit;
102 if (endIndex > totalNumOfWorkflows) {
103 endIndex = totalNumOfWorkflows;
105 selectedWorkflows = workflowList.subList(startIndex, endIndex);
106 } catch (IndexOutOfBoundsException | IllegalArgumentException ex) {
107 selectedWorkflows = new ArrayList<>();
109 return selectedWorkflows;
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);
117 workflowList.sort(Collections.reverseOrder(comparator));
121 private Comparator<Workflow> getWorkflowListComparator() {
122 //More comparators can be added if required based on sort field name
123 return new WorkflowNameComparator();