2 * Copyright © 2016-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.common.versioning.services.types.VersionStatus.Certified;
20 import static org.onap.sdc.common.versioning.services.types.VersionStatus.Deleted;
21 import static org.onap.sdc.common.versioning.services.types.VersionStatus.Deprecated;
22 import static org.onap.sdc.common.versioning.services.types.VersionStatus.Draft;
23 import static org.onap.sdc.workflow.services.ActivitySpecConstant.ACTIVITY_SPEC_NOT_FOUND;
24 import static org.onap.sdc.workflow.services.ActivitySpecConstant.VERSION_ID_DEFAULT_VALUE;
26 import java.util.Collection;
27 import java.util.Collections;
28 import java.util.Comparator;
29 import java.util.EnumMap;
30 import java.util.List;
32 import java.util.Objects;
33 import java.util.function.Predicate;
34 import java.util.stream.Collectors;
35 import org.onap.sdc.common.versioning.services.ItemManager;
36 import org.onap.sdc.common.versioning.services.VersioningManager;
37 import org.onap.sdc.common.versioning.services.types.Item;
38 import org.onap.sdc.common.versioning.services.types.Version;
39 import org.onap.sdc.common.versioning.services.types.VersionCreationMethod;
40 import org.onap.sdc.common.versioning.services.types.VersionStatus;
41 import org.onap.sdc.workflow.api.types.activityspec.ActivitySpecAction;
42 import org.onap.sdc.workflow.persistence.ActivitySpecRepository;
43 import org.onap.sdc.workflow.persistence.types.ActivitySpecEntity;
44 import org.onap.sdc.workflow.services.ActivitySpecManager;
45 import org.onap.sdc.workflow.services.UniqueValueService;
46 import org.onap.sdc.workflow.services.exceptions.EntityNotFoundException;
47 import org.onap.sdc.workflow.services.exceptions.VersionStatusModificationException;
48 import org.onap.sdc.workflow.services.impl.mappers.ActivitySpecMapper;
49 import org.openecomp.sdc.logging.api.Logger;
50 import org.openecomp.sdc.logging.api.LoggerFactory;
51 import org.springframework.beans.factory.annotation.Autowired;
52 import org.springframework.beans.factory.annotation.Qualifier;
53 import org.springframework.stereotype.Service;
55 @Service("activitySpecManager")
56 public class ActivitySpecManagerImpl implements ActivitySpecManager {
58 private static final String ACTIVITY_SPEC_NAME = "ActivitySpec.Name";
59 private static final Logger LOGGER = LoggerFactory.getLogger(ActivitySpecManagerImpl.class);
60 private static final Map<VersionStatus, VersionStatus> EXPECTED_PREV_STATUS;
63 EXPECTED_PREV_STATUS = new EnumMap<>(VersionStatus.class);
64 EXPECTED_PREV_STATUS.put(Certified, Draft);
65 EXPECTED_PREV_STATUS.put(Deprecated, Certified);
66 EXPECTED_PREV_STATUS.put(Deleted, Deprecated);
69 private final ItemManager itemManager;
70 private final VersioningManager versioningManager;
71 private final ActivitySpecRepository activitySpecDao;
72 private final UniqueValueService uniqueValueService;
73 private final ActivitySpecMapper activitySpecMapper;
77 public ActivitySpecManagerImpl(ItemManager itemManager, VersioningManager versioningManager,
78 ActivitySpecRepository activitySpecDao,
79 @Qualifier("uniqueValueService") UniqueValueService uniqueValueService,
80 ActivitySpecMapper activitySpecMapper) {
81 this.itemManager = itemManager;
82 this.versioningManager = versioningManager;
83 this.activitySpecDao = activitySpecDao;
84 this.uniqueValueService = uniqueValueService;
85 this.activitySpecMapper = activitySpecMapper;
89 public ActivitySpecEntity createActivitySpec(ActivitySpecEntity activitySpec) {
91 uniqueValueService.validateUniqueValue(ACTIVITY_SPEC_NAME, activitySpec.getName());
93 Item item = new Item();
94 activitySpecMapper.toItem(activitySpec, item);
95 Item createdItem = itemManager.create(item);
97 Version createdVersion =
98 versioningManager.create(createdItem.getId(), null, new Version(), VersionCreationMethod.major);
100 activitySpec.setId(createdItem.getId());
101 activitySpec.setVersionId(createdVersion.getId());
102 activitySpecDao.create(activitySpec);
104 uniqueValueService.createUniqueValue(ACTIVITY_SPEC_NAME, activitySpec.getName());
109 public ActivitySpecEntity get(ActivitySpecEntity activitySpec) {
110 activitySpec.setVersionId(calculateLatestVersion(activitySpec));
111 ActivitySpecEntity retrieved;
114 retrieved = activitySpecDao.get(activitySpec);
115 } catch (RuntimeException e) {
116 LOGGER.error("Failed to retrieve activity spec for activitySpecId: {} and version: {}",
117 activitySpec.getId(), activitySpec.getVersionId(), e);
118 throw new EntityNotFoundException(ACTIVITY_SPEC_NOT_FOUND);
120 if (retrieved != null) {
121 final Version retrievedVersion = versioningManager.get(activitySpec.getId(), activitySpec.getVersionId());
122 retrieved.setStatus(Objects.nonNull(retrievedVersion) ? retrievedVersion.getStatus().name() : null);
128 public void update(ActivitySpecEntity activitySpec) {
129 Item item = itemManager.get(activitySpec.getId());
131 LOGGER.error("Activity Spec with id {} was not found", activitySpec.getId());
132 throw new EntityNotFoundException(ACTIVITY_SPEC_NOT_FOUND);
134 uniqueValueService.updateUniqueValue(ACTIVITY_SPEC_NAME, item.getName(), activitySpec.getName());
136 activitySpecMapper.toItem(activitySpec, item);
137 itemManager.update(activitySpec.getId(), item);
139 activitySpec.setVersionId(calculateLatestVersion(activitySpec));
140 activitySpecDao.update(activitySpec);
144 public void actOnAction(ActivitySpecEntity activitySpec, ActivitySpecAction action) {
145 VersionStatus newStatus = getVersionStatusByAction(action);
147 String versionId = calculateLatestVersion(activitySpec);
148 Version retrievedVersion;
150 retrievedVersion = versioningManager.get(activitySpec.getId(), versionId);
151 } catch (RuntimeException e) {
152 LOGGER.error("failed to get activity {}, version {}", activitySpec.getId(), versionId, e);
153 throw new EntityNotFoundException(ACTIVITY_SPEC_NOT_FOUND);
155 if (retrievedVersion == null) {
156 throw new EntityNotFoundException(ACTIVITY_SPEC_NOT_FOUND);
159 VersionStatus retrievedStatus = retrievedVersion.getStatus();
160 VersionStatus expectedPrevStatus = EXPECTED_PREV_STATUS.get(newStatus);
161 if (expectedPrevStatus != null && retrievedStatus != expectedPrevStatus) {
162 LOGGER.debug("Failed to {} since activity spec is in status {}", action.name(), retrievedStatus);
163 throw new VersionStatusModificationException(activitySpec.getId(), versionId, retrievedStatus,
167 versioningManager.updateStatus(activitySpec.getId(), retrievedVersion.getId(), newStatus,
168 "actionOnActivitySpec :" + action.name());
170 if (action == ActivitySpecAction.DELETE) {
171 final String activitySpecName = get(new ActivitySpecEntity(activitySpec.getId(), versionId)).getName();
172 uniqueValueService.deleteUniqueValue(ACTIVITY_SPEC_NAME, activitySpecName);
176 private VersionStatus getVersionStatusByAction(ActivitySpecAction action) {
185 throw new UnsupportedOperationException(
186 String.format("Activity Spec action %s is not supported", action.name()));
192 public Collection<ActivitySpecEntity> list(String versionStatus) {
193 Predicate<Item> itemPredicate;
194 if (Objects.nonNull(versionStatus)) {
195 VersionStatus statusEnumValue;
198 statusEnumValue = VersionStatus.valueOf(versionStatus);
199 } catch (IllegalArgumentException e) {
200 LOGGER.debug("Unexpected value of VersionStatus {}", versionStatus);
201 return Collections.emptyList();
204 item -> ItemType.ACTIVITYSPEC.name().equals(item.getType()) && item.getVersionStatusCounters()
208 itemPredicate = item -> ItemType.ACTIVITYSPEC.name().equals(item.getType());
211 return itemManager.list(itemPredicate).stream()
212 .sorted(Comparator.comparing(Item::getModificationTime).reversed())
213 .map(activitySpecMapper::itemToActivitySpec).collect(Collectors.toList());
216 private String calculateLatestVersion(ActivitySpecEntity activitySpec) {
217 if (VERSION_ID_DEFAULT_VALUE.equalsIgnoreCase(activitySpec.getVersionId())) {
218 List<Version> versions;
220 versions = versioningManager.list(activitySpec.getId());
221 } catch (RuntimeException e) {
222 LOGGER.error("Failed to list versions for activitySpecId {}", activitySpec.getId(), e);
223 throw new EntityNotFoundException(ACTIVITY_SPEC_NOT_FOUND);
225 if (Objects.nonNull(versions) && !versions.isEmpty()) {
226 return versions.get(0).getId();
229 return activitySpec.getVersionId();