From 004faa73071ab421826135b33199c9c63f031586 Mon Sep 17 00:00:00 2001 From: freya02 <41875020+freya022@users.noreply.github.com> Date: Fri, 5 Dec 2025 14:28:33 +0100 Subject: [PATCH 1/8] Add `DiscordZstd` and provider Which will serve for both contexts and decompressors --- .../freya02/discord/zstd/api/DiscordZstd.java | 33 +++++++++++++++++ .../discord/zstd/api/DiscordZstdProvider.java | 35 +++++++++++++++++++ .../discord/zstd/ffm/DiscordZstdFFM.java | 33 +++++++++++++++++ .../dev.freya02.discord.zstd.api.DiscordZstd | 1 + .../freya02/discord/zstd/ffm/ZstdFFMTest.java | 10 +++--- .../discord/zstd/jni/DiscordZstdJNI.java | 33 +++++++++++++++++ .../dev.freya02.discord.zstd.api.DiscordZstd | 1 + .../freya02/discord/zstd/jni/ZstdJNITest.java | 10 +++--- 8 files changed, 146 insertions(+), 10 deletions(-) create mode 100644 api/src/main/java/dev/freya02/discord/zstd/api/DiscordZstd.java create mode 100644 api/src/main/java/dev/freya02/discord/zstd/api/DiscordZstdProvider.java create mode 100644 ffm-impl/src/main/java/dev/freya02/discord/zstd/ffm/DiscordZstdFFM.java create mode 100644 ffm-impl/src/main/resources/META-INF/services/dev.freya02.discord.zstd.api.DiscordZstd create mode 100644 jni-impl/src/main/java/dev/freya02/discord/zstd/jni/DiscordZstdJNI.java create mode 100644 jni-impl/src/main/resources/META-INF/services/dev.freya02.discord.zstd.api.DiscordZstd diff --git a/api/src/main/java/dev/freya02/discord/zstd/api/DiscordZstd.java b/api/src/main/java/dev/freya02/discord/zstd/api/DiscordZstd.java new file mode 100644 index 0000000..696b6f6 --- /dev/null +++ b/api/src/main/java/dev/freya02/discord/zstd/api/DiscordZstd.java @@ -0,0 +1,33 @@ +package dev.freya02.discord.zstd.api; + +import org.jspecify.annotations.NullMarked; + +import java.io.InputStream; + +@NullMarked +public interface DiscordZstd { + // TODO rename type + /** + * Creates a new {@link ZstdContext}. + *
This is used to keep track of streaming decompression after each input is consumed via an {@link InputStream}. + * + * @return A new {@link ZstdContext} instance + */ + ZstdContext createContext(); + + // TODO rename type + /** + * Creates a new {@link ZstdDecompressorFactory} with the provided decompression buffer size. + * + * @param bufferSizeHint + * A hint for the size of the buffer used for decompression, + * must be larger than {@value ZstdDecompressor#MIN_BUFFER_SIZE} or be equal to {@value ZstdDecompressor#ZSTD_RECOMMENDED_BUFFER_SIZE}. + * Typically, bigger buffers mean less decompression loops, it does not change inputs or outputs + * + * @throws IllegalArgumentException + * If {@code bufferSize} is less than {@value ZstdDecompressor#MIN_BUFFER_SIZE} and not {@value ZstdDecompressor#ZSTD_RECOMMENDED_BUFFER_SIZE} + * + * @return A new {@link ZstdDecompressorFactory} instance + */ + ZstdDecompressorFactory createDecompressorFactory(int bufferSizeHint); +} diff --git a/api/src/main/java/dev/freya02/discord/zstd/api/DiscordZstdProvider.java b/api/src/main/java/dev/freya02/discord/zstd/api/DiscordZstdProvider.java new file mode 100644 index 0000000..7e8d7af --- /dev/null +++ b/api/src/main/java/dev/freya02/discord/zstd/api/DiscordZstdProvider.java @@ -0,0 +1,35 @@ +package dev.freya02.discord.zstd.api; + +import org.jspecify.annotations.NullMarked; + +import java.util.Iterator; +import java.util.ServiceConfigurationError; +import java.util.ServiceLoader; + +@NullMarked +public class DiscordZstdProvider { + + private static final class InstanceHolder { + private static final DiscordZstd INSTANCE = load(); + } + + /** + * Loads the first implementation of {@link DiscordZstd} found on the classpath. + * + * @throws ServiceConfigurationError If the provider failed to load + * + * @return An implementation of {@link DiscordZstd} + */ + public static DiscordZstd get() { + return InstanceHolder.INSTANCE; + } + + private static DiscordZstd load() { + Iterator instances = ServiceLoader.load(DiscordZstd.class).iterator(); + if (!instances.hasNext()) { + throw new IllegalStateException("No implementations of discord-zstd-java could be found, make sure you added the dependency as described in https://github.com/freya022/discord-zstd-java/blob/master/README.md#-for-bot-developers"); + } + + return instances.next(); + } +} diff --git a/ffm-impl/src/main/java/dev/freya02/discord/zstd/ffm/DiscordZstdFFM.java b/ffm-impl/src/main/java/dev/freya02/discord/zstd/ffm/DiscordZstdFFM.java new file mode 100644 index 0000000..6762ca9 --- /dev/null +++ b/ffm-impl/src/main/java/dev/freya02/discord/zstd/ffm/DiscordZstdFFM.java @@ -0,0 +1,33 @@ +package dev.freya02.discord.zstd.ffm; + +import dev.freya02.discord.zstd.api.DiscordZstd; +import dev.freya02.discord.zstd.api.ZstdContext; +import dev.freya02.discord.zstd.api.ZstdDecompressorFactory; +import dev.freya02.discord.zstd.api.ZstdNativesLoader; +import org.jspecify.annotations.NullMarked; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; + +@NullMarked +public class DiscordZstdFFM implements DiscordZstd { + private static final Logger LOGGER = LoggerFactory.getLogger(DiscordZstdFFM.class); + + public DiscordZstdFFM() throws IOException { + LOGGER.debug("Using FFM implementation of discord-zstd-java"); + + // Load natives if they weren't already + ZstdNativesLoader.loadFromJar(); + } + + @Override + public ZstdContext createContext() { + return new ZstdFFMContext(); + } + + @Override + public ZstdDecompressorFactory createDecompressorFactory(int bufferSizeHint) { + return new ZstdFFMDecompressorFactory(bufferSizeHint); + } +} diff --git a/ffm-impl/src/main/resources/META-INF/services/dev.freya02.discord.zstd.api.DiscordZstd b/ffm-impl/src/main/resources/META-INF/services/dev.freya02.discord.zstd.api.DiscordZstd new file mode 100644 index 0000000..0cf1dd1 --- /dev/null +++ b/ffm-impl/src/main/resources/META-INF/services/dev.freya02.discord.zstd.api.DiscordZstd @@ -0,0 +1 @@ +dev.freya02.discord.zstd.ffm.DiscordZstdFFM diff --git a/ffm-impl/src/test/java/dev/freya02/discord/zstd/ffm/ZstdFFMTest.java b/ffm-impl/src/test/java/dev/freya02/discord/zstd/ffm/ZstdFFMTest.java index 2156fee..b8196c0 100644 --- a/ffm-impl/src/test/java/dev/freya02/discord/zstd/ffm/ZstdFFMTest.java +++ b/ffm-impl/src/test/java/dev/freya02/discord/zstd/ffm/ZstdFFMTest.java @@ -1,9 +1,10 @@ package dev.freya02.discord.zstd.ffm; import dev.freya02.discord.zstd.TestChunks; +import dev.freya02.discord.zstd.api.DiscordZstdProvider; +import dev.freya02.discord.zstd.api.ZstdContext; import dev.freya02.discord.zstd.api.ZstdDecompressor; import dev.freya02.discord.zstd.api.ZstdDecompressorFactory; -import dev.freya02.discord.zstd.api.ZstdNativesLoader; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; @@ -18,14 +19,13 @@ public class ZstdFFMTest { private static List chunks; @BeforeAll - public static void setup() throws IOException { + public static void setup() { chunks = TestChunks.get(TestChunks.Compression.ZSTD); - ZstdNativesLoader.loadFromJar(); } @Test public void test_decompression() { - ZstdDecompressorFactory factory = new ZstdFFMDecompressorFactoryProvider().get(ZstdDecompressor.DEFAULT_BUFFER_SIZE); + ZstdDecompressorFactory factory = DiscordZstdProvider.get().createDecompressorFactory(ZstdDecompressor.DEFAULT_BUFFER_SIZE); ZstdDecompressor decompressor = factory.create(); for (TestChunks.Chunk chunk : chunks) { final byte[] actual = decompressor.decompress(chunk.getCompressed()); @@ -36,7 +36,7 @@ public void test_decompression() { @Test public void test_input_stream() throws IOException { - final ZstdFFMContext context = new ZstdFFMContext(); + ZstdContext context = DiscordZstdProvider.get().createContext(); for (TestChunks.Chunk chunk : chunks) { try (InputStream stream = context.createInputStream(chunk.getCompressed())) { final byte[] actual = stream.readAllBytes(); diff --git a/jni-impl/src/main/java/dev/freya02/discord/zstd/jni/DiscordZstdJNI.java b/jni-impl/src/main/java/dev/freya02/discord/zstd/jni/DiscordZstdJNI.java new file mode 100644 index 0000000..05cb365 --- /dev/null +++ b/jni-impl/src/main/java/dev/freya02/discord/zstd/jni/DiscordZstdJNI.java @@ -0,0 +1,33 @@ +package dev.freya02.discord.zstd.jni; + +import dev.freya02.discord.zstd.api.DiscordZstd; +import dev.freya02.discord.zstd.api.ZstdContext; +import dev.freya02.discord.zstd.api.ZstdDecompressorFactory; +import dev.freya02.discord.zstd.api.ZstdNativesLoader; +import org.jspecify.annotations.NullMarked; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; + +@NullMarked +public class DiscordZstdJNI implements DiscordZstd { + private static final Logger LOGGER = LoggerFactory.getLogger(DiscordZstdJNI.class); + + public DiscordZstdJNI() throws IOException { + LOGGER.debug("Using JNI implementation of discord-zstd-java"); + + // Load natives if they weren't already + ZstdNativesLoader.loadFromJar(); + } + + @Override + public ZstdContext createContext() { + return new ZstdJNIContext(); + } + + @Override + public ZstdDecompressorFactory createDecompressorFactory(int bufferSizeHint) { + return new ZstdJNIDecompressorFactory(bufferSizeHint); + } +} diff --git a/jni-impl/src/main/resources/META-INF/services/dev.freya02.discord.zstd.api.DiscordZstd b/jni-impl/src/main/resources/META-INF/services/dev.freya02.discord.zstd.api.DiscordZstd new file mode 100644 index 0000000..2dfff2d --- /dev/null +++ b/jni-impl/src/main/resources/META-INF/services/dev.freya02.discord.zstd.api.DiscordZstd @@ -0,0 +1 @@ +dev.freya02.discord.zstd.jni.DiscordZstdJNI diff --git a/jni-impl/src/test/java/dev/freya02/discord/zstd/jni/ZstdJNITest.java b/jni-impl/src/test/java/dev/freya02/discord/zstd/jni/ZstdJNITest.java index 3f6ea73..7c69e63 100644 --- a/jni-impl/src/test/java/dev/freya02/discord/zstd/jni/ZstdJNITest.java +++ b/jni-impl/src/test/java/dev/freya02/discord/zstd/jni/ZstdJNITest.java @@ -1,9 +1,10 @@ package dev.freya02.discord.zstd.jni; import dev.freya02.discord.zstd.TestChunks; +import dev.freya02.discord.zstd.api.DiscordZstdProvider; +import dev.freya02.discord.zstd.api.ZstdContext; import dev.freya02.discord.zstd.api.ZstdDecompressor; import dev.freya02.discord.zstd.api.ZstdDecompressorFactory; -import dev.freya02.discord.zstd.api.ZstdNativesLoader; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; @@ -18,14 +19,13 @@ public class ZstdJNITest { private static List chunks; @BeforeAll - public static void setup() throws IOException { + public static void setup() { chunks = TestChunks.get(TestChunks.Compression.ZSTD); - ZstdNativesLoader.loadFromJar(); } @Test public void test_decompression() { - ZstdDecompressorFactory factory = new ZstdJNIDecompressorFactoryProvider().get(ZstdDecompressor.DEFAULT_BUFFER_SIZE); + ZstdDecompressorFactory factory = DiscordZstdProvider.get().createDecompressorFactory(ZstdDecompressor.DEFAULT_BUFFER_SIZE); ZstdDecompressor decompressor = factory.create(); for (TestChunks.Chunk chunk : chunks) { final byte[] actual = decompressor.decompress(chunk.getCompressed()); @@ -36,7 +36,7 @@ public void test_decompression() { @Test public void test_input_stream() throws IOException { - final ZstdJNIContext context = new ZstdJNIContext(); + ZstdContext context = DiscordZstdProvider.get().createContext(); for (TestChunks.Chunk chunk : chunks) { try (InputStream stream = context.createInputStream(chunk.getCompressed())) { final byte[] actual = stream.readAllBytes(); From 4afa712d75daba5a03974aa0b9f424d78c5b1d21 Mon Sep 17 00:00:00 2001 From: freya02 <41875020+freya022@users.noreply.github.com> Date: Fri, 5 Dec 2025 14:40:01 +0100 Subject: [PATCH 2/8] Disable JNA impl publishing --- jna-impl/README.md | 1 + jna-impl/build.gradle.kts | 9 --------- .../zstd/jna/ZstdJNADecompressorFactoryProvider.java | 4 +--- ...ya02.discord.zstd.api.ZstdDecompressorFactoryProvider | 1 - 4 files changed, 2 insertions(+), 13 deletions(-) create mode 100644 jna-impl/README.md delete mode 100644 jna-impl/src/main/resources/META-INF/services/dev.freya02.discord.zstd.api.ZstdDecompressorFactoryProvider diff --git a/jna-impl/README.md b/jna-impl/README.md new file mode 100644 index 0000000..094d2c6 --- /dev/null +++ b/jna-impl/README.md @@ -0,0 +1 @@ +This module is kept for reference purposes, it is nowhere near fast enough to compete with Zlib decompression, thus, this module is no longer published. diff --git a/jna-impl/build.gradle.kts b/jna-impl/build.gradle.kts index 25d88da..fcb0e0c 100644 --- a/jna-impl/build.gradle.kts +++ b/jna-impl/build.gradle.kts @@ -1,7 +1,6 @@ plugins { `java-conventions` `java-library` - `publish-conventions` } val fullProjectName = "${rootProject.name}-${project.name}" @@ -49,11 +48,3 @@ tasks.withType { } } } - -registerPublication( - name = fullProjectName, - description = "Zstandard streaming decompression API for JVM Discord API wrappers using Java Native Access (JNA)", - url = "https://github.com/freya022/discord-zstd-java/tree/master/jna-impl", -) { - from(components["java"]) -} diff --git a/jna-impl/src/main/java/dev/freya02/discord/zstd/jna/ZstdJNADecompressorFactoryProvider.java b/jna-impl/src/main/java/dev/freya02/discord/zstd/jna/ZstdJNADecompressorFactoryProvider.java index 04e5f5d..c9eeecc 100644 --- a/jna-impl/src/main/java/dev/freya02/discord/zstd/jna/ZstdJNADecompressorFactoryProvider.java +++ b/jna-impl/src/main/java/dev/freya02/discord/zstd/jna/ZstdJNADecompressorFactoryProvider.java @@ -1,13 +1,11 @@ package dev.freya02.discord.zstd.jna; import dev.freya02.discord.zstd.api.ZstdDecompressorFactory; -import dev.freya02.discord.zstd.api.ZstdDecompressorFactoryProvider; import org.jspecify.annotations.NullMarked; @NullMarked -public class ZstdJNADecompressorFactoryProvider implements ZstdDecompressorFactoryProvider { +public class ZstdJNADecompressorFactoryProvider { - @Override public ZstdDecompressorFactory get(int bufferSizeHint) { return new ZstdJNADecompressorFactory(bufferSizeHint); } diff --git a/jna-impl/src/main/resources/META-INF/services/dev.freya02.discord.zstd.api.ZstdDecompressorFactoryProvider b/jna-impl/src/main/resources/META-INF/services/dev.freya02.discord.zstd.api.ZstdDecompressorFactoryProvider deleted file mode 100644 index af241ee..0000000 --- a/jna-impl/src/main/resources/META-INF/services/dev.freya02.discord.zstd.api.ZstdDecompressorFactoryProvider +++ /dev/null @@ -1 +0,0 @@ -dev.freya02.discord.zstd.jna.ZstdJNADecompressorFactoryProvider From b0e0076acf9f92bcf85dbaa02fc0cdea78f88ac8 Mon Sep 17 00:00:00 2001 From: freya02 <41875020+freya022@users.noreply.github.com> Date: Fri, 5 Dec 2025 16:03:38 +0100 Subject: [PATCH 3/8] Remove old providers --- .../discord/zstd/api/ZstdContextFactory.java | 8 ------ .../zstd/api/ZstdContextFactoryProvider.java | 8 ------ .../api/ZstdDecompressorFactoryProvider.java | 28 ------------------- .../zstd/ZstdDecompressorBenchmark.java | 4 +-- .../discord/zstd/ZstdStreamingBenchmark.java | 7 ++--- .../zstd/ffm/ZstdFFMContextFactory.java | 13 --------- .../ffm/ZstdFFMContextFactoryProvider.java | 13 --------- .../ZstdFFMDecompressorFactoryProvider.java | 14 ---------- ...iscord.zstd.api.ZstdContextFactoryProvider | 1 - ...d.zstd.api.ZstdDecompressorFactoryProvider | 1 - .../zstd/jni/ZstdJNIContextFactory.java | 13 --------- .../jni/ZstdJNIContextFactoryProvider.java | 13 --------- .../ZstdJNIDecompressorFactoryProvider.java | 14 ---------- ...iscord.zstd.api.ZstdContextFactoryProvider | 1 - ...d.zstd.api.ZstdDecompressorFactoryProvider | 1 - 15 files changed, 5 insertions(+), 134 deletions(-) delete mode 100644 api/src/main/java/dev/freya02/discord/zstd/api/ZstdContextFactory.java delete mode 100644 api/src/main/java/dev/freya02/discord/zstd/api/ZstdContextFactoryProvider.java delete mode 100644 api/src/main/java/dev/freya02/discord/zstd/api/ZstdDecompressorFactoryProvider.java delete mode 100644 ffm-impl/src/main/java/dev/freya02/discord/zstd/ffm/ZstdFFMContextFactory.java delete mode 100644 ffm-impl/src/main/java/dev/freya02/discord/zstd/ffm/ZstdFFMContextFactoryProvider.java delete mode 100644 ffm-impl/src/main/java/dev/freya02/discord/zstd/ffm/ZstdFFMDecompressorFactoryProvider.java delete mode 100644 ffm-impl/src/main/resources/META-INF/services/dev.freya02.discord.zstd.api.ZstdContextFactoryProvider delete mode 100644 ffm-impl/src/main/resources/META-INF/services/dev.freya02.discord.zstd.api.ZstdDecompressorFactoryProvider delete mode 100644 jni-impl/src/main/java/dev/freya02/discord/zstd/jni/ZstdJNIContextFactory.java delete mode 100644 jni-impl/src/main/java/dev/freya02/discord/zstd/jni/ZstdJNIContextFactoryProvider.java delete mode 100644 jni-impl/src/main/java/dev/freya02/discord/zstd/jni/ZstdJNIDecompressorFactoryProvider.java delete mode 100644 jni-impl/src/main/resources/META-INF/services/dev.freya02.discord.zstd.api.ZstdContextFactoryProvider delete mode 100644 jni-impl/src/main/resources/META-INF/services/dev.freya02.discord.zstd.api.ZstdDecompressorFactoryProvider diff --git a/api/src/main/java/dev/freya02/discord/zstd/api/ZstdContextFactory.java b/api/src/main/java/dev/freya02/discord/zstd/api/ZstdContextFactory.java deleted file mode 100644 index 404f7b4..0000000 --- a/api/src/main/java/dev/freya02/discord/zstd/api/ZstdContextFactory.java +++ /dev/null @@ -1,8 +0,0 @@ -package dev.freya02.discord.zstd.api; - -import org.jspecify.annotations.NullMarked; - -@NullMarked -public interface ZstdContextFactory { - ZstdContext create(); -} diff --git a/api/src/main/java/dev/freya02/discord/zstd/api/ZstdContextFactoryProvider.java b/api/src/main/java/dev/freya02/discord/zstd/api/ZstdContextFactoryProvider.java deleted file mode 100644 index 104a223..0000000 --- a/api/src/main/java/dev/freya02/discord/zstd/api/ZstdContextFactoryProvider.java +++ /dev/null @@ -1,8 +0,0 @@ -package dev.freya02.discord.zstd.api; - -import org.jspecify.annotations.NullMarked; - -@NullMarked -public interface ZstdContextFactoryProvider { - ZstdContextFactory get(); -} diff --git a/api/src/main/java/dev/freya02/discord/zstd/api/ZstdDecompressorFactoryProvider.java b/api/src/main/java/dev/freya02/discord/zstd/api/ZstdDecompressorFactoryProvider.java deleted file mode 100644 index f8749a2..0000000 --- a/api/src/main/java/dev/freya02/discord/zstd/api/ZstdDecompressorFactoryProvider.java +++ /dev/null @@ -1,28 +0,0 @@ -package dev.freya02.discord.zstd.api; - -import org.jspecify.annotations.NullMarked; - -import java.util.ServiceLoader; - -/** - * Provider of {@link ZstdDecompressorFactory}. - * - *

Instances are thread safe and can be obtained using {@link ServiceLoader}. - */ -@NullMarked -public interface ZstdDecompressorFactoryProvider { - /** - * Creates a new {@link ZstdDecompressorFactory} with the provided decompression buffer size. - * - * @param bufferSizeHint - * A hint for the size of the buffer used for decompression, - * must be larger than {@value ZstdDecompressor#MIN_BUFFER_SIZE} or be equal to {@value ZstdDecompressor#ZSTD_RECOMMENDED_BUFFER_SIZE}. - * Typically, bigger buffers mean less decompression loops, it does not change inputs or outputs - * - * @throws IllegalArgumentException - * If {@code bufferSize} is less than {@value ZstdDecompressor#MIN_BUFFER_SIZE} and not {@value ZstdDecompressor#ZSTD_RECOMMENDED_BUFFER_SIZE} - * - * @return A new {@link ZstdDecompressorFactory} instance - */ - ZstdDecompressorFactory get(int bufferSizeHint); -} diff --git a/benchmarks/src/jmh/java/dev/freya02/discord/zstd/ZstdDecompressorBenchmark.java b/benchmarks/src/jmh/java/dev/freya02/discord/zstd/ZstdDecompressorBenchmark.java index 129c9d5..9098993 100644 --- a/benchmarks/src/jmh/java/dev/freya02/discord/zstd/ZstdDecompressorBenchmark.java +++ b/benchmarks/src/jmh/java/dev/freya02/discord/zstd/ZstdDecompressorBenchmark.java @@ -3,7 +3,7 @@ import dev.freya02.discord.zstd.api.ZstdDecompressor; import dev.freya02.discord.zstd.api.ZstdDecompressorFactory; import dev.freya02.discord.zstd.api.ZstdNativesLoader; -import dev.freya02.discord.zstd.jni.ZstdJNIDecompressorFactoryProvider; +import dev.freya02.discord.zstd.jni.DiscordZstdJNI; import net.dv8tion.jda.api.utils.data.DataObject; import net.dv8tion.jda.internal.utils.IOUtil; import org.openjdk.jmh.annotations.*; @@ -40,7 +40,7 @@ public static class ZstdDecompressorState { public void setup() throws IOException { ZstdNativesLoader.loadFromJar(); ZstdDecompressorFactory factory = switch (impl) { - case "jni" -> new ZstdJNIDecompressorFactoryProvider().get(ZSTD_BUFFER_SIZE); + case "jni" -> new DiscordZstdJNI().createDecompressorFactory(ZSTD_BUFFER_SIZE); default -> throw new AssertionError("Unknown implementation: " + impl); }; decompressor = factory.create(); diff --git a/benchmarks/src/jmh/java/dev/freya02/discord/zstd/ZstdStreamingBenchmark.java b/benchmarks/src/jmh/java/dev/freya02/discord/zstd/ZstdStreamingBenchmark.java index 0b5be79..8b85b2b 100644 --- a/benchmarks/src/jmh/java/dev/freya02/discord/zstd/ZstdStreamingBenchmark.java +++ b/benchmarks/src/jmh/java/dev/freya02/discord/zstd/ZstdStreamingBenchmark.java @@ -2,7 +2,7 @@ import dev.freya02.discord.zstd.api.ZstdContext; import dev.freya02.discord.zstd.api.ZstdNativesLoader; -import dev.freya02.discord.zstd.jni.ZstdJNIContextFactoryProvider; +import dev.freya02.discord.zstd.jni.DiscordZstdJNI; import net.dv8tion.jda.api.utils.data.DataObject; import net.dv8tion.jda.internal.utils.IOUtil; import org.jetbrains.annotations.Nullable; @@ -35,11 +35,10 @@ public static class ZstdDecompressorState { @Setup public void setup() throws IOException { ZstdNativesLoader.loadFromJar(); - var factory = switch (impl) { - case "jni" -> new ZstdJNIContextFactoryProvider().get(); + context = switch (impl) { + case "jni" -> new DiscordZstdJNI().createContext(); default -> throw new AssertionError("Unknown implementation: " + impl); }; - context = factory.create(); } @TearDown diff --git a/ffm-impl/src/main/java/dev/freya02/discord/zstd/ffm/ZstdFFMContextFactory.java b/ffm-impl/src/main/java/dev/freya02/discord/zstd/ffm/ZstdFFMContextFactory.java deleted file mode 100644 index 776f423..0000000 --- a/ffm-impl/src/main/java/dev/freya02/discord/zstd/ffm/ZstdFFMContextFactory.java +++ /dev/null @@ -1,13 +0,0 @@ -package dev.freya02.discord.zstd.ffm; - -import dev.freya02.discord.zstd.api.ZstdContext; -import dev.freya02.discord.zstd.api.ZstdContextFactory; -import org.jspecify.annotations.NullMarked; - -@NullMarked -public class ZstdFFMContextFactory implements ZstdContextFactory { - @Override - public ZstdContext create() { - return new ZstdFFMContext(); - } -} diff --git a/ffm-impl/src/main/java/dev/freya02/discord/zstd/ffm/ZstdFFMContextFactoryProvider.java b/ffm-impl/src/main/java/dev/freya02/discord/zstd/ffm/ZstdFFMContextFactoryProvider.java deleted file mode 100644 index 6e491cd..0000000 --- a/ffm-impl/src/main/java/dev/freya02/discord/zstd/ffm/ZstdFFMContextFactoryProvider.java +++ /dev/null @@ -1,13 +0,0 @@ -package dev.freya02.discord.zstd.ffm; - -import dev.freya02.discord.zstd.api.ZstdContextFactory; -import dev.freya02.discord.zstd.api.ZstdContextFactoryProvider; -import org.jspecify.annotations.NullMarked; - -@NullMarked -public class ZstdFFMContextFactoryProvider implements ZstdContextFactoryProvider { - @Override - public ZstdContextFactory get() { - return new ZstdFFMContextFactory(); - } -} diff --git a/ffm-impl/src/main/java/dev/freya02/discord/zstd/ffm/ZstdFFMDecompressorFactoryProvider.java b/ffm-impl/src/main/java/dev/freya02/discord/zstd/ffm/ZstdFFMDecompressorFactoryProvider.java deleted file mode 100644 index f9beb9e..0000000 --- a/ffm-impl/src/main/java/dev/freya02/discord/zstd/ffm/ZstdFFMDecompressorFactoryProvider.java +++ /dev/null @@ -1,14 +0,0 @@ -package dev.freya02.discord.zstd.ffm; - -import dev.freya02.discord.zstd.api.ZstdDecompressorFactory; -import dev.freya02.discord.zstd.api.ZstdDecompressorFactoryProvider; -import org.jspecify.annotations.NullMarked; - -@NullMarked -public class ZstdFFMDecompressorFactoryProvider implements ZstdDecompressorFactoryProvider { - - @Override - public ZstdDecompressorFactory get(int bufferSizeHint) { - return new ZstdFFMDecompressorFactory(bufferSizeHint); - } -} diff --git a/ffm-impl/src/main/resources/META-INF/services/dev.freya02.discord.zstd.api.ZstdContextFactoryProvider b/ffm-impl/src/main/resources/META-INF/services/dev.freya02.discord.zstd.api.ZstdContextFactoryProvider deleted file mode 100644 index 53b3ead..0000000 --- a/ffm-impl/src/main/resources/META-INF/services/dev.freya02.discord.zstd.api.ZstdContextFactoryProvider +++ /dev/null @@ -1 +0,0 @@ -dev.freya02.discord.zstd.ffm.ZstdFFMContextFactoryProvider diff --git a/ffm-impl/src/main/resources/META-INF/services/dev.freya02.discord.zstd.api.ZstdDecompressorFactoryProvider b/ffm-impl/src/main/resources/META-INF/services/dev.freya02.discord.zstd.api.ZstdDecompressorFactoryProvider deleted file mode 100644 index 294ac6d..0000000 --- a/ffm-impl/src/main/resources/META-INF/services/dev.freya02.discord.zstd.api.ZstdDecompressorFactoryProvider +++ /dev/null @@ -1 +0,0 @@ -dev.freya02.discord.zstd.ffm.ZstdFFMDecompressorFactoryProvider diff --git a/jni-impl/src/main/java/dev/freya02/discord/zstd/jni/ZstdJNIContextFactory.java b/jni-impl/src/main/java/dev/freya02/discord/zstd/jni/ZstdJNIContextFactory.java deleted file mode 100644 index 3b023b0..0000000 --- a/jni-impl/src/main/java/dev/freya02/discord/zstd/jni/ZstdJNIContextFactory.java +++ /dev/null @@ -1,13 +0,0 @@ -package dev.freya02.discord.zstd.jni; - -import dev.freya02.discord.zstd.api.ZstdContext; -import dev.freya02.discord.zstd.api.ZstdContextFactory; -import org.jspecify.annotations.NullMarked; - -@NullMarked -public class ZstdJNIContextFactory implements ZstdContextFactory { - @Override - public ZstdContext create() { - return new ZstdJNIContext(); - } -} diff --git a/jni-impl/src/main/java/dev/freya02/discord/zstd/jni/ZstdJNIContextFactoryProvider.java b/jni-impl/src/main/java/dev/freya02/discord/zstd/jni/ZstdJNIContextFactoryProvider.java deleted file mode 100644 index 1167f2b..0000000 --- a/jni-impl/src/main/java/dev/freya02/discord/zstd/jni/ZstdJNIContextFactoryProvider.java +++ /dev/null @@ -1,13 +0,0 @@ -package dev.freya02.discord.zstd.jni; - -import dev.freya02.discord.zstd.api.ZstdContextFactory; -import dev.freya02.discord.zstd.api.ZstdContextFactoryProvider; -import org.jspecify.annotations.NullMarked; - -@NullMarked -public class ZstdJNIContextFactoryProvider implements ZstdContextFactoryProvider { - @Override - public ZstdContextFactory get() { - return new ZstdJNIContextFactory(); - } -} diff --git a/jni-impl/src/main/java/dev/freya02/discord/zstd/jni/ZstdJNIDecompressorFactoryProvider.java b/jni-impl/src/main/java/dev/freya02/discord/zstd/jni/ZstdJNIDecompressorFactoryProvider.java deleted file mode 100644 index df83c6d..0000000 --- a/jni-impl/src/main/java/dev/freya02/discord/zstd/jni/ZstdJNIDecompressorFactoryProvider.java +++ /dev/null @@ -1,14 +0,0 @@ -package dev.freya02.discord.zstd.jni; - -import dev.freya02.discord.zstd.api.ZstdDecompressorFactory; -import dev.freya02.discord.zstd.api.ZstdDecompressorFactoryProvider; -import org.jspecify.annotations.NullMarked; - -@NullMarked -public class ZstdJNIDecompressorFactoryProvider implements ZstdDecompressorFactoryProvider { - - @Override - public ZstdDecompressorFactory get(int bufferSizeHint) { - return new ZstdJNIDecompressorFactory(bufferSizeHint); - } -} diff --git a/jni-impl/src/main/resources/META-INF/services/dev.freya02.discord.zstd.api.ZstdContextFactoryProvider b/jni-impl/src/main/resources/META-INF/services/dev.freya02.discord.zstd.api.ZstdContextFactoryProvider deleted file mode 100644 index 1ff1322..0000000 --- a/jni-impl/src/main/resources/META-INF/services/dev.freya02.discord.zstd.api.ZstdContextFactoryProvider +++ /dev/null @@ -1 +0,0 @@ -dev.freya02.discord.zstd.jni.ZstdJNIContextFactoryProvider diff --git a/jni-impl/src/main/resources/META-INF/services/dev.freya02.discord.zstd.api.ZstdDecompressorFactoryProvider b/jni-impl/src/main/resources/META-INF/services/dev.freya02.discord.zstd.api.ZstdDecompressorFactoryProvider deleted file mode 100644 index e29ca8a..0000000 --- a/jni-impl/src/main/resources/META-INF/services/dev.freya02.discord.zstd.api.ZstdDecompressorFactoryProvider +++ /dev/null @@ -1 +0,0 @@ -dev.freya02.discord.zstd.jni.ZstdJNIDecompressorFactoryProvider From c99394374dd3dae5882f1a42c485a651b6f82d96 Mon Sep 17 00:00:00 2001 From: freya02 <41875020+freya022@users.noreply.github.com> Date: Fri, 5 Dec 2025 16:22:14 +0100 Subject: [PATCH 4/8] Set internal visibilities --- ffm-impl/src/main/java/dev/freya02/discord/zstd/ffm/Zstd.java | 2 +- .../main/java/dev/freya02/discord/zstd/ffm/ZstdFFMContext.java | 2 +- .../java/dev/freya02/discord/zstd/ffm/ZstdFFMDecompressor.java | 2 +- .../freya02/discord/zstd/ffm/ZstdFFMDecompressorFactory.java | 2 +- .../java/dev/freya02/discord/zstd/ffm/ZstdFFMInputStream.java | 2 +- .../main/java/dev/freya02/discord/zstd/jni/ZstdJNIContext.java | 2 +- .../java/dev/freya02/discord/zstd/jni/ZstdJNIDecompressor.java | 2 +- .../freya02/discord/zstd/jni/ZstdJNIDecompressorFactory.java | 2 +- .../java/dev/freya02/discord/zstd/jni/ZstdJNIInputStream.java | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/ffm-impl/src/main/java/dev/freya02/discord/zstd/ffm/Zstd.java b/ffm-impl/src/main/java/dev/freya02/discord/zstd/ffm/Zstd.java index 5580fdc..fbfd0b4 100644 --- a/ffm-impl/src/main/java/dev/freya02/discord/zstd/ffm/Zstd.java +++ b/ffm-impl/src/main/java/dev/freya02/discord/zstd/ffm/Zstd.java @@ -39,7 +39,7 @@ * the return value is a suggested next input size (just a hint for better latency) * that will never request more than the remaining content of the compressed frame. */ -public final class Zstd { +final class Zstd { private Zstd() { // Should not be called directly diff --git a/ffm-impl/src/main/java/dev/freya02/discord/zstd/ffm/ZstdFFMContext.java b/ffm-impl/src/main/java/dev/freya02/discord/zstd/ffm/ZstdFFMContext.java index 9803c12..26307c1 100644 --- a/ffm-impl/src/main/java/dev/freya02/discord/zstd/ffm/ZstdFFMContext.java +++ b/ffm-impl/src/main/java/dev/freya02/discord/zstd/ffm/ZstdFFMContext.java @@ -8,7 +8,7 @@ import java.lang.foreign.MemorySegment; @NullMarked -public class ZstdFFMContext implements ZstdContext { +class ZstdFFMContext implements ZstdContext { private final MemorySegment stream; private boolean invalidated = false; diff --git a/ffm-impl/src/main/java/dev/freya02/discord/zstd/ffm/ZstdFFMDecompressor.java b/ffm-impl/src/main/java/dev/freya02/discord/zstd/ffm/ZstdFFMDecompressor.java index 82bfb1a..c54d607 100644 --- a/ffm-impl/src/main/java/dev/freya02/discord/zstd/ffm/ZstdFFMDecompressor.java +++ b/ffm-impl/src/main/java/dev/freya02/discord/zstd/ffm/ZstdFFMDecompressor.java @@ -14,7 +14,7 @@ import java.util.List; @NullMarked -public class ZstdFFMDecompressor extends AbstractZstdDecompressor { +class ZstdFFMDecompressor extends AbstractZstdDecompressor { private static final Logger LOG = LoggerFactory.getLogger(ZstdFFMDecompressor.class); diff --git a/ffm-impl/src/main/java/dev/freya02/discord/zstd/ffm/ZstdFFMDecompressorFactory.java b/ffm-impl/src/main/java/dev/freya02/discord/zstd/ffm/ZstdFFMDecompressorFactory.java index b693c91..b2b5a97 100644 --- a/ffm-impl/src/main/java/dev/freya02/discord/zstd/ffm/ZstdFFMDecompressorFactory.java +++ b/ffm-impl/src/main/java/dev/freya02/discord/zstd/ffm/ZstdFFMDecompressorFactory.java @@ -6,7 +6,7 @@ import org.jspecify.annotations.NullMarked; @NullMarked -public class ZstdFFMDecompressorFactory implements ZstdDecompressorFactory { +class ZstdFFMDecompressorFactory implements ZstdDecompressorFactory { private final int bufferSize; diff --git a/ffm-impl/src/main/java/dev/freya02/discord/zstd/ffm/ZstdFFMInputStream.java b/ffm-impl/src/main/java/dev/freya02/discord/zstd/ffm/ZstdFFMInputStream.java index be9e59e..bb8810b 100644 --- a/ffm-impl/src/main/java/dev/freya02/discord/zstd/ffm/ZstdFFMInputStream.java +++ b/ffm-impl/src/main/java/dev/freya02/discord/zstd/ffm/ZstdFFMInputStream.java @@ -10,7 +10,7 @@ import java.util.Objects; @NullMarked -public class ZstdFFMInputStream extends InputStream { +class ZstdFFMInputStream extends InputStream { private final ZstdFFMContext context; diff --git a/jni-impl/src/main/java/dev/freya02/discord/zstd/jni/ZstdJNIContext.java b/jni-impl/src/main/java/dev/freya02/discord/zstd/jni/ZstdJNIContext.java index 38f66b5..577dac3 100644 --- a/jni-impl/src/main/java/dev/freya02/discord/zstd/jni/ZstdJNIContext.java +++ b/jni-impl/src/main/java/dev/freya02/discord/zstd/jni/ZstdJNIContext.java @@ -6,7 +6,7 @@ import java.io.InputStream; @NullMarked -public class ZstdJNIContext implements ZstdContext { +class ZstdJNIContext implements ZstdContext { private final long zds; private boolean invalidated = false; diff --git a/jni-impl/src/main/java/dev/freya02/discord/zstd/jni/ZstdJNIDecompressor.java b/jni-impl/src/main/java/dev/freya02/discord/zstd/jni/ZstdJNIDecompressor.java index d410072..a9b11c4 100644 --- a/jni-impl/src/main/java/dev/freya02/discord/zstd/jni/ZstdJNIDecompressor.java +++ b/jni-impl/src/main/java/dev/freya02/discord/zstd/jni/ZstdJNIDecompressor.java @@ -9,7 +9,7 @@ import java.util.Arrays; @NullMarked -public class ZstdJNIDecompressor extends AbstractZstdDecompressor { +class ZstdJNIDecompressor extends AbstractZstdDecompressor { private static final Logger LOG = LoggerFactory.getLogger(ZstdJNIDecompressor.class); diff --git a/jni-impl/src/main/java/dev/freya02/discord/zstd/jni/ZstdJNIDecompressorFactory.java b/jni-impl/src/main/java/dev/freya02/discord/zstd/jni/ZstdJNIDecompressorFactory.java index 4e8e676..af7a863 100644 --- a/jni-impl/src/main/java/dev/freya02/discord/zstd/jni/ZstdJNIDecompressorFactory.java +++ b/jni-impl/src/main/java/dev/freya02/discord/zstd/jni/ZstdJNIDecompressorFactory.java @@ -6,7 +6,7 @@ import org.jspecify.annotations.NullMarked; @NullMarked -public class ZstdJNIDecompressorFactory implements ZstdDecompressorFactory { +class ZstdJNIDecompressorFactory implements ZstdDecompressorFactory { private final int bufferSize; diff --git a/jni-impl/src/main/java/dev/freya02/discord/zstd/jni/ZstdJNIInputStream.java b/jni-impl/src/main/java/dev/freya02/discord/zstd/jni/ZstdJNIInputStream.java index 5305365..0dd5ec5 100644 --- a/jni-impl/src/main/java/dev/freya02/discord/zstd/jni/ZstdJNIInputStream.java +++ b/jni-impl/src/main/java/dev/freya02/discord/zstd/jni/ZstdJNIInputStream.java @@ -7,7 +7,7 @@ import java.io.InputStream; @NullMarked -public class ZstdJNIInputStream extends InputStream { +class ZstdJNIInputStream extends InputStream { private final ZstdJNIContext context; private final long nativeContextPtr; From 03448dbc5fb0e3ed2cab2eed725a5c17fbf084ea Mon Sep 17 00:00:00 2001 From: freya02 <41875020+freya022@users.noreply.github.com> Date: Fri, 5 Dec 2025 16:23:48 +0100 Subject: [PATCH 5/8] Remove redundant `ZstdNativesLoader.isLoaded()` check --- .../freya02/discord/zstd/ffm/ZstdFFMDecompressorFactory.java | 4 ---- .../freya02/discord/zstd/jni/ZstdJNIDecompressorFactory.java | 4 ---- 2 files changed, 8 deletions(-) diff --git a/ffm-impl/src/main/java/dev/freya02/discord/zstd/ffm/ZstdFFMDecompressorFactory.java b/ffm-impl/src/main/java/dev/freya02/discord/zstd/ffm/ZstdFFMDecompressorFactory.java index b2b5a97..cefb0fc 100644 --- a/ffm-impl/src/main/java/dev/freya02/discord/zstd/ffm/ZstdFFMDecompressorFactory.java +++ b/ffm-impl/src/main/java/dev/freya02/discord/zstd/ffm/ZstdFFMDecompressorFactory.java @@ -2,7 +2,6 @@ import dev.freya02.discord.zstd.api.ZstdDecompressor; import dev.freya02.discord.zstd.api.ZstdDecompressorFactory; -import dev.freya02.discord.zstd.api.ZstdNativesLoader; import org.jspecify.annotations.NullMarked; @NullMarked @@ -18,9 +17,6 @@ protected ZstdFFMDecompressorFactory(int bufferSize) { @Override public ZstdDecompressor create() { - if (!ZstdNativesLoader.isLoaded()) { - throw new IllegalStateException("Natives are not loaded yet, see ZstdNativesLoader"); - } return new ZstdFFMDecompressor(bufferSize); } } diff --git a/jni-impl/src/main/java/dev/freya02/discord/zstd/jni/ZstdJNIDecompressorFactory.java b/jni-impl/src/main/java/dev/freya02/discord/zstd/jni/ZstdJNIDecompressorFactory.java index af7a863..babe1e0 100644 --- a/jni-impl/src/main/java/dev/freya02/discord/zstd/jni/ZstdJNIDecompressorFactory.java +++ b/jni-impl/src/main/java/dev/freya02/discord/zstd/jni/ZstdJNIDecompressorFactory.java @@ -2,7 +2,6 @@ import dev.freya02.discord.zstd.api.ZstdDecompressor; import dev.freya02.discord.zstd.api.ZstdDecompressorFactory; -import dev.freya02.discord.zstd.api.ZstdNativesLoader; import org.jspecify.annotations.NullMarked; @NullMarked @@ -18,9 +17,6 @@ protected ZstdJNIDecompressorFactory(int bufferSize) { @Override public ZstdDecompressor create() { - if (!ZstdNativesLoader.isLoaded()) { - throw new IllegalStateException("Natives are not loaded yet, see ZstdNativesLoader"); - } return new ZstdJNIDecompressor(bufferSize); } } From 637eaf1fc971f029a6b82eac56fb092da39a7127 Mon Sep 17 00:00:00 2001 From: freya02 <41875020+freya022@users.noreply.github.com> Date: Fri, 5 Dec 2025 16:26:30 +0100 Subject: [PATCH 6/8] Move decompressor buffer size hint checks to factory method --- .../dev/freya02/discord/zstd/ffm/DiscordZstdFFM.java | 7 +++---- .../discord/zstd/ffm/ZstdFFMDecompressorFactory.java | 10 ++++------ .../dev/freya02/discord/zstd/jni/DiscordZstdJNI.java | 7 +++---- .../discord/zstd/jni/ZstdJNIDecompressorFactory.java | 10 ++++------ 4 files changed, 14 insertions(+), 20 deletions(-) diff --git a/ffm-impl/src/main/java/dev/freya02/discord/zstd/ffm/DiscordZstdFFM.java b/ffm-impl/src/main/java/dev/freya02/discord/zstd/ffm/DiscordZstdFFM.java index 6762ca9..a7768e0 100644 --- a/ffm-impl/src/main/java/dev/freya02/discord/zstd/ffm/DiscordZstdFFM.java +++ b/ffm-impl/src/main/java/dev/freya02/discord/zstd/ffm/DiscordZstdFFM.java @@ -1,9 +1,6 @@ package dev.freya02.discord.zstd.ffm; -import dev.freya02.discord.zstd.api.DiscordZstd; -import dev.freya02.discord.zstd.api.ZstdContext; -import dev.freya02.discord.zstd.api.ZstdDecompressorFactory; -import dev.freya02.discord.zstd.api.ZstdNativesLoader; +import dev.freya02.discord.zstd.api.*; import org.jspecify.annotations.NullMarked; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -28,6 +25,8 @@ public ZstdContext createContext() { @Override public ZstdDecompressorFactory createDecompressorFactory(int bufferSizeHint) { + if (bufferSizeHint < ZstdDecompressor.MIN_BUFFER_SIZE && bufferSizeHint != ZstdDecompressor.ZSTD_RECOMMENDED_BUFFER_SIZE) + throw new IllegalArgumentException("Buffer must be larger than or equal to " + ZstdDecompressor.MIN_BUFFER_SIZE + ", provided " + bufferSizeHint); return new ZstdFFMDecompressorFactory(bufferSizeHint); } } diff --git a/ffm-impl/src/main/java/dev/freya02/discord/zstd/ffm/ZstdFFMDecompressorFactory.java b/ffm-impl/src/main/java/dev/freya02/discord/zstd/ffm/ZstdFFMDecompressorFactory.java index cefb0fc..b4b517e 100644 --- a/ffm-impl/src/main/java/dev/freya02/discord/zstd/ffm/ZstdFFMDecompressorFactory.java +++ b/ffm-impl/src/main/java/dev/freya02/discord/zstd/ffm/ZstdFFMDecompressorFactory.java @@ -7,16 +7,14 @@ @NullMarked class ZstdFFMDecompressorFactory implements ZstdDecompressorFactory { - private final int bufferSize; + private final int bufferSizeHint; - protected ZstdFFMDecompressorFactory(int bufferSize) { - if (bufferSize < ZstdDecompressor.MIN_BUFFER_SIZE && bufferSize != ZstdDecompressor.ZSTD_RECOMMENDED_BUFFER_SIZE) - throw new IllegalArgumentException("Buffer must be larger than or equal to " + ZstdDecompressor.MIN_BUFFER_SIZE + ", provided " + bufferSize); - this.bufferSize = bufferSize; + protected ZstdFFMDecompressorFactory(int bufferSizeHint) { + this.bufferSizeHint = bufferSizeHint; } @Override public ZstdDecompressor create() { - return new ZstdFFMDecompressor(bufferSize); + return new ZstdFFMDecompressor(bufferSizeHint); } } diff --git a/jni-impl/src/main/java/dev/freya02/discord/zstd/jni/DiscordZstdJNI.java b/jni-impl/src/main/java/dev/freya02/discord/zstd/jni/DiscordZstdJNI.java index 05cb365..3e6e8f1 100644 --- a/jni-impl/src/main/java/dev/freya02/discord/zstd/jni/DiscordZstdJNI.java +++ b/jni-impl/src/main/java/dev/freya02/discord/zstd/jni/DiscordZstdJNI.java @@ -1,9 +1,6 @@ package dev.freya02.discord.zstd.jni; -import dev.freya02.discord.zstd.api.DiscordZstd; -import dev.freya02.discord.zstd.api.ZstdContext; -import dev.freya02.discord.zstd.api.ZstdDecompressorFactory; -import dev.freya02.discord.zstd.api.ZstdNativesLoader; +import dev.freya02.discord.zstd.api.*; import org.jspecify.annotations.NullMarked; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -28,6 +25,8 @@ public ZstdContext createContext() { @Override public ZstdDecompressorFactory createDecompressorFactory(int bufferSizeHint) { + if (bufferSizeHint < ZstdDecompressor.MIN_BUFFER_SIZE && bufferSizeHint != ZstdDecompressor.ZSTD_RECOMMENDED_BUFFER_SIZE) + throw new IllegalArgumentException("Buffer must be larger than or equal to " + ZstdDecompressor.MIN_BUFFER_SIZE + ", provided " + bufferSizeHint); return new ZstdJNIDecompressorFactory(bufferSizeHint); } } diff --git a/jni-impl/src/main/java/dev/freya02/discord/zstd/jni/ZstdJNIDecompressorFactory.java b/jni-impl/src/main/java/dev/freya02/discord/zstd/jni/ZstdJNIDecompressorFactory.java index babe1e0..f8235e7 100644 --- a/jni-impl/src/main/java/dev/freya02/discord/zstd/jni/ZstdJNIDecompressorFactory.java +++ b/jni-impl/src/main/java/dev/freya02/discord/zstd/jni/ZstdJNIDecompressorFactory.java @@ -7,16 +7,14 @@ @NullMarked class ZstdJNIDecompressorFactory implements ZstdDecompressorFactory { - private final int bufferSize; + private final int bufferSizeHint; - protected ZstdJNIDecompressorFactory(int bufferSize) { - if (bufferSize < ZstdDecompressor.MIN_BUFFER_SIZE && bufferSize != ZstdDecompressor.ZSTD_RECOMMENDED_BUFFER_SIZE) - throw new IllegalArgumentException("Buffer must be larger than or equal to " + ZstdDecompressor.MIN_BUFFER_SIZE + ", provided " + bufferSize); - this.bufferSize = bufferSize; + protected ZstdJNIDecompressorFactory(int bufferSizeHint) { + this.bufferSizeHint = bufferSizeHint; } @Override public ZstdDecompressor create() { - return new ZstdJNIDecompressor(bufferSize); + return new ZstdJNIDecompressor(bufferSizeHint); } } From c0b9a0a7a058e82770c19cb04a04de76e1e7c7ea Mon Sep 17 00:00:00 2001 From: freya02 <41875020+freya022@users.noreply.github.com> Date: Fri, 5 Dec 2025 16:48:06 +0100 Subject: [PATCH 7/8] Update README.md --- README.md | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 04f0da0..a7233f0 100644 --- a/README.md +++ b/README.md @@ -54,10 +54,9 @@ You will only need the `dev.freya02:discord-zstd-java-api:VERSION` dependency, i ### Usage -First, get a `ZstdDecompressorFactoryProvider` by loading one using a `ServiceLoader`, -doing this first ensures you can throw an error when missing an implementation before it can throw one because of missing natives, as they are brought by the implementation. - -Then, you can check if the natives are loaded by checking `ZstdNativesLoader.isLoaded()`, -but usually you'll want to call `loadFromJar()`, you should do it late enough so the bot developer has a chance to load different natives. - -Finally, get a factory from the provider, it will be configured with the values you pass. +The main interface is `DiscordZstd`, you can get an instance with `DiscordZstdProvider.get()`. +Then, you can either: +1. Do bulk processing with a decompressor obtained with `DiscordZstd#createDecompressor` and kept per gateway connection, + calling `ZstdDecompressor#decompress` on each gateway message +2. Process gradually with a context obtained from `DiscordZstd#createContext` and kept per gateway connection, + then making input streams with `ZstdContext#createInputStream` from each gateway message From 675628f5ff1667a8219898eae1c8a7ed1975c8e5 Mon Sep 17 00:00:00 2001 From: freya02 <41875020+freya022@users.noreply.github.com> Date: Fri, 5 Dec 2025 17:15:07 +0100 Subject: [PATCH 8/8] Prefix classes with `Discord` To avoid conflicts with classes of users --- .../freya02/discord/zstd/api/DiscordZstd.java | 16 ++++++------- ...tdContext.java => DiscordZstdContext.java} | 2 +- ...ssor.java => DiscordZstdDecompressor.java} | 4 ++-- .../api/DiscordZstdDecompressorFactory.java | 18 ++++++++++++++ ...ception.java => DiscordZstdException.java} | 4 ++-- ...der.java => DiscordZstdNativesLoader.java} | 6 +++-- .../zstd/api/ZstdDecompressorFactory.java | 18 -------------- .../internal/AbstractZstdDecompressor.java | 4 ++-- .../zstd/ZstdDecompressorBenchmark.java | 14 +++++------ .../discord/zstd/ZstdStreamingBenchmark.java | 8 +++---- .../discord/zstd/ffm/DiscordZstdFFM.java | 14 +++++------ ...ontext.java => DiscordZstdFFMContext.java} | 14 +++++------ ...r.java => DiscordZstdFFMDecompressor.java} | 12 +++++----- .../DiscordZstdFFMDecompressorFactory.java | 20 ++++++++++++++++ ...am.java => DiscordZstdFFMInputStream.java} | 6 ++--- .../zstd/ffm/ZstdFFMDecompressorFactory.java | 20 ---------------- .../freya02/discord/zstd/ffm/ZstdFFMTest.java | 12 +++++----- .../discord/zstd/jna/ZstdJNADecompressor.java | 6 ++--- .../zstd/jna/ZstdJNADecompressorFactory.java | 16 ++++++------- .../ZstdJNADecompressorFactoryProvider.java | 4 ++-- .../freya02/discord/zstd/jna/ZstdJNATest.java | 12 +++++----- jni-impl/natives/include/context.hpp | 14 +++++------ jni-impl/natives/include/decompressor.hpp | 24 +++++++++++-------- jni-impl/natives/include/streaming.hpp | 18 +++++++------- jni-impl/natives/src/context.cpp | 6 ++--- jni-impl/natives/src/decompressor.cpp | 20 +++++++--------- jni-impl/natives/src/streaming.cpp | 8 +++---- .../discord/zstd/jni/DiscordZstdJNI.java | 14 +++++------ ...ontext.java => DiscordZstdJNIContext.java} | 8 +++---- ...r.java => DiscordZstdJNIDecompressor.java} | 10 ++++---- .../DiscordZstdJNIDecompressorFactory.java | 20 ++++++++++++++++ ...am.java => DiscordZstdJNIInputStream.java} | 10 ++++---- .../zstd/jni/ZstdJNIDecompressorFactory.java | 20 ---------------- .../freya02/discord/zstd/jni/ZstdJNITest.java | 12 +++++----- 34 files changed, 209 insertions(+), 205 deletions(-) rename api/src/main/java/dev/freya02/discord/zstd/api/{ZstdContext.java => DiscordZstdContext.java} (84%) rename api/src/main/java/dev/freya02/discord/zstd/api/{ZstdDecompressor.java => DiscordZstdDecompressor.java} (97%) create mode 100644 api/src/main/java/dev/freya02/discord/zstd/api/DiscordZstdDecompressorFactory.java rename api/src/main/java/dev/freya02/discord/zstd/api/{ZstdException.java => DiscordZstdException.java} (54%) rename api/src/main/java/dev/freya02/discord/zstd/api/{ZstdNativesLoader.java => DiscordZstdNativesLoader.java} (95%) delete mode 100644 api/src/main/java/dev/freya02/discord/zstd/api/ZstdDecompressorFactory.java rename ffm-impl/src/main/java/dev/freya02/discord/zstd/ffm/{ZstdFFMContext.java => DiscordZstdFFMContext.java} (78%) rename ffm-impl/src/main/java/dev/freya02/discord/zstd/ffm/{ZstdFFMDecompressor.java => DiscordZstdFFMDecompressor.java} (92%) create mode 100644 ffm-impl/src/main/java/dev/freya02/discord/zstd/ffm/DiscordZstdFFMDecompressorFactory.java rename ffm-impl/src/main/java/dev/freya02/discord/zstd/ffm/{ZstdFFMInputStream.java => DiscordZstdFFMInputStream.java} (92%) delete mode 100644 ffm-impl/src/main/java/dev/freya02/discord/zstd/ffm/ZstdFFMDecompressorFactory.java rename jni-impl/src/main/java/dev/freya02/discord/zstd/jni/{ZstdJNIContext.java => DiscordZstdJNIContext.java} (84%) rename jni-impl/src/main/java/dev/freya02/discord/zstd/jni/{ZstdJNIDecompressor.java => DiscordZstdJNIDecompressor.java} (85%) create mode 100644 jni-impl/src/main/java/dev/freya02/discord/zstd/jni/DiscordZstdJNIDecompressorFactory.java rename jni-impl/src/main/java/dev/freya02/discord/zstd/jni/{ZstdJNIInputStream.java => DiscordZstdJNIInputStream.java} (84%) delete mode 100644 jni-impl/src/main/java/dev/freya02/discord/zstd/jni/ZstdJNIDecompressorFactory.java diff --git a/api/src/main/java/dev/freya02/discord/zstd/api/DiscordZstd.java b/api/src/main/java/dev/freya02/discord/zstd/api/DiscordZstd.java index 696b6f6..8690a30 100644 --- a/api/src/main/java/dev/freya02/discord/zstd/api/DiscordZstd.java +++ b/api/src/main/java/dev/freya02/discord/zstd/api/DiscordZstd.java @@ -8,26 +8,26 @@ public interface DiscordZstd { // TODO rename type /** - * Creates a new {@link ZstdContext}. + * Creates a new {@link DiscordZstdContext}. *
This is used to keep track of streaming decompression after each input is consumed via an {@link InputStream}. * - * @return A new {@link ZstdContext} instance + * @return A new {@link DiscordZstdContext} instance */ - ZstdContext createContext(); + DiscordZstdContext createContext(); // TODO rename type /** - * Creates a new {@link ZstdDecompressorFactory} with the provided decompression buffer size. + * Creates a new {@link DiscordZstdDecompressorFactory} with the provided decompression buffer size. * * @param bufferSizeHint * A hint for the size of the buffer used for decompression, - * must be larger than {@value ZstdDecompressor#MIN_BUFFER_SIZE} or be equal to {@value ZstdDecompressor#ZSTD_RECOMMENDED_BUFFER_SIZE}. + * must be larger than {@value DiscordZstdDecompressor#MIN_BUFFER_SIZE} or be equal to {@value DiscordZstdDecompressor#ZSTD_RECOMMENDED_BUFFER_SIZE}. * Typically, bigger buffers mean less decompression loops, it does not change inputs or outputs * * @throws IllegalArgumentException - * If {@code bufferSize} is less than {@value ZstdDecompressor#MIN_BUFFER_SIZE} and not {@value ZstdDecompressor#ZSTD_RECOMMENDED_BUFFER_SIZE} + * If {@code bufferSize} is less than {@value DiscordZstdDecompressor#MIN_BUFFER_SIZE} and not {@value DiscordZstdDecompressor#ZSTD_RECOMMENDED_BUFFER_SIZE} * - * @return A new {@link ZstdDecompressorFactory} instance + * @return A new {@link DiscordZstdDecompressorFactory} instance */ - ZstdDecompressorFactory createDecompressorFactory(int bufferSizeHint); + DiscordZstdDecompressorFactory createDecompressorFactory(int bufferSizeHint); } diff --git a/api/src/main/java/dev/freya02/discord/zstd/api/ZstdContext.java b/api/src/main/java/dev/freya02/discord/zstd/api/DiscordZstdContext.java similarity index 84% rename from api/src/main/java/dev/freya02/discord/zstd/api/ZstdContext.java rename to api/src/main/java/dev/freya02/discord/zstd/api/DiscordZstdContext.java index 340bca4..58446a7 100644 --- a/api/src/main/java/dev/freya02/discord/zstd/api/ZstdContext.java +++ b/api/src/main/java/dev/freya02/discord/zstd/api/DiscordZstdContext.java @@ -5,7 +5,7 @@ import java.io.InputStream; @NullMarked -public interface ZstdContext { +public interface DiscordZstdContext { void close(); void reset(); diff --git a/api/src/main/java/dev/freya02/discord/zstd/api/ZstdDecompressor.java b/api/src/main/java/dev/freya02/discord/zstd/api/DiscordZstdDecompressor.java similarity index 97% rename from api/src/main/java/dev/freya02/discord/zstd/api/ZstdDecompressor.java rename to api/src/main/java/dev/freya02/discord/zstd/api/DiscordZstdDecompressor.java index ef5d125..1512b35 100644 --- a/api/src/main/java/dev/freya02/discord/zstd/api/ZstdDecompressor.java +++ b/api/src/main/java/dev/freya02/discord/zstd/api/DiscordZstdDecompressor.java @@ -9,7 +9,7 @@ *

Note: Instances are not thread safe, as there should be an instance per gateway connection, which uses 1 read thread. */ @NullMarked -public interface ZstdDecompressor { +public interface DiscordZstdDecompressor { /** * The "recommended" buffer size as defined by {@code ZSTD_DStreamOutSize()} (128 KB as of v1.5.7). This isn't a default. * @@ -57,7 +57,7 @@ public interface ZstdDecompressor { * @throws IllegalStateException * If this decompressor is closed, * or if the decompressor is an errored state and needs to be {@linkplain #reset() reset} - * @throws ZstdException + * @throws DiscordZstdException * If Zstd was unable to decompress the data for any reason, if this exception occurs, * the decompressor will be in an errored state and will need to be {@linkplain #reset() reset} */ diff --git a/api/src/main/java/dev/freya02/discord/zstd/api/DiscordZstdDecompressorFactory.java b/api/src/main/java/dev/freya02/discord/zstd/api/DiscordZstdDecompressorFactory.java new file mode 100644 index 0000000..184b6a7 --- /dev/null +++ b/api/src/main/java/dev/freya02/discord/zstd/api/DiscordZstdDecompressorFactory.java @@ -0,0 +1,18 @@ +package dev.freya02.discord.zstd.api; + +import org.jspecify.annotations.NullMarked; + +/** + * Factory of {@link DiscordZstdDecompressor}. + * + *

Instances are thread safe. + */ +@NullMarked +public interface DiscordZstdDecompressorFactory { + /** + * Creates a new {@link DiscordZstdDecompressor} configured with the parameters passed to this factory. + * + * @return A new {@link DiscordZstdDecompressor} instance + */ + DiscordZstdDecompressor create(); +} diff --git a/api/src/main/java/dev/freya02/discord/zstd/api/ZstdException.java b/api/src/main/java/dev/freya02/discord/zstd/api/DiscordZstdException.java similarity index 54% rename from api/src/main/java/dev/freya02/discord/zstd/api/ZstdException.java rename to api/src/main/java/dev/freya02/discord/zstd/api/DiscordZstdException.java index 1991f8e..f5db88c 100644 --- a/api/src/main/java/dev/freya02/discord/zstd/api/ZstdException.java +++ b/api/src/main/java/dev/freya02/discord/zstd/api/DiscordZstdException.java @@ -3,8 +3,8 @@ /** * An exception thrown when Zstd returns an error code. */ -public class ZstdException extends RuntimeException { - public ZstdException(String message) { +public class DiscordZstdException extends RuntimeException { + public DiscordZstdException(String message) { super(message); } } diff --git a/api/src/main/java/dev/freya02/discord/zstd/api/ZstdNativesLoader.java b/api/src/main/java/dev/freya02/discord/zstd/api/DiscordZstdNativesLoader.java similarity index 95% rename from api/src/main/java/dev/freya02/discord/zstd/api/ZstdNativesLoader.java rename to api/src/main/java/dev/freya02/discord/zstd/api/DiscordZstdNativesLoader.java index 6825b78..a19511b 100644 --- a/api/src/main/java/dev/freya02/discord/zstd/api/ZstdNativesLoader.java +++ b/api/src/main/java/dev/freya02/discord/zstd/api/DiscordZstdNativesLoader.java @@ -12,7 +12,7 @@ * to the absolute path of the native library. */ @NullMarked -public class ZstdNativesLoader { +public class DiscordZstdNativesLoader { private static boolean init = false; /** @@ -41,6 +41,8 @@ public static synchronized boolean load(Path path) { //noinspection ConstantValue if (path == null) throw new IllegalArgumentException("path is null"); + if (!path.isAbsolute()) + throw new IllegalArgumentException("path is not absolute: " + path); final String pathStr = path.toAbsolutePath().toString(); System.setProperty("zstd.lib", pathStr); @@ -86,7 +88,7 @@ public static synchronized boolean loadFromJar() throws IOException { } String resourcePath = String.format("/natives/%s/libzstd.%s", platform, extension); - Path nativePath = NativeUtil.copyNativeFromJar(resourcePath, ZstdNativesLoader.class); + Path nativePath = NativeUtil.copyNativeFromJar(resourcePath, DiscordZstdNativesLoader.class); load(nativePath); return true; } diff --git a/api/src/main/java/dev/freya02/discord/zstd/api/ZstdDecompressorFactory.java b/api/src/main/java/dev/freya02/discord/zstd/api/ZstdDecompressorFactory.java deleted file mode 100644 index 58ddf33..0000000 --- a/api/src/main/java/dev/freya02/discord/zstd/api/ZstdDecompressorFactory.java +++ /dev/null @@ -1,18 +0,0 @@ -package dev.freya02.discord.zstd.api; - -import org.jspecify.annotations.NullMarked; - -/** - * Factory of {@link ZstdDecompressor}. - * - *

Instances are thread safe. - */ -@NullMarked -public interface ZstdDecompressorFactory { - /** - * Creates a new {@link ZstdDecompressor} configured with the parameters passed to this factory. - * - * @return A new {@link ZstdDecompressor} instance - */ - ZstdDecompressor create(); -} diff --git a/api/src/main/java/dev/freya02/discord/zstd/internal/AbstractZstdDecompressor.java b/api/src/main/java/dev/freya02/discord/zstd/internal/AbstractZstdDecompressor.java index 2ddeb6f..bab1cb4 100644 --- a/api/src/main/java/dev/freya02/discord/zstd/internal/AbstractZstdDecompressor.java +++ b/api/src/main/java/dev/freya02/discord/zstd/internal/AbstractZstdDecompressor.java @@ -1,10 +1,10 @@ package dev.freya02.discord.zstd.internal; -import dev.freya02.discord.zstd.api.ZstdDecompressor; +import dev.freya02.discord.zstd.api.DiscordZstdDecompressor; import java.util.List; -public abstract class AbstractZstdDecompressor implements ZstdDecompressor { +public abstract class AbstractZstdDecompressor implements DiscordZstdDecompressor { protected AbstractZstdDecompressor() { } diff --git a/benchmarks/src/jmh/java/dev/freya02/discord/zstd/ZstdDecompressorBenchmark.java b/benchmarks/src/jmh/java/dev/freya02/discord/zstd/ZstdDecompressorBenchmark.java index 9098993..54bd3d0 100644 --- a/benchmarks/src/jmh/java/dev/freya02/discord/zstd/ZstdDecompressorBenchmark.java +++ b/benchmarks/src/jmh/java/dev/freya02/discord/zstd/ZstdDecompressorBenchmark.java @@ -1,8 +1,8 @@ package dev.freya02.discord.zstd; -import dev.freya02.discord.zstd.api.ZstdDecompressor; -import dev.freya02.discord.zstd.api.ZstdDecompressorFactory; -import dev.freya02.discord.zstd.api.ZstdNativesLoader; +import dev.freya02.discord.zstd.api.DiscordZstdDecompressor; +import dev.freya02.discord.zstd.api.DiscordZstdDecompressorFactory; +import dev.freya02.discord.zstd.api.DiscordZstdNativesLoader; import dev.freya02.discord.zstd.jni.DiscordZstdJNI; import net.dv8tion.jda.api.utils.data.DataObject; import net.dv8tion.jda.internal.utils.IOUtil; @@ -26,7 +26,7 @@ @Fork(1) public class ZstdDecompressorBenchmark { - private static final int ZSTD_BUFFER_SIZE = ZstdDecompressor.DEFAULT_BUFFER_SIZE; + private static final int ZSTD_BUFFER_SIZE = DiscordZstdDecompressor.DEFAULT_BUFFER_SIZE; private static final int ZLIB_BUFFER_SIZE = 2048; // JDA default @State(Scope.Benchmark) @@ -34,12 +34,12 @@ public static class ZstdDecompressorState { @Param({"jni"}) private String impl; - public ZstdDecompressor decompressor; + public DiscordZstdDecompressor decompressor; @Setup public void setup() throws IOException { - ZstdNativesLoader.loadFromJar(); - ZstdDecompressorFactory factory = switch (impl) { + DiscordZstdNativesLoader.loadFromJar(); + DiscordZstdDecompressorFactory factory = switch (impl) { case "jni" -> new DiscordZstdJNI().createDecompressorFactory(ZSTD_BUFFER_SIZE); default -> throw new AssertionError("Unknown implementation: " + impl); }; diff --git a/benchmarks/src/jmh/java/dev/freya02/discord/zstd/ZstdStreamingBenchmark.java b/benchmarks/src/jmh/java/dev/freya02/discord/zstd/ZstdStreamingBenchmark.java index 8b85b2b..4abecc9 100644 --- a/benchmarks/src/jmh/java/dev/freya02/discord/zstd/ZstdStreamingBenchmark.java +++ b/benchmarks/src/jmh/java/dev/freya02/discord/zstd/ZstdStreamingBenchmark.java @@ -1,7 +1,7 @@ package dev.freya02.discord.zstd; -import dev.freya02.discord.zstd.api.ZstdContext; -import dev.freya02.discord.zstd.api.ZstdNativesLoader; +import dev.freya02.discord.zstd.api.DiscordZstdContext; +import dev.freya02.discord.zstd.api.DiscordZstdNativesLoader; import dev.freya02.discord.zstd.jni.DiscordZstdJNI; import net.dv8tion.jda.api.utils.data.DataObject; import net.dv8tion.jda.internal.utils.IOUtil; @@ -30,11 +30,11 @@ public static class ZstdDecompressorState { @Param({"jni"}) private String impl; - public ZstdContext context; + public DiscordZstdContext context; @Setup public void setup() throws IOException { - ZstdNativesLoader.loadFromJar(); + DiscordZstdNativesLoader.loadFromJar(); context = switch (impl) { case "jni" -> new DiscordZstdJNI().createContext(); default -> throw new AssertionError("Unknown implementation: " + impl); diff --git a/ffm-impl/src/main/java/dev/freya02/discord/zstd/ffm/DiscordZstdFFM.java b/ffm-impl/src/main/java/dev/freya02/discord/zstd/ffm/DiscordZstdFFM.java index a7768e0..79a05cf 100644 --- a/ffm-impl/src/main/java/dev/freya02/discord/zstd/ffm/DiscordZstdFFM.java +++ b/ffm-impl/src/main/java/dev/freya02/discord/zstd/ffm/DiscordZstdFFM.java @@ -15,18 +15,18 @@ public DiscordZstdFFM() throws IOException { LOGGER.debug("Using FFM implementation of discord-zstd-java"); // Load natives if they weren't already - ZstdNativesLoader.loadFromJar(); + DiscordZstdNativesLoader.loadFromJar(); } @Override - public ZstdContext createContext() { - return new ZstdFFMContext(); + public DiscordZstdContext createContext() { + return new DiscordZstdFFMContext(); } @Override - public ZstdDecompressorFactory createDecompressorFactory(int bufferSizeHint) { - if (bufferSizeHint < ZstdDecompressor.MIN_BUFFER_SIZE && bufferSizeHint != ZstdDecompressor.ZSTD_RECOMMENDED_BUFFER_SIZE) - throw new IllegalArgumentException("Buffer must be larger than or equal to " + ZstdDecompressor.MIN_BUFFER_SIZE + ", provided " + bufferSizeHint); - return new ZstdFFMDecompressorFactory(bufferSizeHint); + public DiscordZstdDecompressorFactory createDecompressorFactory(int bufferSizeHint) { + if (bufferSizeHint < DiscordZstdDecompressor.MIN_BUFFER_SIZE && bufferSizeHint != DiscordZstdDecompressor.ZSTD_RECOMMENDED_BUFFER_SIZE) + throw new IllegalArgumentException("Buffer must be larger than or equal to " + DiscordZstdDecompressor.MIN_BUFFER_SIZE + ", provided " + bufferSizeHint); + return new DiscordZstdFFMDecompressorFactory(bufferSizeHint); } } diff --git a/ffm-impl/src/main/java/dev/freya02/discord/zstd/ffm/ZstdFFMContext.java b/ffm-impl/src/main/java/dev/freya02/discord/zstd/ffm/DiscordZstdFFMContext.java similarity index 78% rename from ffm-impl/src/main/java/dev/freya02/discord/zstd/ffm/ZstdFFMContext.java rename to ffm-impl/src/main/java/dev/freya02/discord/zstd/ffm/DiscordZstdFFMContext.java index 26307c1..0511270 100644 --- a/ffm-impl/src/main/java/dev/freya02/discord/zstd/ffm/ZstdFFMContext.java +++ b/ffm-impl/src/main/java/dev/freya02/discord/zstd/ffm/DiscordZstdFFMContext.java @@ -1,20 +1,20 @@ package dev.freya02.discord.zstd.ffm; -import dev.freya02.discord.zstd.api.ZstdContext; -import dev.freya02.discord.zstd.api.ZstdException; +import dev.freya02.discord.zstd.api.DiscordZstdContext; +import dev.freya02.discord.zstd.api.DiscordZstdException; import org.jspecify.annotations.NullMarked; import java.io.InputStream; import java.lang.foreign.MemorySegment; @NullMarked -class ZstdFFMContext implements ZstdContext { +class DiscordZstdFFMContext implements DiscordZstdContext { private final MemorySegment stream; private boolean invalidated = false; private boolean closed = false; - public ZstdFFMContext() { + public DiscordZstdFFMContext() { this.stream = Zstd.ZSTD_createDStream(); } @@ -38,7 +38,7 @@ public void reset() { @Override public InputStream createInputStream(byte[] input) { - return new ZstdFFMInputStream(this, input); + return new DiscordZstdFFMInputStream(this, input); } public void decompress(MemorySegment dst, long dstCapacity, MemorySegment dstPos, MemorySegment src, long srcSize, MemorySegment srcPos) { @@ -54,8 +54,8 @@ public void decompress(MemorySegment dst, long dstCapacity, MemorySegment dstPos } } - public ZstdException createException(String message) { + public DiscordZstdException createException(String message) { invalidated = true; - return new ZstdException(message); + return new DiscordZstdException(message); } } diff --git a/ffm-impl/src/main/java/dev/freya02/discord/zstd/ffm/ZstdFFMDecompressor.java b/ffm-impl/src/main/java/dev/freya02/discord/zstd/ffm/DiscordZstdFFMDecompressor.java similarity index 92% rename from ffm-impl/src/main/java/dev/freya02/discord/zstd/ffm/ZstdFFMDecompressor.java rename to ffm-impl/src/main/java/dev/freya02/discord/zstd/ffm/DiscordZstdFFMDecompressor.java index c54d607..ee4865a 100644 --- a/ffm-impl/src/main/java/dev/freya02/discord/zstd/ffm/ZstdFFMDecompressor.java +++ b/ffm-impl/src/main/java/dev/freya02/discord/zstd/ffm/DiscordZstdFFMDecompressor.java @@ -1,6 +1,6 @@ package dev.freya02.discord.zstd.ffm; -import dev.freya02.discord.zstd.api.ZstdException; +import dev.freya02.discord.zstd.api.DiscordZstdException; import dev.freya02.discord.zstd.internal.AbstractZstdDecompressor; import org.jspecify.annotations.NullMarked; import org.slf4j.Logger; @@ -14,9 +14,9 @@ import java.util.List; @NullMarked -class ZstdFFMDecompressor extends AbstractZstdDecompressor { +class DiscordZstdFFMDecompressor extends AbstractZstdDecompressor { - private static final Logger LOG = LoggerFactory.getLogger(ZstdFFMDecompressor.class); + private static final Logger LOG = LoggerFactory.getLogger(DiscordZstdFFMDecompressor.class); private final MemorySegment stream; private final MemorySegment dstSegment; @@ -26,7 +26,7 @@ class ZstdFFMDecompressor extends AbstractZstdDecompressor { private boolean invalidated = false; private boolean closed = false; - protected ZstdFFMDecompressor(int bufferSizeHint) + protected DiscordZstdFFMDecompressor(int bufferSizeHint) { this.stream = Zstd.ZSTD_createDStream(); @@ -138,8 +138,8 @@ private static long getLong(MemorySegment segment) { return segment.get(ValueLayout.JAVA_LONG, 0); } - private ZstdException createException(String message) { + private DiscordZstdException createException(String message) { invalidated = true; - return new ZstdException(message); + return new DiscordZstdException(message); } } diff --git a/ffm-impl/src/main/java/dev/freya02/discord/zstd/ffm/DiscordZstdFFMDecompressorFactory.java b/ffm-impl/src/main/java/dev/freya02/discord/zstd/ffm/DiscordZstdFFMDecompressorFactory.java new file mode 100644 index 0000000..1f076d6 --- /dev/null +++ b/ffm-impl/src/main/java/dev/freya02/discord/zstd/ffm/DiscordZstdFFMDecompressorFactory.java @@ -0,0 +1,20 @@ +package dev.freya02.discord.zstd.ffm; + +import dev.freya02.discord.zstd.api.DiscordZstdDecompressor; +import dev.freya02.discord.zstd.api.DiscordZstdDecompressorFactory; +import org.jspecify.annotations.NullMarked; + +@NullMarked +class DiscordZstdFFMDecompressorFactory implements DiscordZstdDecompressorFactory { + + private final int bufferSizeHint; + + protected DiscordZstdFFMDecompressorFactory(int bufferSizeHint) { + this.bufferSizeHint = bufferSizeHint; + } + + @Override + public DiscordZstdDecompressor create() { + return new DiscordZstdFFMDecompressor(bufferSizeHint); + } +} diff --git a/ffm-impl/src/main/java/dev/freya02/discord/zstd/ffm/ZstdFFMInputStream.java b/ffm-impl/src/main/java/dev/freya02/discord/zstd/ffm/DiscordZstdFFMInputStream.java similarity index 92% rename from ffm-impl/src/main/java/dev/freya02/discord/zstd/ffm/ZstdFFMInputStream.java rename to ffm-impl/src/main/java/dev/freya02/discord/zstd/ffm/DiscordZstdFFMInputStream.java index bb8810b..950f4cb 100644 --- a/ffm-impl/src/main/java/dev/freya02/discord/zstd/ffm/ZstdFFMInputStream.java +++ b/ffm-impl/src/main/java/dev/freya02/discord/zstd/ffm/DiscordZstdFFMInputStream.java @@ -10,9 +10,9 @@ import java.util.Objects; @NullMarked -class ZstdFFMInputStream extends InputStream { +class DiscordZstdFFMInputStream extends InputStream { - private final ZstdFFMContext context; + private final DiscordZstdFFMContext context; private final MemorySegment input; private final long inputSize; @@ -22,7 +22,7 @@ class ZstdFFMInputStream extends InputStream { private boolean closed = false; - protected ZstdFFMInputStream(ZstdFFMContext context, byte[] input) { + protected DiscordZstdFFMInputStream(DiscordZstdFFMContext context, byte[] input) { this.context = context; final Arena arena = Arena.ofAuto(); diff --git a/ffm-impl/src/main/java/dev/freya02/discord/zstd/ffm/ZstdFFMDecompressorFactory.java b/ffm-impl/src/main/java/dev/freya02/discord/zstd/ffm/ZstdFFMDecompressorFactory.java deleted file mode 100644 index b4b517e..0000000 --- a/ffm-impl/src/main/java/dev/freya02/discord/zstd/ffm/ZstdFFMDecompressorFactory.java +++ /dev/null @@ -1,20 +0,0 @@ -package dev.freya02.discord.zstd.ffm; - -import dev.freya02.discord.zstd.api.ZstdDecompressor; -import dev.freya02.discord.zstd.api.ZstdDecompressorFactory; -import org.jspecify.annotations.NullMarked; - -@NullMarked -class ZstdFFMDecompressorFactory implements ZstdDecompressorFactory { - - private final int bufferSizeHint; - - protected ZstdFFMDecompressorFactory(int bufferSizeHint) { - this.bufferSizeHint = bufferSizeHint; - } - - @Override - public ZstdDecompressor create() { - return new ZstdFFMDecompressor(bufferSizeHint); - } -} diff --git a/ffm-impl/src/test/java/dev/freya02/discord/zstd/ffm/ZstdFFMTest.java b/ffm-impl/src/test/java/dev/freya02/discord/zstd/ffm/ZstdFFMTest.java index b8196c0..263ed13 100644 --- a/ffm-impl/src/test/java/dev/freya02/discord/zstd/ffm/ZstdFFMTest.java +++ b/ffm-impl/src/test/java/dev/freya02/discord/zstd/ffm/ZstdFFMTest.java @@ -1,10 +1,10 @@ package dev.freya02.discord.zstd.ffm; import dev.freya02.discord.zstd.TestChunks; +import dev.freya02.discord.zstd.api.DiscordZstdContext; +import dev.freya02.discord.zstd.api.DiscordZstdDecompressor; +import dev.freya02.discord.zstd.api.DiscordZstdDecompressorFactory; import dev.freya02.discord.zstd.api.DiscordZstdProvider; -import dev.freya02.discord.zstd.api.ZstdContext; -import dev.freya02.discord.zstd.api.ZstdDecompressor; -import dev.freya02.discord.zstd.api.ZstdDecompressorFactory; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; @@ -25,8 +25,8 @@ public static void setup() { @Test public void test_decompression() { - ZstdDecompressorFactory factory = DiscordZstdProvider.get().createDecompressorFactory(ZstdDecompressor.DEFAULT_BUFFER_SIZE); - ZstdDecompressor decompressor = factory.create(); + DiscordZstdDecompressorFactory factory = DiscordZstdProvider.get().createDecompressorFactory(DiscordZstdDecompressor.DEFAULT_BUFFER_SIZE); + DiscordZstdDecompressor decompressor = factory.create(); for (TestChunks.Chunk chunk : chunks) { final byte[] actual = decompressor.decompress(chunk.getCompressed()); final byte[] expected = chunk.getDecompressed(); @@ -36,7 +36,7 @@ public void test_decompression() { @Test public void test_input_stream() throws IOException { - ZstdContext context = DiscordZstdProvider.get().createContext(); + DiscordZstdContext context = DiscordZstdProvider.get().createContext(); for (TestChunks.Chunk chunk : chunks) { try (InputStream stream = context.createInputStream(chunk.getCompressed())) { final byte[] actual = stream.readAllBytes(); diff --git a/jna-impl/src/main/java/dev/freya02/discord/zstd/jna/ZstdJNADecompressor.java b/jna-impl/src/main/java/dev/freya02/discord/zstd/jna/ZstdJNADecompressor.java index 6f8fb7e..0d1d480 100644 --- a/jna-impl/src/main/java/dev/freya02/discord/zstd/jna/ZstdJNADecompressor.java +++ b/jna-impl/src/main/java/dev/freya02/discord/zstd/jna/ZstdJNADecompressor.java @@ -1,7 +1,7 @@ package dev.freya02.discord.zstd.jna; import com.sun.jna.Pointer; -import dev.freya02.discord.zstd.api.ZstdException; +import dev.freya02.discord.zstd.api.DiscordZstdException; import dev.freya02.discord.zstd.internal.AbstractZstdDecompressor; import org.jspecify.annotations.NullMarked; import org.slf4j.Logger; @@ -122,8 +122,8 @@ public byte[] decompress(byte[] data) } } - private ZstdException createException(String message) { + private DiscordZstdException createException(String message) { invalidated = true; - return new ZstdException(message); + return new DiscordZstdException(message); } } diff --git a/jna-impl/src/main/java/dev/freya02/discord/zstd/jna/ZstdJNADecompressorFactory.java b/jna-impl/src/main/java/dev/freya02/discord/zstd/jna/ZstdJNADecompressorFactory.java index c14dcef..726ea13 100644 --- a/jna-impl/src/main/java/dev/freya02/discord/zstd/jna/ZstdJNADecompressorFactory.java +++ b/jna-impl/src/main/java/dev/freya02/discord/zstd/jna/ZstdJNADecompressorFactory.java @@ -1,24 +1,24 @@ package dev.freya02.discord.zstd.jna; -import dev.freya02.discord.zstd.api.ZstdDecompressor; -import dev.freya02.discord.zstd.api.ZstdDecompressorFactory; -import dev.freya02.discord.zstd.api.ZstdNativesLoader; +import dev.freya02.discord.zstd.api.DiscordZstdDecompressor; +import dev.freya02.discord.zstd.api.DiscordZstdDecompressorFactory; +import dev.freya02.discord.zstd.api.DiscordZstdNativesLoader; import org.jspecify.annotations.NullMarked; @NullMarked -public class ZstdJNADecompressorFactory implements ZstdDecompressorFactory { +public class ZstdJNADecompressorFactory implements DiscordZstdDecompressorFactory { private final int bufferSize; protected ZstdJNADecompressorFactory(int bufferSize) { - if (bufferSize < ZstdDecompressor.MIN_BUFFER_SIZE && bufferSize != ZstdDecompressor.ZSTD_RECOMMENDED_BUFFER_SIZE) - throw new IllegalArgumentException("Buffer must be larger than or equal to " + ZstdDecompressor.MIN_BUFFER_SIZE + ", provided " + bufferSize); + if (bufferSize < DiscordZstdDecompressor.MIN_BUFFER_SIZE && bufferSize != DiscordZstdDecompressor.ZSTD_RECOMMENDED_BUFFER_SIZE) + throw new IllegalArgumentException("Buffer must be larger than or equal to " + DiscordZstdDecompressor.MIN_BUFFER_SIZE + ", provided " + bufferSize); this.bufferSize = bufferSize; } @Override - public ZstdDecompressor create() { - if (!ZstdNativesLoader.isLoaded()) { + public DiscordZstdDecompressor create() { + if (!DiscordZstdNativesLoader.isLoaded()) { throw new IllegalStateException("Natives are not loaded yet, see ZstdNativesLoader"); } return new ZstdJNADecompressor(bufferSize); diff --git a/jna-impl/src/main/java/dev/freya02/discord/zstd/jna/ZstdJNADecompressorFactoryProvider.java b/jna-impl/src/main/java/dev/freya02/discord/zstd/jna/ZstdJNADecompressorFactoryProvider.java index c9eeecc..7ecf0ff 100644 --- a/jna-impl/src/main/java/dev/freya02/discord/zstd/jna/ZstdJNADecompressorFactoryProvider.java +++ b/jna-impl/src/main/java/dev/freya02/discord/zstd/jna/ZstdJNADecompressorFactoryProvider.java @@ -1,12 +1,12 @@ package dev.freya02.discord.zstd.jna; -import dev.freya02.discord.zstd.api.ZstdDecompressorFactory; +import dev.freya02.discord.zstd.api.DiscordZstdDecompressorFactory; import org.jspecify.annotations.NullMarked; @NullMarked public class ZstdJNADecompressorFactoryProvider { - public ZstdDecompressorFactory get(int bufferSizeHint) { + public DiscordZstdDecompressorFactory get(int bufferSizeHint) { return new ZstdJNADecompressorFactory(bufferSizeHint); } } diff --git a/jna-impl/src/test/java/dev/freya02/discord/zstd/jna/ZstdJNATest.java b/jna-impl/src/test/java/dev/freya02/discord/zstd/jna/ZstdJNATest.java index 5ed3928..500fb0a 100644 --- a/jna-impl/src/test/java/dev/freya02/discord/zstd/jna/ZstdJNATest.java +++ b/jna-impl/src/test/java/dev/freya02/discord/zstd/jna/ZstdJNATest.java @@ -1,9 +1,9 @@ package dev.freya02.discord.zstd.jna; import dev.freya02.discord.zstd.TestChunks; -import dev.freya02.discord.zstd.api.ZstdDecompressor; -import dev.freya02.discord.zstd.api.ZstdDecompressorFactory; -import dev.freya02.discord.zstd.api.ZstdNativesLoader; +import dev.freya02.discord.zstd.api.DiscordZstdDecompressor; +import dev.freya02.discord.zstd.api.DiscordZstdDecompressorFactory; +import dev.freya02.discord.zstd.api.DiscordZstdNativesLoader; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; @@ -24,10 +24,10 @@ public static void setup() { @Test public void test_decompression() throws IOException { - assertTrue(ZstdNativesLoader.loadFromJar()); + assertTrue(DiscordZstdNativesLoader.loadFromJar()); - ZstdDecompressorFactory factory = new ZstdJNADecompressorFactoryProvider().get(ZstdDecompressor.DEFAULT_BUFFER_SIZE); - ZstdDecompressor decompressor = factory.create(); + DiscordZstdDecompressorFactory factory = new ZstdJNADecompressorFactoryProvider().get(DiscordZstdDecompressor.DEFAULT_BUFFER_SIZE); + DiscordZstdDecompressor decompressor = factory.create(); for (TestChunks.Chunk chunk : chunks) { final byte[] actual = decompressor.decompress(chunk.getCompressed()); final byte[] expected = chunk.getDecompressed(); diff --git a/jni-impl/natives/include/context.hpp b/jni-impl/natives/include/context.hpp index 54cfe14..daa52df 100644 --- a/jni-impl/natives/include/context.hpp +++ b/jni-impl/natives/include/context.hpp @@ -3,17 +3,17 @@ #include -#define ZstdJNIContext_createDStream Java_dev_freya02_discord_zstd_jni_ZstdJNIContext_createDStream -#define ZstdJNIContext_freeDStream Java_dev_freya02_discord_zstd_jni_ZstdJNIContext_freeDStream -#define ZstdJNIContext_initDStream Java_dev_freya02_discord_zstd_jni_ZstdJNIContext_initDStream -#define ZstdJNIContext_decompress0 Java_dev_freya02_discord_zstd_jni_ZstdJNIContext_decompress0 +#define DiscordZstdJNIContext_createDStream Java_dev_freya02_discord_zstd_jni_DiscordZstdJNIContext_createDStream +#define DiscordZstdJNIContext_freeDStream Java_dev_freya02_discord_zstd_jni_DiscordZstdJNIContext_freeDStream +#define DiscordZstdJNIContext_initDStream Java_dev_freya02_discord_zstd_jni_DiscordZstdJNIContext_initDStream +#define DiscordZstdJNIContext_decompress0 Java_dev_freya02_discord_zstd_jni_DiscordZstdJNIContext_decompress0 extern "C" { -JNIEXPORT jlong JNICALL ZstdJNIContext_createDStream(JNIEnv *env, jclass obj); +JNIEXPORT jlong JNICALL DiscordZstdJNIContext_createDStream(JNIEnv *env, jclass obj); -JNIEXPORT void JNICALL ZstdJNIContext_freeDStream(JNIEnv *env, jclass obj, jlong zdsPtr); +JNIEXPORT void JNICALL DiscordZstdJNIContext_freeDStream(JNIEnv *env, jclass obj, jlong zdsPtr); -JNIEXPORT jlong JNICALL ZstdJNIContext_initDStream(JNIEnv *env, jclass obj, jlong zdsPtr); +JNIEXPORT jlong JNICALL DiscordZstdJNIContext_initDStream(JNIEnv *env, jclass obj, jlong zdsPtr); } #endif //LIBZSTD_JNI_CONTEXT_HPP diff --git a/jni-impl/natives/include/decompressor.hpp b/jni-impl/natives/include/decompressor.hpp index d2fa2ad..0c59402 100644 --- a/jni-impl/natives/include/decompressor.hpp +++ b/jni-impl/natives/include/decompressor.hpp @@ -3,21 +3,25 @@ #include +#define DiscordZstdJNIDecompressor_createDStream Java_dev_freya02_discord_zstd_jni_DiscordZstdJNIDecompressor_createDStream +#define DiscordZstdJNIDecompressor_freeDStream Java_dev_freya02_discord_zstd_jni_DiscordZstdJNIDecompressor_freeDStream +#define DiscordZstdJNIDecompressor_DStreamOutSize Java_dev_freya02_discord_zstd_jni_DiscordZstdJNIDecompressor_DStreamOutSize +#define DiscordZstdJNIDecompressor_initDStream Java_dev_freya02_discord_zstd_jni_DiscordZstdJNIDecompressor_initDStream +#define DiscordZstdJNIDecompressor_decompressMessage Java_dev_freya02_discord_zstd_jni_DiscordZstdJNIDecompressor_decompressMessage + extern "C" { -JNIEXPORT jlong JNICALL Java_dev_freya02_discord_zstd_jni_ZstdJNIDecompressor_createDStream( - JNIEnv *env, jclass obj); +JNIEXPORT jlong JNICALL DiscordZstdJNIDecompressor_createDStream(JNIEnv *env, jclass obj); -JNIEXPORT jlong JNICALL Java_dev_freya02_discord_zstd_jni_ZstdJNIDecompressor_freeDStream( - JNIEnv *env, jclass obj, jlong zds); +JNIEXPORT jlong JNICALL DiscordZstdJNIDecompressor_freeDStream(JNIEnv *env, jclass obj, jlong zds); -JNIEXPORT jint JNICALL Java_dev_freya02_discord_zstd_jni_ZstdJNIDecompressor_DStreamOutSize( - JNIEnv *env, jclass obj); +JNIEXPORT jint JNICALL DiscordZstdJNIDecompressor_DStreamOutSize(JNIEnv *env, jclass obj); -JNIEXPORT jlong JNICALL Java_dev_freya02_discord_zstd_jni_ZstdJNIDecompressor_initDStream( - JNIEnv *env, jclass obj, jlong zds); +JNIEXPORT jlong JNICALL DiscordZstdJNIDecompressor_initDStream(JNIEnv *env, jclass obj, jlong zds); -JNIEXPORT jbyteArray JNICALL Java_dev_freya02_discord_zstd_jni_ZstdJNIDecompressor_decompressMessage( - JNIEnv *env, jclass obj, jlong zds, jbyteArray bufferArray, jbyteArray inputArray); +JNIEXPORT jbyteArray JNICALL DiscordZstdJNIDecompressor_decompressMessage(JNIEnv *env, jclass obj, + jlong zds, + jbyteArray bufferArray, + jbyteArray inputArray); } #endif // NATIVES_DECOMPRESSOR_H diff --git a/jni-impl/natives/include/streaming.hpp b/jni-impl/natives/include/streaming.hpp index a5fbb26..9592e0a 100644 --- a/jni-impl/natives/include/streaming.hpp +++ b/jni-impl/natives/include/streaming.hpp @@ -4,9 +4,9 @@ #include #include -#define ZstdJNIInputStream_newContext Java_dev_freya02_discord_zstd_jni_ZstdJNIInputStream_newContext -#define ZstdJNIInputStream_freeContext Java_dev_freya02_discord_zstd_jni_ZstdJNIInputStream_freeContext -#define ZstdJNIInputStream_inflate0 Java_dev_freya02_discord_zstd_jni_ZstdJNIInputStream_inflate0 +#define DiscordZstdJNIInputStream_newContext Java_dev_freya02_discord_zstd_jni_DiscordZstdJNIInputStream_newContext +#define DiscordZstdJNIInputStream_freeContext Java_dev_freya02_discord_zstd_jni_DiscordZstdJNIInputStream_freeContext +#define DiscordZstdJNIInputStream_inflate0 Java_dev_freya02_discord_zstd_jni_DiscordZstdJNIInputStream_inflate0 class Context { public: @@ -17,14 +17,14 @@ class Context { }; extern "C" { -JNIEXPORT jlong JNICALL ZstdJNIInputStream_newContext(JNIEnv *env, jclass obj, jlong zdsPtr); +JNIEXPORT jlong JNICALL DiscordZstdJNIInputStream_newContext(JNIEnv *env, jclass obj, jlong zdsPtr); -JNIEXPORT void JNICALL ZstdJNIInputStream_freeContext(JNIEnv *env, jclass obj, jlong ctxPtr); +JNIEXPORT void JNICALL DiscordZstdJNIInputStream_freeContext(JNIEnv *env, jclass obj, jlong ctxPtr); -JNIEXPORT jlong JNICALL ZstdJNIInputStream_inflate0(JNIEnv *env, jclass, - jlong ctxPtr, - jbyteArray srcJ, jlong srcSize, - jbyteArray dstJ, jlong dstOff, jlong dstSize); +JNIEXPORT jlong JNICALL DiscordZstdJNIInputStream_inflate0(JNIEnv *env, jclass, + jlong ctxPtr, + jbyteArray srcJ, jlong srcSize, + jbyteArray dstJ, jlong dstOff, jlong dstSize); } #endif // NATIVES_STREAMING_HPP diff --git a/jni-impl/natives/src/context.cpp b/jni-impl/natives/src/context.cpp index 6e7a47b..10b51d6 100644 --- a/jni-impl/natives/src/context.cpp +++ b/jni-impl/natives/src/context.cpp @@ -1,16 +1,16 @@ #include #include -jlong ZstdJNIContext_createDStream(JNIEnv *, jclass) { +jlong DiscordZstdJNIContext_createDStream(JNIEnv *, jclass) { return reinterpret_cast(ZSTD_createDStream()); } -void ZstdJNIContext_freeDStream(JNIEnv *, jclass, const jlong zdsPtr) { +void DiscordZstdJNIContext_freeDStream(JNIEnv *, jclass, const jlong zdsPtr) { const auto zds = reinterpret_cast(zdsPtr); ZSTD_freeDStream(zds); } -jlong ZstdJNIContext_initDStream(JNIEnv *, jclass, const jlong zdsPtr) { +jlong DiscordZstdJNIContext_initDStream(JNIEnv *, jclass, const jlong zdsPtr) { const auto zds = reinterpret_cast(zdsPtr); return static_cast(ZSTD_initDStream(zds)); } diff --git a/jni-impl/natives/src/decompressor.cpp b/jni-impl/natives/src/decompressor.cpp index 91dcbc4..9a32b12 100644 --- a/jni-impl/natives/src/decompressor.cpp +++ b/jni-impl/natives/src/decompressor.cpp @@ -3,28 +3,26 @@ #include #include -jlong Java_dev_freya02_discord_zstd_jni_ZstdJNIDecompressor_createDStream( - JNIEnv *, jclass) { +jlong DiscordZstdJNIDecompressor_createDStream(JNIEnv *, jclass) { return reinterpret_cast(ZSTD_createDStream()); } -jlong Java_dev_freya02_discord_zstd_jni_ZstdJNIDecompressor_freeDStream( - JNIEnv *, jclass, jlong zds) { +jlong DiscordZstdJNIDecompressor_freeDStream(JNIEnv *, jclass, jlong zds) { return ZSTD_freeDStream(reinterpret_cast(zds)); } -jint Java_dev_freya02_discord_zstd_jni_ZstdJNIDecompressor_DStreamOutSize( - JNIEnv *, jclass) { +jint DiscordZstdJNIDecompressor_DStreamOutSize(JNIEnv *, jclass) { return ZSTD_DStreamOutSize(); } -jlong Java_dev_freya02_discord_zstd_jni_ZstdJNIDecompressor_initDStream( - JNIEnv *, jclass, jlong zds) { +jlong DiscordZstdJNIDecompressor_initDStream(JNIEnv *, jclass, jlong zds) { return ZSTD_initDStream(reinterpret_cast(zds)); } -jbyteArray Java_dev_freya02_discord_zstd_jni_ZstdJNIDecompressor_decompressMessage( - JNIEnv *env, jclass, jlong zds, jbyteArray bufferArray, jbyteArray inputArray) { +jbyteArray DiscordZstdJNIDecompressor_decompressMessage(JNIEnv *env, jclass, + jlong zds, + jbyteArray bufferArray, + jbyteArray inputArray) { ZSTD_outBuffer output; output.dst = env->GetPrimitiveArrayCritical(bufferArray, nullptr); output.size = env->GetArrayLength(bufferArray); @@ -62,7 +60,7 @@ jbyteArray Java_dev_freya02_discord_zstd_jni_ZstdJNIDecompressor_decompressMessa env->ReleasePrimitiveArrayCritical(inputArray, const_cast(input.src), 0); const auto errorName = ZSTD_getErrorName(result); - const auto exceptionClass = env->FindClass("dev/freya02/discord/zstd/api/ZstdException"); + const auto exceptionClass = env->FindClass("dev/freya02/discord/zstd/api/DiscordZstdException"); env->ThrowNew(exceptionClass, errorName); return nullptr; diff --git a/jni-impl/natives/src/streaming.cpp b/jni-impl/natives/src/streaming.cpp index b610b77..8a78644 100644 --- a/jni-impl/natives/src/streaming.cpp +++ b/jni-impl/natives/src/streaming.cpp @@ -6,17 +6,17 @@ Context::Context(ZSTD_DCtx *zds) { this->srcPos = 0; } -jlong ZstdJNIInputStream_newContext(JNIEnv *, jclass, const jlong zdsPtr) { +jlong DiscordZstdJNIInputStream_newContext(JNIEnv *, jclass, const jlong zdsPtr) { const auto zds = reinterpret_cast(zdsPtr); return reinterpret_cast(new Context(zds)); } -void ZstdJNIInputStream_freeContext(JNIEnv *, jclass, const jlong ctxPtr) { +void DiscordZstdJNIInputStream_freeContext(JNIEnv *, jclass, const jlong ctxPtr) { const auto ctx = reinterpret_cast(ctxPtr); delete ctx; } -jlong ZstdJNIInputStream_inflate0(JNIEnv *env, jclass, +jlong DiscordZstdJNIInputStream_inflate0(JNIEnv *env, jclass, const jlong ctxPtr, jbyteArray srcJ, const jlong srcSize, jbyteArray dstJ, const jlong dstOff, const jlong dstSize) { @@ -54,7 +54,7 @@ jlong ZstdJNIInputStream_inflate0(JNIEnv *env, jclass, if (ZSTD_isError(result)) { const auto errorName = ZSTD_getErrorName(result); - const auto exceptionClass = env->FindClass("dev/freya02/discord/zstd/api/ZstdException"); + const auto exceptionClass = env->FindClass("dev/freya02/discord/zstd/api/DiscordZstdException"); env->ThrowNew(exceptionClass, errorName); return -1; diff --git a/jni-impl/src/main/java/dev/freya02/discord/zstd/jni/DiscordZstdJNI.java b/jni-impl/src/main/java/dev/freya02/discord/zstd/jni/DiscordZstdJNI.java index 3e6e8f1..8f4fd2d 100644 --- a/jni-impl/src/main/java/dev/freya02/discord/zstd/jni/DiscordZstdJNI.java +++ b/jni-impl/src/main/java/dev/freya02/discord/zstd/jni/DiscordZstdJNI.java @@ -15,18 +15,18 @@ public DiscordZstdJNI() throws IOException { LOGGER.debug("Using JNI implementation of discord-zstd-java"); // Load natives if they weren't already - ZstdNativesLoader.loadFromJar(); + DiscordZstdNativesLoader.loadFromJar(); } @Override - public ZstdContext createContext() { - return new ZstdJNIContext(); + public DiscordZstdContext createContext() { + return new DiscordZstdJNIContext(); } @Override - public ZstdDecompressorFactory createDecompressorFactory(int bufferSizeHint) { - if (bufferSizeHint < ZstdDecompressor.MIN_BUFFER_SIZE && bufferSizeHint != ZstdDecompressor.ZSTD_RECOMMENDED_BUFFER_SIZE) - throw new IllegalArgumentException("Buffer must be larger than or equal to " + ZstdDecompressor.MIN_BUFFER_SIZE + ", provided " + bufferSizeHint); - return new ZstdJNIDecompressorFactory(bufferSizeHint); + public DiscordZstdDecompressorFactory createDecompressorFactory(int bufferSizeHint) { + if (bufferSizeHint < DiscordZstdDecompressor.MIN_BUFFER_SIZE && bufferSizeHint != DiscordZstdDecompressor.ZSTD_RECOMMENDED_BUFFER_SIZE) + throw new IllegalArgumentException("Buffer must be larger than or equal to " + DiscordZstdDecompressor.MIN_BUFFER_SIZE + ", provided " + bufferSizeHint); + return new DiscordZstdJNIDecompressorFactory(bufferSizeHint); } } diff --git a/jni-impl/src/main/java/dev/freya02/discord/zstd/jni/ZstdJNIContext.java b/jni-impl/src/main/java/dev/freya02/discord/zstd/jni/DiscordZstdJNIContext.java similarity index 84% rename from jni-impl/src/main/java/dev/freya02/discord/zstd/jni/ZstdJNIContext.java rename to jni-impl/src/main/java/dev/freya02/discord/zstd/jni/DiscordZstdJNIContext.java index 577dac3..5ab7915 100644 --- a/jni-impl/src/main/java/dev/freya02/discord/zstd/jni/ZstdJNIContext.java +++ b/jni-impl/src/main/java/dev/freya02/discord/zstd/jni/DiscordZstdJNIContext.java @@ -1,18 +1,18 @@ package dev.freya02.discord.zstd.jni; -import dev.freya02.discord.zstd.api.ZstdContext; +import dev.freya02.discord.zstd.api.DiscordZstdContext; import org.jspecify.annotations.NullMarked; import java.io.InputStream; @NullMarked -class ZstdJNIContext implements ZstdContext { +class DiscordZstdJNIContext implements DiscordZstdContext { private final long zds; private boolean invalidated = false; private boolean closed = false; - public ZstdJNIContext() { + public DiscordZstdJNIContext() { this.zds = createDStream(); } @@ -47,7 +47,7 @@ public void reset() { @Override public InputStream createInputStream(byte[] input) { - return new ZstdJNIInputStream(this, zds, input); + return new DiscordZstdJNIInputStream(this, zds, input); } private static native long createDStream(); diff --git a/jni-impl/src/main/java/dev/freya02/discord/zstd/jni/ZstdJNIDecompressor.java b/jni-impl/src/main/java/dev/freya02/discord/zstd/jni/DiscordZstdJNIDecompressor.java similarity index 85% rename from jni-impl/src/main/java/dev/freya02/discord/zstd/jni/ZstdJNIDecompressor.java rename to jni-impl/src/main/java/dev/freya02/discord/zstd/jni/DiscordZstdJNIDecompressor.java index a9b11c4..85479d6 100644 --- a/jni-impl/src/main/java/dev/freya02/discord/zstd/jni/ZstdJNIDecompressor.java +++ b/jni-impl/src/main/java/dev/freya02/discord/zstd/jni/DiscordZstdJNIDecompressor.java @@ -1,6 +1,6 @@ package dev.freya02.discord.zstd.jni; -import dev.freya02.discord.zstd.api.ZstdException; +import dev.freya02.discord.zstd.api.DiscordZstdException; import dev.freya02.discord.zstd.internal.AbstractZstdDecompressor; import org.jspecify.annotations.NullMarked; import org.slf4j.Logger; @@ -9,9 +9,9 @@ import java.util.Arrays; @NullMarked -class ZstdJNIDecompressor extends AbstractZstdDecompressor { +class DiscordZstdJNIDecompressor extends AbstractZstdDecompressor { - private static final Logger LOG = LoggerFactory.getLogger(ZstdJNIDecompressor.class); + private static final Logger LOG = LoggerFactory.getLogger(DiscordZstdJNIDecompressor.class); private final long zds; private final byte[] buffer; @@ -19,7 +19,7 @@ class ZstdJNIDecompressor extends AbstractZstdDecompressor { private boolean invalidated = false; private boolean closed = false; - protected ZstdJNIDecompressor(int bufferSizeHint) + protected DiscordZstdJNIDecompressor(int bufferSizeHint) { this.zds = createDStream(); @@ -68,7 +68,7 @@ public byte[] decompress(byte[] data) try { return decompressMessage(zds, buffer, data); - } catch (ZstdException e) { + } catch (DiscordZstdException e) { invalidated = true; throw e; } diff --git a/jni-impl/src/main/java/dev/freya02/discord/zstd/jni/DiscordZstdJNIDecompressorFactory.java b/jni-impl/src/main/java/dev/freya02/discord/zstd/jni/DiscordZstdJNIDecompressorFactory.java new file mode 100644 index 0000000..a3f21f4 --- /dev/null +++ b/jni-impl/src/main/java/dev/freya02/discord/zstd/jni/DiscordZstdJNIDecompressorFactory.java @@ -0,0 +1,20 @@ +package dev.freya02.discord.zstd.jni; + +import dev.freya02.discord.zstd.api.DiscordZstdDecompressor; +import dev.freya02.discord.zstd.api.DiscordZstdDecompressorFactory; +import org.jspecify.annotations.NullMarked; + +@NullMarked +class DiscordZstdJNIDecompressorFactory implements DiscordZstdDecompressorFactory { + + private final int bufferSizeHint; + + protected DiscordZstdJNIDecompressorFactory(int bufferSizeHint) { + this.bufferSizeHint = bufferSizeHint; + } + + @Override + public DiscordZstdDecompressor create() { + return new DiscordZstdJNIDecompressor(bufferSizeHint); + } +} diff --git a/jni-impl/src/main/java/dev/freya02/discord/zstd/jni/ZstdJNIInputStream.java b/jni-impl/src/main/java/dev/freya02/discord/zstd/jni/DiscordZstdJNIInputStream.java similarity index 84% rename from jni-impl/src/main/java/dev/freya02/discord/zstd/jni/ZstdJNIInputStream.java rename to jni-impl/src/main/java/dev/freya02/discord/zstd/jni/DiscordZstdJNIInputStream.java index 0dd5ec5..f76dd0d 100644 --- a/jni-impl/src/main/java/dev/freya02/discord/zstd/jni/ZstdJNIInputStream.java +++ b/jni-impl/src/main/java/dev/freya02/discord/zstd/jni/DiscordZstdJNIInputStream.java @@ -1,15 +1,15 @@ package dev.freya02.discord.zstd.jni; -import dev.freya02.discord.zstd.api.ZstdException; +import dev.freya02.discord.zstd.api.DiscordZstdException; import org.jspecify.annotations.NullMarked; import java.io.IOException; import java.io.InputStream; @NullMarked -class ZstdJNIInputStream extends InputStream { +class DiscordZstdJNIInputStream extends InputStream { - private final ZstdJNIContext context; + private final DiscordZstdJNIContext context; private final long nativeContextPtr; private final byte[] input; @@ -17,7 +17,7 @@ class ZstdJNIInputStream extends InputStream { private boolean closed = false; - protected ZstdJNIInputStream(ZstdJNIContext context, long zds, byte[] input) { + protected DiscordZstdJNIInputStream(DiscordZstdJNIContext context, long zds, byte[] input) { this.context = context; this.nativeContextPtr = newContext(zds); this.input = input; @@ -51,7 +51,7 @@ public int read(byte[] b, int off, int len) throws IOException { try { return (int) inflate0(nativeContextPtr, input, inputSize, b, off, len); - } catch (ZstdException e) { + } catch (DiscordZstdException e) { context.invalidate(); throw new RuntimeException(e); } diff --git a/jni-impl/src/main/java/dev/freya02/discord/zstd/jni/ZstdJNIDecompressorFactory.java b/jni-impl/src/main/java/dev/freya02/discord/zstd/jni/ZstdJNIDecompressorFactory.java deleted file mode 100644 index f8235e7..0000000 --- a/jni-impl/src/main/java/dev/freya02/discord/zstd/jni/ZstdJNIDecompressorFactory.java +++ /dev/null @@ -1,20 +0,0 @@ -package dev.freya02.discord.zstd.jni; - -import dev.freya02.discord.zstd.api.ZstdDecompressor; -import dev.freya02.discord.zstd.api.ZstdDecompressorFactory; -import org.jspecify.annotations.NullMarked; - -@NullMarked -class ZstdJNIDecompressorFactory implements ZstdDecompressorFactory { - - private final int bufferSizeHint; - - protected ZstdJNIDecompressorFactory(int bufferSizeHint) { - this.bufferSizeHint = bufferSizeHint; - } - - @Override - public ZstdDecompressor create() { - return new ZstdJNIDecompressor(bufferSizeHint); - } -} diff --git a/jni-impl/src/test/java/dev/freya02/discord/zstd/jni/ZstdJNITest.java b/jni-impl/src/test/java/dev/freya02/discord/zstd/jni/ZstdJNITest.java index 7c69e63..117508e 100644 --- a/jni-impl/src/test/java/dev/freya02/discord/zstd/jni/ZstdJNITest.java +++ b/jni-impl/src/test/java/dev/freya02/discord/zstd/jni/ZstdJNITest.java @@ -1,10 +1,10 @@ package dev.freya02.discord.zstd.jni; import dev.freya02.discord.zstd.TestChunks; +import dev.freya02.discord.zstd.api.DiscordZstdContext; +import dev.freya02.discord.zstd.api.DiscordZstdDecompressor; +import dev.freya02.discord.zstd.api.DiscordZstdDecompressorFactory; import dev.freya02.discord.zstd.api.DiscordZstdProvider; -import dev.freya02.discord.zstd.api.ZstdContext; -import dev.freya02.discord.zstd.api.ZstdDecompressor; -import dev.freya02.discord.zstd.api.ZstdDecompressorFactory; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; @@ -25,8 +25,8 @@ public static void setup() { @Test public void test_decompression() { - ZstdDecompressorFactory factory = DiscordZstdProvider.get().createDecompressorFactory(ZstdDecompressor.DEFAULT_BUFFER_SIZE); - ZstdDecompressor decompressor = factory.create(); + DiscordZstdDecompressorFactory factory = DiscordZstdProvider.get().createDecompressorFactory(DiscordZstdDecompressor.DEFAULT_BUFFER_SIZE); + DiscordZstdDecompressor decompressor = factory.create(); for (TestChunks.Chunk chunk : chunks) { final byte[] actual = decompressor.decompress(chunk.getCompressed()); final byte[] expected = chunk.getDecompressed(); @@ -36,7 +36,7 @@ public void test_decompression() { @Test public void test_input_stream() throws IOException { - ZstdContext context = DiscordZstdProvider.get().createContext(); + DiscordZstdContext context = DiscordZstdProvider.get().createContext(); for (TestChunks.Chunk chunk : chunks) { try (InputStream stream = context.createInputStream(chunk.getCompressed())) { final byte[] actual = stream.readAllBytes();