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.activityspec.be.impl;
19 import static org.openecomp.sdc.versioning.dao.types.VersionStatus.Certified;
20 import static org.openecomp.sdc.versioning.dao.types.VersionStatus.Deleted;
21 import static org.openecomp.sdc.versioning.dao.types.VersionStatus.Deprecated;
22 import static org.openecomp.sdc.versioning.dao.types.VersionStatus.Draft;
24 import java.util.Collection;
25 import java.util.Collections;
26 import java.util.EnumMap;
27 import java.util.List;
29 import java.util.Objects;
30 import java.util.function.Predicate;
32 import org.onap.sdc.activityspec.api.rest.types.ActivitySpecAction;
33 import org.onap.sdc.activityspec.be.dao.ActivitySpecDao;
34 import org.onap.sdc.activityspec.utils.ActivitySpecConstant;
35 import org.onap.sdc.activityspec.be.ActivitySpecManager;
36 import org.onap.sdc.activityspec.be.dao.types.ActivitySpecEntity;
37 import org.onap.sdc.activityspec.be.datatypes.ItemType;
38 import org.onap.sdc.activityspec.errors.ActivitySpecNotFoundException;
39 import org.openecomp.core.dao.UniqueValueDao;
40 import org.openecomp.core.util.UniqueValueUtil;
41 import org.openecomp.sdc.common.errors.CoreException;
42 import org.openecomp.sdc.common.errors.ErrorCategory;
43 import org.openecomp.sdc.common.errors.ErrorCode;
44 import org.openecomp.sdc.common.errors.SdcRuntimeException;
45 import org.openecomp.sdc.logging.api.Logger;
46 import org.openecomp.sdc.logging.api.LoggerFactory;
47 import org.openecomp.sdc.versioning.ItemManager;
48 import org.openecomp.sdc.versioning.VersioningManager;
49 import org.openecomp.sdc.versioning.dao.types.Version;
50 import org.openecomp.sdc.versioning.dao.types.VersionStatus;
51 import org.openecomp.sdc.versioning.types.Item;
52 import org.openecomp.sdc.versioning.types.VersionCreationMethod;
54 public class ActivitySpecManagerImpl implements ActivitySpecManager {
56 private static final Map<VersionStatus, VersionStatus> EXPECTED_PREV_STATUS;
59 EXPECTED_PREV_STATUS = new EnumMap<>(VersionStatus.class);
60 EXPECTED_PREV_STATUS.put(Certified, Draft);
61 EXPECTED_PREV_STATUS.put(Deprecated, Certified);
62 EXPECTED_PREV_STATUS.put(Deleted, Deprecated);
65 private final ItemManager itemManager;
66 private final VersioningManager versioningManager;
67 private final ActivitySpecDao activitySpecDao;
68 private final UniqueValueUtil uniqueValueUtil;
69 private static final String ACTIVITY_SPEC_NAME = "ActivitySpec.Name";
70 private static final Logger LOGGER = LoggerFactory.getLogger(ActivitySpecManagerImpl.class);
72 public ActivitySpecManagerImpl(ItemManager itemManager, VersioningManager versioningManager,
73 ActivitySpecDao activitySpecDao, UniqueValueDao uniqueValueDao) {
74 this.itemManager = itemManager;
75 this.versioningManager = versioningManager;
76 this.activitySpecDao = activitySpecDao;
77 this.uniqueValueUtil = new UniqueValueUtil(uniqueValueDao);
81 public ActivitySpecEntity createActivitySpec(ActivitySpecEntity activitySpecEntity) {
83 validateUniqueValue(activitySpecEntity);
85 Item item = getActivitySpecItem(activitySpecEntity);
86 item = itemManager.create(item);
88 Version version = getActivitySpecVersion(activitySpecEntity);
89 versioningManager.create(item.getId(), version, VersionCreationMethod.major);
91 enrichActivitySpec(item, version, activitySpecEntity);
92 activitySpecDao.create(activitySpecEntity);
94 uniqueValueUtil.createUniqueValue(ACTIVITY_SPEC_NAME, activitySpecEntity.getName());
95 return activitySpecEntity;
98 private void validateUniqueValue(ActivitySpecEntity activitySpecEntity) {
100 uniqueValueUtil.validateUniqueValue(ACTIVITY_SPEC_NAME, activitySpecEntity.getName());
101 } catch (CoreException exception) {
102 LOGGER.debug("Unique value error for activity spec name :" + activitySpecEntity.getName(), exception);
103 throw new CoreException(new ErrorCode.ErrorCodeBuilder().withCategory(ErrorCategory.APPLICATION)
104 .withId(exception.code().id())
105 .withMessage("name already in use").build());
109 private Version getActivitySpecVersion(ActivitySpecEntity activitySpecEntity) {
110 return activitySpecEntity.getVersion() == null ? new Version() : activitySpecEntity.getVersion();
115 public ActivitySpecEntity get(ActivitySpecEntity activitySpec) {
116 activitySpec.setVersion(calculateLatestVersion(activitySpec.getId(), activitySpec.getVersion()));
117 ActivitySpecEntity retrieved;
119 retrieved = activitySpecDao.get(activitySpec);
120 } catch (SdcRuntimeException runtimeException) {
122 "Failed to retrieve activity spec for activitySpecId: " + activitySpec.getId() + " and version: "
123 + activitySpec.getVersion().getId(), runtimeException);
124 throw new ActivitySpecNotFoundException(ActivitySpecConstant.ACTIVITY_SPEC_NOT_FOUND, runtimeException);
126 if (retrieved != null) {
127 final Version retrievedVersion = versioningManager.get(activitySpec.getId(), activitySpec.getVersion());
128 retrieved.setStatus(Objects.nonNull(retrievedVersion) ? retrievedVersion.getStatus().name() : null);
134 public void update(ActivitySpecEntity activitySpec) {
136 ActivitySpecEntity previousActivitySpec = get(activitySpec);
138 if (!activitySpec.getName().equals(previousActivitySpec.getName())) {
139 validateUniqueValue(activitySpec);
142 activitySpecDao.update(activitySpec);
144 if (!activitySpec.getName().equals(previousActivitySpec.getName())) {
145 uniqueValueUtil.createUniqueValue(ACTIVITY_SPEC_NAME, activitySpec.getName());
146 itemManager.updateName(activitySpec.getId(), activitySpec.getName());
147 uniqueValueUtil.deleteUniqueValue(ACTIVITY_SPEC_NAME, previousActivitySpec.getName());
152 public void actOnAction(String activitySpecId, String versionId, ActivitySpecAction action) {
153 Version version = new Version(versionId);
154 version = calculateLatestVersion(activitySpecId, version);
155 if (action == ActivitySpecAction.CERTIFY) {
156 version.setStatus(Certified);
158 if (action == ActivitySpecAction.DEPRECATE) {
159 version.setStatus(Deprecated);
161 if (action == ActivitySpecAction.DELETE) {
162 version.setStatus(Deleted);
165 updateVersionStatus(activitySpecId, action, version);
166 if (action == ActivitySpecAction.DELETE) {
167 ActivitySpecEntity entity = new ActivitySpecEntity();
168 entity.setId(activitySpecId);
169 entity.setVersion(version);
170 final ActivitySpecEntity activitySpecEntity = get(entity);
171 uniqueValueUtil.deleteUniqueValue(ACTIVITY_SPEC_NAME, activitySpecEntity.getName());
175 private void updateVersionStatus(String activitySpecId, ActivitySpecAction action, Version version) {
176 VersionStatus prevVersionStatus = null;
177 Version retrievedVersion;
179 retrievedVersion = versioningManager.get(activitySpecId, version);
180 } catch (SdcRuntimeException exception) {
182 "Failed to get version for activitySpecId: " + activitySpecId + " and version: " + version.getId(),
184 throw new ActivitySpecNotFoundException(ActivitySpecConstant.ACTIVITY_SPEC_NOT_FOUND, exception);
188 VersionStatus status = version.getStatus();
189 VersionStatus expectedPrevStatus = EXPECTED_PREV_STATUS.get(status);
190 if (expectedPrevStatus != null) {
192 VersionStatus retrievedStatus = Objects.nonNull(retrievedVersion) ? retrievedVersion.getStatus() : null;
193 if (retrievedStatus != expectedPrevStatus) {
194 LOGGER.debug("Failed to " + version.getStatus() + " since activity spec is in " + retrievedStatus);
195 throw new CoreException(new ErrorCode.ErrorCodeBuilder().withMessage(ActivitySpecConstant.INVALID_STATE)
198 prevVersionStatus = expectedPrevStatus;
201 if (Objects.nonNull(retrievedVersion)) {
202 retrievedVersion.setStatus(status);
203 versioningManager.updateVersion(activitySpecId, retrievedVersion);
204 itemManager.updateVersionStatus(activitySpecId, status, prevVersionStatus);
205 versioningManager.publish(activitySpecId, retrievedVersion, "actionOnActivitySpec :" + action.name());
209 private Version calculateLatestVersion(String activitySpecId, Version version) {
210 if (ActivitySpecConstant.VERSION_ID_DEFAULT_VALUE.equalsIgnoreCase(version.getId())) {
213 list = versioningManager.list(activitySpecId);
214 } catch (SdcRuntimeException runtimeException) {
215 LOGGER.debug("Failed to list versions for activitySpecId " + activitySpecId, runtimeException);
216 throw new ActivitySpecNotFoundException(ActivitySpecConstant.ACTIVITY_SPEC_NOT_FOUND, runtimeException);
218 if (Objects.nonNull(list) && !list.isEmpty()) {
226 public Collection<Item> list(String versionStatus) {
227 Predicate<Item> itemPredicate;
228 if (Objects.nonNull(versionStatus)) {
230 VersionStatus statusEnumValue;
233 statusEnumValue = VersionStatus.valueOf(versionStatus);
234 } catch (IllegalArgumentException e) {
235 LOGGER.debug("Unexpected value of VersionStatus {}", versionStatus);
236 return Collections.emptyList();
240 item -> ItemType.ACTIVITYSPEC.name().equals(item.getType()) && item.getVersionStatusCounters()
241 .containsKey(statusEnumValue);
244 itemPredicate = item -> ItemType.ACTIVITYSPEC.name().equals(item.getType());
247 return itemManager.list(itemPredicate);
250 private void enrichActivitySpec(Item item, Version version, ActivitySpecEntity activitySpecEntity) {
251 activitySpecEntity.setId(item.getId());
252 activitySpecEntity.setVersion(version);
255 private Item getActivitySpecItem(ActivitySpecEntity activitySpecEntity) {
256 Item item = new Item();
257 item.setType(ItemType.ACTIVITYSPEC.name());
258 item.setName(activitySpecEntity.getName());
259 if (activitySpecEntity.getId() != null) {
260 item.setId(activitySpecEntity.getId());
262 item.addProperty(ActivitySpecConstant.CATEGORY_ATTRIBUTE_NAME, activitySpecEntity.getCategoryList());