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