2 * Copyright © 2018 European Support Limited
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
17 package org.onap.sdc.workflow.services.impl;
19 import static org.onap.sdc.workflow.services.impl.ItemType.WORKFLOW;
20 import static org.onap.sdc.workflow.services.types.PagingConstants.DEFAULT_LIMIT;
21 import static org.onap.sdc.workflow.services.types.PagingConstants.DEFAULT_OFFSET;
22 import static org.onap.sdc.workflow.services.types.PagingConstants.MAX_LIMIT;
24 import java.util.Collection;
25 import java.util.Comparator;
26 import java.util.List;
28 import java.util.function.Predicate;
29 import java.util.stream.Collectors;
30 import org.onap.sdc.workflow.services.types.Workflow;
31 import org.onap.sdc.workflow.services.types.WorkflowVersionState;
32 import org.onap.sdc.workflow.services.UniqueValueService;
33 import org.onap.sdc.workflow.services.WorkflowManager;
34 import org.onap.sdc.workflow.services.exceptions.EntityNotFoundException;
35 import org.onap.sdc.workflow.services.impl.mappers.VersionStateMapper;
36 import org.onap.sdc.workflow.services.impl.mappers.WorkflowMapper;
37 import org.onap.sdc.workflow.services.types.Page;
38 import org.onap.sdc.workflow.services.types.PagingRequest;
39 import org.onap.sdc.workflow.services.types.RequestSpec;
40 import org.onap.sdc.workflow.services.types.Sort;
41 import org.onap.sdc.workflow.services.types.SortingRequest;
42 import org.openecomp.sdc.logging.api.Logger;
43 import org.openecomp.sdc.logging.api.LoggerFactory;
44 import org.openecomp.sdc.versioning.ItemManager;
45 import org.openecomp.sdc.versioning.dao.types.VersionStatus;
46 import org.openecomp.sdc.versioning.types.Item;
47 import org.openecomp.sdc.versioning.types.ItemStatus;
48 import org.springframework.beans.factory.annotation.Autowired;
49 import org.springframework.beans.factory.annotation.Qualifier;
50 import org.springframework.stereotype.Service;
52 @Service("workflowManager")
53 public class WorkflowManagerImpl implements WorkflowManager {
55 private static final String WORKFLOW_NOT_FOUND_ERROR_MSG = "Workflow with id '%s' does not exist";
56 private static final String WORKFLOW_NAME_UNIQUE_TYPE = "WORKFLOW_NAME";
57 private static final Predicate<Item> WORKFLOW_ITEM_FILTER = item -> WORKFLOW.name().equals(item.getType());
58 private static final String WORKSPACES_SORT_PROPERTY = "name";
59 private static final RequestSpec WORKSPACES_DEFAULT_REQUEST_SPEC =
60 new RequestSpec(new PagingRequest(DEFAULT_OFFSET, DEFAULT_LIMIT),
61 SortingRequest.builder().sort(new Sort(WORKSPACES_SORT_PROPERTY, true)).build());
63 private static final Logger LOGGER = LoggerFactory.getLogger(WorkflowManagerImpl.class);
65 private final ItemManager itemManager;
66 private final UniqueValueService uniqueValueService;
67 private final WorkflowMapper workflowMapper;
68 private final VersionStateMapper versionStateMapper;
71 public WorkflowManagerImpl(ItemManager itemManager,
72 @Qualifier("uniqueValueService") UniqueValueService uniqueValueService, WorkflowMapper workflowMapper,
73 VersionStateMapper versionStateMapper) {
74 this.itemManager = itemManager;
75 this.uniqueValueService = uniqueValueService;
76 this.workflowMapper = workflowMapper;
77 this.versionStateMapper = versionStateMapper;
81 public Page<Workflow> list(Set<WorkflowVersionState> versionStatesFilter, RequestSpec requestSpec) {
82 requestSpec = getRequestSpec(requestSpec);
84 Set<VersionStatus> versionStatusesFilter =
85 versionStatesFilter == null ? null :
86 versionStatesFilter.stream().map(versionStateMapper::workflowVersionStateToVersionStatus)
87 .collect(Collectors.toSet());
89 Collection<Item> workflowItems = itemManager.list(getFilter(versionStatusesFilter));
91 List<Workflow> workflowsSlice = workflowItems.stream().map(workflowMapper::itemToWorkflow)
92 .sorted(getWorkflowComparator(requestSpec.getSorting()))
93 .skip(requestSpec.getPaging().getOffset())
94 .limit(requestSpec.getPaging().getLimit())
95 .collect(Collectors.toList());
96 return new Page<>(workflowsSlice, requestSpec.getPaging(), workflowItems.size());
100 public Workflow get(Workflow workflow) {
101 Item retrievedItem = itemManager.get(workflow.getId());
102 if (retrievedItem == null) {
103 LOGGER.error(String.format("Workflow with id %s was not found", workflow.getId()));
104 throw new EntityNotFoundException(String.format(WORKFLOW_NOT_FOUND_ERROR_MSG, workflow.getId()));
106 return this.workflowMapper.itemToWorkflow(retrievedItem);
110 public Workflow create(Workflow workflow) {
111 Item item = workflowMapper.workflowToItem(workflow);
112 item.setStatus(ItemStatus.ACTIVE);
114 uniqueValueService.validateUniqueValue(WORKFLOW_NAME_UNIQUE_TYPE, workflow.getName());
115 Item createdItem = itemManager.create(item);
116 uniqueValueService.createUniqueValue(WORKFLOW_NAME_UNIQUE_TYPE, workflow.getName());
118 return workflowMapper.itemToWorkflow(createdItem);
122 public void update(Workflow workflow) {
123 Item retrievedItem = itemManager.get(workflow.getId());
124 if (retrievedItem == null) {
125 LOGGER.error(String.format("Workflow with id %s was not found", workflow.getId()));
126 throw new EntityNotFoundException(String.format(WORKFLOW_NOT_FOUND_ERROR_MSG, workflow.getId()));
129 uniqueValueService.updateUniqueValue(WORKFLOW_NAME_UNIQUE_TYPE, retrievedItem.getName(), workflow.getName());
131 Item item = workflowMapper.workflowToItem(workflow);
132 item.setId(workflow.getId());
133 item.setStatus(retrievedItem.getStatus());
134 item.setVersionStatusCounters(retrievedItem.getVersionStatusCounters());
135 itemManager.update(item);
138 private static RequestSpec getRequestSpec(RequestSpec requestSpec) {
139 if (requestSpec == null) {
140 return WORKSPACES_DEFAULT_REQUEST_SPEC;
142 if (requestSpec.getPaging() == null) {
143 requestSpec.setPaging(WORKSPACES_DEFAULT_REQUEST_SPEC.getPaging());
145 handlePagingRequestValues(requestSpec.getPaging());
147 if (requestSpec.getSorting() == null) {
148 requestSpec.setSorting(WORKSPACES_DEFAULT_REQUEST_SPEC.getSorting());
153 private static void handlePagingRequestValues(PagingRequest paging) {
154 if (paging.getOffset() == null) {
155 paging.setOffset(DEFAULT_OFFSET);
157 if (paging.getLimit() == null) {
158 paging.setLimit(DEFAULT_LIMIT);
159 } else if (paging.getLimit() > MAX_LIMIT) {
160 paging.setLimit(MAX_LIMIT);
164 private static Comparator<Workflow> getWorkflowComparator(SortingRequest sorting) {
165 Boolean byNameAscending = sorting.getSorts().stream()
166 .filter(sort -> WORKSPACES_SORT_PROPERTY.equalsIgnoreCase(sort.getProperty()))
167 .findFirst().map(Sort::isAscendingOrder).orElse(true);
168 Comparator<Workflow> byName = Comparator.comparing(Workflow::getName);
170 return byNameAscending ? byName : byName.reversed();
173 private static Predicate<Item> getFilter(Set<VersionStatus> versionStatuses) {
174 return WORKFLOW_ITEM_FILTER
175 .and(item -> versionStatuses == null || item.getVersionStatusCounters().keySet().stream()
176 .anyMatch(versionStatuses::contains));