Unit Tests
[sdc.git] / openecomp-be / lib / openecomp-core-lib / openecomp-zusammen-lib / openecomp-zusammen-plugin / src / main / java / org / openecomp / core / zusammen / plugin / collaboration / CommitStagingService.java
1 package org.openecomp.core.zusammen.plugin.collaboration;
2
3 import com.amdocs.zusammen.datatypes.Id;
4 import com.amdocs.zusammen.datatypes.SessionContext;
5 import com.amdocs.zusammen.datatypes.item.ElementContext;
6 import org.openecomp.core.zusammen.plugin.dao.types.ElementEntity;
7 import org.openecomp.core.zusammen.plugin.dao.types.StageEntity;
8 import org.openecomp.core.zusammen.plugin.dao.types.VersionEntity;
9
10 import java.util.Collection;
11 import java.util.Optional;
12
13 public class CommitStagingService {
14
15   private VersionPrivateStore versionPrivateStore;
16   private VersionStageStore versionStageStore;
17   private ElementPrivateStore elementPrivateStore;
18   private ElementStageStore elementStageStore;
19
20   public CommitStagingService(VersionPrivateStore versionPrivateStore,
21                               VersionStageStore versionStageStore,
22                               ElementPrivateStore elementPrivateStore,
23                               ElementStageStore elementStageStore) {
24     this.versionPrivateStore = versionPrivateStore;
25     this.versionStageStore = versionStageStore;
26     this.elementPrivateStore = elementPrivateStore;
27     this.elementStageStore = elementStageStore;
28   }
29
30   public void commitStaging(SessionContext context, Id itemId, Id versionId) {
31     Optional<StageEntity<VersionEntity>> versionStage =
32         versionStageStore.get(context, itemId, new VersionEntity(versionId));
33
34     final ElementContext elementContext = new ElementContext(itemId, versionId, Id.ZERO);
35     Collection<ElementEntity> stagedElementIds = elementStageStore.listIds(context, elementContext);
36
37     if ((!versionStage.isPresent() && stagedElementIds.isEmpty()) ||
38         elementStageStore.hasConflicts(context, elementContext)) {
39       return;
40     }
41
42     versionStage.ifPresent(verStage -> commitVersionStage(context, itemId, verStage));
43     commitElementsStage(context, elementContext, stagedElementIds);
44   }
45
46   private void commitVersionStage(SessionContext context, Id itemId,
47                                   StageEntity<VersionEntity> versionStage) {
48     switch (versionStage.getAction()) {
49       case CREATE:
50         versionPrivateStore.commitStagedCreate(context, itemId, versionStage.getEntity(),
51             versionStage.getPublishTime());
52         break;
53       case UPDATE:
54         versionPrivateStore.commitStagedUpdate(context, itemId, versionStage.getEntity(),
55             versionStage.getPublishTime());
56         break;
57       case IGNORE:
58         versionPrivateStore.commitStagedIgnore(context, itemId, versionStage.getEntity(),
59             versionStage.getPublishTime());
60         break;
61       default:
62         throw new UnsupportedOperationException(
63             "Version change other then Create/Update/Ignore is not supported");
64     }
65
66     versionStageStore.delete(context, itemId, versionStage.getEntity());
67   }
68
69   private void commitElementsStage(SessionContext context, ElementContext elementContext,
70                                    Collection<ElementEntity> stagedElementIds) {
71     for (ElementEntity stagedElementId : stagedElementIds) {
72       StageEntity<ElementEntity> stagedElement =
73           elementStageStore.get(context, elementContext, stagedElementId)
74               .orElseThrow(
75                   () -> new IllegalStateException("Element id returned by list must exist"));
76       switch (stagedElement.getAction()) {
77         case CREATE:
78           elementPrivateStore.commitStagedCreate(context, elementContext, stagedElement.getEntity(),
79               stagedElement.getPublishTime());
80           break;
81         case UPDATE:
82           elementPrivateStore.commitStagedUpdate(context, elementContext, stagedElement.getEntity(),
83               stagedElement.getPublishTime());
84           break;
85         case DELETE:
86           elementPrivateStore
87               .commitStagedDelete(context, elementContext, stagedElement.getEntity());
88           break;
89         case IGNORE:
90           elementPrivateStore.commitStagedIgnore(context, elementContext, stagedElement.getEntity(),
91               stagedElement.getPublishTime());
92           break;
93         default:
94           throw new UnsupportedOperationException(
95               "Element change other then Create/Update/Delete/Ignore is not supported");
96       }
97       elementStageStore.delete(context, elementContext, stagedElement.getEntity());
98     }
99   }
100 }