/
codebase/
codebase/area/
codebase/doc/
codebase/etc/
codebase/src/net/sourceforge/pain/data/trigger/
codebase/src/net/sourceforge/pain/logic/
codebase/src/net/sourceforge/pain/logic/affect/
codebase/src/net/sourceforge/pain/logic/event/
codebase/src/net/sourceforge/pain/logic/event/deploy/
codebase/src/net/sourceforge/pain/logic/event/guitool/
codebase/src/net/sourceforge/pain/logic/event/guitool/event/
codebase/src/net/sourceforge/pain/logic/fn/util/
codebase/src/net/sourceforge/pain/logic/trigger/
codebase/src/net/sourceforge/pain/logic/trigger/impl/
codebase/src/net/sourceforge/pain/network/console/
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/plugin/command/
codebase/src/net/sourceforge/pain/plugin/reset/
codebase/src/net/sourceforge/pain/plugin/shutdown/
codebase/src/net/sourceforge/pain/plugin/social/
codebase/src/net/sourceforge/pain/util/
db/doc/javadoc/resources/
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/
tests/
tests/src/
tests/src/net/sourceforge/pain/db/data/
package net.sourceforge.pain.plugin;

import java.util.*;

public abstract class Plugin {

	protected PluginClassLoader loader;
	// plugin name is a package suffix after net.sf.pain.plugin. prefix
	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
	 * @return
	 */
	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;
    }
}