unit tests - openecomp-be
[sdc.git] / openecomp-be / api / openecomp-sdc-rest-webapp / item-rest / item-rest-services / src / main / java / org / openecomp / sdcrests / item / rest / services / VersionsImpl.java
1 /*
2  * Copyright © 2016-2018 European Support Limited
3  *
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
7  *
8  *   http://www.apache.org/licenses/LICENSE-2.0
9  *
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.
15  */
16
17 package org.openecomp.sdcrests.item.rest.services;
18
19 import com.google.common.annotations.VisibleForTesting;
20 import org.openecomp.sdc.activitylog.ActivityLogManager;
21 import org.openecomp.sdc.activitylog.ActivityLogManagerFactory;
22 import org.openecomp.sdc.activitylog.dao.type.ActivityLogEntity;
23 import org.openecomp.sdc.activitylog.dao.type.ActivityType;
24 import org.openecomp.sdc.common.errors.CoreException;
25 import org.openecomp.sdc.common.errors.Messages;
26 import org.openecomp.sdc.conflicts.ConflictsManager;
27 import org.openecomp.sdc.conflicts.ConflictsManagerFactory;
28 import org.openecomp.sdc.itempermissions.PermissionsManager;
29 import org.openecomp.sdc.itempermissions.PermissionsManagerFactory;
30 import org.openecomp.sdc.logging.api.Logger;
31 import org.openecomp.sdc.logging.api.LoggerFactory;
32 import org.openecomp.sdc.notification.dtos.Event;
33 import org.openecomp.sdc.notification.factories.NotificationPropagationManagerFactory;
34 import org.openecomp.sdc.notification.services.NotificationPropagationManager;
35 import org.openecomp.sdc.versioning.AsdcItemManager;
36 import org.openecomp.sdc.versioning.AsdcItemManagerFactory;
37 import org.openecomp.sdc.versioning.VersioningManager;
38 import org.openecomp.sdc.versioning.VersioningManagerFactory;
39 import org.openecomp.sdc.versioning.dao.types.Revision;
40 import org.openecomp.sdc.versioning.dao.types.SynchronizationState;
41 import org.openecomp.sdc.versioning.dao.types.Version;
42 import org.openecomp.sdc.versioning.errors.RevisionIdNotFoundErrorBuilder;
43 import org.openecomp.sdc.versioning.types.NotificationEventTypes;
44 import org.openecomp.sdc.versioning.types.VersionCreationMethod;
45 import org.openecomp.sdcrests.item.rest.Versions;
46 import org.openecomp.sdcrests.item.rest.mapping.MapActivityLogEntityToDto;
47 import org.openecomp.sdcrests.item.rest.mapping.MapRevisionToDto;
48 import org.openecomp.sdcrests.item.rest.mapping.MapVersionToDto;
49 import org.openecomp.sdcrests.item.rest.models.SyncEvent;
50 import org.openecomp.sdcrests.item.types.*;
51 import org.openecomp.sdcrests.wrappers.GenericCollectionWrapper;
52 import org.springframework.context.annotation.Scope;
53 import org.springframework.stereotype.Service;
54
55 import javax.inject.Named;
56 import javax.ws.rs.core.Response;
57 import java.util.HashMap;
58 import java.util.List;
59 import java.util.Map;
60
61 import static org.openecomp.sdc.itempermissions.notifications.NotificationConstants.PERMISSION_USER;
62 import static org.openecomp.sdc.versioning.VersioningNotificationConstansts.*;
63
64 @Named
65 @Service("versions")
66 @Scope(value = "prototype")
67 public class VersionsImpl implements Versions {
68
69     private static final String COMMIT_ITEM_ACTION = "Commit_Item";
70     private static final Logger LOGGER = LoggerFactory.getLogger(VersionsImpl.class);
71
72     private ManagersProvider managersProvider;
73
74     @Override
75     public Response list(String itemId, String user) {
76         GenericCollectionWrapper<VersionDto> results = new GenericCollectionWrapper<>();
77         MapVersionToDto mapper = new MapVersionToDto();
78
79         getManagersProvider().getVersioningManager().list(itemId)
80             .forEach(version -> results.add(mapper.applyMapping(version, VersionDto.class)));
81         return Response.ok(results).build();
82     }
83
84     @Override
85     public Response create(VersionRequestDto request, String itemId, String baseVersionId, String user) {
86         Version version = new Version();
87         version.setBaseId(baseVersionId);
88         version.setDescription(request.getDescription());
89
90         version = getManagersProvider().getVersioningManager()
91             .create(itemId, version, VersionCreationMethod.valueOf(request.getCreationMethod().name()));
92
93         VersionDto versionDto = new MapVersionToDto().applyMapping(version, VersionDto.class);
94
95         getManagersProvider().getActivityLogManager().logActivity(
96             new ActivityLogEntity(itemId, version, ActivityType.Create_Version, user, true, "", ""));
97
98         return Response.ok(versionDto).build();
99     }
100
101     @Override
102     public Response get(String itemId, String versionId, String user) {
103         Version version = getVersion(itemId, new Version(versionId));
104         VersionDto versionDto = new MapVersionToDto().applyMapping(version, VersionDto.class);
105         return Response.ok(versionDto).build();
106     }
107
108     @Override
109     public Response getActivityLog(String itemId, String versionId, String user) {
110         GenericCollectionWrapper<ActivityLogDto> results = new GenericCollectionWrapper<>();
111         MapActivityLogEntityToDto mapper = new MapActivityLogEntityToDto();
112
113         getManagersProvider().getActivityLogManager().listLoggedActivities(itemId, new Version(versionId))
114                 .forEach(loggedActivity -> results.add(mapper.applyMapping(loggedActivity, ActivityLogDto.class)));
115
116         return Response.ok(results).build();
117     }
118
119     @Override
120     public Response listRevisions(String itemId, String versionId, String user) {
121         List<Revision> revisions = getManagersProvider().getVersioningManager().listRevisions(itemId, new Version(versionId));
122         filterRevisions(revisions);
123
124         GenericCollectionWrapper<RevisionDto> results = new GenericCollectionWrapper<>();
125         MapRevisionToDto mapper = new MapRevisionToDto();
126         revisions.forEach(revision -> results.add(mapper.applyMapping(revision, RevisionDto.class)));
127         return Response.ok(results).build();
128     }
129
130     @Override
131     public Response actOn(VersionActionRequestDto request, String itemId, String versionId, String user) {
132         Version version = new Version(versionId);
133         switch (request.getAction()) {
134             case Sync:
135                 sync(itemId, version);
136                 break;
137             case Commit:
138                 if (!getManagersProvider().getPermissionsManager().isAllowed(itemId, user, COMMIT_ITEM_ACTION)) {
139                     return Response.status(Response.Status.FORBIDDEN)
140                                    .entity(new Exception(Messages.PERMISSIONS_ERROR.getErrorMessage())).build();
141                 }
142                 commit(request.getCommitRequest(), itemId, version, user);
143                 break;
144             case Revert:
145                 revert(request.getRevisionRequest(), itemId, versionId);
146                 break;
147             case Clean:
148                 getManagersProvider().getVersioningManager().clean(itemId, version);
149                 break;
150             default:
151                 throw new UnsupportedOperationException(String.format("Action %s not supported.", request.getAction()));
152         }
153         return Response.ok().build();
154     }
155
156     private Version getVersion(String itemId, Version version) {
157         Version retrievedVersion = getManagersProvider().getVersioningManager().get(itemId, version);
158
159         if (retrievedVersion.getState().getSynchronizationState() != SynchronizationState.Merging &&
160                     // looks for sdc applicative conflicts
161                     getManagersProvider().getConflictsManager().isConflicted(itemId, retrievedVersion)) {
162             retrievedVersion.getState().setSynchronizationState(SynchronizationState.Merging);
163         }
164         return retrievedVersion;
165     }
166
167     private void sync(String itemId, Version version) {
168         getManagersProvider().getVersioningManager().sync(itemId, version);
169         getManagersProvider().getConflictsManager().finalizeMerge(itemId, version);
170     }
171
172     private void commit(CommitRequestDto request, String itemId, Version version, String user) {
173
174         String message = request == null ? "" : request.getMessage();
175
176         getManagersProvider().getVersioningManager().publish(itemId, version, message);
177         notifyUsers(itemId, version, message, user, NotificationEventTypes.COMMIT);
178         getManagersProvider().getActivityLogManager().logActivity(
179             new ActivityLogEntity(itemId, version, ActivityType.Commit, user, true, "", message));
180     }
181
182     private void revert(RevisionRequestDto request, String itemId, String versionId) {
183         if (request.getRevisionId() == null) {
184             throw new CoreException(new RevisionIdNotFoundErrorBuilder().build());
185         }
186
187         getManagersProvider().getVersioningManager().revert(itemId, new Version(versionId), request.getRevisionId());
188     }
189
190     private void filterRevisions(List<Revision> revisions) {
191   /* When creating a new item an initial version is created with invalid data.
192      This revision is not an applicable revision. The logic of identifying this revision is:
193      1- only the first version of item has this issue
194      2- only in the first item version there are 2 revisions created
195      3- the second revision is in format "Initial <vlm/vsp>: <name of the vlm/vsp>"
196      4- only if a revision in this format exists we remove the first revision. */
197         int numOfRevisions = revisions.size();
198         if (numOfRevisions > 1 &&
199
200                     revisions.get(numOfRevisions - 2).getMessage().matches("Initial .*:.*")) {
201             revisions.remove(numOfRevisions - 1);
202         }
203     }
204
205     private void notifyUsers(String itemId, Version version, String message, String userName,
206             NotificationEventTypes eventType) {
207         Map<String, Object> eventProperties = new HashMap<>();
208         eventProperties.put(ITEM_NAME, getManagersProvider().getAsdcItemManager().get(itemId).getName());
209         eventProperties.put(ITEM_ID, itemId);
210
211         Version ver = getManagersProvider().getVersioningManager().get(itemId, version);
212         eventProperties.put(VERSION_NAME, ver.getName());
213         eventProperties.put(VERSION_ID, ver.getId());
214
215         eventProperties.put(SUBMIT_DESCRIPTION, message);
216         eventProperties.put(PERMISSION_USER, userName);
217
218         Event syncEvent = new SyncEvent(eventType.getEventName(), itemId, eventProperties, itemId);
219         try {
220             getManagersProvider().getNotificationPropagationManager().notifySubscribers(syncEvent, userName);
221         } catch (Exception e) {
222             LOGGER.error("Failed to send sync notification to users subscribed o item '" + itemId);
223         }
224     }
225
226     @VisibleForTesting
227     void setManagersProvider(ManagersProvider managersProvider) {
228         this.managersProvider = managersProvider;
229     }
230
231     private ManagersProvider getManagersProvider() {
232         if (managersProvider == null){
233             managersProvider = new ManagersProvider();
234         }
235         return managersProvider;
236     }
237
238 }