ShepardMain.java

package de.dlr.shepard;

import de.dlr.shepard.common.neo4j.MigrationsRunner;
import de.dlr.shepard.common.neo4j.NeoConnector;
import de.dlr.shepard.common.util.IConnector;
import de.dlr.shepard.common.util.PKIHelper;
import io.quarkus.logging.Log;
import io.quarkus.runtime.Quarkus;
import io.quarkus.runtime.QuarkusApplication;
import io.quarkus.runtime.Shutdown;
import io.quarkus.runtime.Startup;
import io.quarkus.runtime.annotations.QuarkusMain;
import jakarta.annotation.Nullable;
import jakarta.enterprise.context.control.ActivateRequestContext;
import jakarta.inject.Inject;
import org.flywaydb.core.Flyway;

@QuarkusMain
public class ShepardMain implements QuarkusApplication {

  private static final IConnector neo4j = NeoConnector.getInstance();

  @Inject
  Flyway flyway;

  @Startup
  void init() {
    Log.info("Starting shepard backend");

    migrateTimescale("1.7.0");

    migrateNeo4j("V13");

    Log.info("Run leftover timescale migrations...");
    flyway.migrate();
    Log.info("Finished leftover timescale migrations...");

    Log.info("Run leftover Neo4j migrations...");
    var neoRunner = new MigrationsRunner();
    neoRunner.waitForConnection();
    neoRunner.apply();
    Log.info("Finished leftover Neo4j migrations...");

    var pkiHelper = new PKIHelper();
    pkiHelper.init();

    Log.info("Initialize neo4j databases...");
    neo4j.connect();
    Log.info("Connection established to neo4j database!");
  }

  private void migrateTimescale(String version) {
    Log.info("Run PostGres migrations until V" + version + "...");
    if (version == null) flyway.migrate();
    else Flyway.configure().configuration(flyway.getConfiguration()).target(version).load().migrate();
    Log.info("Finished PostGres migrations V" + version + "!");
  }

  private void migrateNeo4j(String version) {
    var migrationRunner = new MigrationsRunner(version);
    Log.info("Waiting for neo4j database...");
    migrationRunner.waitForConnection();
    Log.info("Run neo4j database migrations until " + version + "...");
    migrationRunner.apply();
    Log.info("Finished neo4j database migrations!");
  }

  @Override
  @ActivateRequestContext
  public int run(String... args) throws Exception {
    Quarkus.waitForExit();
    return 0;
  }

  @Shutdown
  void shutdown() {
    neo4j.disconnect();
  }
}