From a4acf1509444e61c1109f271724f80a0ef42738e Mon Sep 17 00:00:00 2001 From: Olof Larsson Date: Tue, 19 Apr 2016 12:00:56 +0200 Subject: [PATCH] MassiveCore - Lazy Active by Reflection. Solves unwanted early instance creation. --- src/com/massivecraft/massivecore/Active.java | 7 ++ src/com/massivecraft/massivecore/Engine.java | 11 ++- .../massivecraft/massivecore/MassiveCore.java | 91 +++++++++---------- .../massivecore/MassivePlugin.java | 31 ++++++- .../massivecore/command/MassiveCommand.java | 9 ++ .../massivecraft/massivecore/store/Coll.java | 8 +- .../massivecraft/massivecore/store/Colls.java | 7 ++ .../massivecore/util/ReflectionUtil.java | 13 +++ 8 files changed, 123 insertions(+), 54 deletions(-) diff --git a/src/com/massivecraft/massivecore/Active.java b/src/com/massivecraft/massivecore/Active.java index e3ba4fb2..a1f1126e 100644 --- a/src/com/massivecraft/massivecore/Active.java +++ b/src/com/massivecraft/massivecore/Active.java @@ -2,10 +2,17 @@ package com.massivecraft.massivecore; public interface Active { + // Boolean public boolean isActive(); public void setActive(boolean active); + // Plugin public MassivePlugin setActivePlugin(MassivePlugin plugin); public MassivePlugin getActivePlugin(); + // Combined Setter + // Plugin is set first. + // Boolean by null state. + public void setActive(MassivePlugin plugin); + } diff --git a/src/com/massivecraft/massivecore/Engine.java b/src/com/massivecraft/massivecore/Engine.java index 4820e54b..b5cdd7d8 100644 --- a/src/com/massivecraft/massivecore/Engine.java +++ b/src/com/massivecraft/massivecore/Engine.java @@ -74,9 +74,9 @@ public abstract class Engine implements Active, Listener, Runnable } @Override - public MassivePlugin setActivePlugin(MassivePlugin activePlugin) + public MassivePlugin setActivePlugin(MassivePlugin plugin) { - this.setPluginSoft(activePlugin); + this.setPluginSoft(plugin); return null; } @@ -86,6 +86,13 @@ public abstract class Engine implements Active, Listener, Runnable return this.getPlugin(); } + @Override + public void setActive(MassivePlugin plugin) + { + this.setActivePlugin(plugin); + this.setActive(plugin != null); + } + // -------------------------------------------- // // ACTIVE > EVENTS // -------------------------------------------- // diff --git a/src/com/massivecraft/massivecore/MassiveCore.java b/src/com/massivecraft/massivecore/MassiveCore.java index 14c18b44..5c2c69a0 100644 --- a/src/com/massivecraft/massivecore/MassiveCore.java +++ b/src/com/massivecraft/massivecore/MassiveCore.java @@ -205,62 +205,59 @@ public class MassiveCore extends MassivePlugin // Activate this.activate( // Coll - MultiverseColl.get(), - AspectColl.get(), - MassiveCoreMConfColl.get(), - MassiveCoreMSponsorInfoColl.get(), + MultiverseColl.class, + AspectColl.class, + MassiveCoreMConfColl.class, + MassiveCoreMSponsorInfoColl.class, // Engine - EngineMassiveCoreChestGui.get(), - EngineMassiveCoreCollTick.get(), - EngineMassiveCoreCommandRegistration.get(), - EngineMassiveCoreDatabase.get(), - EngineMassiveCoreDestination.get(), - EngineMassiveCoreGank.get(), - EngineMassiveCoreMain.get(), - EngineMassiveCorePlayerLeave.get(), - EngineMassiveCorePlayerState.get(), - EngineMassiveCorePlayerUpdate.get(), - EngineMassiveCoreScheduledTeleport.get(), - EngineMassiveCoreTeleportMixinCause.get(), - EngineMassiveCoreVariable.get(), - EngineMassiveCoreWorldNameSet.get(), - EngineMassiveCoreSponsor.get(), + EngineMassiveCoreChestGui.class, + EngineMassiveCoreCollTick.class, + EngineMassiveCoreCommandRegistration.class, + EngineMassiveCoreDatabase.class, + EngineMassiveCoreDestination.class, + EngineMassiveCoreGank.class, + EngineMassiveCoreMain.class, + EngineMassiveCorePlayerLeave.class, + EngineMassiveCorePlayerState.class, + EngineMassiveCorePlayerUpdate.class, + EngineMassiveCoreScheduledTeleport.class, + EngineMassiveCoreTeleportMixinCause.class, + EngineMassiveCoreVariable.class, + EngineMassiveCoreWorldNameSet.class, + EngineMassiveCoreSponsor.class, // Util - PlayerUtil.get(), + PlayerUtil.class, // Integration - IntegrationVault.get() - ); - - // NOTE: Some commands rely on the MConf being loaded at construction. - this.activate( + IntegrationVault.class, + // Command - CmdMassiveCore.get(), - CmdMassiveCoreUsys.get(), - CmdMassiveCoreStore.get(), - CmdMassiveCoreBuffer.get(), - CmdMassiveCoreCmdurl.get(), - CmdMassiveCoreClick.get(), + CmdMassiveCore.class, + CmdMassiveCoreUsys.class, + CmdMassiveCoreStore.class, + CmdMassiveCoreBuffer.class, + CmdMassiveCoreCmdurl.class, + CmdMassiveCoreClick.class, // Mixin - MixinEvent.get(), // NOTE: Should be first - MixinActionbar.get(), - MixinActual.get(), - MixinCommand.get(), - MixinDisplayName.get(), - MixinGamemode.get(), - MixinInventory.get(), - MixinKick.get(), - MixinMessage.get(), - MixinModification.get(), - MixinPlayed.get(), - MixinSenderPs.get(), - MixinTeleport.get(), - MixinTitle.get(), - MixinVisibility.get(), - MixinWorld.get() + MixinEvent.class, // NOTE: Should be first + MixinActionbar.class, + MixinActual.class, + MixinCommand.class, + MixinDisplayName.class, + MixinGamemode.class, + MixinInventory.class, + MixinKick.class, + MixinMessage.class, + MixinModification.class, + MixinPlayed.class, + MixinSenderPs.class, + MixinTeleport.class, + MixinTitle.class, + MixinVisibility.class, + MixinWorld.class ); // Start the examine threads diff --git a/src/com/massivecraft/massivecore/MassivePlugin.java b/src/com/massivecraft/massivecore/MassivePlugin.java index fd920b9d..1c14209e 100644 --- a/src/com/massivecraft/massivecore/MassivePlugin.java +++ b/src/com/massivecraft/massivecore/MassivePlugin.java @@ -12,6 +12,7 @@ import org.bukkit.plugin.java.JavaPlugin; import com.massivecraft.massivecore.command.MassiveCommand; import com.massivecraft.massivecore.store.Coll; +import com.massivecraft.massivecore.util.ReflectionUtil; import com.massivecraft.massivecore.util.Txt; import com.massivecraft.massivecore.xlib.gson.Gson; import com.massivecraft.massivecore.xlib.gson.GsonBuilder; @@ -170,15 +171,37 @@ public abstract class MassivePlugin extends JavaPlugin implements Listener, Name Bukkit.getPluginManager().disablePlugin(this); } - public void activate(Active... actives) + public void activate(Object... objects) { - for (Active active : actives) + for (Object object : objects) { - active.setActivePlugin(this); - active.setActive(true); + Active active = asActive(object); + active.setActive(this); } } + private static Active asActive(Object object) + { + if (object instanceof Active) + { + return (Active)object; + } + + if (object instanceof Class) + { + Class clazz = (Class)object; + if ( ! Active.class.isAssignableFrom(clazz)) throw new IllegalArgumentException("Not Active Class: " + (clazz == null ? "NULL" : clazz)); + + Object instance = ReflectionUtil.getSingletonInstance(clazz); + if ( ! (instance instanceof Active)) throw new IllegalArgumentException("Not Active Instance: " + (instance == null ? "NULL" : instance) + " for object: " + (object == null ? "NULL" : object)); + + Active active = (Active)instance; + return active; + } + + throw new IllegalArgumentException("Neither Active nor Class: " + object); + } + // -------------------------------------------- // // LOGGING // -------------------------------------------- // diff --git a/src/com/massivecraft/massivecore/command/MassiveCommand.java b/src/com/massivecraft/massivecore/command/MassiveCommand.java index e6cb08e7..0076c6a3 100644 --- a/src/com/massivecraft/massivecore/command/MassiveCommand.java +++ b/src/com/massivecraft/massivecore/command/MassiveCommand.java @@ -85,6 +85,7 @@ public class MassiveCommand implements Active, PluginIdentifiableCommand // NOTE: Not Implemented } + @Override public MassivePlugin setActivePlugin(MassivePlugin activePlugin) { if (activePlugin == null) @@ -97,11 +98,19 @@ public class MassiveCommand implements Active, PluginIdentifiableCommand } } + @Override public MassivePlugin getActivePlugin() { return registry.get(this); } + @Override + public void setActive(MassivePlugin plugin) + { + this.setActivePlugin(plugin); + this.setActive(plugin != null); + } + // -------------------------------------------- // // PLUGIN IDENTIFIABLE COMMAND // -------------------------------------------- // diff --git a/src/com/massivecraft/massivecore/store/Coll.java b/src/com/massivecraft/massivecore/store/Coll.java index 806cd005..e38931f5 100644 --- a/src/com/massivecraft/massivecore/store/Coll.java +++ b/src/com/massivecraft/massivecore/store/Coll.java @@ -1033,7 +1033,13 @@ public class Coll> extends CollAbstract { return name2instance.containsKey(this.getName()); } - + + @Override + public void setActive(MassivePlugin plugin) + { + this.setActivePlugin(plugin); + this.setActive(plugin != null); + } // -------------------------------------------- // // NAME UTILITIES diff --git a/src/com/massivecraft/massivecore/store/Colls.java b/src/com/massivecraft/massivecore/store/Colls.java index 7f1f9f35..23227e7d 100644 --- a/src/com/massivecraft/massivecore/store/Colls.java +++ b/src/com/massivecraft/massivecore/store/Colls.java @@ -73,6 +73,13 @@ public abstract class Colls, E extends Entity> implements A return this.plugin; } + @Override + public void setActive(MassivePlugin plugin) + { + this.setActivePlugin(plugin); + this.setActive(plugin != null); + } + // -------------------------------------------- // // UTIL // -------------------------------------------- // diff --git a/src/com/massivecraft/massivecore/util/ReflectionUtil.java b/src/com/massivecraft/massivecore/util/ReflectionUtil.java index 843c128b..45adaf0e 100644 --- a/src/com/massivecraft/massivecore/util/ReflectionUtil.java +++ b/src/com/massivecraft/massivecore/util/ReflectionUtil.java @@ -122,6 +122,19 @@ public class ReflectionUtil return (T) invokeMethod(method, target, EMPTY_ARRAY_OF_OBJECT); } + // -------------------------------------------- // + // SINGLETON INSTANCE + // -------------------------------------------- // + + public static T getSingletonInstance(Class clazz) + { + Method get = getMethod(clazz, "get"); + T ret = invokeMethod(get, null); + if (ret == null) throw new NullPointerException("Singleton instance was null for: " + clazz); + if ( ! clazz.isAssignableFrom(ret.getClass())) throw new IllegalStateException("Singleton instance was not of same or subclass for: " + clazz); + return ret; + } + // -------------------------------------------- // // FIELD > GET // -------------------------------------------- //