2 * Copyright © 2016-2017 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.openecomp.activityspec.be.impl;
19 import static org.openecomp.activityspec.api.rest.types.ActivitySpecAction.CERTIFY;
20 import static org.openecomp.activityspec.api.rest.types.ActivitySpecAction.DELETE;
21 import static org.openecomp.activityspec.api.rest.types.ActivitySpecAction.DEPRECATE;
22 import static org.openecomp.activityspec.utils.ActivitySpecConstant.ACTIVITY_SPEC_NOT_FOUND;
23 import static org.openecomp.activityspec.utils.ActivitySpecConstant.INVALID_STATE;
24 import static org.openecomp.sdc.versioning.dao.types.VersionStatus.Certified;
25 import static org.openecomp.sdc.versioning.dao.types.VersionStatus.Deleted;
26 import static org.openecomp.sdc.versioning.dao.types.VersionStatus.Deprecated;
27 import static org.openecomp.sdc.versioning.dao.types.VersionStatus.Draft;
29 import java.util.Collection;
30 import java.util.Collections;
31 import java.util.EnumMap;
32 import java.util.List;
34 import java.util.Objects;
35 import java.util.function.Predicate;
36 import org.openecomp.activityspec.api.rest.types.ActivitySpecAction;
37 import org.openecomp.activityspec.be.ActivitySpecManager;
38 import org.openecomp.activityspec.be.dao.ActivitySpecDao;
39 import org.openecomp.activityspec.be.dao.types.ActivitySpecEntity;
40 import org.openecomp.activityspec.be.datatypes.ItemType;
41 import org.openecomp.activityspec.errors.ActivitySpecNotFoundException;
42 import org.openecomp.activityspec.utils.ActivitySpecConstant;
43 import org.openecomp.core.dao.UniqueValueDao;
44 import org.openecomp.core.util.UniqueValueUtil;
45 import org.openecomp.sdc.common.errors.CoreException;
46 import org.openecomp.sdc.common.errors.ErrorCategory;
47 import org.openecomp.sdc.common.errors.ErrorCode;
48 import org.openecomp.sdc.common.errors.SdcRuntimeException;
49 import org.openecomp.sdc.logging.api.Logger;
50 import org.openecomp.sdc.logging.api.LoggerFactory;
51 import org.openecomp.sdc.versioning.ItemManager;
52 import org.openecomp.sdc.versioning.VersioningManager;
53 import org.openecomp.sdc.versioning.dao.types.Version;
54 import org.openecomp.sdc.versioning.dao.types.VersionStatus;
55 import org.openecomp.sdc.versioning.types.Item;
56 import org.openecomp.sdc.versioning.types.VersionCreationMethod;
58 public class ActivitySpecManagerImpl implements ActivitySpecManager {
60 private static final Map<VersionStatus, Transition> TRANSITIONS;
63 TRANSITIONS = new EnumMap<>(VersionStatus.class);
64 TRANSITIONS.put(Certified, new Transition("Certify", Draft));
65 TRANSITIONS.put(Deprecated, new Transition("Deprecate", Certified));
66 TRANSITIONS.put(Deleted, new Transition("Delete", Deprecated));
69 private final ItemManager itemManager;
70 private final VersioningManager versioningManager;
71 private final ActivitySpecDao activitySpecDao;
72 private final UniqueValueUtil uniqueValueUtil;
73 private static final String ACTIVITY_SPEC_NAME = "ActivitySpec.Name";
74 private static final Logger LOGGER =
75 LoggerFactory.getLogger(ActivitySpecManagerImpl.class);
77 public ActivitySpecManagerImpl(ItemManager itemManager,
78 VersioningManager versioningManager,
79 ActivitySpecDao activitySpecDao,
80 UniqueValueDao uniqueValueDao) {
81 this.itemManager = itemManager;
82 this.versioningManager = versioningManager;
83 this.activitySpecDao = activitySpecDao;
84 this.uniqueValueUtil = new UniqueValueUtil(uniqueValueDao);
88 public ActivitySpecEntity createActivitySpec(ActivitySpecEntity activitySpecEntity) {
90 validateUniqueValue(activitySpecEntity);
92 Item item = getActivitySpecItem(activitySpecEntity);
93 item = itemManager.create(item);
95 Version version = getActivitySpecVersion(activitySpecEntity);
96 versioningManager.create(item.getId(), version, VersionCreationMethod.major);
98 enrichActivitySpec(item, version, activitySpecEntity);
99 activitySpecDao.create(activitySpecEntity);
101 uniqueValueUtil.createUniqueValue(ACTIVITY_SPEC_NAME, activitySpecEntity.getName());
102 return activitySpecEntity;
105 private void validateUniqueValue(ActivitySpecEntity activitySpecEntity) {
107 uniqueValueUtil.validateUniqueValue(ACTIVITY_SPEC_NAME, activitySpecEntity.getName());
108 } catch (CoreException exception) {
109 LOGGER.debug("Unique value error for activity spec name :" + activitySpecEntity.getName(), exception);
110 throw new CoreException(new ErrorCode.ErrorCodeBuilder()
111 .withCategory(ErrorCategory.APPLICATION)
112 .withId(exception.code().id())
113 .withMessage("name already in use").build());
117 private Version getActivitySpecVersion(ActivitySpecEntity activitySpecEntity) {
118 return activitySpecEntity.getVersion() == null ? new Version()
119 : activitySpecEntity.getVersion();
124 public ActivitySpecEntity get(ActivitySpecEntity activitySpec) {
125 activitySpec.setVersion(calculateLatestVersion(activitySpec.getId(),activitySpec.getVersion()));
126 ActivitySpecEntity retrieved;
128 retrieved = activitySpecDao.get(activitySpec);
129 } catch (SdcRuntimeException runtimeException) {
130 LOGGER.debug("Failed to retrieve activity spec for activitySpecId: " + activitySpec.getId()
131 + " and version: " + activitySpec.getVersion().getId(), runtimeException);
132 throw new ActivitySpecNotFoundException(ACTIVITY_SPEC_NOT_FOUND, runtimeException);
134 if (retrieved != null) {
135 final Version retrievedVersion = versioningManager.get(activitySpec.getId(),
136 activitySpec.getVersion());
137 retrieved.setStatus(Objects.nonNull(retrievedVersion) ? retrievedVersion.getStatus().name()
144 public void update(ActivitySpecEntity activitySpec) {
146 ActivitySpecEntity previousActivitySpec = get(activitySpec);
148 if (!activitySpec.getName().equals(previousActivitySpec.getName())) {
149 validateUniqueValue(activitySpec);
152 activitySpecDao.update(activitySpec);
154 if (!activitySpec.getName().equals(previousActivitySpec.getName())) {
155 uniqueValueUtil.createUniqueValue(ACTIVITY_SPEC_NAME, activitySpec.getName());
156 itemManager.updateName(activitySpec.getId(), activitySpec.getName());
157 uniqueValueUtil.deleteUniqueValue(ACTIVITY_SPEC_NAME, previousActivitySpec.getName());
162 public void actOnAction(String activitySpecId, String versionId, ActivitySpecAction action) {
163 Version version = new Version(versionId);
164 version = calculateLatestVersion(activitySpecId, version);
165 if (action == CERTIFY) {
166 version.setStatus(Certified);
168 if (action == DEPRECATE) {
169 version.setStatus(Deprecated);
171 if (action == DELETE) {
172 version.setStatus(Deleted);
175 updateVersionStatus(activitySpecId, action, version);
176 if (action == DELETE) {
177 ActivitySpecEntity entity = new ActivitySpecEntity();
178 entity.setId(activitySpecId);
179 entity.setVersion(version);
180 final ActivitySpecEntity activitySpecEntity = get(entity);
181 uniqueValueUtil.deleteUniqueValue(ACTIVITY_SPEC_NAME, activitySpecEntity.getName());
185 private void updateVersionStatus(String activitySpecId, ActivitySpecAction action,
187 VersionStatus prevVersionStatus = null;
188 Version retrievedVersion;
190 retrievedVersion = versioningManager.get(activitySpecId, version);
191 } catch (SdcRuntimeException exception) {
192 LOGGER.debug("Failed to get version for activitySpecId: " + activitySpecId
193 + " and version: " + version.getId(), exception);
194 throw new ActivitySpecNotFoundException(ACTIVITY_SPEC_NOT_FOUND, exception);
198 VersionStatus status = version.getStatus();
199 Transition transition = TRANSITIONS.get(status);
200 if (transition != null) {
202 VersionStatus retrievedStatus = Objects.nonNull(retrievedVersion) ? retrievedVersion.getStatus() : null;
203 if (retrievedStatus != transition.prevStatus) {
204 LOGGER.debug("Failed to " + version.getStatus() + " since activity spec is in "
206 throw new CoreException(new ErrorCode.ErrorCodeBuilder()
207 .withMessage(INVALID_STATE).build());
209 prevVersionStatus = transition.prevStatus;
212 if (Objects.nonNull(retrievedVersion)) {
213 retrievedVersion.setStatus(status);
214 versioningManager.updateVersion(activitySpecId, retrievedVersion);
215 itemManager.updateVersionStatus(activitySpecId, status, prevVersionStatus);
216 versioningManager.publish(activitySpecId, retrievedVersion, "actionOnActivitySpec :"
221 private Version calculateLatestVersion(String activitySpecId, Version version) {
222 if (ActivitySpecConstant.VERSION_ID_DEFAULT_VALUE.equalsIgnoreCase(version.getId())) {
225 list = versioningManager.list(activitySpecId);
226 } catch (SdcRuntimeException runtimeException) {
227 LOGGER.debug("Failed to list versions for activitySpecId "
228 + activitySpecId, runtimeException);
229 throw new ActivitySpecNotFoundException(ACTIVITY_SPEC_NOT_FOUND, runtimeException);
231 if (Objects.nonNull(list) && !list.isEmpty()) {
239 public Collection<Item> list(String versionStatus) {
240 Predicate<Item> itemPredicate;
241 if (Objects.nonNull(versionStatus)) {
243 VersionStatus statusEnumValue;
246 statusEnumValue = VersionStatus.valueOf(versionStatus);
247 } catch (IllegalArgumentException e) {
248 LOGGER.debug("Unexpected value of VersionStatus {}", versionStatus);
249 return Collections.emptyList();
252 itemPredicate = item -> ItemType.ACTIVITYSPEC.name().equals(item.getType())
253 && item.getVersionStatusCounters().containsKey(statusEnumValue);
256 itemPredicate = item -> ItemType.ACTIVITYSPEC.name().equals(item.getType());
259 return itemManager.list(itemPredicate);
262 private void enrichActivitySpec(Item item, Version version,
263 ActivitySpecEntity activitySpecEntity) {
264 activitySpecEntity.setId(item.getId());
265 activitySpecEntity.setVersion(version);
268 private Item getActivitySpecItem(ActivitySpecEntity activitySpecEntity) {
269 Item item = new Item();
270 item.setType(ItemType.ACTIVITYSPEC.name());
271 item.setName(activitySpecEntity.getName());
272 if (activitySpecEntity.getId() != null) {
273 item.setId(activitySpecEntity.getId());
275 item.addProperty(ActivitySpecConstant.CATEGORY_ATTRIBUTE_NAME,
276 activitySpecEntity.getCategoryList());
280 private static class Transition {
282 private final String action;
283 private final VersionStatus prevStatus;
285 private Transition(String action, VersionStatus prevStatus) {
286 this.action = action;
287 this.prevStatus = prevStatus;