From 52e23388ff80fa21ca10db33f502a30ee630c6f7 Mon Sep 17 00:00:00 2001 From: zwiterrion Date: Tue, 30 Jan 2024 09:52:16 +0100 Subject: [PATCH] add missing java sources --- .idea/codeStyles/Project.xml | 7 ++ .idea/codeStyles/codeStyleConfig.xml | 5 + .idea/extism.iml | 9 ++ .idea/misc.xml | 6 ++ .idea/modules.xml | 8 ++ .idea/vcs.xml | 6 ++ .idea/workspace.xml | 49 ++++++++++ .../java/org/extism/sdk/CancelHandle.java | 21 +++++ .../java/org/extism/sdk/ExtismException.java | 18 ++++ .../java/org/extism/sdk/ExtismFunction.java | 12 +++ .../java/org/extism/sdk/HostUserData.java | 7 ++ .../org/extism/sdk/manifest/Manifest.java | 93 +++++++++++++++++++ .../sdk/manifest/ManifestHttpRequest.java | 29 ++++++ .../extism/sdk/manifest/MemoryOptions.java | 18 ++++ .../java/org/extism/sdk/support/Hashing.java | 21 +++++ .../org/extism/sdk/support/JsonSerde.java | 56 +++++++++++ .../extism/sdk/wasm/ByteArrayWasmSource.java | 38 ++++++++ .../org/extism/sdk/wasm/PathWasmSource.java | 40 ++++++++ .../java/org/extism/sdk/wasm/WasmSource.java | 19 ++++ 19 files changed, 462 insertions(+) create mode 100644 .idea/codeStyles/Project.xml create mode 100644 .idea/codeStyles/codeStyleConfig.xml create mode 100644 .idea/extism.iml create mode 100644 .idea/misc.xml create mode 100644 .idea/modules.xml create mode 100644 .idea/vcs.xml create mode 100644 .idea/workspace.xml create mode 100644 java/src/main/java/org/extism/sdk/CancelHandle.java create mode 100644 java/src/main/java/org/extism/sdk/ExtismException.java create mode 100644 java/src/main/java/org/extism/sdk/ExtismFunction.java create mode 100644 java/src/main/java/org/extism/sdk/HostUserData.java create mode 100644 java/src/main/java/org/extism/sdk/manifest/Manifest.java create mode 100644 java/src/main/java/org/extism/sdk/manifest/ManifestHttpRequest.java create mode 100644 java/src/main/java/org/extism/sdk/manifest/MemoryOptions.java create mode 100644 java/src/main/java/org/extism/sdk/support/Hashing.java create mode 100644 java/src/main/java/org/extism/sdk/support/JsonSerde.java create mode 100644 java/src/main/java/org/extism/sdk/wasm/ByteArrayWasmSource.java create mode 100644 java/src/main/java/org/extism/sdk/wasm/PathWasmSource.java create mode 100644 java/src/main/java/org/extism/sdk/wasm/WasmSource.java diff --git a/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml new file mode 100644 index 000000000..919ce1f1f --- /dev/null +++ b/.idea/codeStyles/Project.xml @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/.idea/codeStyles/codeStyleConfig.xml b/.idea/codeStyles/codeStyleConfig.xml new file mode 100644 index 000000000..a55e7a179 --- /dev/null +++ b/.idea/codeStyles/codeStyleConfig.xml @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/.idea/extism.iml b/.idea/extism.iml new file mode 100644 index 000000000..d6ebd4805 --- /dev/null +++ b/.idea/extism.iml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 000000000..639900d13 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 000000000..e3775bda0 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 000000000..35eb1ddfb --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/workspace.xml b/.idea/workspace.xml new file mode 100644 index 000000000..22c655fd6 --- /dev/null +++ b/.idea/workspace.xml @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + 1706604659918 + + + + \ No newline at end of file diff --git a/java/src/main/java/org/extism/sdk/CancelHandle.java b/java/src/main/java/org/extism/sdk/CancelHandle.java new file mode 100644 index 000000000..b88e3b2d3 --- /dev/null +++ b/java/src/main/java/org/extism/sdk/CancelHandle.java @@ -0,0 +1,21 @@ +package org.extism.sdk; + +import com.sun.jna.Pointer; + +/** + * CancelHandle is used to cancel a running Plugin + */ +public class CancelHandle { + private Pointer handle; + + public CancelHandle(Pointer handle) { + this.handle = handle; + } + + /** + * Cancel execution of the Plugin associated with the CancelHandle + */ + boolean cancel() { + return LibExtism.INSTANCE.extism_plugin_cancel(this.handle); + } +} diff --git a/java/src/main/java/org/extism/sdk/ExtismException.java b/java/src/main/java/org/extism/sdk/ExtismException.java new file mode 100644 index 000000000..e48216fd8 --- /dev/null +++ b/java/src/main/java/org/extism/sdk/ExtismException.java @@ -0,0 +1,18 @@ +package org.extism.sdk; + +/** + * Thrown when an exceptional condition has occurred. + */ +public class ExtismException extends RuntimeException { + + public ExtismException() { + } + + public ExtismException(String message) { + super(message); + } + + public ExtismException(String message, Throwable cause) { + super(message, cause); + } +} diff --git a/java/src/main/java/org/extism/sdk/ExtismFunction.java b/java/src/main/java/org/extism/sdk/ExtismFunction.java new file mode 100644 index 000000000..08e348bc7 --- /dev/null +++ b/java/src/main/java/org/extism/sdk/ExtismFunction.java @@ -0,0 +1,12 @@ +package org.extism.sdk; + +import java.util.Optional; + +public interface ExtismFunction { + void invoke( + ExtismCurrentPlugin plugin, + LibExtism.ExtismVal[] params, + LibExtism.ExtismVal[] returns, + Optional data + ); +} diff --git a/java/src/main/java/org/extism/sdk/HostUserData.java b/java/src/main/java/org/extism/sdk/HostUserData.java new file mode 100644 index 000000000..bbd31f4c9 --- /dev/null +++ b/java/src/main/java/org/extism/sdk/HostUserData.java @@ -0,0 +1,7 @@ +package org.extism.sdk; + +import com.sun.jna.PointerType; + +public class HostUserData extends PointerType { + +} \ No newline at end of file diff --git a/java/src/main/java/org/extism/sdk/manifest/Manifest.java b/java/src/main/java/org/extism/sdk/manifest/Manifest.java new file mode 100644 index 000000000..37f4c6179 --- /dev/null +++ b/java/src/main/java/org/extism/sdk/manifest/Manifest.java @@ -0,0 +1,93 @@ +package org.extism.sdk.manifest; + +import com.google.gson.annotations.SerializedName; +import org.extism.sdk.wasm.WasmSource; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Map; + +public class Manifest { + + @SerializedName("wasm") + private final List sources; + + @SerializedName("memory") + private final MemoryOptions memoryOptions; + + // FIXME remove this and related stuff if not supported in java-sdk + @SerializedName("allowed_hosts") + private final List allowedHosts; + + @SerializedName("allowed_paths") + private final Map allowedPaths; + + @SerializedName("config") + private final Map config; + + public Manifest() { + this(new ArrayList<>(), null, null, null, null); + } + + public Manifest(WasmSource source) { + this(List.of(source)); + } + + public Manifest(List sources) { + this(sources, null, null, null, null); + } + + public Manifest(List sources, MemoryOptions memoryOptions) { + this(sources, memoryOptions, null, null, null); + } + + public Manifest(List sources, MemoryOptions memoryOptions, Map config) { + this(sources, memoryOptions, config, null, null); + } + + public Manifest(List sources, MemoryOptions memoryOptions, Map config, List allowedHosts) { + this(sources, memoryOptions, config, allowedHosts, null); + } + + public Manifest(List sources, MemoryOptions memoryOptions, Map config, List allowedHosts, Map allowedPaths) { + this.sources = sources; + this.memoryOptions = memoryOptions; + this.config = config; + this.allowedHosts = allowedHosts; + this.allowedPaths = allowedPaths; + } + + public void addSource(WasmSource source) { + this.sources.add(source); + } + + public List getSources() { + return Collections.unmodifiableList(sources); + } + + public MemoryOptions getMemoryOptions() { + return memoryOptions; + } + + public Map getConfig() { + if (config == null || config.isEmpty()) { + return Collections.emptyMap(); + } + return Collections.unmodifiableMap(config); + } + + public List getAllowedHosts() { + if (allowedHosts == null || allowedHosts.isEmpty()) { + return Collections.emptyList(); + } + return Collections.unmodifiableList(allowedHosts); + } + + public Map getAllowedPaths() { + if (allowedPaths == null || allowedPaths.isEmpty()) { + return Collections.emptyMap(); + } + return Collections.unmodifiableMap(allowedPaths); + } +} diff --git a/java/src/main/java/org/extism/sdk/manifest/ManifestHttpRequest.java b/java/src/main/java/org/extism/sdk/manifest/ManifestHttpRequest.java new file mode 100644 index 000000000..0ee568912 --- /dev/null +++ b/java/src/main/java/org/extism/sdk/manifest/ManifestHttpRequest.java @@ -0,0 +1,29 @@ +package org.extism.sdk.manifest; + +import java.util.Map; + +// FIXME remove this and related stuff if not supported in java-sdk +public class ManifestHttpRequest { + + private final String url; + private final Map header; + private final String method; + + public ManifestHttpRequest(String url, Map header, String method) { + this.url = url; + this.header = header; + this.method = method; + } + + public String url() { + return url; + } + + public Map header() { + return header; + } + + public String method() { + return method; + } +} \ No newline at end of file diff --git a/java/src/main/java/org/extism/sdk/manifest/MemoryOptions.java b/java/src/main/java/org/extism/sdk/manifest/MemoryOptions.java new file mode 100644 index 000000000..f35089310 --- /dev/null +++ b/java/src/main/java/org/extism/sdk/manifest/MemoryOptions.java @@ -0,0 +1,18 @@ +package org.extism.sdk.manifest; + +import com.google.gson.annotations.SerializedName; + +/** + * Configures memory for the Wasm runtime. + * Memory is described in units of pages (64KB) and represent contiguous chunks of addressable memory. + * + * @param max Max number of pages. + */ +public class MemoryOptions { + @SerializedName("max") + private final Integer max; + + public MemoryOptions(Integer max) { + this.max = max; + } +} diff --git a/java/src/main/java/org/extism/sdk/support/Hashing.java b/java/src/main/java/org/extism/sdk/support/Hashing.java new file mode 100644 index 000000000..57c72b672 --- /dev/null +++ b/java/src/main/java/org/extism/sdk/support/Hashing.java @@ -0,0 +1,21 @@ +package org.extism.sdk.support; + +import java.security.MessageDigest; + +public class Hashing { + + public static String sha256HexDigest(byte[] input) { + try { + var messageDigest = MessageDigest.getInstance("SHA-256"); + var messageDigestBytes = messageDigest.digest(input); + + var hexString = new StringBuilder(); + for (var b : messageDigestBytes) { + hexString.append(String.format("%02x", b)); + } + return hexString.toString(); + } catch (Exception e) { + throw new RuntimeException(e); + } + } +} diff --git a/java/src/main/java/org/extism/sdk/support/JsonSerde.java b/java/src/main/java/org/extism/sdk/support/JsonSerde.java new file mode 100644 index 000000000..766957218 --- /dev/null +++ b/java/src/main/java/org/extism/sdk/support/JsonSerde.java @@ -0,0 +1,56 @@ +package org.extism.sdk.support; + +import com.google.gson.*; +import com.google.gson.stream.JsonReader; +import com.google.gson.stream.JsonToken; +import com.google.gson.stream.JsonWriter; +import org.extism.sdk.manifest.Manifest; + +import java.io.IOException; +import java.lang.reflect.Type; +import java.nio.charset.StandardCharsets; +import java.util.Base64; + +public class JsonSerde { + + private static final Gson GSON; + + static { + GSON = new GsonBuilder() // + .disableHtmlEscaping() // + // needed to convert the byte[] to a base64 encoded String + .registerTypeHierarchyAdapter(byte[].class, new ByteArrayAdapter()) // + .setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES) // + .setPrettyPrinting() // + .create(); + } + + public static String toJson(Manifest manifest) { + return GSON.toJson(manifest); + } + + private static class ByteArrayAdapter extends TypeAdapter { + + @Override + public void write(JsonWriter out, byte[] byteValue) throws IOException { + out.value(new String(Base64.getEncoder().encode(byteValue))); + } + + @Override + public byte[] read(JsonReader in) { + try { + if (in.peek() == JsonToken.NULL) { + in.nextNull(); + return new byte[]{}; + } + String byteValue = in.nextString(); + if (byteValue != null) { + return Base64.getDecoder().decode(byteValue); + } + return new byte[]{}; + } catch (Exception e) { + throw new JsonParseException(e); + } + } + } +} diff --git a/java/src/main/java/org/extism/sdk/wasm/ByteArrayWasmSource.java b/java/src/main/java/org/extism/sdk/wasm/ByteArrayWasmSource.java new file mode 100644 index 000000000..9ad174eaa --- /dev/null +++ b/java/src/main/java/org/extism/sdk/wasm/ByteArrayWasmSource.java @@ -0,0 +1,38 @@ +package org.extism.sdk.wasm; + +/** + * WASM Source represented by raw bytes. + */ +public class ByteArrayWasmSource implements WasmSource { + + private final String name; + private final byte[] data; + private final String hash; + + + /** + * Constructor + * @param name + * @param data the byte array representing the WASM code + * @param hash + */ + public ByteArrayWasmSource(String name, byte[] data, String hash) { + this.name = name; + this.data = data; + this.hash = hash; + } + + @Override + public String name() { + return name; + } + + @Override + public String hash() { + return hash; + } + + public byte[] data() { + return data; + } +} diff --git a/java/src/main/java/org/extism/sdk/wasm/PathWasmSource.java b/java/src/main/java/org/extism/sdk/wasm/PathWasmSource.java new file mode 100644 index 000000000..3246dc6be --- /dev/null +++ b/java/src/main/java/org/extism/sdk/wasm/PathWasmSource.java @@ -0,0 +1,40 @@ +package org.extism.sdk.wasm; + +/** + * WASM Source represented by a file referenced by a path. + */ +public class PathWasmSource implements WasmSource { + + private final String name; + + private final String path; + + private final String hash; + + /** + * Constructor + * @param name + * @param path + * @param hash + */ + public PathWasmSource(String name, String path, String hash) { + this.name = name; + this.path = path; + this.hash = hash; + } + + @Override + public String name() { + return name; + } + + @Override + public String hash() { + return hash; + } + + public String path() { + return path; + } +} + diff --git a/java/src/main/java/org/extism/sdk/wasm/WasmSource.java b/java/src/main/java/org/extism/sdk/wasm/WasmSource.java new file mode 100644 index 000000000..ab96c2393 --- /dev/null +++ b/java/src/main/java/org/extism/sdk/wasm/WasmSource.java @@ -0,0 +1,19 @@ +package org.extism.sdk.wasm; + +/** + * A named WASM source. + */ +public interface WasmSource { + + /** + * Logical name of the WASM source + * @return + */ + String name(); + + /** + * Hash of the WASM source + * @return + */ + String hash(); +}