2 * Copyright © 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.
16 package org.openecomp.sdcrests.vendorlicense.rest.services;
18 import static org.openecomp.sdc.itempermissions.notifications.NotificationConstants.PERMISSION_USER;
19 import static org.openecomp.sdc.versioning.VersioningNotificationConstansts.ITEM_ID;
20 import static org.openecomp.sdc.versioning.VersioningNotificationConstansts.ITEM_NAME;
21 import static org.openecomp.sdc.versioning.VersioningNotificationConstansts.SUBMIT_DESCRIPTION;
22 import static org.openecomp.sdc.versioning.VersioningNotificationConstansts.VERSION_ID;
23 import static org.openecomp.sdc.versioning.VersioningNotificationConstansts.VERSION_NAME;
24 import static org.openecomp.sdcrests.vendorlicense.types.VendorLicenseModelActionRequestDto.VendorLicenseModelAction.Submit;
26 import java.util.Collection;
27 import java.util.HashMap;
28 import java.util.List;
30 import java.util.function.Predicate;
31 import java.util.stream.Collectors;
32 import javax.inject.Named;
33 import javax.ws.rs.core.Response;
34 import org.openecomp.core.dao.UniqueValueDaoFactory;
35 import org.openecomp.core.util.UniqueValueUtil;
36 import org.openecomp.sdc.activitylog.ActivityLogManager;
37 import org.openecomp.sdc.activitylog.ActivityLogManagerFactory;
38 import org.openecomp.sdc.activitylog.dao.type.ActivityLogEntity;
39 import org.openecomp.sdc.activitylog.dao.type.ActivityType;
40 import org.openecomp.sdc.common.errors.Messages;
41 import org.openecomp.sdc.datatypes.model.ItemType;
42 import org.openecomp.sdc.healing.factory.HealingManagerFactory;
43 import org.openecomp.sdc.itempermissions.PermissionsManager;
44 import org.openecomp.sdc.itempermissions.PermissionsManagerFactory;
45 import org.openecomp.sdc.itempermissions.impl.types.PermissionTypes;
46 import org.openecomp.sdc.logging.api.Logger;
47 import org.openecomp.sdc.logging.api.LoggerFactory;
48 import org.openecomp.sdc.notification.dtos.Event;
49 import org.openecomp.sdc.notification.factories.NotificationPropagationManagerFactory;
50 import org.openecomp.sdc.notification.services.NotificationPropagationManager;
51 import org.openecomp.sdc.vendorlicense.VendorLicenseConstants;
52 import org.openecomp.sdc.vendorlicense.VendorLicenseManager;
53 import org.openecomp.sdc.vendorlicense.VendorLicenseManagerFactory;
54 import org.openecomp.sdc.vendorlicense.dao.types.VendorLicenseModelEntity;
55 import org.openecomp.sdc.vendorsoftwareproduct.dao.VendorSoftwareProductInfoDao;
56 import org.openecomp.sdc.vendorsoftwareproduct.dao.VendorSoftwareProductInfoDaoFactory;
57 import org.openecomp.sdc.vendorsoftwareproduct.dao.type.VspDetails;
58 import org.openecomp.sdc.versioning.AsdcItemManager;
59 import org.openecomp.sdc.versioning.AsdcItemManagerFactory;
60 import org.openecomp.sdc.versioning.VersioningManager;
61 import org.openecomp.sdc.versioning.VersioningManagerFactory;
62 import org.openecomp.sdc.versioning.dao.types.Version;
63 import org.openecomp.sdc.versioning.dao.types.VersionStatus;
64 import org.openecomp.sdc.versioning.types.Item;
65 import org.openecomp.sdc.versioning.types.ItemStatus;
66 import org.openecomp.sdc.versioning.types.NotificationEventTypes;
67 import org.openecomp.sdcrests.item.rest.mapping.MapItemToDto;
68 import org.openecomp.sdcrests.item.rest.mapping.MapVersionToDto;
69 import org.openecomp.sdcrests.item.types.ItemCreationDto;
70 import org.openecomp.sdcrests.item.types.ItemDto;
71 import org.openecomp.sdcrests.item.types.VersionDto;
72 import org.openecomp.sdcrests.vendorlicense.rest.VendorLicenseModels;
73 import org.openecomp.sdcrests.vendorlicense.rest.exception.VendorLicenseModelExceptionSupplier;
74 import org.openecomp.sdcrests.vendorlicense.rest.mapping.MapVendorLicenseModelEntityToDto;
75 import org.openecomp.sdcrests.vendorlicense.rest.mapping.MapVendorLicenseModelRequestDtoToVendorLicenseModelEntity;
76 import org.openecomp.sdcrests.vendorlicense.types.VendorLicenseModelActionRequestDto;
77 import org.openecomp.sdcrests.vendorlicense.types.VendorLicenseModelEntityDto;
78 import org.openecomp.sdcrests.vendorlicense.types.VendorLicenseModelRequestDto;
79 import org.openecomp.sdcrests.wrappers.GenericCollectionWrapper;
80 import org.springframework.context.annotation.Scope;
81 import org.springframework.stereotype.Service;
82 import org.springframework.validation.annotation.Validated;
85 @Service("vendorLicenseModels")
86 @Scope(value = "prototype")
88 public class VendorLicenseModelsImpl implements VendorLicenseModels {
90 private static final String SUBMIT_ITEM_ACTION = "Submit_Item";
91 private static final String SUBMIT_HEALED_VERSION_ERROR = "VLM Id %s: Error while submitting version %s created based on Certified version %s for healing purpose.";
92 private static final Logger LOGGER = LoggerFactory.getLogger(VendorLicenseModelsImpl.class);
94 private final PermissionsManager permissionsManager;
95 private final NotificationPropagationManager notifier;
96 private final AsdcItemManager asdcItemManager;
97 private final VersioningManager versioningManager;
98 private final VendorLicenseManager vendorLicenseManager;
99 private final ActivityLogManager activityLogManager;
100 private final UniqueValueUtil uniqueValueUtil;
101 private final VendorSoftwareProductInfoDao vendorSoftwareProductInfoDao;
103 public VendorLicenseModelsImpl() {
104 this.permissionsManager = PermissionsManagerFactory.getInstance().createInterface();
105 this.notifier = NotificationPropagationManagerFactory.getInstance().createInterface();
106 this.asdcItemManager = AsdcItemManagerFactory.getInstance().createInterface();
107 this.versioningManager = VersioningManagerFactory.getInstance().createInterface();
108 this.vendorLicenseManager = VendorLicenseManagerFactory.getInstance().createInterface();
109 this.activityLogManager = ActivityLogManagerFactory.getInstance().createInterface();
110 this.uniqueValueUtil = new UniqueValueUtil(UniqueValueDaoFactory.getInstance().createInterface());
111 this.vendorSoftwareProductInfoDao = VendorSoftwareProductInfoDaoFactory.getInstance().createInterface();
115 * Test purpose constructor.
116 * @param permissionsManager the {@link PermissionsManager} instance
117 * @param notifier the {@link NotificationPropagationManager} instance
118 * @param asdcItemManager the {@link AsdcItemManager} instance
119 * @param versioningManager the {@link VersioningManager} instance
120 * @param vendorLicenseManager the {@link VendorLicenseManager} instance
121 * @param activityLogManager the {@link ActivityLogManager} instance
122 * @param uniqueValueUtil the {@link UniqueValueUtil} instance
123 * @param vendorSoftwareProductInfoDao the {@link VendorSoftwareProductInfoDao} instance
125 VendorLicenseModelsImpl(final PermissionsManager permissionsManager,
126 final NotificationPropagationManager notifier,
127 final AsdcItemManager asdcItemManager,
128 final VersioningManager versioningManager,
129 final VendorLicenseManager vendorLicenseManager,
130 final ActivityLogManager activityLogManager,
131 final UniqueValueUtil uniqueValueUtil,
132 final VendorSoftwareProductInfoDao vendorSoftwareProductInfoDao) {
133 this.permissionsManager = permissionsManager;
134 this.notifier = notifier;
135 this.asdcItemManager = asdcItemManager;
136 this.versioningManager = versioningManager;
137 this.vendorLicenseManager = vendorLicenseManager;
138 this.activityLogManager = activityLogManager;
139 this.uniqueValueUtil = uniqueValueUtil;
140 this.vendorSoftwareProductInfoDao = vendorSoftwareProductInfoDao;
144 public Response listLicenseModels(String versionStatus, String itemStatus, String user) {
145 Predicate<Item> itemPredicate = createItemPredicate(versionStatus, itemStatus, user);
146 GenericCollectionWrapper<ItemDto> results = new GenericCollectionWrapper<>();
147 MapItemToDto mapper = new MapItemToDto();
148 asdcItemManager.list(itemPredicate).stream().sorted((o1, o2) -> o2.getModificationTime().compareTo(o1.getModificationTime()))
149 .forEach(item -> results.add(mapper.applyMapping(item, ItemDto.class)));
150 return Response.ok(results).build();
154 public Response createLicenseModel(VendorLicenseModelRequestDto request, String user) {
155 Item item = new Item();
156 item.setType(ItemType.vlm.name());
158 item.setStatus(ItemStatus.ACTIVE);
159 item.setName(request.getVendorName());
160 item.setDescription(request.getDescription());
161 uniqueValueUtil.validateUniqueValue(VendorLicenseConstants.UniqueValues.VENDOR_NAME, item.getName());
162 item = asdcItemManager.create(item);
163 uniqueValueUtil.createUniqueValue(VendorLicenseConstants.UniqueValues.VENDOR_NAME, item.getName());
164 Version version = versioningManager.create(item.getId(), new Version(), null);
165 VendorLicenseModelEntity vlm = new MapVendorLicenseModelRequestDtoToVendorLicenseModelEntity()
166 .applyMapping(request, VendorLicenseModelEntity.class);
167 vlm.setId(item.getId());
168 vlm.setVersion(version);
169 vendorLicenseManager.createVendorLicenseModel(vlm);
170 versioningManager.publish(item.getId(), version, "Initial vlm:" + vlm.getVendorName());
171 ItemCreationDto itemCreationDto = new ItemCreationDto();
172 itemCreationDto.setItemId(item.getId());
173 itemCreationDto.setVersion(new MapVersionToDto().applyMapping(version, VersionDto.class));
174 activityLogManager.logActivity(new ActivityLogEntity(vlm.getId(), version, ActivityType.Create, user, true, "", ""));
175 return Response.ok(itemCreationDto).build();
179 public Response updateLicenseModel(VendorLicenseModelRequestDto request, String vlmId, String versionId, String user) {
180 VendorLicenseModelEntity vlm = new MapVendorLicenseModelRequestDtoToVendorLicenseModelEntity()
181 .applyMapping(request, VendorLicenseModelEntity.class);
183 vlm.setVersion(new Version(versionId));
184 vendorLicenseManager.updateVendorLicenseModel(vlm);
185 return Response.ok().build();
189 public Response getLicenseModel(String vlmId, String versionId, String user) {
190 Version version = versioningManager.get(vlmId, new Version(versionId));
191 VendorLicenseModelEntity vlm = vendorLicenseManager.getVendorLicenseModel(vlmId, version);
193 HealingManagerFactory.getInstance().createInterface().healItemVersion(vlmId, version, ItemType.vlm, false).ifPresent(healedVersion -> {
194 vlm.setVersion(healedVersion);
195 if (version.getStatus() == VersionStatus.Certified) {
196 submitHealedVersion(vlmId, healedVersion, versionId, user);
199 } catch (Exception e) {
200 LOGGER.error(String.format("Error while auto healing VLM with Id %s and version %s", vlmId, versionId), e);
202 VendorLicenseModelEntityDto vlmDto = new MapVendorLicenseModelEntityToDto().applyMapping(vlm, VendorLicenseModelEntityDto.class);
203 return Response.ok(vlmDto).build();
207 public Response deleteLicenseModel(final String vlmId, final String user) {
208 final Item vlm = asdcItemManager.get(vlmId);
209 if (vlm == null || !ItemType.vlm.getName().equals(vlm.getType())) {
210 throw VendorLicenseModelExceptionSupplier.couldNotFindVlm(vlmId).get();
213 final List<String> vlmUsedByAnyVsp = findVspsUsingVlm(vlm.getId());
214 if (!vlmUsedByAnyVsp.isEmpty()) {
215 throw VendorLicenseModelExceptionSupplier.cantDeleteUsedVlm(vlmId, vlmUsedByAnyVsp).get();
218 final Integer certifiedVersionsCounter = vlm.getVersionStatusCounters().get(VersionStatus.Certified);
219 final boolean wasVlmAtLeastOnceCertified = certifiedVersionsCounter != null && certifiedVersionsCounter > 0;
220 if (wasVlmAtLeastOnceCertified) {
221 throw VendorLicenseModelExceptionSupplier.cantDeleteCertifiedVlm(vlmId).get();
224 asdcItemManager.delete(vlm);
225 permissionsManager.deleteItemPermissions(vlmId);
226 uniqueValueUtil.deleteUniqueValue(VendorLicenseConstants.UniqueValues.VENDOR_NAME, vlm.getName());
227 notifyUsers(vlmId, vlm.getName(), null, null, user, NotificationEventTypes.DELETE);
228 return Response.ok().build();
232 public Response actOnLicenseModel(VendorLicenseModelActionRequestDto request, String vlmId, String versionId, String user) {
233 Version version = new Version(versionId);
234 if (request.getAction() == Submit) {
235 if (!permissionsManager.isAllowed(vlmId, user, SUBMIT_ITEM_ACTION)) {
236 return Response.status(Response.Status.FORBIDDEN).entity(new Exception(Messages.PERMISSIONS_ERROR.getErrorMessage())).build();
238 String message = request.getSubmitRequest() == null ? "Submit" : request.getSubmitRequest().getMessage();
239 submit(vlmId, version, message, user);
240 notifyUsers(vlmId, null, version, message, user, NotificationEventTypes.SUBMIT);
242 return Response.ok().build();
245 private List<String> findVspsUsingVlm(final String vlmId) {
246 final Collection<VspDetails> vspDetailsList = vendorSoftwareProductInfoDao.list(null);
247 return vspDetailsList.stream()
248 .filter(vspDetails -> vlmId.equals(vspDetails.getVendorId()))
249 .map(VspDetails::getName)
250 .collect(Collectors.toList());
253 private void submit(String vlmId, Version version, String message, String user) {
254 vendorLicenseManager.validate(vlmId, version);
255 versioningManager.submit(vlmId, version, message);
256 activityLogManager.logActivity(new ActivityLogEntity(vlmId, version, ActivityType.Submit, user, true, "", message));
259 private void submitHealedVersion(String vlmId, Version healedVersion, String baseVersionId, String user) {
261 submit(vlmId, healedVersion, "Submit after heal", user);
262 } catch (Exception ex) {
263 LOGGER.error(String.format(SUBMIT_HEALED_VERSION_ERROR, vlmId, healedVersion.getId(), baseVersionId), ex);
267 private void notifyUsers(String itemId, String itemName, Version version, String message, String userName, NotificationEventTypes eventType) {
268 Map<String, Object> eventProperties = new HashMap<>();
269 eventProperties.put(ITEM_NAME, itemName == null ? asdcItemManager.get(itemId).getName() : itemName);
270 eventProperties.put(ITEM_ID, itemId);
271 if (version != null) {
272 eventProperties.put(VERSION_NAME, version.getName() == null ? versioningManager.get(itemId, version).getName() : version.getName());
273 eventProperties.put(VERSION_ID, version.getId());
275 eventProperties.put(SUBMIT_DESCRIPTION, message);
276 eventProperties.put(PERMISSION_USER, userName);
277 Event syncEvent = new SyncEvent(eventType.getEventName(), itemId, eventProperties, itemId);
279 notifier.notifySubscribers(syncEvent, userName);
280 } catch (Exception e) {
281 LOGGER.error("Failed to send sync notification to users subscribed o item '" + itemId);
285 private boolean userHasPermission(String itemId, String userId) {
286 return permissionsManager.getUserItemPermission(itemId, userId)
287 .map(permission -> permission.matches(PermissionTypes.Contributor.name() + "|" + PermissionTypes.Owner.name())).orElse(false);
290 private Predicate<Item> createItemPredicate(String versionStatus, String itemStatus, String user) {
291 Predicate<Item> itemPredicate = item -> ItemType.vlm.name().equals(item.getType());
292 if (ItemStatus.ARCHIVED.name().equals(itemStatus)) {
293 itemPredicate = itemPredicate.and(item -> ItemStatus.ARCHIVED.equals(item.getStatus()));
295 itemPredicate = itemPredicate.and(item -> ItemStatus.ACTIVE.equals(item.getStatus()));
296 if (VersionStatus.Certified.name().equals(versionStatus)) {
297 itemPredicate = itemPredicate.and(item -> item.getVersionStatusCounters().containsKey(VersionStatus.Certified));
298 } else if (VersionStatus.Draft.name().equals(versionStatus)) {
299 itemPredicate = itemPredicate
300 .and(item -> item.getVersionStatusCounters().containsKey(VersionStatus.Draft) && userHasPermission(item.getId(), user));
303 return itemPredicate;
306 private class SyncEvent implements Event {
308 private String eventType;
309 private String originatorId;
310 private Map<String, Object> attributes;
311 private String entityId;
313 SyncEvent(String eventType, String originatorId, Map<String, Object> attributes, String entityId) {
314 this.eventType = eventType;
315 this.originatorId = originatorId;
316 this.attributes = attributes;
317 this.entityId = entityId;
321 public String getEventType() {
326 public String getOriginatorId() {
331 public Map<String, Object> getAttributes() {
336 public String getEntityId() {