RuneHive-Game
Loading...
Searching...
No Matches
PluginManager.java
Go to the documentation of this file.
1package com.runehive.game.plugin;
2
3import com.runehive.game.event.bus.PlayerDataBus;
4import io.github.classgraph.*;
5import org.apache.logging.log4j.LogManager;
6import org.apache.logging.log4j.Logger;
7
8import java.lang.reflect.Constructor;
9import java.util.HashSet;
10import java.util.Set;
11
12/**
13 * This class handles how plugins are loaded/unloaded and accessed.
14 *
15 * @author nshusa
16 */
17public final class PluginManager {
18
19 private static final Logger logger = LogManager.getLogger(PluginManager.class);
20 private static final Set<String> plugins = new HashSet<>();
22
23 private PluginManager() {
24 throw new UnsupportedOperationException();
25 }
26
27 public static void load(final String pkg) {
28 try (final ScanResult scanResult =
29 new ClassGraph()
30 .enableClassInfo()
31 .enableMethodInfo()
32 .acceptPackages(pkg)
33 .scan()) {
34 for (final ClassInfo classInfo : scanResult.getSubclasses(PluginContext.class)) {
35 try {
36 if (!classInfo.isAbstract()) {
37 final MethodInfoList constructorInfos = classInfo.getDeclaredConstructorInfo();
38 final MethodInfo constructorInfo = constructorInfos.get(0);
39 final Constructor<?> constructor = constructorInfo.loadClassAndGetConstructor();
40
41 final Object instance = constructor.newInstance();
42 final PluginContext listener = (PluginContext) instance;
43 listener.onInit();
44 dataBus.subscribe(listener);
45 plugins.add(classInfo.getName());
46 }
47 } catch (Exception ex) {
48 logger.error(String.format("Error loading plugin=%s", classInfo.getSimpleName()), ex);
49 }
50 }
51 }
52 logger.info(String.format("Loaded: %d plugins.", PluginManager.getPluginCount()));
53 }
54
55 public static int getPluginCount() {
56 return plugins.size();
57 }
58
59 public static PlayerDataBus getDataBus() {
60 return dataBus;
61 }
62
63}
The base class that all plugins should extend.
static final Set< String > plugins
static final PlayerDataBus dataBus
static void load(final String pkg)