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 org.openecomp.sdc.common.errors.CoreException;
20 import org.openecomp.sdc.common.errors.ErrorCategory;
21 import org.openecomp.sdc.common.errors.ErrorCode;
22 import org.openecomp.sdc.logging.api.Logger;
23 import org.openecomp.sdc.logging.api.LoggerFactory;
24 import org.openecomp.sdc.versioning.ItemManager;
25 import org.openecomp.sdc.versioning.VersionCalculator;
26 import org.openecomp.sdc.versioning.VersioningManager;
27 import org.openecomp.sdc.versioning.dao.VersionDao;
28 import org.openecomp.sdc.versioning.dao.types.Revision;
29 import org.openecomp.sdc.versioning.dao.types.SynchronizationState;
30 import org.openecomp.sdc.versioning.dao.types.Version;
31 import org.openecomp.sdc.versioning.types.VersionCreationMethod;
33 import java.util.HashMap;
34 import java.util.List;
36 import java.util.stream.Collectors;
38 import static org.openecomp.sdc.versioning.dao.types.VersionStatus.Certified;
39 import static org.openecomp.sdc.versioning.dao.types.VersionStatus.Draft;
41 public class VersioningManagerImpl implements VersioningManager {
42 private static final Logger LOGGER = LoggerFactory.getLogger(VersioningManagerImpl.class);
44 private VersionDao versionDao;
45 private VersionCalculator versionCalculator;
46 private ItemManager itemManager;
48 public VersioningManagerImpl(VersionDao versionDao,
49 VersionCalculator versionCalculator,
50 ItemManager itemManager) {
51 this.versionDao = versionDao;
52 this.versionCalculator = versionCalculator;
53 this.itemManager = itemManager;
58 public List<Version> list(String itemId) {
60 List<Version> versions = versionDao.list(itemId);
61 Set<String> versionsNames = versions.stream().map(Version::getName).collect(Collectors.toSet());
62 versions.forEach(version -> {
63 version.setAdditionalInfo(new HashMap<>());
64 versionCalculator.injectAdditionalInfo(version, versionsNames);
70 public Version get(String itemId, Version version) {
71 return versionDao.get(itemId, version)
72 .map(retrievedVersion -> getUpdateRetrievedVersion(itemId, retrievedVersion))
73 .orElseGet(() -> getSyncedVersion(itemId, version));
76 private Version getUpdateRetrievedVersion(String itemId, Version version) {
77 if (version.getStatus() == Certified &&
78 (version.getState().getSynchronizationState() == SynchronizationState.OutOfSync ||
79 version.getState().isDirty())) {
80 forceSync(itemId, version);
81 LOGGER.info("Item Id {}, version Id {}: Force sync is done", itemId, version.getId());
82 version = versionDao.get(itemId, version)
83 .orElseThrow(() -> new IllegalStateException(
84 "Get version after a successful force sync must return the version"));
89 private Version getSyncedVersion(String itemId, Version version) {
90 sync(itemId, version);
91 LOGGER.info("Item Id {}, version Id {}: First time sync is done", itemId, version.getId());
92 return versionDao.get(itemId, version)
93 .orElseThrow(() -> new IllegalStateException(
94 "Get version after a successful sync must return the version"));
98 public Version create(String itemId, Version version, VersionCreationMethod creationMethod) {
99 String baseVersionName = null;
100 if (version.getBaseId() == null) {
101 version.setDescription("Initial version");
103 baseVersionName = get(itemId, new Version(version.getBaseId())).getName();
105 String versionName = versionCalculator.calculate(baseVersionName, creationMethod);
106 validateVersionName(itemId, versionName);
107 version.setName(versionName);
109 versionDao.create(itemId, version);
110 itemManager.updateVersionStatus(itemId, Draft, null);
112 publish(itemId, version, String.format("Create version: %s", version.getName()));
116 private void validateVersionName(String itemId, String versionName) {
117 if (versionDao.list(itemId).stream()
118 .anyMatch(version -> versionName.equals(version.getName()))) {
119 String errorDescription = String
120 .format("Item %s: create version failed, a version with the name %s already exist",
121 itemId, versionName);
123 throw new CoreException(new ErrorCode.ErrorCodeBuilder()
124 .withMessage(errorDescription)
130 public void submit(String itemId, Version version, String submitDescription) {
131 version = get(itemId, version);
133 validateSubmit(itemId, version);
135 version.setStatus(Certified);
136 versionDao.update(itemId, version);
138 publish(itemId, version, submitDescription);
140 itemManager.updateVersionStatus(itemId, Certified, Draft);
143 private void validateSubmit(String itemId, Version version) {
144 if (version.getStatus() == Certified) {
145 String errorDescription = String
146 .format("Item %s: submit version failed, version %s is already Certified", itemId,
148 throw new CoreException(new ErrorCode.ErrorCodeBuilder()
149 .withCategory(ErrorCategory.APPLICATION)
150 .withId("VERSION_ALREADY_CERTIFIED")
151 .withMessage(errorDescription)
157 public void publish(String itemId, Version version, String message) {
158 versionDao.publish(itemId, version, message);
163 public void sync(String itemId, Version version) {
164 versionDao.sync(itemId, version);
168 public void forceSync(String itemId, Version version) {
169 versionDao.forceSync(itemId, version);
173 public void revert(String itemId, Version version, String revisionId) {
174 versionDao.revert(itemId, version, revisionId);
178 public List<Revision> listRevisions(String itemId, Version version) {
179 return versionDao.listRevisions(itemId, version);
183 public void updateVersion(String itemId, Version version) {
184 versionDao.update(itemId, version);
188 public void clean(String itemId, Version version) {
189 versionDao.clean(itemId, version);