Skip to content

Commit

Permalink
доработка документации
Browse files Browse the repository at this point in the history
  • Loading branch information
InterVi committed Nov 19, 2017
1 parent aa58007 commit b70e299
Show file tree
Hide file tree
Showing 4 changed files with 156 additions and 3 deletions.
15 changes: 13 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
@@ -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** - вывод справки
37 changes: 37 additions & 0 deletions src/ru/intervi/jsplugins/api/PluginListener.java
Original file line number Diff line number Diff line change
Expand Up @@ -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<String, String> getCommands();
/**
* универсальный метод для взаимодействия плагинов между собой
* @param data
* @return
*/
public List<? extends Object> communicate(List<? extends Object> data);
}
3 changes: 3 additions & 0 deletions src/ru/intervi/jsplugins/api/SimplePlugin.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,9 @@

import ru.intervi.jsplugins.manager.PluginManager;

/**
* класс-заглушка, чтобы не реализовывать не нужные методы
*/
public class SimplePlugin implements PluginListener {
public String getName() {
return "SimplePlugin";
Expand Down
104 changes: 103 additions & 1 deletion src/ru/intervi/jsplugins/manager/PluginManager.java
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,9 @@
import ru.intervi.jsplugins.api.InvalidPluginException;
import ru.intervi.jsplugins.api.PluginListener;

/**
* управление плагинами
*/
public class PluginManager {
public PluginManager() {
STANDALONE = false;
Expand All @@ -27,6 +30,16 @@ public PluginManager(Main main) {
private ConcurrentHashMap<String, String> cmdsMap = new ConcurrentHashMap<String, String>();
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()});
Expand All @@ -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);
Expand All @@ -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<PluginListener> 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);
}
Expand Down

0 comments on commit b70e299

Please sign in to comment.