From bb23fce01ef528f507303f90e2500098ec65ff7a Mon Sep 17 00:00:00 2001 From: Bjorn Beishline <75190918+BjornTheProgrammer@users.noreply.github.com> Date: Tue, 27 Jan 2026 11:23:28 -0700 Subject: [PATCH] Add in plugin manager --- java/patchbukkit/build.gradle.kts | 1 + .../java/org/patchbukkit/NativeCallbacks.java | 5 + .../patchbukkit/PatchBukkitPluginLoader.java | 2 +- .../patchbukkit/PatchBukkitPluginManager.java | 292 ++++++++++++++++++ .../org/patchbukkit/PatchBukkitServer.java | 6 +- rust/Cargo.lock | 58 ++++ rust/Cargo.toml | 2 +- rust/src/java/java_to_rust.rs | 10 - rust/src/java/mod.rs | 1 - 9 files changed, 360 insertions(+), 17 deletions(-) create mode 100644 java/patchbukkit/src/main/java/org/patchbukkit/NativeCallbacks.java create mode 100644 java/patchbukkit/src/main/java/org/patchbukkit/PatchBukkitPluginManager.java delete mode 100644 rust/src/java/java_to_rust.rs diff --git a/java/patchbukkit/build.gradle.kts b/java/patchbukkit/build.gradle.kts index fabd511..10c352a 100644 --- a/java/patchbukkit/build.gradle.kts +++ b/java/patchbukkit/build.gradle.kts @@ -12,6 +12,7 @@ repositories { dependencies { compileOnly("io.papermc.paper:paper-api:1.21.11-R0.1-SNAPSHOT") implementation("net.sf.jopt-simple:jopt-simple:6.0-alpha-3") + implementation("io.github.astonbitecode:j4rs:0.24.0") } java { diff --git a/java/patchbukkit/src/main/java/org/patchbukkit/NativeCallbacks.java b/java/patchbukkit/src/main/java/org/patchbukkit/NativeCallbacks.java new file mode 100644 index 0000000..26a3bae --- /dev/null +++ b/java/patchbukkit/src/main/java/org/patchbukkit/NativeCallbacks.java @@ -0,0 +1,5 @@ +package org.patchbukkit; + +import org.astonbitecode.j4rs.api.invocation.NativeCallbackToRustChannelSupport; + +public class NativeCallbacks extends NativeCallbackToRustChannelSupport {} diff --git a/java/patchbukkit/src/main/java/org/patchbukkit/PatchBukkitPluginLoader.java b/java/patchbukkit/src/main/java/org/patchbukkit/PatchBukkitPluginLoader.java index 105df77..595f105 100644 --- a/java/patchbukkit/src/main/java/org/patchbukkit/PatchBukkitPluginLoader.java +++ b/java/patchbukkit/src/main/java/org/patchbukkit/PatchBukkitPluginLoader.java @@ -16,7 +16,7 @@ import org.bukkit.plugin.RegisteredListener; import org.bukkit.plugin.UnknownDependencyException; import org.bukkit.plugin.java.JavaPlugin; -@SuppressWarnings("deprecation") +@SuppressWarnings({ "deprecation", "removal" }) public class PatchBukkitPluginLoader implements PluginLoader { public static JavaPlugin createPlugin(String jarPath, String mainClass) { diff --git a/java/patchbukkit/src/main/java/org/patchbukkit/PatchBukkitPluginManager.java b/java/patchbukkit/src/main/java/org/patchbukkit/PatchBukkitPluginManager.java new file mode 100644 index 0000000..2a96a20 --- /dev/null +++ b/java/patchbukkit/src/main/java/org/patchbukkit/PatchBukkitPluginManager.java @@ -0,0 +1,292 @@ +package org.patchbukkit; + +import io.papermc.paper.plugin.PermissionManager; +import io.papermc.paper.plugin.configuration.PluginMeta; +import java.io.File; +import java.util.List; +import java.util.Set; +import org.bukkit.event.Event; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.permissions.Permissible; +import org.bukkit.permissions.Permission; +import org.bukkit.plugin.*; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.NonNull; + +@SuppressWarnings("removal") +public class PatchBukkitPluginManager implements PluginManager { + + @Override + public void registerInterface(@NotNull Class loader) + throws IllegalArgumentException {} + + @Override + public @Nullable Plugin getPlugin(@NotNull String name) { + throw new UnsupportedOperationException( + "Unimplemented method 'getPlugin'" + ); + } + + @Override + public @NotNull Plugin[] getPlugins() { + throw new UnsupportedOperationException( + "Unimplemented method 'getPlugins'" + ); + } + + @Override + public boolean isPluginEnabled(@NotNull String name) { + throw new UnsupportedOperationException( + "Unimplemented method 'isPluginEnabled'" + ); + } + + @Override + public boolean isPluginEnabled(@Nullable Plugin plugin) { + throw new UnsupportedOperationException( + "Unimplemented method 'isPluginEnabled'" + ); + } + + @Override + public @Nullable Plugin loadPlugin(@NotNull File file) + throws InvalidPluginException, InvalidDescriptionException, UnknownDependencyException { + throw new UnsupportedOperationException( + "Unimplemented method 'loadPlugin'" + ); + } + + @Override + public @NotNull Plugin[] loadPlugins(@NotNull File directory) { + throw new UnsupportedOperationException( + "Unimplemented method 'loadPlugins'" + ); + } + + @Override + public @NotNull Plugin[] loadPlugins(@NonNull @NotNull File[] files) { + throw new UnsupportedOperationException( + "Unimplemented method 'loadPlugins'" + ); + } + + @Override + public void disablePlugins() { + throw new UnsupportedOperationException( + "Unimplemented method 'disablePlugins'" + ); + } + + @Override + public void clearPlugins() { + throw new UnsupportedOperationException( + "Unimplemented method 'clearPlugins'" + ); + } + + @Override + public void callEvent(@NotNull Event event) throws IllegalStateException { + throw new UnsupportedOperationException( + "Unimplemented method 'callEvent'" + ); + } + + @Override + public void registerEvents( + @NotNull Listener listener, + @NotNull Plugin plugin + ) { + throw new UnsupportedOperationException( + "Unimplemented method 'registerEvents'" + ); + } + + @Override + public void registerEvent( + @NotNull Class event, + @NotNull Listener listener, + @NotNull EventPriority priority, + @NotNull EventExecutor executor, + @NotNull Plugin plugin + ) { + throw new UnsupportedOperationException( + "Unimplemented method 'registerEvent'" + ); + } + + @Override + public void registerEvent( + @NotNull Class event, + @NotNull Listener listener, + @NotNull EventPriority priority, + @NotNull EventExecutor executor, + @NotNull Plugin plugin, + boolean ignoreCancelled + ) { + throw new UnsupportedOperationException( + "Unimplemented method 'registerEvent'" + ); + } + + @Override + public void enablePlugin(@NotNull Plugin plugin) { + throw new UnsupportedOperationException( + "Unimplemented method 'enablePlugin'" + ); + } + + @Override + public void disablePlugin(@NotNull Plugin plugin) { + throw new UnsupportedOperationException( + "Unimplemented method 'disablePlugin'" + ); + } + + @Override + public @Nullable Permission getPermission(@NotNull String name) { + throw new UnsupportedOperationException( + "Unimplemented method 'getPermission'" + ); + } + + @Override + public void addPermission(@NotNull Permission perm) { + throw new UnsupportedOperationException( + "Unimplemented method 'addPermission'" + ); + } + + @Override + public void removePermission(@NotNull Permission perm) { + throw new UnsupportedOperationException( + "Unimplemented method 'removePermission'" + ); + } + + @Override + public void removePermission(@NotNull String name) { + throw new UnsupportedOperationException( + "Unimplemented method 'removePermission'" + ); + } + + @Override + public @NotNull Set getDefaultPermissions(boolean op) { + throw new UnsupportedOperationException( + "Unimplemented method 'getDefaultPermissions'" + ); + } + + @Override + public void recalculatePermissionDefaults(@NotNull Permission perm) { + throw new UnsupportedOperationException( + "Unimplemented method 'recalculatePermissionDefaults'" + ); + } + + @Override + public void subscribeToPermission( + @NotNull String permission, + @NotNull Permissible permissible + ) { + throw new UnsupportedOperationException( + "Unimplemented method 'subscribeToPermission'" + ); + } + + @Override + public void unsubscribeFromPermission( + @NotNull String permission, + @NotNull Permissible permissible + ) { + throw new UnsupportedOperationException( + "Unimplemented method 'unsubscribeFromPermission'" + ); + } + + @Override + public @NotNull Set getPermissionSubscriptions( + @NotNull String permission + ) { + throw new UnsupportedOperationException( + "Unimplemented method 'getPermissionSubscriptions'" + ); + } + + @Override + public void subscribeToDefaultPerms( + boolean op, + @NotNull Permissible permissible + ) { + throw new UnsupportedOperationException( + "Unimplemented method 'subscribeToDefaultPerms'" + ); + } + + @Override + public void unsubscribeFromDefaultPerms( + boolean op, + @NotNull Permissible permissible + ) { + throw new UnsupportedOperationException( + "Unimplemented method 'unsubscribeFromDefaultPerms'" + ); + } + + @Override + public @NotNull Set getDefaultPermSubscriptions(boolean op) { + throw new UnsupportedOperationException( + "Unimplemented method 'getDefaultPermSubscriptions'" + ); + } + + @Override + public @NotNull Set getPermissions() { + throw new UnsupportedOperationException( + "Unimplemented method 'getPermissions'" + ); + } + + @Override + public void addPermissions(List perm) { + throw new UnsupportedOperationException( + "Unimplemented method 'addPermissions'" + ); + } + + @Override + public void clearPermissions() { + throw new UnsupportedOperationException( + "Unimplemented method 'clearPermissions'" + ); + } + + @Override + public boolean useTimings() { + throw new UnsupportedOperationException( + "Unimplemented method 'useTimings'" + ); + } + + @Override + public boolean isTransitiveDependency( + PluginMeta pluginMeta, + PluginMeta dependencyConfig + ) { + throw new UnsupportedOperationException( + "Unimplemented method 'isTransitiveDependency'" + ); + } + + @Override + public void overridePermissionManager( + @NotNull Plugin plugin, + @Nullable PermissionManager permissionManager + ) { + throw new UnsupportedOperationException( + "Unimplemented method 'overridePermissionManager'" + ); + } +} diff --git a/java/patchbukkit/src/main/java/org/patchbukkit/PatchBukkitServer.java b/java/patchbukkit/src/main/java/org/patchbukkit/PatchBukkitServer.java index aec0bc8..c90fde6 100644 --- a/java/patchbukkit/src/main/java/org/patchbukkit/PatchBukkitServer.java +++ b/java/patchbukkit/src/main/java/org/patchbukkit/PatchBukkitServer.java @@ -84,6 +84,7 @@ import org.bukkit.util.CachedServerIcon; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +@SuppressWarnings("removal") public class PatchBukkitServer implements Server { private final String serverName = @@ -442,10 +443,7 @@ public class PatchBukkitServer implements Server { @Override public @NotNull PluginManager getPluginManager() { - // TODO Auto-generated method stub - throw new UnsupportedOperationException( - "Unimplemented method 'getPluginManager'" - ); + return new PatchBukkitPluginManager(); } @Override diff --git a/rust/Cargo.lock b/rust/Cargo.lock index 30342f7..39a9f44 100644 --- a/rust/Cargo.lock +++ b/rust/Cargo.lock @@ -630,6 +630,27 @@ dependencies = [ "subtle", ] +[[package]] +name = "dirs" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3e8aa94d75141228480295a7d0e7feb620b1a5ad9f12bc40be62411e38cce4e" +dependencies = [ + "dirs-sys", +] + +[[package]] +name = "dirs-sys" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e01a3366d27ee9890022452ee61b2b63a67e6f13f58900b651ff5665f0bb1fab" +dependencies = [ + "libc", + "option-ext", + "redox_users", + "windows-sys 0.59.0", +] + [[package]] name = "displaydoc" version = "0.2.5" @@ -1362,6 +1383,16 @@ version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f9fbbcab51052fe104eb5e5d351cf728d30a5be1fe14d9be8a3b097481fb97de" +[[package]] +name = "libredox" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d0b95e02c851351f877147b7deea7b1afb1df71b63aa5f8270716e0c5720616" +dependencies = [ + "bitflags", + "libc", +] + [[package]] name = "linux-raw-sys" version = "0.11.0" @@ -1576,6 +1607,12 @@ version = "1.70.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe" +[[package]] +name = "option-ext" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" + [[package]] name = "p384" version = "0.13.1" @@ -2163,6 +2200,17 @@ dependencies = [ "bitflags", ] +[[package]] +name = "redox_users" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4e608c6638b9c18977b00b475ac1f28d14e84b27d8d42f70e0bf1e3dec127ac" +dependencies = [ + "getrandom 0.2.17", + "libredox", + "thiserror", +] + [[package]] name = "regex" version = "1.12.2" @@ -2255,6 +2303,7 @@ dependencies = [ "proc-macro2", "quote", "rust-embed-utils", + "shellexpand", "syn", "walkdir", ] @@ -2538,6 +2587,15 @@ dependencies = [ "digest 0.11.0-rc.5", ] +[[package]] +name = "shellexpand" +version = "3.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b1fdf65dd6331831494dd616b30351c38e96e45921a27745cf98490458b90bb" +dependencies = [ + "dirs", +] + [[package]] name = "shlex" version = "1.3.0" diff --git a/rust/Cargo.toml b/rust/Cargo.toml index 67ff039..35dd4a2 100644 --- a/rust/Cargo.toml +++ b/rust/Cargo.toml @@ -17,7 +17,7 @@ log = "0.4" glob = "0.3.2" j4rs = { version = "0.24" } j4rs_derive = "0.1" -rust-embed = "8.9.0" +rust-embed = { version = "8.9.0", features = ["interpolate-folder-path"] } walkdir = "2" zip = "7.1" diff --git a/rust/src/java/java_to_rust.rs b/rust/src/java/java_to_rust.rs deleted file mode 100644 index 784c2c5..0000000 --- a/rust/src/java/java_to_rust.rs +++ /dev/null @@ -1,10 +0,0 @@ -use j4rs::prelude::*; -use j4rs_derive::*; - -#[call_from_java("io.github.astonbitecode.j4rs.example.RustSimpleFunctionCall.fnnoargs")] -fn my_function_with_no_args() { - println!("Hello from the Rust world!"); - // If you need to have a Jvm here, you need to attach the thread - let _jvm = Jvm::attach_thread().unwrap(); - // Now you may further call Java classes and methods as usual! -} diff --git a/rust/src/java/mod.rs b/rust/src/java/mod.rs index 6857f30..6682467 100644 --- a/rust/src/java/mod.rs +++ b/rust/src/java/mod.rs @@ -1,4 +1,3 @@ pub mod jar; -pub mod java_to_rust; pub mod jvm; pub mod resources;