A long time for stop developing minecraft plugins due to busy about university and side works. Coming back from a long learning journey, i decide to recode my personal minecraft api for upcoming new server. Found that the code now i can build it with more structural design pattern. Such as MinecraftAPI interface class for runtime reloadable content.
package me.oska.core.abs;
public interface MinecraftAPI
{
void register();
void unregister();
void intialise();
void teardown();
}
Also i have updated my reader utility code for reading jar class with functional interface make it more flexible.
package me.oska.core.util;
import me.oska.core.OskaCore;
import me.oska.core.lambda.VoidAction;
import org.apache.commons.io.FilenameUtils;
import java.io.File;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.Enumeration;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;
public class ReaderUtil
{
public static void readJAR(File folder, VoidAction<Class<?>> action)
{
for (File file : folder.listFiles())
{
if (file.isDirectory())
{
readJAR(file, action);
}
else if (file.isFile())
{
if (FilenameUtils.getExtension(file.getName()).equalsIgnoreCase("jar"))
{
try
{
JarFile jarfile = new JarFile(file);
Enumeration<JarEntry> entry = jarfile.entries();
URL[] urls = { new URL("jar:file:" + file.getPath() + "!/") };
URLClassLoader cl = URLClassLoader.newInstance(urls, OskaCore.ins.getClass().getClassLoader());
while (entry.hasMoreElements())
{
JarEntry je = entry.nextElement();
if (je.isDirectory() || !je.getName().endsWith(".class"))
{
continue;
}
String classname = je.getName().substring(0, je.getName().length() - 6);
classname = classname.replace('/', '.');
Class clazz = Class.forName(classname, true, cl);
action.run(clazz);
}
cl.close();
jarfile.close();
}
catch (Exception ex)
{
OskaCore.ins.getLogger().severe("Fail when loading from '" + file.getName() + "'");
ex.printStackTrace();
}
}
}
}
}
}