Skip to content

Commit d1c2116

Browse files
committed
Delay registration of ScalaPlugins to Paper's PluginManager until they are enabled for the first time. Fixes #22.
1 parent 627cc30 commit d1c2116

File tree

5 files changed

+56
-15
lines changed

5 files changed

+56
-15
lines changed

JavaExample/src/main/java/xyz/janboerman/scalaloader/example/java/ExamplePlugin.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ public class ExamplePlugin extends ScalaPlugin {
3333
private final Random random = new Random();
3434

3535
public ExamplePlugin() {
36-
super(new ScalaPluginDescription("JavaExample", "0.18.6-SNAPSHOT").addHardDepend("Scala2Example"));
36+
super(new ScalaPluginDescription("JavaExample", "0.18.9-SNAPSHOT").addHardDepend("Scala2Example"));
3737
}
3838

3939
public static ExamplePlugin getInstance() {

JavaExample/src/main/resources/plugin.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
name: JavaExample #Ignored!
22
main: xyz.janboerman.scalaloader.example.java.ExamplePlugin #Ignored!
3-
version: 0.18.3-SNAPSHOT #Ignored!
3+
version: 0.18.9-SNAPSHOT #Ignored!
44
api-version: 1.13
55

66
commands:

Scala2Example/src/main/scala/xyz/janboerman/scalaloader/example/scala/ExamplePlugin.scala

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,8 @@ import org.bukkit.{ChatColor, Material}
44
import org.bukkit.command.{Command, CommandSender}
55
import org.bukkit.event.{EventPriority, Listener}
66
import org.bukkit.permissions.PermissionDefault
7-
import xyz.janboerman.scalaloader.example.scala.Permissions.{homePermission, fooPermission}
7+
import org.bukkit.plugin.PluginLoadOrder
8+
import xyz.janboerman.scalaloader.example.scala.Permissions.{fooPermission, homePermission}
89
import xyz.janboerman.scalaloader.plugin.ScalaPluginDescription.{Command => SPCommand, Permission => SPPermission}
910
import xyz.janboerman.scalaloader.plugin.{ScalaPlugin, ScalaPluginDescription}
1011
import xyz.janboerman.scalaloader.plugin.description.{Api, ApiVersion, Scala, ScalaVersion}
@@ -17,10 +18,11 @@ object Permissions {
1718
@Scala(version = ScalaVersion.v2_13_10)
1819
@Api(ApiVersion.v1_19)
1920
object ExamplePlugin
20-
extends ScalaPlugin(new ScalaPluginDescription("Scala2Example", "0.18.6-SNAPSHOT")
21+
extends ScalaPlugin(new ScalaPluginDescription("Scala2Example", "0.18.9-SNAPSHOT")
2122
.addCommand(new SPCommand("foo").permission(fooPermission))
2223
.addCommand(new SPCommand("home").permission(homePermission).usage("/home set|tp"))
23-
.permissions(homePermission)) {
24+
.permissions(homePermission)
25+
.loadOrder(PluginLoadOrder.STARTUP)) {
2426

2527
getLogger.info("Scala2Example - I am constructed!")
2628

ScalaLoader-Paper/src/main/java/xyz/janboerman/scalaloader/paper/ScalaLoader.java

Lines changed: 21 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import com.google.common.graph.MutableGraph;
66
import io.papermc.paper.plugin.bootstrap.PluginBootstrap;
77
import io.papermc.paper.plugin.bootstrap.PluginProviderContext;
8+
import io.papermc.paper.plugin.manager.PaperPluginManagerImpl;
89
import org.bukkit.Server;
910
import org.bukkit.command.CommandMap;
1011
import org.bukkit.event.EventHandler;
@@ -276,6 +277,8 @@ private void loadScalaPlugins(File[] files) {
276277
//perhaps, split this logic? maybe construct the ScalaPlugins from ScalaLoader's constructor
277278
//and then, call scalaPlugin.onLoad() from ScalaLoader's onLoad() method.
278279

280+
//idea: create a ScalaPluginProvider? and register it at an EntrypointHandler? The problem in doing that is PluginFileType#guessType cannot guess our type :/
281+
279282
//all ScalaPlugins have been scanned.
280283
//let's instantiate them!
281284

@@ -312,8 +315,6 @@ private void loadScalaPlugins(File[] files) {
312315
ScalaPlugin plugin = optionalPlugin.get();
313316

314317
addScalaPlugin(plugin);
315-
PaperHacks.getPaperPluginManager().loadPlugin(plugin); //calls PaperPluginInstanceManager#loadPlugin(Plugin provided)
316-
//this correctly takes dependencies and softdependencies into account, but not inverse dependencies. should I make the distinction between dependency graph and load graph?
317318
plugin.onLoad();
318319
}
319320

@@ -358,14 +359,25 @@ private static void bootstrap(PluginBootstrap bootstrapper, ScalaPluginProviderC
358359
}
359360

360361
private void enableScalaPlugins(PluginLoadOrder loadOrder) {
361-
for (ScalaPlugin plugin : getScalaPlugins()) {
362-
if (!plugin.isEnabled() && plugin.getPluginMeta().getLoadOrder() == loadOrder) {
363-
ScalaPluginEnableEvent event = new ScalaPluginEnableEvent(plugin);
364-
getServer().getPluginManager().callEvent(event);
365-
if (event.isCancelled())
366-
continue;
362+
for (ScalaPlugin scalaPlugin : getScalaPlugins()) {
363+
if (scalaPlugin.getPluginMeta().getLoadOrder() == loadOrder) {
364+
365+
//register the ScalaPlugin with Paper's pluginManager.
366+
PaperPluginManagerImpl paperPluginManager = PaperHacks.getPaperPluginManager();
367+
if (paperPluginManager.getPlugin(scalaPlugin.getName()) == null) { //ensure idempotency
368+
paperPluginManager.loadPlugin(scalaPlugin); //more like "registerPlugin" since PaperPluginInstanceManager.loadPlugin(Plugin) does not call Plugin.onLoad()!
369+
//note that scalaPlugin.onLoad() has already been called!
370+
}
367371

368-
PaperHacks.getPaperPluginManager().enablePlugin(plugin);
372+
//now, enable the scalaPlugin.
373+
if (!scalaPlugin.isEnabled()) {
374+
ScalaPluginEnableEvent event = new ScalaPluginEnableEvent(scalaPlugin);
375+
getServer().getPluginManager().callEvent(event);
376+
if (event.isCancelled())
377+
continue;
378+
379+
PaperHacks.getPaperPluginManager().enablePlugin(scalaPlugin);
380+
}
369381
}
370382
}
371383
}

ScalaLoader-Paper/src/main/java/xyz/janboerman/scalaloader/paper/plugin/ScalaPluginClassLoader.java

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,21 +14,26 @@
1414
import java.security.CodeSource;
1515
import java.util.ArrayList;
1616
import java.util.Collections;
17+
import java.util.LinkedHashMap;
1718
import java.util.List;
1819
import java.util.Map;
1920
import java.util.function.BiFunction;
2021
import java.util.jar.JarEntry;
2122
import java.util.logging.Logger;
2223
import java.util.jar.JarFile;
24+
import java.util.stream.Collectors;
2325

2426
import io.papermc.paper.plugin.entrypoint.classloader.ClassloaderBytecodeModifier;
2527
import io.papermc.paper.plugin.entrypoint.classloader.PaperPluginClassLoader;
2628

29+
import io.papermc.paper.plugin.manager.PaperPluginManagerImpl;
2730
import org.bukkit.Server;
2831
import org.bukkit.command.Command;
2932
import org.bukkit.command.PluginCommand;
3033
import org.bukkit.configuration.serialization.ConfigurationSerializable;
3134
import org.bukkit.configuration.serialization.ConfigurationSerialization;
35+
import org.bukkit.permissions.Permission;
36+
import org.bukkit.permissions.PermissionDefault;
3237
import org.bukkit.plugin.Plugin;
3338
import org.bukkit.plugin.java.JavaPlugin;
3439

@@ -44,6 +49,7 @@
4449
import xyz.janboerman.scalaloader.compat.Compat;
4550
import xyz.janboerman.scalaloader.compat.IScalaPluginClassLoader;
4651
import xyz.janboerman.scalaloader.paper.ScalaLoader;
52+
import xyz.janboerman.scalaloader.plugin.ScalaPluginDescription;
4753
import xyz.janboerman.scalaloader.plugin.description.ApiVersion;
4854
import xyz.janboerman.scalaloader.plugin.runtime.ClassDefineResult;
4955
import xyz.janboerman.scalaloader.plugin.runtime.ClassFile;
@@ -98,7 +104,7 @@ public void init(JavaPlugin plugin) {
98104
hackDataFolder();
99105
hackPluginDescriptionFile();
100106
registerCommandsFromPluginYaml();
101-
//TODO maybe in the future I will have to hack the permissions map as well.
107+
registerPermissionsFromPluginYaml(); // is it really necessary to register our permissions with the Paper PluginManager though?
102108

103109
this.persistentClasses = new PersistentClasses(getPlugin());
104110
for (ClassFile classFile : this.persistentClasses.load()) {
@@ -345,6 +351,14 @@ private void registerCommandsFromPluginYaml() {
345351
getServer().getCommandMap().registerAll(getPlugin().getName(), pluginCommands);
346352
}
347353

354+
private void registerPermissionsFromPluginYaml() {
355+
ScalaPluginDescription scalaPluginDescription = getConfiguration().description;
356+
PermissionDefault defaultPermission = scalaPluginDescription.getPermissionDefault();
357+
PaperHacks.getPaperPluginManager().addPermissions(scalaPluginDescription.getPermissions().stream()
358+
.map(descriptionPermission -> toBukkitPermission(descriptionPermission, defaultPermission))
359+
.toList());
360+
}
361+
348362
private static final PluginCommand newPluginCommand(String name, ScalaPlugin plugin) {
349363
try {
350364
Constructor<PluginCommand> ctor = PluginCommand.class.getDeclaredConstructor(String.class, Plugin.class);
@@ -355,4 +369,17 @@ private static final PluginCommand newPluginCommand(String name, ScalaPlugin plu
355369
}
356370
}
357371

372+
private static final Permission toBukkitPermission(xyz.janboerman.scalaloader.plugin.ScalaPluginDescription.Permission descriptionPermission, PermissionDefault defaultPermission) {
373+
return new Permission(descriptionPermission.getName(), descriptionPermission.getDescription().orElse(null), defaultPermission, toBukkitChildren(descriptionPermission.getChildren()));
374+
}
375+
376+
private static final Map<String, Boolean> toBukkitChildren(Map<xyz.janboerman.scalaloader.plugin.ScalaPluginDescription.Permission, Boolean> children) {
377+
if (children == null || children.isEmpty()) return Compat.emptyMap();
378+
LinkedHashMap<String, Boolean> result = new LinkedHashMap<>();
379+
for (var entry : children.entrySet()) {
380+
result.put(entry.getKey().getName(), entry.getValue());
381+
}
382+
return result;
383+
}
384+
358385
}

0 commit comments

Comments
 (0)