/* * This file is part of BukkitBridge. * * Copyright (c) 2012 Spout LLC <http://www.spout.org/> * BukkitBridge is licensed under the GNU General Public License. * * BukkitBridge is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * BukkitBridge is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package org.spout.bridge.bukkit; import java.io.File; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.Set; import org.bukkit.Server; import org.bukkit.command.SimpleCommandMap; 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.plugin.EventExecutor; import org.bukkit.plugin.InvalidDescriptionException; import org.bukkit.plugin.InvalidPluginException; import org.bukkit.plugin.Plugin; import org.bukkit.plugin.PluginLoader; import org.bukkit.plugin.PluginManager; import org.bukkit.plugin.SimplePluginManager; import org.bukkit.plugin.UnknownDependencyException; public class ForwardingPluginManager implements PluginManager { private final SimplePluginManager manager; private final Method fireEvent; ForwardingPluginManager(Server server) { manager = new SimplePluginManager(server, new SimpleCommandMap(server)); try { fireEvent = SimplePluginManager.class.getDeclaredMethod("fireEvent", new Class[] {Event.class}); fireEvent.setAccessible(true); } catch (NoSuchMethodException e) { throw new RuntimeException("Unable to find SimplePluginManager.fireEvent(event)", e); } catch (SecurityException e) { throw new RuntimeException("Unable to access SimplePluginManager.fireEvent(event)", e); } } @Override public synchronized void addPermission(Permission perm) { manager.addPermission(perm); } @Override public void callEvent(Event event) throws IllegalStateException { if (event.getHandlers().getRegisteredListeners().length > 0) { callEventSafe(event); } } private synchronized void callEventSafe(Event event) throws IllegalStateException { // Can not forward to callEvent(event), it checks for Bukkit-esque thread-safety try { fireEvent.invoke(manager, event); } catch (IllegalAccessException e) { throw new RuntimeException("Unable to access SimplePluginManager.fireEvent(event)", e); } catch (IllegalArgumentException e) { throw new RuntimeException("Unable to call SimplePluginManager.fireEvent(event) with " + event, e); } catch (InvocationTargetException e) { throw new IllegalStateException(e); } } @Override public synchronized void clearPlugins() { manager.clearPlugins(); } @Override public synchronized void disablePlugin(Plugin plugin) { manager.disablePlugin(plugin); } @Override public synchronized void disablePlugins() { manager.disablePlugins(); } @Override public synchronized void enablePlugin(Plugin plugin) { manager.enablePlugin(plugin); } @Override public synchronized Set<Permissible> getDefaultPermSubscriptions(boolean op) { return manager.getDefaultPermSubscriptions(op); } @Override public synchronized Set<Permission> getDefaultPermissions(boolean op) { return manager.getDefaultPermissions(op); } @Override public synchronized Permission getPermission(String name) { return manager.getPermission(name); } @Override public synchronized Set<Permissible> getPermissionSubscriptions(String permission) { return manager.getPermissionSubscriptions(permission); } @Override public synchronized Set<Permission> getPermissions() { return manager.getPermissions(); } @Override public synchronized Plugin getPlugin(String name) { return manager.getPlugin(name); } @Override public synchronized Plugin[] getPlugins() { return manager.getPlugins(); } @Override public synchronized boolean isPluginEnabled(String name) { return manager.isPluginEnabled(name); } @Override public synchronized boolean isPluginEnabled(Plugin plugin) { return manager.isPluginEnabled(plugin); } @Override public synchronized Plugin loadPlugin(File file) throws InvalidPluginException, InvalidDescriptionException, UnknownDependencyException { return manager.loadPlugin(file); } @Override public synchronized Plugin[] loadPlugins(File file) { return manager.loadPlugins(file); } @Override public synchronized void recalculatePermissionDefaults(Permission perm) { manager.recalculatePermissionDefaults(perm); } @Override public synchronized void registerEvent(Class<? extends Event> event, Listener listener, EventPriority priority, EventExecutor executor, Plugin plugin) { manager.registerEvent(event, listener, priority, executor, plugin); } @Override public synchronized void registerEvent(Class<? extends Event> event, Listener listener, EventPriority priority, EventExecutor executor, Plugin plugin, boolean ignoreCancelled) { manager.registerEvent(event, listener, priority, executor, plugin, ignoreCancelled); } @Override public synchronized void registerEvents(Listener listener, Plugin plugin) { manager.registerEvents(listener, plugin); } @Override public synchronized void registerInterface(Class<? extends PluginLoader> loader) throws IllegalArgumentException { manager.registerInterface(loader); } @Override public synchronized void removePermission(Permission perm) { manager.removePermission(perm); } @Override public synchronized void removePermission(String perm) { manager.removePermission(perm); } @Override public synchronized void subscribeToDefaultPerms(boolean op, Permissible permissible) { manager.subscribeToDefaultPerms(op, permissible); } @Override public synchronized void subscribeToPermission(String permission, Permissible permissible) { manager.subscribeToPermission(permission, permissible); } @Override public synchronized void unsubscribeFromDefaultPerms(boolean op, Permissible permissible) { manager.unsubscribeFromDefaultPerms(op, permissible); } @Override public synchronized void unsubscribeFromPermission(String permission, Permissible permissible) { manager.unsubscribeFromPermission(permission, permissible); } @Override public synchronized boolean useTimings() { return manager.useTimings(); } }