Skip to content

Commit

Permalink
Allow to inject classloader (#147)
Browse files Browse the repository at this point in the history
  • Loading branch information
rainbowdashlabs authored Jan 23, 2024
1 parent 4e30701 commit 4f2364a
Show file tree
Hide file tree
Showing 6 changed files with 66 additions and 22 deletions.
18 changes: 18 additions & 0 deletions sadu-core/src/main/java/de/chojo/sadu/updater/SqlVersion.java
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,9 @@

import org.jetbrains.annotations.NotNull;

import java.io.IOException;
import java.nio.charset.StandardCharsets;

/**
* Class representing a version maintained by the SqlUpdaterBuilder
* <p>
Expand Down Expand Up @@ -85,4 +88,19 @@ public int compareTo(@NotNull SqlVersion o) {
}
return Integer.compare(patch, o.patch);
}

public static SqlVersion load() throws IOException {
return load(SqlVersion.class.getClassLoader());
}

public static SqlVersion load(ClassLoader classLoader) throws IOException {
var version = "";
try (var versionFile = classLoader.getResourceAsStream("database/version")) {
version = new String(versionFile.readAllBytes(), StandardCharsets.UTF_8).trim();
}

var ver = version.split("\\.");
return new SqlVersion(Integer.parseInt(ver[0]), Integer.parseInt(ver[1]));

}
}
19 changes: 17 additions & 2 deletions sadu-core/src/main/java/de/chojo/sadu/updater/UpdaterBuilder.java
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,21 @@

@ApiStatus.Internal
public interface UpdaterBuilder<T extends JdbcConfig<?>, S extends UpdaterBuilder<T, ?>> {
void setSource(DataSource source);
void setVersion(SqlVersion version);
/**
* Set the datasource that should be used
* @param source source
*/
S setSource(DataSource source);

/**
* Set the current db version that is expected
* @param version version
*/
S setVersion(SqlVersion version);

/**
* Set the Classloader that should be used to load resourced.
* @param classLoader classloader
*/
S withClassLoader(ClassLoader classLoader);
}
Original file line number Diff line number Diff line change
Expand Up @@ -28,8 +28,8 @@ public class PostgreSqlUpdater extends SqlUpdater<PostgreSqlJdbc, PostgreSqlUpda

private final String[] schemas;

protected PostgreSqlUpdater(DataSource source, QueryBuilderConfig config, String versionTable, QueryReplacement[] replacements, SqlVersion version, Database<PostgreSqlJdbc, PostgreSqlUpdaterBuilder> type, String[] schemas, Map<SqlVersion, Consumer<Connection>> preUpdateHook, Map<SqlVersion, Consumer<Connection>> postUpdateHook) {
super(source, config, versionTable, replacements, version, type, preUpdateHook, postUpdateHook);
protected PostgreSqlUpdater(DataSource source, QueryBuilderConfig config, String versionTable, QueryReplacement[] replacements, SqlVersion version, Database<PostgreSqlJdbc, PostgreSqlUpdaterBuilder> type, String[] schemas, Map<SqlVersion, Consumer<Connection>> preUpdateHook, Map<SqlVersion, Consumer<Connection>> postUpdateHook, ClassLoader classLoader) {
super(source, config, versionTable, replacements, version, type, preUpdateHook, postUpdateHook, classLoader);
this.schemas = schemas;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
import de.chojo.sadu.databases.Database;
import de.chojo.sadu.jdbc.PostgreSqlJdbc;
import de.chojo.sadu.updater.BaseSqlUpdaterBuilder;
import de.chojo.sadu.updater.SqlVersion;

import javax.annotation.CheckReturnValue;
import java.io.IOException;
Expand Down Expand Up @@ -39,7 +40,8 @@ public PostgreSqlUpdaterBuilder setSchemas(String... schemas) {

@Override
public void execute() throws SQLException, IOException {
var updater = new PostgreSqlUpdater(source, config, versionTable, replacements, version, type, schemas, preUpdateHook, postUpdateHook);
if (version == null) version = SqlVersion.load(classLoader);
var updater = new PostgreSqlUpdater(source, config, versionTable, replacements, version, type, schemas, preUpdateHook, postUpdateHook, classLoader);
updater.init();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -34,17 +34,20 @@ public class BaseSqlUpdaterBuilder<T extends JdbcConfig<?>, S extends BaseSqlUpd
protected String versionTable = "version";
protected QueryReplacement[] replacements = new QueryReplacement[0];
protected QueryBuilderConfig config = QueryBuilderConfig.builder().throwExceptions().build();
protected ClassLoader classLoader = getClass().getClassLoader();

public BaseSqlUpdaterBuilder(Database<T, S> type) {
this.type = type;
}

public void setSource(DataSource source) {
public S setSource(DataSource source) {
this.source = source;
return self();
}

public void setVersion(SqlVersion version) {
public S setVersion(SqlVersion version) {
this.version = version;
return self();
}

/**
Expand Down Expand Up @@ -96,14 +99,22 @@ public S postUpdateHook(SqlVersion version, Consumer<Connection> consumer) {
return self();
}


@Override
public S withClassLoader(ClassLoader classLoader) {
this.classLoader = classLoader;
return self();
}

/**
* Build the updater and start the update process.
*
* @throws SQLException If execution of the scripts fails
* @throws IOException If the scripts can't be read.
*/
public void execute() throws SQLException, IOException {
var sqlUpdater = new SqlUpdater<>(source, config, versionTable, replacements, version, type, preUpdateHook, postUpdateHook);
if (version == null) version = SqlVersion.load(classLoader);
var sqlUpdater = new SqlUpdater<>(source, config, versionTable, replacements, version, type, preUpdateHook, postUpdateHook, classLoader);
sqlUpdater.init();
}

Expand Down
26 changes: 12 additions & 14 deletions sadu-updater/src/main/java/de/chojo/sadu/updater/SqlUpdater.java
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.function.Consumer;
import java.util.stream.Collectors;

Expand Down Expand Up @@ -109,16 +110,18 @@ public class SqlUpdater<T extends JdbcConfig<?>, U extends BaseSqlUpdaterBuilder
private final String versionTable;
private final QueryReplacement[] replacements;
private final Database<T, U> type;
private final ClassLoader classLoader;

protected SqlUpdater(DataSource source, QueryBuilderConfig config, String versionTable, QueryReplacement[] replacements, SqlVersion version, Database<T, U> type, Map<SqlVersion, Consumer<Connection>> preUpdateHook, Map<SqlVersion, Consumer<Connection>> postUpdateHook) {
protected SqlUpdater(DataSource source, QueryBuilderConfig config, String versionTable, QueryReplacement[] replacements, SqlVersion version, Database<T, U> type, Map<SqlVersion, Consumer<Connection>> preUpdateHook, Map<SqlVersion, Consumer<Connection>> postUpdateHook, ClassLoader classLoader) {
super(source, config);
this.source = source;
this.source = Objects.requireNonNull(source);
this.versionTable = versionTable;
this.replacements = replacements;
this.type = type;
this.version = version;
this.type = Objects.requireNonNull(type);
this.version = Objects.requireNonNull(version);
this.preUpdateHook = preUpdateHook;
this.postUpdateHook = postUpdateHook;
this.classLoader = classLoader;
}

/**
Expand All @@ -134,13 +137,7 @@ protected SqlUpdater(DataSource source, QueryBuilderConfig config, String versio
*/
@CheckReturnValue
public static <T extends JdbcConfig<?>, U extends UpdaterBuilder<T, ?>> U builder(DataSource dataSource, Database<T, U> type) throws IOException {
var version = "";
try (var versionFile = SqlUpdater.class.getClassLoader().getResourceAsStream("database/version")) {
version = new String(versionFile.readAllBytes(), StandardCharsets.UTF_8).trim();
}

var ver = version.split("\\.");
return builder(dataSource, new SqlVersion(Integer.parseInt(ver[0]), Integer.parseInt(ver[1])), type);
return (U) type.newSqlUpdaterBuilder().setSource(dataSource);
}

/**
Expand All @@ -151,7 +148,9 @@ protected SqlUpdater(DataSource source, QueryBuilderConfig config, String versio
* @param type the sql type of the database
* @param <T> type of the database defined by the {@link Database}
* @return builder instance
* @deprecated Use {{@link #builder(DataSource, Database)}} and use {@link UpdaterBuilder#setVersion(SqlVersion)}.
*/
@Deprecated(forRemoval = true)
public static <T extends JdbcConfig<?>, U extends UpdaterBuilder<T, ?>> U builder(DataSource dataSource, SqlVersion version, Database<T, U> type) {
var builder = type.newSqlUpdaterBuilder();
builder.setSource(dataSource);
Expand Down Expand Up @@ -318,8 +317,7 @@ private List<Patch> getPatchesFrom(int major, int patch) throws IOException {
}

private boolean patchExists(int major, int patch) {
return getClass().getClassLoader()
.getResource("database/" + type.name() + "/" + major + "/patch_" + patch + ".sql") != null;
return classLoader.getResource("database/" + type.name() + "/" + major + "/patch_" + patch + ".sql") != null;
}

private String loadPatch(int major, int patch) throws IOException {
Expand All @@ -328,7 +326,7 @@ private String loadPatch(int major, int patch) throws IOException {

private String loadFromResource(Object... path) throws IOException {
var patch = Arrays.stream(path).map(Object::toString).collect(Collectors.joining("/"));
try (var patchFile = getClass().getClassLoader().getResourceAsStream("database/" + type.name() + "/" + patch)) {
try (var patchFile = classLoader.getResourceAsStream("database/" + type.name() + "/" + patch)) {
log.info("Loading resource {}", "database/" + type.name() + "/" + patch);
return new String(patchFile.readAllBytes(), StandardCharsets.UTF_8);
}
Expand Down

0 comments on commit 4f2364a

Please sign in to comment.