Pre-instantiate commands.

This commit makes use of the `register(Command)` method in MobArena's
command handler to pre-instantiate the command classes and inject the
main plugin instance in their constructors. This allows us to get rid of
the horrible Singleton anti-pattern.

Closes #6
This commit is contained in:
Andreas Troelsen
2021-08-06 22:12:56 +02:00
parent 1756a08318
commit 7e08fde493
7 changed files with 42 additions and 45 deletions
@@ -37,12 +37,6 @@ import java.util.logging.Level;
public class MobArenaStatsPlugin extends JavaPlugin implements MobArenaStats { public class MobArenaStatsPlugin extends JavaPlugin implements MobArenaStats {
// The sad state of affairs is that MobArena's command framework has no
// support for registering commands by instance, but only by class, which
// means that we can't properly inject dependencies and have to resort to
// the Singleton Pattern.
private static MobArenaStats instance;
private StatsStoreRegistry statsStoreRegistry; private StatsStoreRegistry statsStoreRegistry;
private Executor syncExecutor; private Executor syncExecutor;
@@ -78,8 +72,6 @@ public class MobArenaStatsPlugin extends JavaPlugin implements MobArenaStats {
private void setup() { private void setup() {
try { try {
instance = this;
createDataFolder(); createDataFolder();
createConfigFile(); createConfigFile();
setupExecutors(); setupExecutors();
@@ -128,14 +120,14 @@ public class MobArenaStatsPlugin extends JavaPlugin implements MobArenaStats {
CommandHandler handler = (CommandHandler) command.getExecutor(); CommandHandler handler = (CommandHandler) command.getExecutor();
// User commands // User commands
handler.register(ArenaStatsCommand.class); handler.register(new ArenaStatsCommand(this));
handler.register(GlobalStatsCommand.class); handler.register(new GlobalStatsCommand(this));
handler.register(PlayerStatsCommand.class); handler.register(new PlayerStatsCommand(this));
// Admin commands // Admin commands
handler.register(DeleteSessionStatsCommand.class); handler.register(new DeleteSessionStatsCommand(this));
handler.register(ExportCommand.class); handler.register(new ExportCommand(this));
handler.register(ImportCommand.class); handler.register(new ImportCommand(this));
} }
private void setupMetrics() { private void setupMetrics() {
@@ -207,8 +199,4 @@ public class MobArenaStatsPlugin extends JavaPlugin implements MobArenaStats {
return statsStore; return statsStore;
} }
public static MobArenaStats getInstance() {
return instance;
}
} }
@@ -8,7 +8,6 @@ import com.garbagemule.MobArena.util.Slugs;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.mobarena.stats.MobArenaStats; import org.mobarena.stats.MobArenaStats;
import org.mobarena.stats.MobArenaStatsPlugin;
import org.mobarena.stats.store.ArenaStats; import org.mobarena.stats.store.ArenaStats;
import org.mobarena.stats.store.StatsStore; import org.mobarena.stats.store.StatsStore;
@@ -29,11 +28,14 @@ import static org.bukkit.ChatColor.YELLOW;
) )
public class ArenaStatsCommand implements Command { public class ArenaStatsCommand implements Command {
private final MobArenaStats plugin;
public ArenaStatsCommand(MobArenaStats plugin) {
this.plugin = plugin;
}
@Override @Override
public boolean execute(ArenaMaster am, CommandSender sender, String... args) { public boolean execute(ArenaMaster am, CommandSender sender, String... args) {
// :(
MobArenaStats plugin = MobArenaStatsPlugin.getInstance();
if (args.length < 1) { if (args.length < 1) {
return false; return false;
} }
@@ -8,7 +8,6 @@ import org.bukkit.ChatColor;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.mobarena.stats.MobArenaStats; import org.mobarena.stats.MobArenaStats;
import org.mobarena.stats.MobArenaStatsPlugin;
import org.mobarena.stats.store.StatsStore; import org.mobarena.stats.store.StatsStore;
import java.util.List; import java.util.List;
@@ -23,11 +22,14 @@ import java.util.UUID;
) )
public class DeleteSessionStatsCommand implements Command { public class DeleteSessionStatsCommand implements Command {
private final MobArenaStats plugin;
public DeleteSessionStatsCommand(MobArenaStats plugin) {
this.plugin = plugin;
}
@Override @Override
public boolean execute(ArenaMaster am, CommandSender sender, String... args) { public boolean execute(ArenaMaster am, CommandSender sender, String... args) {
// :(
MobArenaStats plugin = MobArenaStatsPlugin.getInstance();
// TODO: check args, handle non-UUID input error // TODO: check args, handle non-UUID input error
UUID sessionId = UUID.fromString(args[0]); UUID sessionId = UUID.fromString(args[0]);
@@ -7,7 +7,6 @@ import com.garbagemule.MobArena.framework.ArenaMaster;
import org.bukkit.ChatColor; import org.bukkit.ChatColor;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import org.mobarena.stats.MobArenaStats; import org.mobarena.stats.MobArenaStats;
import org.mobarena.stats.MobArenaStatsPlugin;
import org.mobarena.stats.store.StatsExport; import org.mobarena.stats.store.StatsExport;
import org.mobarena.stats.store.StatsStore; import org.mobarena.stats.store.StatsStore;
import org.mobarena.stats.store.StatsStoreRegistry; import org.mobarena.stats.store.StatsStoreRegistry;
@@ -21,11 +20,14 @@ import org.mobarena.stats.store.StatsStoreRegistry;
) )
public class ExportCommand implements Command { public class ExportCommand implements Command {
private final MobArenaStats plugin;
public ExportCommand(MobArenaStats plugin) {
this.plugin = plugin;
}
@Override @Override
public boolean execute(ArenaMaster am, CommandSender sender, String... args) { public boolean execute(ArenaMaster am, CommandSender sender, String... args) {
// :(
MobArenaStats plugin = MobArenaStatsPlugin.getInstance();
StatsStore store = plugin.getStatsStore(); StatsStore store = plugin.getStatsStore();
StatsStoreRegistry registry = plugin.getStatsStoreRegistry(); StatsStoreRegistry registry = plugin.getStatsStoreRegistry();
@@ -6,7 +6,6 @@ import com.garbagemule.MobArena.commands.CommandInfo;
import com.garbagemule.MobArena.framework.ArenaMaster; import com.garbagemule.MobArena.framework.ArenaMaster;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import org.mobarena.stats.MobArenaStats; import org.mobarena.stats.MobArenaStats;
import org.mobarena.stats.MobArenaStatsPlugin;
import org.mobarena.stats.store.GlobalStats; import org.mobarena.stats.store.GlobalStats;
import org.mobarena.stats.store.StatsStore; import org.mobarena.stats.store.StatsStore;
@@ -27,11 +26,14 @@ import static org.bukkit.ChatColor.YELLOW;
) )
public class GlobalStatsCommand implements Command { public class GlobalStatsCommand implements Command {
private final MobArenaStats plugin;
public GlobalStatsCommand(MobArenaStats plugin) {
this.plugin = plugin;
}
@Override @Override
public boolean execute(ArenaMaster am, CommandSender sender, String... args) { public boolean execute(ArenaMaster am, CommandSender sender, String... args) {
// :(
MobArenaStats plugin = MobArenaStatsPlugin.getInstance();
Messenger messenger = am.getGlobalMessenger(); Messenger messenger = am.getGlobalMessenger();
plugin.getAsyncExecutor().execute(() -> { plugin.getAsyncExecutor().execute(() -> {
StatsStore store = plugin.getStatsStore(); StatsStore store = plugin.getStatsStore();
@@ -8,7 +8,6 @@ import org.bukkit.ChatColor;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.mobarena.stats.MobArenaStats; import org.mobarena.stats.MobArenaStats;
import org.mobarena.stats.MobArenaStatsPlugin;
import org.mobarena.stats.store.StatsExport; import org.mobarena.stats.store.StatsExport;
import org.mobarena.stats.store.StatsImport; import org.mobarena.stats.store.StatsImport;
import org.mobarena.stats.store.StatsStore; import org.mobarena.stats.store.StatsStore;
@@ -30,15 +29,18 @@ import java.util.stream.Collectors;
) )
public class ImportCommand implements Command { public class ImportCommand implements Command {
private final MobArenaStats plugin;
public ImportCommand(MobArenaStats plugin) {
this.plugin = plugin;
}
@Override @Override
public boolean execute(ArenaMaster am, CommandSender sender, String... args) { public boolean execute(ArenaMaster am, CommandSender sender, String... args) {
if (args.length < 1) { if (args.length < 1) {
return false; return false;
} }
// :(
MobArenaStats plugin = MobArenaStatsPlugin.getInstance();
Path data = plugin.getDataFolder().toPath(); Path data = plugin.getDataFolder().toPath();
Path file = data.resolve(args[0]); Path file = data.resolve(args[0]);
if (!Files.exists(file)) { if (!Files.exists(file)) {
@@ -110,9 +112,6 @@ public class ImportCommand implements Command {
return Collections.emptyList(); return Collections.emptyList();
} }
// :(
MobArenaStats plugin = MobArenaStatsPlugin.getInstance();
String[] files = plugin.getDataFolder().list(); String[] files = plugin.getDataFolder().list();
if (files == null || files.length == 0) { if (files == null || files.length == 0) {
return Collections.emptyList(); return Collections.emptyList();
@@ -7,7 +7,6 @@ import com.garbagemule.MobArena.framework.ArenaMaster;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.mobarena.stats.MobArenaStats; import org.mobarena.stats.MobArenaStats;
import org.mobarena.stats.MobArenaStatsPlugin;
import org.mobarena.stats.store.PlayerStats; import org.mobarena.stats.store.PlayerStats;
import org.mobarena.stats.store.StatsStore; import org.mobarena.stats.store.StatsStore;
@@ -28,11 +27,14 @@ import static org.bukkit.ChatColor.YELLOW;
) )
public class PlayerStatsCommand implements Command { public class PlayerStatsCommand implements Command {
private final MobArenaStats plugin;
public PlayerStatsCommand(MobArenaStats plugin) {
this.plugin = plugin;
}
@Override @Override
public boolean execute(ArenaMaster am, CommandSender sender, String... args) { public boolean execute(ArenaMaster am, CommandSender sender, String... args) {
// :(
MobArenaStats plugin = MobArenaStatsPlugin.getInstance();
String name; String name;
if (args.length == 0) { if (args.length == 0) {
if (!(sender instanceof Player)) { if (!(sender instanceof Player)) {