[SDC-29] rebase continue work to align source
[sdc.git] / asdctool / src / main / java / org / openecomp / sdc / asdctool / impl / migration / v1707 / Migration1707RelationsFix.java
1 package org.openecomp.sdc.asdctool.impl.migration.v1707;
2
3 import java.util.EnumMap;
4 import java.util.Iterator;
5 import java.util.List;
6 import java.util.Map;
7 import org.apache.tinkerpop.gremlin.structure.Direction;
8 import org.apache.tinkerpop.gremlin.structure.Edge;
9 import org.openecomp.sdc.be.dao.jsongraph.GraphVertex;
10 import org.openecomp.sdc.be.dao.jsongraph.TitanDao;
11 import org.openecomp.sdc.be.dao.jsongraph.types.EdgeLabelEnum;
12 import org.openecomp.sdc.be.dao.jsongraph.types.JsonParseFlagEnum;
13 import org.openecomp.sdc.be.dao.jsongraph.types.VertexTypeEnum;
14 import org.openecomp.sdc.be.dao.titan.TitanOperationStatus;
15 import org.openecomp.sdc.be.datatypes.enums.GraphPropertyEnum;
16 import org.openecomp.sdc.be.datatypes.enums.JsonPresentationFields;
17 import org.slf4j.Logger;
18 import org.slf4j.LoggerFactory;
19 import org.springframework.beans.factory.annotation.Autowired;
20 import org.springframework.stereotype.Component;
21
22 import fj.data.Either;
23 @Component("migration1707relationsFix")
24 public class Migration1707RelationsFix {
25
26         private static Logger LOGGER = LoggerFactory.getLogger(Migration1707RelationsFix.class);
27         
28         @Autowired
29     private TitanDao titanDao;
30
31         public boolean migrate() {
32                 boolean result = true;
33
34                 try{
35                         Map<GraphPropertyEnum, Object> propsHasNot = new EnumMap<>(GraphPropertyEnum.class);
36                         propsHasNot.put(GraphPropertyEnum.IS_DELETED, true);
37                         Either<List<GraphVertex>, TitanOperationStatus> getAllTopologyTemplatesRes = titanDao.getByCriteria(VertexTypeEnum.TOPOLOGY_TEMPLATE, null, propsHasNot, JsonParseFlagEnum.ParseMetadata);
38                         if (getAllTopologyTemplatesRes.isRight() && getAllTopologyTemplatesRes.right().value() != TitanOperationStatus.NOT_FOUND) {
39                                 LOGGER.debug("Failed to fetch all non marked as deleted topology templates , error {}", getAllTopologyTemplatesRes.right().value());
40                                 result = false;
41                         }
42                         if(getAllTopologyTemplatesRes.isLeft()){
43                                 fixComponentsRelations(getAllTopologyTemplatesRes.left().value());
44                         }
45                         if(result){
46                                 Either<List<GraphVertex>, TitanOperationStatus> getAllNodeTypesRes = titanDao.getByCriteria(VertexTypeEnum.NODE_TYPE, null, propsHasNot, JsonParseFlagEnum.ParseMetadata);
47                                 if (getAllNodeTypesRes.isRight() && getAllNodeTypesRes.right().value() != TitanOperationStatus.NOT_FOUND) {
48                                         LOGGER.debug("Failed to fetch all non marked as deleted node types , error {}", getAllNodeTypesRes.right().value());
49                                         result = false;
50                                 }
51                                 if(getAllNodeTypesRes.isLeft()){
52                                         fixComponentsRelations(getAllNodeTypesRes.left().value());
53                                 }
54                         }
55                 } catch (Exception e){
56                         LOGGER.debug("The exception {} occured upon migration 1707 relations fixing. ", e.getMessage());
57                         e.printStackTrace();
58                         result = false;
59                 }
60                 finally{
61                         if(result){
62                                 titanDao.commit();
63                         } else {
64                                 titanDao.rollback();
65                         }
66                 }
67                 return result;
68         }
69         
70         private void fixComponentsRelations(List<GraphVertex> notDeletedComponentVerticies) {
71                 notDeletedComponentVerticies.stream().forEach(this::fixComponentRelations);
72         }
73         
74         private void fixComponentRelations(GraphVertex componentV) {
75                 fixCreatorComponentRelation(componentV);
76                 fixLastModifierComponentRelation(componentV);
77                 fixStateComponentRelation(componentV);
78         }
79         
80         private void fixStateComponentRelation(GraphVertex componentV) {
81                 boolean relevantEdgeFound = false;
82                 Iterator<Edge> edges = componentV.getVertex().edges(Direction.IN, EdgeLabelEnum.STATE.name());
83                 String getState = (String) componentV.getJsonMetadataField(JsonPresentationFields.LIFECYCLE_STATE);
84                 while(edges.hasNext()){
85                         Edge edge = edges.next();
86                         String edgeState = (String) edge.property(GraphPropertyEnum.STATE.getProperty()).orElse(null);
87                         if(getState.equals(edgeState) && !relevantEdgeFound){
88                                 relevantEdgeFound = true;
89                         } else {
90                                 removeEdge(edge);
91                         }
92                 }
93         }
94
95         private void fixCreatorComponentRelation(GraphVertex componentV) {
96                 boolean relevantUserFound = false;
97                 Iterator<Edge> edges = componentV.getVertex().edges(Direction.IN, EdgeLabelEnum.CREATOR.name());
98                 String getCreatorUserId = (String) componentV.getJsonMetadataField(JsonPresentationFields.USER_ID_CREATOR);
99                 while(edges.hasNext()){
100                         Edge edge = edges.next();
101                         String userId = (String) edge.outVertex().property(GraphPropertyEnum.USERID.getProperty()).orElse(null);
102                         if(getCreatorUserId.equals(userId) && !relevantUserFound){
103                                 relevantUserFound = true;
104                         } else {
105                                 removeEdge(edge);
106                         }
107                 }
108         }
109         
110         private void fixLastModifierComponentRelation(GraphVertex componentV) {
111                 boolean relevantUserFound = false;
112                 Iterator<Edge> edges = componentV.getVertex().edges(Direction.IN, EdgeLabelEnum.LAST_MODIFIER.name());
113                 String getLastUpdaterUserId = (String) componentV.getJsonMetadataField(JsonPresentationFields.USER_ID_LAST_UPDATER);
114                 while(edges.hasNext()){
115                         Edge edge = edges.next();
116                         String updaterId = (String) edge.outVertex().property(GraphPropertyEnum.USERID.getProperty()).orElse(null);
117                         if(getLastUpdaterUserId.equals(updaterId) && !relevantUserFound){
118                                 relevantUserFound = true;
119                         } else {
120                                 removeEdge(edge);
121                         }
122                 }
123         }
124
125         private void removeEdge(Edge edge) {
126                 LOGGER.debug("Going to remove edge {} upon migration 1707 relations fixing. ", edge.id());
127                 edge.remove();
128                 LOGGER.debug("The edge {} has been removed. ", edge.id());
129         }
130         
131 }