From b70e2994c2808979354e3d341ffaa2ce60c2abac Mon Sep 17 00:00:00 2001 From: InterVi Date: Sun, 19 Nov 2017 13:58:42 +0300 Subject: [PATCH] =?UTF-8?q?=D0=B4=D0=BE=D1=80=D0=B0=D0=B1=D0=BE=D1=82?= =?UTF-8?q?=D0=BA=D0=B0=20=D0=B4=D0=BE=D0=BA=D1=83=D0=BC=D0=B5=D0=BD=D1=82?= =?UTF-8?q?=D0=B0=D1=86=D0=B8=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 15 ++- .../intervi/jsplugins/api/PluginListener.java | 37 +++++++ .../intervi/jsplugins/api/SimplePlugin.java | 3 + .../jsplugins/manager/PluginManager.java | 104 +++++++++++++++++- 4 files changed, 156 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index f1bbeb5..a589b62 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,16 @@ # JSPlugins -Easy plugin system libray. +Простая система плагинов, которая может быть как встроенной библиотекой, так и самостоятельным приложением. -**[JavaDoc](https://intervi.github.io/JSPlugins/)** +**[JavaDoc](https://intervi.github.io/jsplugins/)** + +## Команды + +* **exit** - выгрузить все плагины и выйти +* **load** *[path to jar]* - загрузить плагин +* **unload** *[plugin name]* - выгрузить плагин +* **reload** *[plugin name]* - перезагрузить плагин +* **plugins** - список плагинов +* **info** *[plugin name]* - информация о плагине +* **cmds** *[plugin name]* - команды плагина +* **help** - вывод справки diff --git a/src/ru/intervi/jsplugins/api/PluginListener.java b/src/ru/intervi/jsplugins/api/PluginListener.java index 111728a..9cfa494 100644 --- a/src/ru/intervi/jsplugins/api/PluginListener.java +++ b/src/ru/intervi/jsplugins/api/PluginListener.java @@ -5,18 +5,55 @@ import ru.intervi.jsplugins.manager.PluginManager; +/** + * интерфейс плагина + */ public interface PluginListener { + /** название плагина */ public String getName(); + /** версия плагина */ public int getVersion(); + /** имя автора */ public String getAuthor(); + /** почта автора */ public String getAuthorEmail(); + /** страница плагина или автора */ public String getAuthorURL(); + /** описание плагина */ public String getDescription(); + /** + * событие загрузки плагина + * @param manager + */ public void onLoad(PluginManager manager); + /** + * событие загрузки другого плагина + * @param plugin + */ public void onLoadedNewPlugin(PluginListener plugin); + /** + * событие выгрузки другого плагина + * @param plugin + */ public void onUnloadPlugin(PluginListener plugin); + /** событие выгрузки плагина */ public void onUnload(); + /** + * обработка команды + * @param message команда + * @param args аргументы + * @return вывод пользователю + */ public String onCommand(String message, String[] args); + /** + * команды плагина + * @return ключ - команда, значение - описание + */ public Map getCommands(); + /** + * универсальный метод для взаимодействия плагинов между собой + * @param data + * @return + */ public List communicate(List data); } \ No newline at end of file diff --git a/src/ru/intervi/jsplugins/api/SimplePlugin.java b/src/ru/intervi/jsplugins/api/SimplePlugin.java index f9d2ec6..89dabba 100644 --- a/src/ru/intervi/jsplugins/api/SimplePlugin.java +++ b/src/ru/intervi/jsplugins/api/SimplePlugin.java @@ -5,6 +5,9 @@ import ru.intervi.jsplugins.manager.PluginManager; +/** + * класс-заглушка, чтобы не реализовывать не нужные методы + */ public class SimplePlugin implements PluginListener { public String getName() { return "SimplePlugin"; diff --git a/src/ru/intervi/jsplugins/manager/PluginManager.java b/src/ru/intervi/jsplugins/manager/PluginManager.java index 55f1f95..1e53a85 100644 --- a/src/ru/intervi/jsplugins/manager/PluginManager.java +++ b/src/ru/intervi/jsplugins/manager/PluginManager.java @@ -14,6 +14,9 @@ import ru.intervi.jsplugins.api.InvalidPluginException; import ru.intervi.jsplugins.api.PluginListener; +/** + * управление плагинами + */ public class PluginManager { public PluginManager() { STANDALONE = false; @@ -27,6 +30,16 @@ public PluginManager(Main main) { private ConcurrentHashMap cmdsMap = new ConcurrentHashMap(); private final boolean STANDALONE; + /** + * загрузить плагин + * @param path + * @throws NullPointerException + * @throws IOException + * @throws InvalidPluginException + * @throws ClassNotFoundException + * @throws InstantiationException + * @throws IllegalAccessException + */ public void loadPlugin(File path) throws NullPointerException, IOException, InvalidPluginException, ClassNotFoundException, InstantiationException, IllegalAccessException { if (!path.isFile()) throw new NullPointerException("not found: " + path.getAbsolutePath()); URLClassLoader loader = new URLClassLoader(new URL[] {path.toURI().toURL()}); @@ -47,20 +60,54 @@ public void loadPlugin(File path) throws NullPointerException, IOException, Inva } finally {loader.close();} } + /** + * загрузить плагин + * @param path + * @throws NullPointerException + * @throws IOException + * @throws InvalidPluginException + * @throws ClassNotFoundException + * @throws InstantiationException + * @throws IllegalAccessException + */ public void loadPlugin(String path) throws NullPointerException, IOException, InvalidPluginException, ClassNotFoundException, InstantiationException, IllegalAccessException { loadPlugin(new File(path)); } + /** + * перезагрузить плагин + * @param plugin + * @throws NullPointerException + * @throws ClassNotFoundException + * @throws InstantiationException + * @throws IllegalAccessException + * @throws IOException + * @throws InvalidPluginException + */ public void reloadPlugin(PluginListener plugin) throws NullPointerException, ClassNotFoundException, InstantiationException, IllegalAccessException, IOException, InvalidPluginException { File path = new File(plugin.getClass().getProtectionDomain().getCodeSource().getLocation().getPath()); unloadPlugin(plugin); loadPlugin(path); } + /** + * перезагрузить плагин + * @param name + * @throws NullPointerException + * @throws ClassNotFoundException + * @throws InstantiationException + * @throws IllegalAccessException + * @throws IOException + * @throws InvalidPluginException + */ public void reloadPlugin(String name) throws NullPointerException, ClassNotFoundException, InstantiationException, IllegalAccessException, IOException, InvalidPluginException { reloadPlugin(map.get(name)); } + /** + * выгрузить плагин + * @param plugin + */ public void unloadPlugin(PluginListener plugin) { plugin.onUnload(); for (PluginListener p : map.values()) p.onUnloadPlugin(plugin); @@ -69,50 +116,105 @@ public void unloadPlugin(PluginListener plugin) { if (STANDALONE) Main.LOGGER.warning(plugin.getName() + " unloaded"); } + /** + * выгрузить плагин + * @param name + */ public void unloadPlugin(String name) { unloadPlugin(map.get(name)); } + /** + * проверка плагина на валидность + * @param path + * @return + */ public boolean isValidPlugin(File path) { - return true; + return true; //будет написано позже } + /** + * проверка плагина на валидность + * @param path + * @return + */ public boolean isValidPlugin(String path) { return isValidPlugin(new File(path)); } + /** + * проверка, загружен ли плагин + * @param plugin + * @return true если да + */ public boolean hasPlugin(PluginListener plugin) { return map.containsValue(plugin); } + /** + * проверка, загружен ли плагин + * @param name + * @return true если да + */ public boolean hasPlugin(String name) { return map.containsKey(name); } + /** + * получить плагин по названию + * @param name + * @return + */ public PluginListener getPluginFromName(String name) { return map.get(name); } + /** + * получить все плагины + * @return + */ public Collection getPlugins() { return map.values(); } + /** + * проверка, есть ли загруженные плагины + * @return true если да + */ public boolean isEmpty() { return map.isEmpty(); } + /** + * количество загруженных плагинов + * @return + */ public int size() { return map.size(); } + /** + * получить директорию с плагинами + * @return + */ public static File getPluginsFolder() { return new File('.' + File.separatorChar + "plugins"); } + /** + * получить JAR-файл библиотеки + * @return + */ public File getJarPath() { return new File(this.getClass().getProtectionDomain().getCodeSource().getLocation().getPath()); } + /** + * отправить команду + * @param message команда + * @param args аргументы + * @return вывод пользователю + */ public String sendCommand(String message, String[] args) { return map.get(cmdsMap.get(message)).onCommand(message, args); }