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