1 package org.openecomp.sdc.asdctool.impl.migration.v1707.jsonmodel;
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;
11 import javax.annotation.Resource;
12 import java.util.List;
14 public abstract class JsonModelMigration<T> implements Migration1707Task {
16 private static final Logger LOGGER = LoggerFactory.getLogger(JsonModelMigration.class);
18 @Resource(name = "titan-dao")
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())));
28 boolean doPostSaveOperation(T element) {
32 boolean doPostMigrateOperation(List<T> elements) {
36 void doPreMigrationOperation(List<T> elements){}
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) {
49 return postMigrate(elementsToMigrate);
52 private boolean migrateElement(T node) {
53 boolean savedSuccessfully = saveElementIfNotExists(node);
54 return savedSuccessfully && doPostSaveOperation(node);
57 private boolean postMigrate(List<T> elements) {
58 boolean postMigrateSuccessfully = doPostMigrateOperation(elements);
59 if (!postMigrateSuccessfully) {
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())));
73 private Either<Boolean, ?> isExists(T element) {
74 Either<T, ?> byId = getElementFromNewGraph(element);
75 return byId.either(existingVal -> Either.left(true),
76 this::getEitherNotExistOrErrorStatus);
79 private <S> Either<Boolean, S> getEitherNotExistOrErrorStatus(S status) {
80 return status == getNotFoundErrorStatus() ? Either.left(false) : Either.right(status);
83 abstract Either<List<T>, ?> getElementsToMigrate();
85 abstract Either<T, ?> getElementFromNewGraph(T element);
87 abstract boolean save(T element);
89 abstract <S extends Enum> S getNotFoundErrorStatus();