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