Fixed mutli-class modules to be unrelodaable
This commit is contained in:
parent
6ad9e5e7e6
commit
b5eebeddab
@ -32,13 +32,14 @@ import net.minecraft.server.v1_11_R1.MinecraftServer;
|
|||||||
/** The module loader, mother of all modules. Responsible for loading and taking care of all modules.
|
/** The module loader, mother of all modules. Responsible for loading and taking care of all modules.
|
||||||
*
|
*
|
||||||
* @author Pepich */
|
* @author Pepich */
|
||||||
@Version(major = 3, minor = 1, revision = 0, compatible = 2)
|
@Version(major = 3, minor = 1, revision = 1, compatible = 2)
|
||||||
public final class ModuleLoader implements CoreModule
|
public final class ModuleLoader implements CoreModule
|
||||||
{
|
{
|
||||||
private static ModuleLoader instance;
|
private static ModuleLoader instance;
|
||||||
private static final HashMap<Module, Boolean> modules = new HashMap<Module, Boolean>();
|
private static final HashMap<Module, Boolean> modules = new HashMap<Module, Boolean>();
|
||||||
private static URL[] urls;
|
private static URL[] urls;
|
||||||
private static URLClassLoader mainLoader;
|
private static URLClassLoader mainLoader;
|
||||||
|
private static HashMap<Module, URLClassLoader> loaders = new HashMap<Module, URLClassLoader>();
|
||||||
|
|
||||||
private ModuleLoader()
|
private ModuleLoader()
|
||||||
{
|
{
|
||||||
@ -306,24 +307,41 @@ public final class ModuleLoader implements CoreModule
|
|||||||
Utils.info("Attempting to load new class definition before disabling and removing the old module:");
|
Utils.info("Attempting to load new class definition before disabling and removing the old module:");
|
||||||
boolean differs = false;
|
boolean differs = false;
|
||||||
Utils.info("Old class definition: Class@" + m.getClass().hashCode());
|
Utils.info("Old class definition: Class@" + m.getClass().hashCode());
|
||||||
ClassLoader delegateParent = Module.class.getClassLoader();
|
ClassLoader delegateParent = mainLoader.getParent();
|
||||||
Class<?> newClass = null;
|
Class<?> newClass = null;
|
||||||
try (URLClassLoader cl = new URLClassLoader(urls, delegateParent))
|
URLClassLoader cl = new URLClassLoader(urls, delegateParent);
|
||||||
|
try
|
||||||
{
|
{
|
||||||
newClass = cl.loadClass(m.getClass().getName());
|
newClass = cl.loadClass(m.getClass().getName());
|
||||||
Utils.info("Found new class definition: Class@" + newClass.hashCode());
|
Utils.info("Found new class definition: Class@" + newClass.hashCode());
|
||||||
differs = m.getClass() != newClass;
|
differs = m.getClass() != newClass;
|
||||||
}
|
}
|
||||||
catch (IOException | ClassNotFoundException e)
|
catch (ClassNotFoundException e)
|
||||||
{
|
{
|
||||||
Utils.error("Could not find a class definition, aborting now!");
|
Utils.error("Could not find a class definition, aborting now!");
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
|
try
|
||||||
|
{
|
||||||
|
cl.close();
|
||||||
|
}
|
||||||
|
catch (IOException e1)
|
||||||
|
{
|
||||||
|
e1.printStackTrace();
|
||||||
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (!differs)
|
if (!differs)
|
||||||
{
|
{
|
||||||
Utils.warn("New class definition equals old definition, are you sure you did everything right?");
|
Utils.warn("New class definition equals old definition, are you sure you did everything right?");
|
||||||
Utils.info("Aborting now...");
|
Utils.info("Aborting now...");
|
||||||
|
try
|
||||||
|
{
|
||||||
|
cl.close();
|
||||||
|
}
|
||||||
|
catch (IOException e)
|
||||||
|
{
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
Utils.info("Found new class definition, attempting to instantiate:");
|
Utils.info("Found new class definition, attempting to instantiate:");
|
||||||
@ -336,6 +354,14 @@ public final class ModuleLoader implements CoreModule
|
|||||||
{
|
{
|
||||||
Utils.error("Could not instantiate the module, aborting!");
|
Utils.error("Could not instantiate the module, aborting!");
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
|
try
|
||||||
|
{
|
||||||
|
cl.close();
|
||||||
|
}
|
||||||
|
catch (IOException e1)
|
||||||
|
{
|
||||||
|
e1.printStackTrace();
|
||||||
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
Utils.info("Instantiated new class definition, checking versions:");
|
Utils.info("Instantiated new class definition, checking versions:");
|
||||||
@ -346,13 +372,30 @@ public final class ModuleLoader implements CoreModule
|
|||||||
if (oldVersion.equals(newVersion))
|
if (oldVersion.equals(newVersion))
|
||||||
{
|
{
|
||||||
Utils.error("Detected equal module versions, aborting now...");
|
Utils.error("Detected equal module versions, aborting now...");
|
||||||
|
try
|
||||||
|
{
|
||||||
|
cl.close();
|
||||||
|
}
|
||||||
|
catch (IOException e)
|
||||||
|
{
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
Utils.info("Versions differ, disabling old module:");
|
Utils.info("Versions differ, disabling old module:");
|
||||||
disableModule(m);
|
disableModule(m);
|
||||||
Utils.info("Disabled module, overriding the implementation:");
|
Utils.info("Disabled module, overriding the implementation:");
|
||||||
modules.remove(m);
|
modules.remove(m);
|
||||||
|
try
|
||||||
|
{
|
||||||
|
loaders.remove(m).close();
|
||||||
|
}
|
||||||
|
catch (IOException e)
|
||||||
|
{
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
modules.put(module, false);
|
modules.put(module, false);
|
||||||
|
loaders.put(module, cl);
|
||||||
Utils.info("Successfully updated class definition. Enabling new implementation:");
|
Utils.info("Successfully updated class definition. Enabling new implementation:");
|
||||||
enableLoadedModule(module);
|
enableLoadedModule(module);
|
||||||
Object[] newStatus = getServerStatus();
|
Object[] newStatus = getServerStatus();
|
||||||
|
Reference in New Issue
Block a user