1 package org.openecomp.sdc.asdctool.impl.migration.v1707.jsonmodel;
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;
9 import javax.annotation.Resource;
10 import java.util.List;
12 public abstract class JsonModelMigration<T> implements Migration {
14 private final boolean COMPLETED_OK = true;
16 @Resource(name = "titan-dao")
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())));
26 boolean doPostSaveOperation(T element) {
30 boolean doPostMigrateOperation(List<T> elements) {
34 private boolean migrateElementsToNewGraph(List<T> elementsToMigrate) {
35 for (T node : elementsToMigrate) {
36 boolean migratedSuccessfully = migrateElement(node);
37 if (!migratedSuccessfully) {
43 return postMigrate(elementsToMigrate);
46 private boolean migrateElement(T node) {
47 boolean savedSuccessfully = saveElementIfNotExists(node);
48 return savedSuccessfully && doPostSaveOperation(node);
51 private boolean postMigrate(List<T> elements) {
52 boolean postMigrateSuccessfully = doPostMigrateOperation(elements);
53 if (!postMigrateSuccessfully) {
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())));
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())));
71 private Either<Boolean, ?> isExists(T element) {
72 Either<T, ?> byId = getElementFromNewGraph(element);
73 return byId.either(existingVal -> Either.left(true),
74 this::getEitherNotExistOrErrorStatus);
77 private <S> Either<Boolean, S> getEitherNotExistOrErrorStatus(S status) {
78 return status == getNotFoundErrorStatus() ? Either.left(false) : Either.right(status);
81 abstract Either<List<T>, ?> getElementsToMigrate();
83 abstract Either<T, ?> getElementFromNewGraph(T element);
85 abstract Either<T, ?> save(T element);
87 abstract <S extends Enum> S getNotFoundErrorStatus();