View Javadoc
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        // scan for the migrations specified by Cypher or XML files
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  }