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.openecomp.sdc.versioning.impl;
19 import static org.openecomp.sdc.versioning.dao.types.VersionStatus.Certified;
20 import static org.openecomp.sdc.versioning.dao.types.VersionStatus.Draft;
22 import java.util.HashMap;
23 import java.util.List;
25 import java.util.stream.Collectors;
26 import org.openecomp.sdc.common.errors.CoreException;
27 import org.openecomp.sdc.common.errors.ErrorCategory;
28 import org.openecomp.sdc.common.errors.ErrorCode;
29 import org.openecomp.sdc.logging.api.Logger;
30 import org.openecomp.sdc.logging.api.LoggerFactory;
31 import org.openecomp.sdc.versioning.ItemManager;
32 import org.openecomp.sdc.versioning.VersionCalculator;
33 import org.openecomp.sdc.versioning.VersioningManager;
34 import org.openecomp.sdc.versioning.dao.VersionDao;
35 import org.openecomp.sdc.versioning.dao.types.Revision;
36 import org.openecomp.sdc.versioning.dao.types.SynchronizationState;
37 import org.openecomp.sdc.versioning.dao.types.Version;
38 import org.openecomp.sdc.versioning.types.VersionCreationMethod;
40 public class VersioningManagerImpl implements VersioningManager {
41 private static final Logger LOGGER = LoggerFactory.getLogger(VersioningManagerImpl.class);
43 private VersionDao versionDao;
44 private VersionCalculator versionCalculator;
45 private ItemManager itemManager;
47 public VersioningManagerImpl(VersionDao versionDao,
48 VersionCalculator versionCalculator,
49 ItemManager itemManager) {
50 this.versionDao = versionDao;
51 this.versionCalculator = versionCalculator;
52 this.itemManager = itemManager;
57 public List<Version> list(String itemId) {
59 List<Version> versions = versionDao.list(itemId);
60 Set<String> versionsNames = versions.stream().map(Version::getName).collect(Collectors.toSet());
61 versions.forEach(version -> {
62 version.setAdditionalInfo(new HashMap<>());
63 versionCalculator.injectAdditionalInfo(version, versionsNames);
69 public Version get(String itemId, Version version) {
70 return versionDao.get(itemId, version)
71 .map(retrievedVersion -> getUpdateRetrievedVersion(itemId, retrievedVersion))
72 .orElseGet(() -> getSyncedVersion(itemId, version));
75 private Version getUpdateRetrievedVersion(String itemId, Version version) {
76 if (version.getStatus() == Certified &&
77 (version.getState().getSynchronizationState() == SynchronizationState.OutOfSync ||
78 version.getState().isDirty())) {
79 forceSync(itemId, version);
80 LOGGER.info("Item Id {}, version Id {}: Force sync is done", itemId, version.getId());
81 version = versionDao.get(itemId, version)
82 .orElseThrow(() -> new IllegalStateException(
83 "Get version after a successful force sync must return the version"));
88 private Version getSyncedVersion(String itemId, Version version) {
89 sync(itemId, version);
90 LOGGER.info("Item Id {}, version Id {}: First time sync is done", itemId, version.getId());
91 return versionDao.get(itemId, version)
92 .orElseThrow(() -> new IllegalStateException(
93 "Get version after a successful sync must return the version"));
97 public Version create(String itemId, Version version, VersionCreationMethod creationMethod) {
98 String baseVersionName = null;
99 if (version.getBaseId() == null) {
100 version.setDescription("Initial version");
102 baseVersionName = get(itemId, new Version(version.getBaseId())).getName();
104 String versionName = versionCalculator.calculate(baseVersionName, creationMethod);
105 validateVersionName(itemId, versionName);
106 version.setName(versionName);
108 versionDao.create(itemId, version);
109 itemManager.updateVersionStatus(itemId, Draft, null);
111 publish(itemId, version, String.format("Create version: %s", version.getName()));
115 private void validateVersionName(String itemId, String versionName) {
116 if (versionDao.list(itemId).stream()
117 .anyMatch(version -> versionName.equals(version.getName()))) {
118 String errorDescription = String
119 .format("Item %s: create version failed, a version with the name %s already exist",
120 itemId, versionName);
122 throw new CoreException(new ErrorCode.ErrorCodeBuilder()
123 .withMessage(errorDescription)
129 public void submit(String itemId, Version version, String submitDescription) {
130 version = get(itemId, version);
132 validateSubmit(itemId, version);
134 version.setStatus(Certified);
135 versionDao.update(itemId, version);
137 publish(itemId, version, submitDescription);
139 itemManager.updateVersionStatus(itemId, Certified, Draft);
142 private void validateSubmit(String itemId, Version version) {
143 if (version.getStatus() == Certified) {
144 String errorDescription = String
145 .format("Item %s: submit version failed, version %s is already Certified", itemId,
147 throw new CoreException(new ErrorCode.ErrorCodeBuilder()
148 .withCategory(ErrorCategory.APPLICATION)
149 .withId("VERSION_ALREADY_CERTIFIED")
150 .withMessage(errorDescription)
156 public void publish(String itemId, Version version, String message) {
157 versionDao.publish(itemId, version, message);
162 public void sync(String itemId, Version version) {
163 versionDao.sync(itemId, version);
167 public void forceSync(String itemId, Version version) {
168 versionDao.forceSync(itemId, version);
172 public void revert(String itemId, Version version, String revisionId) {
173 versionDao.revert(itemId, version, revisionId);
177 public List<Revision> listRevisions(String itemId, Version version) {
178 return versionDao.listRevisions(itemId, version);
182 public void updateVersion(String itemId, Version version) {
183 versionDao.update(itemId, version);