MigrationsRunner.java
package de.dlr.shepard.common.neo4j;
import ac.simons.neo4j.migrations.core.Migrations;
import ac.simons.neo4j.migrations.core.MigrationsConfig;
import ac.simons.neo4j.migrations.core.MigrationsConfig.VersionSortOrder;
import io.quarkus.logging.Log;
import jakarta.annotation.Nullable;
import java.nio.file.Path;
import org.eclipse.microprofile.config.ConfigProvider;
import org.neo4j.driver.AuthTokens;
import org.neo4j.driver.Driver;
import org.neo4j.driver.GraphDatabase;
public class MigrationsRunner {
private final Migrations migrations;
private final Driver driver;
public MigrationsRunner() {
this(null);
}
public MigrationsRunner(@Nullable String targetVersion) {
String username = ConfigProvider.getConfig().getValue("neo4j.username", String.class);
String password = ConfigProvider.getConfig().getValue("neo4j.password", String.class);
String host = "neo4j://" + ConfigProvider.getConfig().getValue("neo4j.host", String.class);
driver = GraphDatabase.driver(host, AuthTokens.basic(username, password));
var config = MigrationsConfig.builder()
.withTransactionMode(MigrationsConfig.TransactionMode.PER_STATEMENT)
.withPackagesToScan("de.dlr.shepard.common.neo4j.migrations")
// scan for the migrations specified by Cypher or XML files
.withLocationsToScan("classpath:neo4j/migrations")
.withResourceScanner(null)
.withVersionSortOrder(VersionSortOrder.SEMANTIC)
.withTarget(targetVersion)
.build();
migrations = new Migrations(config, driver);
}
public void waitForConnection() {
while (true) {
try {
driver.verifyConnectivity();
break;
} catch (Exception e) {
Log.warn("Cannot connect to neo4j database. Retrying...");
}
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
Log.error("Cannot sleep while waiting for neo4j Connection");
Thread.currentThread().interrupt();
}
}
}
public void apply() {
migrations.apply();
}
}