[SDC-29] rebase continue work to align source
[sdc.git] / asdctool / src / main / java / org / openecomp / sdc / asdctool / impl / migration / v1707 / jsonmodel / JsonModelMigration.java
1 package org.openecomp.sdc.asdctool.impl.migration.v1707.jsonmodel;
2
3 import fj.data.Either;
4 import org.openecomp.sdc.asdctool.impl.migration.Migration1707Task;
5 import org.openecomp.sdc.asdctool.impl.migration.MigrationMsg;
6 import org.openecomp.sdc.asdctool.impl.migration.v1707.MigrationUtils;
7 import org.openecomp.sdc.be.dao.jsongraph.TitanDao;
8 import org.slf4j.Logger;
9 import org.slf4j.LoggerFactory;
10
11 import javax.annotation.Resource;
12 import java.util.List;
13
14 public abstract class JsonModelMigration<T> implements Migration1707Task {
15
16     private static final Logger LOGGER = LoggerFactory.getLogger(JsonModelMigration.class);
17
18     @Resource(name = "titan-dao")
19     TitanDao titanDao;
20
21     @Override
22     public boolean migrate() {
23         Either<List<T>, ?> elementsToMigrate = getElementsToMigrate();
24         return elementsToMigrate.either(this::migrateElementsToNewGraph,
25                                         errorStatus -> MigrationUtils.handleError(MigrationMsg.FAILED_TO_RETRIEVE_NODES.getMessage(errorStatus.toString())));
26     }
27
28     boolean doPostSaveOperation(T element) {
29         return true;
30     }
31
32     boolean doPostMigrateOperation(List<T> elements) {
33         return true;
34     }
35
36     void doPreMigrationOperation(List<T> elements){}
37
38     private boolean migrateElementsToNewGraph(List<T> elementsToMigrate) {
39         LOGGER.info(this.description() + ": starting to migrate elements to new graph. elements to migrate: {}", elementsToMigrate.size());
40         doPreMigrationOperation(elementsToMigrate);
41         for (T node : elementsToMigrate) {
42             boolean migratedSuccessfully = migrateElement(node);
43             if (!migratedSuccessfully) {
44                 titanDao.rollback();
45                 return false;
46             }
47             titanDao.commit();
48         }
49         return postMigrate(elementsToMigrate);
50     }
51
52     private boolean migrateElement(T node) {
53         boolean savedSuccessfully = saveElementIfNotExists(node);
54         return savedSuccessfully && doPostSaveOperation(node);
55     }
56
57     private boolean postMigrate(List<T> elements) {
58         boolean postMigrateSuccessfully = doPostMigrateOperation(elements);
59         if (!postMigrateSuccessfully) {
60             titanDao.rollback();
61             return false;
62         }
63         titanDao.commit();
64         return true;
65     }
66
67     private boolean saveElementIfNotExists(T element) {
68         return isExists(element).either(isExist -> isExist || save(element),
69                                         status -> MigrationUtils.handleError(MigrationMsg.FAILED_TO_GET_NODE_FROM_GRAPH.getMessage(status.toString())));
70     }
71
72
73     private Either<Boolean, ?> isExists(T element) {
74         Either<T, ?> byId = getElementFromNewGraph(element);
75         return byId.either(existingVal -> Either.left(true),
76                            this::getEitherNotExistOrErrorStatus);
77     }
78
79     private <S> Either<Boolean, S> getEitherNotExistOrErrorStatus(S status) {
80         return status == getNotFoundErrorStatus() ? Either.left(false) : Either.right(status);
81     }
82
83     abstract Either<List<T>, ?> getElementsToMigrate();
84
85     abstract Either<T, ?> getElementFromNewGraph(T element);
86
87     abstract boolean save(T element);
88
89     abstract <S extends Enum> S getNotFoundErrorStatus();
90
91
92 }