package pl.shockah.shocky; import java.io.File; import java.net.URL; import java.net.URLClassLoader; import java.util.ArrayList; import java.util.Collections; import java.util.List; public abstract class ModuleLoader { protected List<Module> modules = Collections.synchronizedList(new ArrayList<Module>()); protected Module loadModule(ModuleSource<?> source) { Module m = load(source); if (m != null) modules.add(m); return m; } protected void unloadModule(Module module) { if (modules.contains(module)) modules.remove(module); } public void unloadAllModules() { while (!modules.isEmpty()) modules.get(0).unload(); } protected abstract boolean accept(ModuleSource<?> source); protected abstract Module load(ModuleSource<?> source); public static class Java extends ModuleLoader { protected boolean accept(ModuleSource<?> source) { return source.source instanceof File || source.source instanceof URL; } protected Module load(ModuleSource<?> source) { Module module = null; try { String moduleName = null; URLClassLoader loader = null; if (source.source instanceof File) { File file = (File)source.source; moduleName = file.getName(); if (moduleName.endsWith(".class")) moduleName = new StringBuilder(moduleName).reverse().delete(0,6).reverse().toString(); else return null; if (moduleName.contains("$")) return null; loader = new URLClassLoader(new URL[]{file.getParentFile().toURI().toURL()}); } else if (source.source instanceof URL) { URL url = (URL)source.source; moduleName = url.toString(); StringBuilder sb = new StringBuilder(moduleName).reverse(); moduleName = new StringBuilder(sb.substring(0,sb.indexOf("/"))).reverse().toString(); String modulePath = new StringBuilder(url.toString()).delete(0,url.toString().length()-moduleName.length()).toString(); if (moduleName.endsWith(".class")) moduleName = new StringBuilder(moduleName).reverse().delete(0,6).reverse().toString(); else return null; if (moduleName.contains("$")) return null; loader = new URLClassLoader(new URL[]{new URL(modulePath)}); } if (loader != null && moduleName != null) { Class<?> c = loader.loadClass(moduleName); if (c != null && Module.class.isAssignableFrom(c)) module = (Module)c.newInstance(); //loader.close(); } } catch (Exception e) {e.printStackTrace();} return module; } } }