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 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..8690a30 --- /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 DiscordZstdContext}. + *
This is used to keep track of streaming decompression after each input is consumed via an {@link InputStream}. + * + * @return A new {@link DiscordZstdContext} instance + */ + DiscordZstdContext createContext(); + + // TODO rename type + /** + * 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 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 DiscordZstdDecompressor#MIN_BUFFER_SIZE} and not {@value DiscordZstdDecompressor#ZSTD_RECOMMENDED_BUFFER_SIZE} + * + * @return A new {@link DiscordZstdDecompressorFactory} instance + */ + 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/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/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/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/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/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 129c9d5..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,9 +1,9 @@ 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.jni.ZstdJNIDecompressorFactoryProvider; +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; import org.openjdk.jmh.annotations.*; @@ -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,13 +34,13 @@ 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) { - case "jni" -> new ZstdJNIDecompressorFactoryProvider().get(ZSTD_BUFFER_SIZE); + DiscordZstdNativesLoader.loadFromJar(); + DiscordZstdDecompressorFactory factory = switch (impl) { + 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..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,8 +1,8 @@ package dev.freya02.discord.zstd; -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.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; import org.jetbrains.annotations.Nullable; @@ -30,16 +30,15 @@ public static class ZstdDecompressorState { @Param({"jni"}) private String impl; - public ZstdContext context; + public DiscordZstdContext context; @Setup public void setup() throws IOException { - ZstdNativesLoader.loadFromJar(); - var factory = switch (impl) { - case "jni" -> new ZstdJNIContextFactoryProvider().get(); + DiscordZstdNativesLoader.loadFromJar(); + 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/DiscordZstdFFM.java b/ffm-impl/src/main/java/dev/freya02/discord/zstd/ffm/DiscordZstdFFM.java new file mode 100644 index 0000000..79a05cf --- /dev/null +++ b/ffm-impl/src/main/java/dev/freya02/discord/zstd/ffm/DiscordZstdFFM.java @@ -0,0 +1,32 @@ +package dev.freya02.discord.zstd.ffm; + +import dev.freya02.discord.zstd.api.*; +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 + DiscordZstdNativesLoader.loadFromJar(); + } + + @Override + public DiscordZstdContext createContext() { + return new DiscordZstdFFMContext(); + } + + @Override + 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 9803c12..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 -public 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 82bfb1a..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 -public 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 @@ public 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 be9e59e..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 -public 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 @@ public 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/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/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/ZstdFFMDecompressorFactory.java b/ffm-impl/src/main/java/dev/freya02/discord/zstd/ffm/ZstdFFMDecompressorFactory.java deleted file mode 100644 index b693c91..0000000 --- a/ffm-impl/src/main/java/dev/freya02/discord/zstd/ffm/ZstdFFMDecompressorFactory.java +++ /dev/null @@ -1,26 +0,0 @@ -package dev.freya02.discord.zstd.ffm; - -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 -public class ZstdFFMDecompressorFactory implements ZstdDecompressorFactory { - - private final int bufferSize; - - 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; - } - - @Override - public ZstdDecompressor create() { - if (!ZstdNativesLoader.isLoaded()) { - throw new IllegalStateException("Natives are not loaded yet, see ZstdNativesLoader"); - } - return new ZstdFFMDecompressor(bufferSize); - } -} 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.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/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/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..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,9 +1,10 @@ package dev.freya02.discord.zstd.ffm; 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.DiscordZstdContext; +import dev.freya02.discord.zstd.api.DiscordZstdDecompressor; +import dev.freya02.discord.zstd.api.DiscordZstdDecompressorFactory; +import dev.freya02.discord.zstd.api.DiscordZstdProvider; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; @@ -18,15 +19,14 @@ 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); - 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 { - final ZstdFFMContext context = new ZstdFFMContext(); + 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/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/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 04e5f5d..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,14 +1,12 @@ package dev.freya02.discord.zstd.jna; -import dev.freya02.discord.zstd.api.ZstdDecompressorFactory; -import dev.freya02.discord.zstd.api.ZstdDecompressorFactoryProvider; +import dev.freya02.discord.zstd.api.DiscordZstdDecompressorFactory; import org.jspecify.annotations.NullMarked; @NullMarked -public class ZstdJNADecompressorFactoryProvider implements ZstdDecompressorFactoryProvider { +public class ZstdJNADecompressorFactoryProvider { - @Override - public ZstdDecompressorFactory get(int bufferSizeHint) { + public DiscordZstdDecompressorFactory 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 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 new file mode 100644 index 0000000..8f4fd2d --- /dev/null +++ b/jni-impl/src/main/java/dev/freya02/discord/zstd/jni/DiscordZstdJNI.java @@ -0,0 +1,32 @@ +package dev.freya02.discord.zstd.jni; + +import dev.freya02.discord.zstd.api.*; +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 + DiscordZstdNativesLoader.loadFromJar(); + } + + @Override + public DiscordZstdContext createContext() { + return new DiscordZstdJNIContext(); + } + + @Override + 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 38f66b5..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 -public 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 d410072..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 -public 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 @@ public 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 5305365..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 -public 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 @@ public 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/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/ZstdJNIDecompressorFactory.java b/jni-impl/src/main/java/dev/freya02/discord/zstd/jni/ZstdJNIDecompressorFactory.java deleted file mode 100644 index 4e8e676..0000000 --- a/jni-impl/src/main/java/dev/freya02/discord/zstd/jni/ZstdJNIDecompressorFactory.java +++ /dev/null @@ -1,26 +0,0 @@ -package dev.freya02.discord.zstd.jni; - -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 -public class ZstdJNIDecompressorFactory implements ZstdDecompressorFactory { - - private final int bufferSize; - - 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; - } - - @Override - public ZstdDecompressor create() { - if (!ZstdNativesLoader.isLoaded()) { - throw new IllegalStateException("Natives are not loaded yet, see ZstdNativesLoader"); - } - return new ZstdJNIDecompressor(bufferSize); - } -} 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.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/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 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..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,9 +1,10 @@ package dev.freya02.discord.zstd.jni; 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.DiscordZstdContext; +import dev.freya02.discord.zstd.api.DiscordZstdDecompressor; +import dev.freya02.discord.zstd.api.DiscordZstdDecompressorFactory; +import dev.freya02.discord.zstd.api.DiscordZstdProvider; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; @@ -18,15 +19,14 @@ 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); - 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 { - final ZstdJNIContext context = new ZstdJNIContext(); + DiscordZstdContext context = DiscordZstdProvider.get().createContext(); for (TestChunks.Chunk chunk : chunks) { try (InputStream stream = context.createInputStream(chunk.getCompressed())) { final byte[] actual = stream.readAllBytes();