/
codebase/src/net/sourceforge/pain/admin/console/command/
codebase/src/net/sourceforge/pain/data/role/
codebase/src/net/sourceforge/pain/network/console/telnet/
codebase/src/net/sourceforge/pain/network/guitool/
codebase/src/net/sourceforge/pain/plugin/
codebase/src/net/sourceforge/pain/util/
db/src/net/sourceforge/pain/util/
gui/
gui/lib/
gui/src/net/sourceforge/pain/tools/guitool/dbbrowse/
gui/src/net/sourceforge/pain/tools/guitool/dialog/
gui/src/net/sourceforge/pain/tools/guitool/menu/
gui/src/net/sourceforge/pain/tools/guitool/resources/
gui/src/net/sourceforge/pain/tools/guitool/resources/images/
gui/src/net/sourceforge/pain/tools/guitool/resources/images/explorer/
mudlibs/tinylib/
mudlibs/tinylib/area/
mudlibs/tinylib/etc/
mudlibs/tinylib/src/net/sourceforge/pain/tinylib/
mudlibs/tinylib/src/net/sourceforge/pain/tinylib/data/affect/
mudlibs/tinylib/src/net/sourceforge/pain/tinylib/data/prototype/
mudlibs/tinylib/src/net/sourceforge/pain/tinylib/data/trigger/
mudlibs/tinylib/src/net/sourceforge/pain/tinylib/logic/affect/
mudlibs/tinylib/src/net/sourceforge/pain/tinylib/logic/event/
mudlibs/tinylib/src/net/sourceforge/pain/tinylib/logic/event/deploy/
mudlibs/tinylib/src/net/sourceforge/pain/tinylib/logic/event/guitool/
mudlibs/tinylib/src/net/sourceforge/pain/tinylib/logic/event/guitool/event/
mudlibs/tinylib/src/net/sourceforge/pain/tinylib/logic/fn/util/
mudlibs/tinylib/src/net/sourceforge/pain/tinylib/logic/trigger/
mudlibs/tinylib/src/net/sourceforge/pain/tinylib/logic/trigger/impl/
mudlibs/tinylib/src/net/sourceforge/pain/tinylib/plugin/command/
mudlibs/tinylib/src/net/sourceforge/pain/tinylib/plugin/reset/
mudlibs/tinylib/src/net/sourceforge/pain/tinylib/plugin/shutdown/
mudlibs/tinylib/src/net/sourceforge/pain/tinylib/plugin/social/
mudlibs/tinylib/src/net/sourceforge/pain/tinylib/util/
tests/
tests/src/
tests/src/net/sourceforge/pain/db/data/
package net.sourceforge.pain.plugin;

import java.util.*;

/**
 * Base class for all plugin impls
 * Plugin is a set of classes that provides custom functionality to
 * server and should not be reloaded every time logic classes are reloaded
 * Sample of plugins: text commands or socials to events mapping (this mapping should not
 * be reloaded every time logic is reloaded), plugins that has SQL connections to
 * some stat database, shutdown timer plugin (emits shutdown evet by timer and
 * should not be reloaded on logic reloading)
 * Plugins should not have direct references to logic classes (plugins
 * should use events).
 * Logic is allowed to have direct references to plugins.  
 *
 */
public abstract class Plugin {

    /** plugin name is a package suffix after net.sf.pain.plugin. prefix
     * (see CodebaseLaunchar settings)
     */
    protected String pluginName;

    /**
     * child plugin names, should not be modified from other package!
     */
    protected final Set childs = new HashSet();

    public Plugin() {
        if (getClass().getClassLoader().getClass() != PluginClassLoader.class) {
            throw new RuntimeException("Plugin class:" + getClass().getName() + " must be loaded by PluginManager!");
        }
    }

    protected abstract void init() throws Exception;

    protected abstract void deinit();

    /**
     * This method is used from static PAIN code. Static code should not to have any direct links to reloadable plugins
     *
     * @param key
     * @param args
     */
    public Object invoke(int key, Object[] args) {
        throw new UnsupportedOperationException();
    }

    /**
     * plugin
     * child plugin should be reloaded when parent is reloading
     *
     * @param pluginName
     */
    synchronized final void addChild(String pluginName) {
        if (childs.contains(pluginName)) {
            return;
        }
        childs.add(pluginName);
    };


    final void removeChild(String pluginName) {
        childs.remove(pluginName);
    };

    public String toString() {
        return getClass().getName();
    }

    public final Set getDependedPlugins() {
        return Collections.unmodifiableSet(childs);
    }

    public final String getPluginName() {
        return pluginName;
    }
}