package com.nicewuerfel.blockown.command; import com.nicewuerfel.blockown.BlockOwn; import com.nicewuerfel.blockown.Message; import com.nicewuerfel.blockown.Setting; import com.nicewuerfel.blockown.database.Database; import com.nicewuerfel.blockown.importer.Importer; import com.nicewuerfel.blockown.importer.ImporterException; import com.nicewuerfel.blockown.output.Output; import com.nicewuerfel.blockown.protection.Protection; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import java.io.File; import java.lang.reflect.InvocationTargetException; import java.net.MalformedURLException; import java.net.URL; import java.net.URLClassLoader; public class CE_Import extends CommandExecutor { private final ClassLoader externalImportClassLoader; private final boolean folderAccess; public CE_Import(Setting setting, Database database, Protection protection, File importerFolder) { super(setting, database, protection); URL url = null; try { url = importerFolder.toURI().toURL(); } catch (MalformedURLException e) { getOutput().printException("Error accessing Importer folder, import command unavailable", e); folderAccess = false; externalImportClassLoader = null; return; } externalImportClassLoader = URLClassLoader.newInstance(new URL[]{url}, BlockOwn.class.getClassLoader()); folderAccess = true; } @Override public boolean onCommand(final CommandSender sender, Command cmd, String cmdName, String[] args) { if (!folderAccess) { sender.sendMessage(Message.COMMAND_IMPORT_UNAVAILABLE.getMessage()); return false; } if (!isConsole(sender)) { return true; } if (args.length != 1) { return false; } Class<? extends Importer> importerClass; try { importerClass = findClass(args[0]); } catch (ClassNotFoundException e) { getOutput().printException("No matching importer found", e); return false; } try { Importer importer = importerClass.getConstructor(Output.class, Database.class, File.class, Runnable.class) .newInstance(getOutput(), database, new File("plugins"), new Runnable() { @Override public void run() { sender.sendMessage(Message.COMMAND_IMPORT_SUCCESS.getMessage()); } }); Thread importThread = new Thread(importer, "Import Thread"); sender.sendMessage(Message.COMMAND_IMPORT_START.getMessage()); importThread.start(); return true; } catch (InstantiationException | IllegalAccessException | InvocationTargetException | NoSuchMethodException | SecurityException e) { getOutput().printException("There probably was an error in the requested importer class", e); return false; } catch (ImporterException e) { getOutput().printException(e.getMessage(), e); return false; } } @SuppressWarnings("unchecked") private Class<? extends Importer> findClass(String name) throws ClassNotFoundException { Class<? extends Importer> result = null; try { Class<?> found = Class.forName("de.pheasn.blockown.importer." + name); if (Importer.class.isAssignableFrom(found) && !found.isInterface()) { result = (Class<? extends Importer>) found; } } catch (ClassNotFoundException e) { if (externalImportClassLoader != null) { Class<?> found = externalImportClassLoader.loadClass(name); if (Importer.class.isAssignableFrom(found) && !found.isInterface()) { result = (Class<? extends Importer>) found; } } } if (result == null) { throw new ClassNotFoundException(); } return result; } }