diff --git a/bukkit-impl/build.gradle.kts b/bukkit-impl/build.gradle.kts index cb4267c22..464873e6f 100644 --- a/bukkit-impl/build.gradle.kts +++ b/bukkit-impl/build.gradle.kts @@ -95,6 +95,7 @@ dependencies { testImplementation(testFixtures(project(":api"))) testImplementation(libs.adventure.nbt) testImplementation(libs.mockbukkit) + testImplementation(libs.paper.api) testImplementation(libs.sqlite.jdbc) } diff --git a/bukkit-impl/src/main/java/dev/jsinco/brewery/bukkit/command/DebugDumpCommand.java b/bukkit-impl/src/main/java/dev/jsinco/brewery/bukkit/command/DebugDumpCommand.java index 61fd33f4b..08a000d1b 100644 --- a/bukkit-impl/src/main/java/dev/jsinco/brewery/bukkit/command/DebugDumpCommand.java +++ b/bukkit-impl/src/main/java/dev/jsinco/brewery/bukkit/command/DebugDumpCommand.java @@ -14,6 +14,7 @@ import dev.jsinco.brewery.api.util.Pair; import dev.jsinco.brewery.bukkit.TheBrewingProject; import dev.jsinco.brewery.configuration.DrunkenModifierSection; +import dev.jsinco.brewery.util.FileUtil; import dev.jsinco.brewery.util.MessageUtil; import io.papermc.paper.command.brigadier.CommandSourceStack; import io.papermc.paper.command.brigadier.Commands; @@ -193,7 +194,7 @@ private static int execute(CommandContext context, String ar } private static CompletableFuture suggest(CommandContext context, SuggestionsBuilder builder) { - File dataFolder = TheBrewingProject.getInstance().getDataFolder(); + File dataFolder = FileUtil.getWorkFolder(); String argString = builder.getRemaining(); String[] tokens = argString.split(" ", -1); String current = tokens[tokens.length - 1]; @@ -233,8 +234,7 @@ private static void suggestFileSpecs(SuggestionsBuilder builder, String prefix, } private static File createDebugDump(String argsString) { - TheBrewingProject plugin = TheBrewingProject.getInstance(); - File dataFolder = plugin.getDataFolder(); + File dataFolder = FileUtil.getWorkFolder(); String timestamp = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd_HH-mm-ss")); File outputDir = new File(dataFolder, "output"); diff --git a/bukkit-impl/src/main/java/dev/jsinco/brewery/bukkit/util/WorkFolderProviderImpl.java b/bukkit-impl/src/main/java/dev/jsinco/brewery/bukkit/util/WorkFolderProviderImpl.java new file mode 100644 index 000000000..8bf5c407b --- /dev/null +++ b/bukkit-impl/src/main/java/dev/jsinco/brewery/bukkit/util/WorkFolderProviderImpl.java @@ -0,0 +1,25 @@ +package dev.jsinco.brewery.bukkit.util; + +import dev.jsinco.brewery.bukkit.TheBrewingProject; +import dev.jsinco.brewery.util.WorkFolderProvider; + +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; + +public class WorkFolderProviderImpl implements WorkFolderProvider { + + + @Override + public File getWorkFolder() { + TheBrewingProject instance = TheBrewingProject.getInstance(); + if (instance == null) { + try { + return Files.createTempDirectory("tbp").toFile(); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + return instance.getDataFolder(); + } +} diff --git a/bukkit-impl/src/main/resources/META-INF/services/dev.jsinco.brewery.util.WorkFolderProvider b/bukkit-impl/src/main/resources/META-INF/services/dev.jsinco.brewery.util.WorkFolderProvider new file mode 100644 index 000000000..d74b6d846 --- /dev/null +++ b/bukkit-impl/src/main/resources/META-INF/services/dev.jsinco.brewery.util.WorkFolderProvider @@ -0,0 +1 @@ +dev.jsinco.brewery.bukkit.util.WorkFolderProviderImpl \ No newline at end of file diff --git a/bukkit-impl/src/test/java/dev/jsinco/brewery/bukkit/structure/StructureReaderTest.java b/bukkit-impl/src/test/java/dev/jsinco/brewery/bukkit/structure/StructureReaderTest.java index a9eb30741..75d419d91 100644 --- a/bukkit-impl/src/test/java/dev/jsinco/brewery/bukkit/structure/StructureReaderTest.java +++ b/bukkit-impl/src/test/java/dev/jsinco/brewery/bukkit/structure/StructureReaderTest.java @@ -24,6 +24,7 @@ import org.mockbukkit.mockbukkit.world.WorldMock; import java.io.File; +import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.net.URISyntaxException; @@ -73,7 +74,7 @@ void fromJson_names(String pathString) throws StructureReadException, IOExceptio assertEquals(structureName, structure.getName()); } - BreweryStructure readStructure(Path internalPath, File jsonFile) { + BreweryStructure readStructure(Path internalPath, File jsonFile) throws IOException { OkaeriSerdes pack = new OkaeriSerdesBuilder() .add(new BreweryVectorSerializer()) .add(new BreweryVectorListSerializer()) @@ -84,13 +85,12 @@ BreweryStructure readStructure(Path internalPath, File jsonFile) { .add(new MaterialsSerializer()) .add(new StructureTypeSerializer()) .build(); - return ConfigManager.create(BreweryStructureConfig.class, it -> { - it.withConfigurer(new YamlSnakeYamlConfigurer(), pack); - it.withBindFile(jsonFile); - it.withRemoveOrphans(true); - it.saveDefaults(); - it.load(false); - }).toStructure(internalPath, StructurePlacerUtils.matchers()); + try (InputStream inputStream = new FileInputStream(jsonFile)) { + return ConfigManager.create(BreweryStructureConfig.class, it -> { + it.configure(options -> options.configurer(new YamlSnakeYamlConfigurer(), pack)); + it.load(inputStream); + }).toStructure(internalPath, StructurePlacerUtils.matchers()); + } } static Stream getSchemFormatPaths() { diff --git a/core/src/main/java/dev/jsinco/brewery/configuration/structure/BarrelTypeDefinitions.java b/core/src/main/java/dev/jsinco/brewery/configuration/structure/BarrelTypeDefinitions.java index 3bc7cc732..f572aea16 100644 --- a/core/src/main/java/dev/jsinco/brewery/configuration/structure/BarrelTypeDefinitions.java +++ b/core/src/main/java/dev/jsinco/brewery/configuration/structure/BarrelTypeDefinitions.java @@ -1,6 +1,7 @@ package dev.jsinco.brewery.configuration.structure; import dev.jsinco.brewery.api.breweries.BarrelType; +import dev.jsinco.brewery.util.FileUtil; import eu.okaeri.configs.ConfigManager; import eu.okaeri.configs.OkaeriConfig; import eu.okaeri.configs.annotation.CustomKey; @@ -30,7 +31,7 @@ public class BarrelTypeDefinitions extends OkaeriConfig { public static List allBarrelTypes() { boolean newlySaved = false; - File barrelTypesFile = new File("plugins/TheBrewingProject", "barrel_types.yml"); + File barrelTypesFile = new File(FileUtil.getWorkFolder(), "barrel_types.yml"); try { if (!barrelTypesFile.exists()) { if (!barrelTypesFile.createNewFile()) { diff --git a/core/src/main/java/dev/jsinco/brewery/util/FileUtil.java b/core/src/main/java/dev/jsinco/brewery/util/FileUtil.java index 92703cbce..4a1132925 100644 --- a/core/src/main/java/dev/jsinco/brewery/util/FileUtil.java +++ b/core/src/main/java/dev/jsinco/brewery/util/FileUtil.java @@ -4,6 +4,7 @@ import com.google.gson.JsonParser; import org.jspecify.annotations.NonNull; +import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; @@ -12,9 +13,12 @@ import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.StandardCopyOption; +import java.util.ServiceLoader; public final class FileUtil { + private static WorkFolderProvider workFolderProvider; + public static void extractFile(@NonNull Class clazz, @NonNull String filename, @NonNull Path outDir, boolean replace) { try (InputStream in = clazz.getResourceAsStream("/" + filename)) { if (in == null) { @@ -49,4 +53,13 @@ public static JsonElement readJsonResource(String path) { throw new RuntimeException(e); } } + + public static File getWorkFolder() { + if (workFolderProvider == null) { + workFolderProvider = ServiceLoader.load(WorkFolderProvider.class, WorkFolderProvider.class.getClassLoader()).findFirst() + .orElseThrow(); + } + return workFolderProvider.getWorkFolder(); + } + } diff --git a/core/src/main/java/dev/jsinco/brewery/util/WorkFolderProvider.java b/core/src/main/java/dev/jsinco/brewery/util/WorkFolderProvider.java new file mode 100644 index 000000000..3e79ceb68 --- /dev/null +++ b/core/src/main/java/dev/jsinco/brewery/util/WorkFolderProvider.java @@ -0,0 +1,9 @@ +package dev.jsinco.brewery.util; + +import java.io.File; + +public interface WorkFolderProvider { + + + File getWorkFolder(); +} diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 4b2578fdf..d885bc9ae 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -41,7 +41,7 @@ jetbrainsAnnotations = "26.0.2-1" adventure = "4.23.0" junit = "5.13.3" junit-platform-launcher = "1.13.3" -mockbukkit = "4.64.0" +mockbukkit = "4.113.1" sqlite-jdbc = "3.50.1.0" [libraries] @@ -92,7 +92,6 @@ jetbrains-annotations = { group = "org.jetbrains", name = "annotations", version adventure-api = { group = "net.kyori", name = "adventure-api", version.ref = "adventure" } adventure-nbt = { group = "net.kyori", name = "adventure-nbt", version.ref = "adventure" } adventure-text-minimessage = { group = "net.kyori", name = "adventure-text-minimessage", version.ref = "adventure" } -junit-bom = { group = "org.junit", name = "junit-bom", version.ref = "junit" } junit-jupiter = { group = "org.junit.jupiter", name = "junit-jupiter", version.ref = "junit" } junit-platform-launcher = { group = "org.junit.platform", name = "junit-platform-launcher", version.ref = "junit-platform-launcher" } mockbukkit = { group = "org.mockbukkit.mockbukkit", name = "mockbukkit-v1.21", version.ref = "mockbukkit" }