1 package de.dlr.shepard.common.neo4j;
2
3 import ac.simons.neo4j.migrations.core.Migrations;
4 import ac.simons.neo4j.migrations.core.MigrationsConfig;
5 import ac.simons.neo4j.migrations.core.MigrationsConfig.VersionSortOrder;
6 import io.quarkus.logging.Log;
7 import jakarta.annotation.Nullable;
8 import java.nio.file.Path;
9 import org.eclipse.microprofile.config.ConfigProvider;
10 import org.neo4j.driver.AuthTokens;
11 import org.neo4j.driver.Driver;
12 import org.neo4j.driver.GraphDatabase;
13
14 public class MigrationsRunner {
15
16 private final Migrations migrations;
17 private final Driver driver;
18
19 public MigrationsRunner() {
20 this(null);
21 }
22
23 public MigrationsRunner(@Nullable String targetVersion) {
24 String username = ConfigProvider.getConfig().getValue("neo4j.username", String.class);
25 String password = ConfigProvider.getConfig().getValue("neo4j.password", String.class);
26 String host = "neo4j://" + ConfigProvider.getConfig().getValue("neo4j.host", String.class);
27 driver = GraphDatabase.driver(host, AuthTokens.basic(username, password));
28
29 var config = MigrationsConfig.builder()
30 .withTransactionMode(MigrationsConfig.TransactionMode.PER_STATEMENT)
31 .withPackagesToScan("de.dlr.shepard.common.neo4j.migrations")
32
33 .withLocationsToScan("classpath:neo4j/migrations")
34 .withResourceScanner(null)
35 .withVersionSortOrder(VersionSortOrder.SEMANTIC)
36 .withTarget(targetVersion)
37 .build();
38
39 migrations = new Migrations(config, driver);
40 }
41
42 public void waitForConnection() {
43 while (true) {
44 try {
45 driver.verifyConnectivity();
46 break;
47 } catch (Exception e) {
48 Log.warn("Cannot connect to neo4j database. Retrying...");
49 }
50 try {
51 Thread.sleep(1000);
52 } catch (InterruptedException e) {
53 Log.error("Cannot sleep while waiting for neo4j Connection");
54 Thread.currentThread().interrupt();
55 }
56 }
57 }
58
59 public void apply() {
60 migrations.apply();
61 }
62 }