From 8f56c0f761675b1a69f5837b40ae90ecfa3a8519 Mon Sep 17 00:00:00 2001 From: Lilly <46890129+RainbowDashLabs@users.noreply.github.com> Date: Tue, 23 Jan 2024 09:54:54 +0100 Subject: [PATCH] Allow to inject classloader --- .../de/chojo/sadu/updater/SqlVersion.java | 18 ++++++++++++++++++ .../de/chojo/sadu/updater/UpdaterBuilder.java | 19 +++++++++++++++++-- .../chojo/sadu/update/PostgreSqlUpdater.java | 4 ++-- .../sadu/update/PostgreSqlUpdaterBuilder.java | 2 +- .../sadu/updater/BaseSqlUpdaterBuilder.java | 17 ++++++++++++++--- .../de/chojo/sadu/updater/SqlUpdater.java | 19 ++++++++----------- 6 files changed, 60 insertions(+), 19 deletions(-) diff --git a/sadu-core/src/main/java/de/chojo/sadu/updater/SqlVersion.java b/sadu-core/src/main/java/de/chojo/sadu/updater/SqlVersion.java index da1f90d7..a3e2ccf4 100644 --- a/sadu-core/src/main/java/de/chojo/sadu/updater/SqlVersion.java +++ b/sadu-core/src/main/java/de/chojo/sadu/updater/SqlVersion.java @@ -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 *

@@ -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])); + + } } diff --git a/sadu-core/src/main/java/de/chojo/sadu/updater/UpdaterBuilder.java b/sadu-core/src/main/java/de/chojo/sadu/updater/UpdaterBuilder.java index 92f1abc5..73652d29 100644 --- a/sadu-core/src/main/java/de/chojo/sadu/updater/UpdaterBuilder.java +++ b/sadu-core/src/main/java/de/chojo/sadu/updater/UpdaterBuilder.java @@ -13,6 +13,21 @@ @ApiStatus.Internal public interface UpdaterBuilder, S extends UpdaterBuilder> { - 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); } diff --git a/sadu-postgresql/src/main/java/de/chojo/sadu/update/PostgreSqlUpdater.java b/sadu-postgresql/src/main/java/de/chojo/sadu/update/PostgreSqlUpdater.java index 513d9df5..cd8cff4b 100644 --- a/sadu-postgresql/src/main/java/de/chojo/sadu/update/PostgreSqlUpdater.java +++ b/sadu-postgresql/src/main/java/de/chojo/sadu/update/PostgreSqlUpdater.java @@ -28,8 +28,8 @@ public class PostgreSqlUpdater extends SqlUpdater type, String[] schemas, Map> preUpdateHook, Map> postUpdateHook) { - super(source, config, versionTable, replacements, version, type, preUpdateHook, postUpdateHook); + protected PostgreSqlUpdater(DataSource source, QueryBuilderConfig config, String versionTable, QueryReplacement[] replacements, SqlVersion version, Database type, String[] schemas, Map> preUpdateHook, Map> postUpdateHook, ClassLoader classLoader) { + super(source, config, versionTable, replacements, version, type, preUpdateHook, postUpdateHook, classLoader); this.schemas = schemas; } diff --git a/sadu-postgresql/src/main/java/de/chojo/sadu/update/PostgreSqlUpdaterBuilder.java b/sadu-postgresql/src/main/java/de/chojo/sadu/update/PostgreSqlUpdaterBuilder.java index c0869115..816be7d9 100644 --- a/sadu-postgresql/src/main/java/de/chojo/sadu/update/PostgreSqlUpdaterBuilder.java +++ b/sadu-postgresql/src/main/java/de/chojo/sadu/update/PostgreSqlUpdaterBuilder.java @@ -39,7 +39,7 @@ 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); + var updater = new PostgreSqlUpdater(source, config, versionTable, replacements, version, type, schemas, preUpdateHook, postUpdateHook, classLoader); updater.init(); } } diff --git a/sadu-updater/src/main/java/de/chojo/sadu/updater/BaseSqlUpdaterBuilder.java b/sadu-updater/src/main/java/de/chojo/sadu/updater/BaseSqlUpdaterBuilder.java index d2749ba1..74f284c9 100644 --- a/sadu-updater/src/main/java/de/chojo/sadu/updater/BaseSqlUpdaterBuilder.java +++ b/sadu-updater/src/main/java/de/chojo/sadu/updater/BaseSqlUpdaterBuilder.java @@ -34,17 +34,20 @@ public class BaseSqlUpdaterBuilder, 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 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(); } /** @@ -96,6 +99,13 @@ public S postUpdateHook(SqlVersion version, Consumer consumer) { return self(); } + + @Override + public S withClassLoader(ClassLoader classLoader) { + this.classLoader = classLoader; + return self(); + } + /** * Build the updater and start the update process. * @@ -103,7 +113,8 @@ public S postUpdateHook(SqlVersion version, Consumer consumer) { * @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(); } diff --git a/sadu-updater/src/main/java/de/chojo/sadu/updater/SqlUpdater.java b/sadu-updater/src/main/java/de/chojo/sadu/updater/SqlUpdater.java index 53a67fd5..d7abed91 100644 --- a/sadu-updater/src/main/java/de/chojo/sadu/updater/SqlUpdater.java +++ b/sadu-updater/src/main/java/de/chojo/sadu/updater/SqlUpdater.java @@ -109,8 +109,9 @@ public class SqlUpdater, U extends BaseSqlUpdaterBuilder private final String versionTable; private final QueryReplacement[] replacements; private final Database type; + private final ClassLoader classLoader; - protected SqlUpdater(DataSource source, QueryBuilderConfig config, String versionTable, QueryReplacement[] replacements, SqlVersion version, Database type, Map> preUpdateHook, Map> postUpdateHook) { + protected SqlUpdater(DataSource source, QueryBuilderConfig config, String versionTable, QueryReplacement[] replacements, SqlVersion version, Database type, Map> preUpdateHook, Map> postUpdateHook, ClassLoader classLoader) { super(source, config); this.source = source; this.versionTable = versionTable; @@ -119,6 +120,7 @@ protected SqlUpdater(DataSource source, QueryBuilderConfig config, String versio this.version = version; this.preUpdateHook = preUpdateHook; this.postUpdateHook = postUpdateHook; + this.classLoader = classLoader; } /** @@ -134,13 +136,7 @@ protected SqlUpdater(DataSource source, QueryBuilderConfig config, String versio */ @CheckReturnValue public static , U extends UpdaterBuilder> U builder(DataSource dataSource, Database 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); } /** @@ -151,7 +147,9 @@ protected SqlUpdater(DataSource source, QueryBuilderConfig config, String versio * @param type the sql type of the database * @param 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 , U extends UpdaterBuilder> U builder(DataSource dataSource, SqlVersion version, Database type) { var builder = type.newSqlUpdaterBuilder(); builder.setSource(dataSource); @@ -318,8 +316,7 @@ private List 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 { @@ -328,7 +325,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); }