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;
 
  11 import java.util.function.Predicate;
 
  12 import java.util.stream.Collectors;
 
  13 import org.onap.sdc.workflow.persistence.types.Workflow;
 
  14 import org.onap.sdc.workflow.persistence.types.WorkflowVersionState;
 
  15 import org.onap.sdc.workflow.services.UniqueValueService;
 
  16 import org.onap.sdc.workflow.services.WorkflowManager;
 
  17 import org.onap.sdc.workflow.services.WorkflowNameComparator;
 
  18 import org.onap.sdc.workflow.services.exceptions.EntityNotFoundException;
 
  19 import org.onap.sdc.workflow.services.impl.mappers.VersionStateMapper;
 
  20 import org.onap.sdc.workflow.services.impl.mappers.WorkflowMapper;
 
  21 import org.openecomp.sdc.logging.api.Logger;
 
  22 import org.openecomp.sdc.logging.api.LoggerFactory;
 
  23 import org.openecomp.sdc.versioning.ItemManager;
 
  24 import org.openecomp.sdc.versioning.dao.types.VersionStatus;
 
  25 import org.openecomp.sdc.versioning.types.Item;
 
  26 import org.openecomp.sdc.versioning.types.ItemStatus;
 
  27 import org.springframework.beans.factory.annotation.Autowired;
 
  28 import org.springframework.beans.factory.annotation.Qualifier;
 
  29 import org.springframework.data.domain.Pageable;
 
  30 import org.springframework.data.domain.Sort;
 
  31 import org.springframework.stereotype.Service;
 
  32 import org.springframework.util.CollectionUtils;
 
  34 @Service("workflowManager")
 
  35 public class WorkflowManagerImpl implements WorkflowManager {
 
  37     public static final String WORKFLOW_TYPE = "WORKFLOW";
 
  38     private static final String WORKFLOW_NOT_FOUND_ERROR_MSG = "Workflow with id '%s' does not exist";
 
  39     private static final String WORKFLOW_NAME_UNIQUE_TYPE = "WORKFLOW_NAME";
 
  40     static final Predicate<Item> WORKFLOW_ITEM_FILTER = item -> WORKFLOW_TYPE.equals(item.getType());
 
  42     private static final Logger LOGGER = LoggerFactory.getLogger(WorkflowManagerImpl.class);
 
  43     private final ItemManager itemManager;
 
  44     private final UniqueValueService uniqueValueService;
 
  45     private final WorkflowMapper workflowMapper;
 
  46     private final VersionStateMapper versionStateMapper;
 
  49     public WorkflowManagerImpl(ItemManager itemManager,
 
  50             @Qualifier("uniqueValueService") UniqueValueService uniqueValueService, WorkflowMapper workflowMapper,
 
  51             VersionStateMapper versionStateMapper) {
 
  52         this.itemManager = itemManager;
 
  53         this.uniqueValueService = uniqueValueService;
 
  54         this.workflowMapper = workflowMapper;
 
  55         this.versionStateMapper = versionStateMapper;
 
  59     public Collection<Workflow> list(Set<WorkflowVersionState> versionStatesFilter, Pageable pageRequest) {
 
  60         Set<VersionStatus> versionStatusesFilter =
 
  61                 CollectionUtils.isEmpty(versionStatesFilter) ? Collections.emptySet() :
 
  62                         versionStatesFilter.stream().map(versionStateMapper::workflowVersionStateToVersionStatus)
 
  63                                            .collect(Collectors.toSet());
 
  65         List<Workflow> workflows = itemManager.list(getFilter(versionStatusesFilter)).stream()
 
  66                                               .map(workflowMapper::itemToWorkflow)
 
  67                                               .collect(Collectors.toList());
 
  68         sortWorkflows(workflows, pageRequest);
 
  69         return applyLimitAndOffset(workflows, pageRequest);
 
  73     public Workflow get(Workflow workflow) {
 
  74         Item retrievedItem = itemManager.get(workflow.getId());
 
  75         if (retrievedItem == null) {
 
  76             LOGGER.error(String.format("Workflow with id %s was not found",workflow.getId()));
 
  77             throw new EntityNotFoundException(String.format(WORKFLOW_NOT_FOUND_ERROR_MSG, workflow.getId()));
 
  79         return this.workflowMapper.itemToWorkflow(retrievedItem);
 
  83     public Workflow create(Workflow workflow) {
 
  84         Item item = workflowMapper.workflowToItem(workflow);
 
  85         item.setStatus(ItemStatus.ACTIVE);
 
  87         uniqueValueService.validateUniqueValue(WORKFLOW_NAME_UNIQUE_TYPE, new String[] {workflow.getName()});
 
  88         Item createdItem = itemManager.create(item);
 
  89         uniqueValueService.createUniqueValue(WORKFLOW_NAME_UNIQUE_TYPE, new String[] {workflow.getName()});
 
  91         return workflowMapper.itemToWorkflow(createdItem);
 
  95     public void update(Workflow workflow) {
 
  96         Item retrievedItem = itemManager.get(workflow.getId());
 
  97         if (retrievedItem == null) {
 
  98             LOGGER.error(String.format("Workflow with id %s was not found",workflow.getId()));
 
  99             throw new EntityNotFoundException(String.format(WORKFLOW_NOT_FOUND_ERROR_MSG, workflow.getId()));
 
 102         uniqueValueService.updateUniqueValue(WORKFLOW_NAME_UNIQUE_TYPE, retrievedItem.getName(), workflow.getName());
 
 104         Item item = workflowMapper.workflowToItem(workflow);
 
 105         item.setId(workflow.getId());
 
 106         item.setStatus(retrievedItem.getStatus());
 
 107         item.setVersionStatusCounters(retrievedItem.getVersionStatusCounters());
 
 108         itemManager.update(item);
 
 111     private List<Workflow> applyLimitAndOffset(List<Workflow> workflowList, Pageable pageRequest) {
 
 112         int limit = pageRequest.getPageSize();
 
 113         int offset = pageRequest.getPageNumber();
 
 114         int totalNumOfWorkflows = workflowList.size();
 
 115         List<Workflow> selectedWorkflows;
 
 117             if (limit > totalNumOfWorkflows) {
 
 118                 limit = totalNumOfWorkflows;
 
 120             int startIndex = offset * limit;
 
 121             int endIndex = startIndex + limit;
 
 122             if (endIndex > totalNumOfWorkflows) {
 
 123                 endIndex = totalNumOfWorkflows;
 
 125             selectedWorkflows = workflowList.subList(startIndex, endIndex);
 
 126         } catch (IndexOutOfBoundsException | IllegalArgumentException ex) {
 
 127             selectedWorkflows = new ArrayList<>();
 
 129         return selectedWorkflows;
 
 132     private void sortWorkflows(List<Workflow> workflows, Pageable pageRequest) {
 
 133         Comparator<Workflow> comparator = getWorkflowsComparator();
 
 134         if (pageRequest.getSort().getOrderFor(SORT_FIELD_NAME).getDirection() == Sort.Direction.ASC) {
 
 135             workflows.sort(comparator);
 
 137             workflows.sort(Collections.reverseOrder(comparator));
 
 141     private Comparator<Workflow> getWorkflowsComparator() {
 
 142         //More comparators can be added if required based on sort field name
 
 143         return new WorkflowNameComparator();
 
 146     private static Predicate<Item> getFilter(Set<VersionStatus> versionStatuses) {
 
 147         return CollectionUtils.isEmpty(versionStatuses)
 
 148                        ? WORKFLOW_ITEM_FILTER
 
 149                        : WORKFLOW_ITEM_FILTER.and(item -> item.getVersionStatusCounters().keySet().stream()
 
 150                                                               .anyMatch(versionStatuses::contains));