Refactor list revisions api
[sdc.git] / openecomp-be / lib / openecomp-sdc-versioning-lib / openecomp-sdc-versioning-core / src / main / java / org / openecomp / sdc / versioning / dao / impl / zusammen / VersionZusammenDaoImpl.java
1 package org.openecomp.sdc.versioning.dao.impl.zusammen;
2
3 import com.amdocs.zusammen.datatypes.Id;
4 import com.amdocs.zusammen.datatypes.SessionContext;
5 import com.amdocs.zusammen.datatypes.item.Info;
6 import com.amdocs.zusammen.datatypes.item.ItemVersion;
7 import com.amdocs.zusammen.datatypes.item.ItemVersionData;
8 import com.amdocs.zusammen.datatypes.item.ItemVersionStatus;
9 import com.amdocs.zusammen.datatypes.item.SynchronizationStatus;
10 import com.amdocs.zusammen.datatypes.itemversion.ItemVersionRevisions;
11 import org.openecomp.core.zusammen.api.ZusammenAdaptor;
12 import org.openecomp.sdc.common.errors.CoreException;
13 import org.openecomp.sdc.common.errors.ErrorCategory;
14 import org.openecomp.sdc.common.errors.ErrorCode;
15 import org.openecomp.sdc.versioning.dao.VersionDao;
16 import org.openecomp.sdc.versioning.dao.impl.zusammen.convertor.ItemVersionToVersionConvertor;
17 import org.openecomp.sdc.versioning.dao.types.Revision;
18 import org.openecomp.sdc.versioning.dao.types.SynchronizationState;
19 import org.openecomp.sdc.versioning.dao.types.Version;
20 import org.openecomp.sdc.versioning.dao.types.VersionState;
21
22 import java.util.ArrayList;
23 import java.util.List;
24 import java.util.Optional;
25 import java.util.stream.Collectors;
26
27 import static org.openecomp.core.zusammen.api.ZusammenUtil.createSessionContext;
28
29 public class VersionZusammenDaoImpl implements VersionDao {
30
31   public static final class ZusammenProperty {
32     public static final String LABEL = "label";
33     public static final String STATUS = "status";
34
35     private ZusammenProperty() {
36       throw new IllegalStateException("Constants class");
37     }
38   }
39
40   private ZusammenAdaptor zusammenAdaptor;
41
42   public VersionZusammenDaoImpl(ZusammenAdaptor zusammenAdaptor) {
43     this.zusammenAdaptor = zusammenAdaptor;
44   }
45
46   @Override
47   public List<Version> list(String itemId) {
48     ItemVersionToVersionConvertor convertor = new ItemVersionToVersionConvertor();
49     return zusammenAdaptor.listPublicVersions(createSessionContext(), new Id(itemId)).stream()
50         .map(convertor::convert)
51         .collect(Collectors.toList());
52   }
53
54   @Override
55   public void create(String itemId, Version version) {
56     Id versionId =
57         zusammenAdaptor.createVersion(createSessionContext(), new Id(itemId),
58             version.getBaseId() == null ? null : new Id(version.getBaseId()),
59             mapToZusammenVersion(version));
60
61     version.setId(versionId.getValue());
62   }
63
64   @Override
65   public void update(String itemId, Version version) {
66     zusammenAdaptor.updateVersion(createSessionContext(), new Id(itemId), new Id(version.getId()),
67         mapToZusammenVersion(version));
68   }
69
70   @Override
71   public Optional<Version> get(String itemId, Version version) {
72     SessionContext context = createSessionContext();
73     Id itemIdObj = new Id(itemId);
74     Id versionId = new Id(version.getId());
75     ItemVersion itemVersion = zusammenAdaptor.getVersion(context, itemIdObj, versionId);
76
77     if (itemVersion == null) {
78       return Optional.empty();
79     }
80
81     VersionState versionState =
82         convertState(zusammenAdaptor.getVersionStatus(context, itemIdObj, versionId));
83     updateVersionStatus(context, itemIdObj, versionId, versionState, itemVersion);
84
85     Version result = new ItemVersionToVersionConvertor().convert(itemVersion);
86     result.setState(versionState);
87     return Optional.of(result);
88   }
89
90   @Override
91   public void delete(String itemId, Version version) {
92     throw new UnsupportedOperationException("Delete version operation is not yet supported.");
93   }
94
95   @Override
96   public void publish(String itemId, Version version, String message) {
97     zusammenAdaptor
98         .publishVersion(createSessionContext(), new Id(itemId), new Id(version.getId()), message);
99   }
100
101   @Override
102   public void sync(String itemId, Version version) {
103     zusammenAdaptor
104         .syncVersion(createSessionContext(), new Id(itemId), new Id(version.getId()));
105   }
106
107   @Override
108   public void forceSync(String itemId, Version version) {
109     zusammenAdaptor
110         .forceSyncVersion(createSessionContext(), new Id(itemId), new Id(version.getId()));
111   }
112
113   @Override
114   public void revert(String itemId, Version version, String revisionId) {
115     zusammenAdaptor.revert(createSessionContext(), new Id(itemId), new Id(version.getId()),
116         new Id(revisionId));
117   }
118
119   @Override
120   public List<Revision> listRevisions(String itemId, Version version) {
121     ItemVersionRevisions itemVersionRevisions = zusammenAdaptor
122         .listRevisions(createSessionContext(), new Id(itemId), new Id(version.getId()));
123
124     return itemVersionRevisions == null || itemVersionRevisions.getItemVersionRevisions() == null ||
125         itemVersionRevisions.getItemVersionRevisions().isEmpty()
126         ? new ArrayList<>()
127         : itemVersionRevisions.getItemVersionRevisions().stream()
128             .map(this::convertRevision)
129             .sorted(this::compareRevisionsTime)
130             .collect(Collectors.toList());
131   }
132
133   private void updateVersionStatus(SessionContext context, Id itemId, Id versionId,
134                                    VersionState versionState, ItemVersion itemVersion) {
135     if (versionState.getSynchronizationState() != SynchronizationState.UpToDate) {
136       String versionStatus = zusammenAdaptor.getPublicVersion(context, itemId, versionId)
137           .getData().getInfo().getProperty(ZusammenProperty.STATUS);
138       itemVersion.getData().getInfo().addProperty(ZusammenProperty.STATUS, versionStatus);
139     }
140   }
141
142   private ItemVersionData mapToZusammenVersion(Version version) {
143     Info info = new Info();
144     info.addProperty(ZusammenProperty.LABEL, version.toString());
145     info.addProperty(ZusammenProperty.STATUS, version.getStatus().name());
146     info.setName(version.getName());
147     info.setDescription(version.getDescription());
148
149     ItemVersionData itemVersionData = new ItemVersionData();
150     itemVersionData.setInfo(info);
151     return itemVersionData;
152   }
153
154   private VersionState convertState(ItemVersionStatus versionStatus) {
155     VersionState state = new VersionState();
156     state.setSynchronizationState(getSyncState(versionStatus.getSynchronizationStatus()));
157     state.setDirty(versionStatus.isDirty());
158     return state;
159   }
160
161   private SynchronizationState getSyncState(SynchronizationStatus synchronizationStatus) {
162     switch (synchronizationStatus) {
163       case UP_TO_DATE:
164         return SynchronizationState.UpToDate;
165       case OUT_OF_SYNC:
166         return SynchronizationState.OutOfSync;
167       case MERGING:
168         return SynchronizationState.Merging;
169       default:
170         throw new CoreException(new ErrorCode.ErrorCodeBuilder()
171             .withCategory(ErrorCategory.APPLICATION)
172             .withId("UNKNOWN_VERSION_STATE")
173             .withMessage("Version state is unknown").build());
174     }
175   }
176
177   private Revision convertRevision(
178       com.amdocs.zusammen.datatypes.itemversion.Revision zusammenRevision) {
179     Revision revision = new Revision();
180     revision.setId(zusammenRevision.getRevisionId().getValue());
181     revision.setTime(zusammenRevision.getTime());
182     revision.setUser(zusammenRevision.getUser());
183     revision.setMessage(zusammenRevision.getMessage());
184     return revision;
185   }
186
187   private int compareRevisionsTime(Revision revision1, Revision revision2) {
188     return revision1.getTime().before(revision2.getTime()) ? 1 : -1;
189   }
190 }