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