package pluginbase.testingbukkit.plugin;
import com.google.common.collect.ImmutableSet;
import org.bukkit.Server;
import org.bukkit.event.Event;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.permissions.Permissible;
import org.bukkit.permissions.Permission;
import org.bukkit.permissions.PermissionDefault;
import org.bukkit.plugin.*;
import org.bukkit.plugin.java.JavaPlugin;
import org.powermock.api.mockito.PowerMockito;
import pluginbase.testingbukkit.FileLocations;
import java.io.File;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.util.*;
public class TestingPluginManager implements PluginManager {
List<Plugin> plugins = new ArrayList<Plugin>();
Set<Plugin> enabledPlugins = new HashSet<Plugin>();
private final Map<String, Permission> permissions = new HashMap<String, Permission>();
private final Map<Boolean, Set<Permission>> defaultPerms = new LinkedHashMap<Boolean, Set<Permission>>();
private final Map<String, Map<Permissible, Boolean>> permSubs = new HashMap<String, Map<Permissible, Boolean>>();
private final Map<Boolean, Map<Permissible, Boolean>> defSubs = new HashMap<Boolean, Map<Permissible, Boolean>>();
Server server;
PluginLoader pluginLoader;
public TestingPluginManager(Server server) {
this.server = server;
this.pluginLoader = PowerMockito.mock(PluginLoader.class);
defaultPerms.put(true, new HashSet<Permission>());
defaultPerms.put(false, new HashSet<Permission>());
}
@Override
public void registerInterface(Class<? extends PluginLoader> aClass) throws IllegalArgumentException {
//To change body of implemented methods use File | Settings | File Templates.
}
@Override
public Plugin getPlugin(String s) {
for (Plugin plugin : plugins) {
if (plugin.getName().equals(s)) {
return plugin;
}
}
return null;
}
@Override
public Plugin[] getPlugins() {
return plugins.toArray(new Plugin[plugins.size()]);
}
@Override
public boolean isPluginEnabled(String s) {
for (Plugin plugin : enabledPlugins) {
if (plugin.getName().equals(s)) {
return true;
}
}
return false;
}
@Override
public boolean isPluginEnabled(Plugin plugin) {
return enabledPlugins.contains(plugin);
}
@Override
public Plugin loadPlugin(File file) throws InvalidPluginException, InvalidDescriptionException, UnknownDependencyException {
return null;
}
public Plugin loadPlugin(PluginDescriptionFile pdf) {
try {
Class<Plugin> clazz = (Class<Plugin>) Class.forName(pdf.getMain());
Constructor<Plugin> constructor = clazz.getDeclaredConstructor(PluginLoader.class, Server.class, PluginDescriptionFile.class, File.class, File.class);
constructor.setAccessible(true);
File pluginDir = new File(FileLocations.PLUGIN_DIRECTORY, pdf.getName());
Plugin plugin = constructor.newInstance(pluginLoader, server, pdf, pluginDir, new File(FileLocations.PLUGIN_DIRECTORY, "pluginTestFile"));
//getField("server").set(plugin, server);
//getField("description").set(plugin, pdf);
//getField("dataFolder").set(plugin, pluginDir);
plugin.onLoad();
plugins.add(plugin);
return plugin;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
private Field getField(String name) throws Exception {
Field field = JavaPlugin.class.getDeclaredField(name);
field.setAccessible(true);
return field;
}
@Override
public Plugin[] loadPlugins(File file) {
return new Plugin[0];
}
@Override
public void disablePlugins() {
for (Plugin plugin : new HashSet<Plugin>(enabledPlugins)) {
disablePlugin(plugin);
}
}
@Override
public void clearPlugins() {
disablePlugins();
plugins.clear();
}
@Override
public void callEvent(Event event) throws IllegalStateException {
//To change body of implemented methods use File | Settings | File Templates.
}
@Override
public void registerEvents(Listener listener, Plugin plugin) {
//To change body of implemented methods use File | Settings | File Templates.
}
@Override
public void registerEvent(Class<? extends Event> aClass, Listener listener, EventPriority eventPriority, EventExecutor eventExecutor, Plugin plugin) {
//To change body of implemented methods use File | Settings | File Templates.
}
@Override
public void registerEvent(Class<? extends Event> aClass, Listener listener, EventPriority eventPriority, EventExecutor eventExecutor, Plugin plugin, boolean b) {
//To change body of implemented methods use File | Settings | File Templates.
}
@Override
public void enablePlugin(Plugin plugin) {
plugin.onEnable();
}
@Override
public void disablePlugin(Plugin plugin) {
if (enabledPlugins.contains(plugin)) {
plugin.onDisable();
enabledPlugins.remove(plugin);
}
}
public Permission getPermission(String name) {
return permissions.get(name.toLowerCase());
}
public void addPermission(Permission perm) {
String name = perm.getName().toLowerCase();
if (permissions.containsKey(name)) {
throw new IllegalArgumentException("The permission " + name + " is already defined!");
}
permissions.put(name, perm);
calculatePermissionDefault(perm);
}
public Set<Permission> getDefaultPermissions(boolean op) {
return ImmutableSet.copyOf(defaultPerms.get(op));
}
public void removePermission(Permission perm) {
removePermission(perm.getName());
}
public void removePermission(String name) {
permissions.remove(name.toLowerCase());
}
public void recalculatePermissionDefaults(Permission perm) {
if (permissions.containsValue(perm)) {
defaultPerms.get(true).remove(perm);
defaultPerms.get(false).remove(perm);
calculatePermissionDefault(perm);
}
}
private void calculatePermissionDefault(Permission perm) {
if ((perm.getDefault() == PermissionDefault.OP) || (perm.getDefault() == PermissionDefault.TRUE)) {
defaultPerms.get(true).add(perm);
dirtyPermissibles(true);
}
if ((perm.getDefault() == PermissionDefault.NOT_OP) || (perm.getDefault() == PermissionDefault.TRUE)) {
defaultPerms.get(false).add(perm);
dirtyPermissibles(false);
}
}
private void dirtyPermissibles(boolean op) {
Set<Permissible> permissibles = getDefaultPermSubscriptions(op);
for (Permissible p : permissibles) {
p.recalculatePermissions();
}
}
public void subscribeToPermission(String permission, Permissible permissible) {
String name = permission.toLowerCase();
Map<Permissible, Boolean> map = permSubs.get(name);
if (map == null) {
map = new WeakHashMap<Permissible, Boolean>();
permSubs.put(name, map);
}
map.put(permissible, true);
}
public void unsubscribeFromPermission(String permission, Permissible permissible) {
String name = permission.toLowerCase();
Map<Permissible, Boolean> map = permSubs.get(name);
if (map != null) {
map.remove(permissible);
if (map.isEmpty()) {
permSubs.remove(name);
}
}
}
public Set<Permissible> getPermissionSubscriptions(String permission) {
String name = permission.toLowerCase();
Map<Permissible, Boolean> map = permSubs.get(name);
if (map == null) {
return ImmutableSet.of();
} else {
return ImmutableSet.copyOf(map.keySet());
}
}
public void subscribeToDefaultPerms(boolean op, Permissible permissible) {
Map<Permissible, Boolean> map = defSubs.get(op);
if (map == null) {
map = new WeakHashMap<Permissible, Boolean>();
defSubs.put(op, map);
}
map.put(permissible, true);
}
public void unsubscribeFromDefaultPerms(boolean op, Permissible permissible) {
Map<Permissible, Boolean> map = defSubs.get(op);
if (map != null) {
map.remove(permissible);
if (map.isEmpty()) {
defSubs.remove(op);
}
}
}
public Set<Permissible> getDefaultPermSubscriptions(boolean op) {
Map<Permissible, Boolean> map = defSubs.get(op);
if (map == null) {
return ImmutableSet.of();
} else {
return ImmutableSet.copyOf(map.keySet());
}
}
public Set<Permission> getPermissions() {
return new HashSet<Permission>(permissions.values());
}
@Override
public boolean useTimings() {
return false;
}
}