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.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;
29 @Service("workflowManager")
30 public class WorkflowManagerImpl implements WorkflowManager {
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());
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);
43 public WorkflowManagerImpl(ItemManager itemManager,
44 @Qualifier("uniqueValueService") UniqueValueService uniqueValueService, WorkflowMapper workflowMapper) {
45 this.itemManager = itemManager;
46 this.uniqueValueService = uniqueValueService;
47 this.workflowMapper = workflowMapper;
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);
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()));
65 return this.workflowMapper.itemToWorkflow(retrievedItem);
69 public Workflow create(Workflow workflow) {
70 Item item = workflowMapper.workflowToItem(workflow);
71 item.setStatus(ItemStatus.ACTIVE);
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()});
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()));
87 uniqueValueService.updateUniqueValue(WORKFLOW_NAME_UNIQUE_TYPE, retrievedItem.getName(), workflow.getName());
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);
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;
102 if (limit > totalNumOfWorkflows) {
103 limit = totalNumOfWorkflows;
105 int startIndex = offset * limit;
106 int endIndex = startIndex + limit;
107 if (endIndex > totalNumOfWorkflows) {
108 endIndex = totalNumOfWorkflows;
110 selectedWorkflows = workflowList.subList(startIndex, endIndex);
111 } catch (IndexOutOfBoundsException | IllegalArgumentException ex) {
112 selectedWorkflows = new ArrayList<>();
114 return selectedWorkflows;
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);
122 workflowList.sort(Collections.reverseOrder(comparator));
126 private Comparator<Workflow> getWorkflowListComparator() {
127 //More comparators can be added if required based on sort field name
128 return new WorkflowNameComparator();