From e0b371604e6cf2388c4f48768588aaedb40a392b Mon Sep 17 00:00:00 2001
From: Daniel Gerhardt <code@dgerhardt.net>
Date: Thu, 9 Aug 2018 22:08:03 +0200
Subject: [PATCH] Do not initialize V2ToV3Migration w/o migrate-from property

Startup failed before if no second database for migration was available.

Fixes #19.
---
 .../de/thm/arsnova/config/PersistanceConfig.java  |  3 +++
 .../migrations/MigrateFromLegacyCondition.java    | 15 +++++++++++++++
 .../couchdb/migrations/MigrationExecutor.java     | 11 +++++++----
 .../couchdb/migrations/V2ToV3Migration.java       |  2 ++
 4 files changed, 27 insertions(+), 4 deletions(-)
 create mode 100644 src/main/java/de/thm/arsnova/persistance/couchdb/migrations/MigrateFromLegacyCondition.java

diff --git a/src/main/java/de/thm/arsnova/config/PersistanceConfig.java b/src/main/java/de/thm/arsnova/config/PersistanceConfig.java
index dd1b1e21e..13d31dc60 100644
--- a/src/main/java/de/thm/arsnova/config/PersistanceConfig.java
+++ b/src/main/java/de/thm/arsnova/config/PersistanceConfig.java
@@ -34,6 +34,9 @@ public class PersistanceConfig {
 
 	@Bean
 	public MangoCouchDbConnector couchDbMigrationConnector() throws Exception {
+		if (couchDbMigrateFrom.isEmpty()) {
+			return null;
+		}
 		return new MangoCouchDbConnector(couchDbMigrateFrom, couchDbInstance(), couchDbObjectMapperFactory());
 	}
 
diff --git a/src/main/java/de/thm/arsnova/persistance/couchdb/migrations/MigrateFromLegacyCondition.java b/src/main/java/de/thm/arsnova/persistance/couchdb/migrations/MigrateFromLegacyCondition.java
new file mode 100644
index 000000000..0c2d1c681
--- /dev/null
+++ b/src/main/java/de/thm/arsnova/persistance/couchdb/migrations/MigrateFromLegacyCondition.java
@@ -0,0 +1,15 @@
+package de.thm.arsnova.persistance.couchdb.migrations;
+
+import org.springframework.context.annotation.Condition;
+import org.springframework.context.annotation.ConditionContext;
+import org.springframework.core.type.AnnotatedTypeMetadata;
+import org.springframework.stereotype.Component;
+
+@Component
+public class MigrateFromLegacyCondition implements Condition {
+	@Override
+	public boolean matches(final ConditionContext context, final AnnotatedTypeMetadata metadata) {
+		final String migrateFrom = context.getEnvironment().getProperty("couchdb.migrate-from");
+		return migrateFrom != null && !migrateFrom.isEmpty();
+	}
+}
diff --git a/src/main/java/de/thm/arsnova/persistance/couchdb/migrations/MigrationExecutor.java b/src/main/java/de/thm/arsnova/persistance/couchdb/migrations/MigrationExecutor.java
index 9d32a2018..68554e69c 100644
--- a/src/main/java/de/thm/arsnova/persistance/couchdb/migrations/MigrationExecutor.java
+++ b/src/main/java/de/thm/arsnova/persistance/couchdb/migrations/MigrationExecutor.java
@@ -23,9 +23,11 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.stereotype.Service;
 
+import java.util.Collections;
 import java.util.Comparator;
 import java.util.Date;
 import java.util.List;
+import java.util.Optional;
 import java.util.stream.Collectors;
 
 /**
@@ -37,11 +39,12 @@ import java.util.stream.Collectors;
 public class MigrationExecutor {
 	private static final Logger logger = LoggerFactory.getLogger(MigrationExecutor.class);
 
-	private List<Migration> migrations;
+	private List<Migration> migrations = Collections.EMPTY_LIST;
 
-	public MigrationExecutor(List<Migration> migrations) {
-		this.migrations = migrations.stream()
-				.sorted(Comparator.comparing(Migration::getId)).collect(Collectors.toList());
+	public MigrationExecutor(final Optional<List<Migration>> migrations) {
+		migrations.map(m -> this.migrations = m.stream()
+				.sorted(Comparator.comparing(Migration::getId)).collect(Collectors.toList()));
+		logger.debug("Initialized {} migration(s).", this.migrations.size());
 	}
 
 	public boolean runMigrations(@NonNull final MigrationState migrationState) {
diff --git a/src/main/java/de/thm/arsnova/persistance/couchdb/migrations/V2ToV3Migration.java b/src/main/java/de/thm/arsnova/persistance/couchdb/migrations/V2ToV3Migration.java
index 60647e2ed..c55c34720 100644
--- a/src/main/java/de/thm/arsnova/persistance/couchdb/migrations/V2ToV3Migration.java
+++ b/src/main/java/de/thm/arsnova/persistance/couchdb/migrations/V2ToV3Migration.java
@@ -29,6 +29,7 @@ import de.thm.arsnova.persistance.UserRepository;
 import de.thm.arsnova.persistance.couchdb.support.MangoCouchDbConnector;
 import org.ektorp.DocumentNotFoundException;
 import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.context.annotation.Conditional;
 import org.springframework.stereotype.Service;
 
 import java.util.ArrayList;
@@ -44,6 +45,7 @@ import java.util.Set;
  *
  * @author Daniel Gerhardt
  */
+@Conditional(MigrateFromLegacyCondition.class)
 @Service
 public class V2ToV3Migration implements Migration {
 	private static final String ID = "20170914131300";
-- 
GitLab