/
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;


import net.sourceforge.pain.data.*;
import net.sourceforge.pain.db.*;
import net.sourceforge.pain.logic.*;
import net.sourceforge.pain.network.console.*;
import net.sourceforge.pain.network.guitool.*;
import net.sourceforge.pain.plugin.*;
import net.sourceforge.pain.util.*;

import java.util.*;

/**
 * PAiN mud codebase static context
 * contains references to core codebase singleton classes
 * like user console service manager, admin console service manager,
 * logic/plugins loaders, database instance.
 */
public final class Codebase {

    public static final Date serverStartTime = new Date();
    public static final String CODEBASE_VERSION = "0.45";

    private static CodebaseData codebaseData = null;

    private static net.sourceforge.pain.Pulse pulse = new net.sourceforge.pain.Pulse();

    private static AdminConsoleManager adminCM;
    private static UserConsoleManager userCM;
    private static GuiToolSessionManager guiSM;
    private static PluginManager plm;
    private static PainDB db;

    private static LogicLoader logicLoader;
    public static String OBJECT_FACTORY_PACKAGE_PREFIX;
    public static String TRIGGERS_LOGIC_PACKAGE_PREFIX;
    public static String AFFECTS_LOGIC_PACKAGE_PREFIX;


    private Codebase() {
    }

    /**
     * @return database instance
     */
    public static PainDB getDB() {
        return db;
    }

    static void setDB(PainDB _db) {
        assert  db == null;
        Codebase.db = _db;
        codebaseData = (CodebaseData) db.getRoot();
    }

    public static CodebaseData getCodebaseData() {
        return codebaseData;
    }

    static void setUserConsoleManager(UserConsoleManager consoleManager) {
        assert userCM == null;
        userCM = consoleManager;
    }

    static void setAdminConsoleManager(AdminConsoleManager consoleManager) {
        assert adminCM == null;
        adminCM = consoleManager;
    }


    public static UserConsoleManager getUserConsoleManager() {
        return userCM;
    }

    public static AdminConsoleManager getAdminConsoleManager() {
        return adminCM;
    }

    public static Pulse getPulse() {
        return pulse;
    }

    /**
     * @param eventClassSuffix event class name suffix within event logic package
     * @param params           - passed to event
     * @throws Exception if eny error occurs during event instance instantiation
     */
    public static void processEvent(String eventClassSuffix, Object params) throws Exception {
        processEvent(logicLoader.provideEventClass(eventClassSuffix), params);
    }

    /**
     * @param eventImplClass - event impl class. (Note all references to logic
     *                       classes should be released by static code during logic reloading to allow
     *                       Java GC do it's work
     * @param params         - passed to event
     * @throws Exception if eny error occurs during event instance instantiation
     */
    public static void processEvent(Class eventImplClass, Object params) throws Exception {
        Event e = (Event) eventImplClass.newInstance();
        e.processEvent(params);
    }

    /**
     * @return loader responsible for logic classes loading
     */
    public static LogicLoader getLogicLoader() {
        return logicLoader;
    }

    /**
     * @return loader responsible for plugins loading
     */
    public static PluginManager getPluginManager() {
        return plm;
    }

    static void setPluginManager(PluginManager _plm) {
        assert plm == null;
        plm = _plm;
    }


    /**
     * flushes database caches to file and calls System.exit(0)
     * Shutdown is allowed only if no active transaction exists
     */
    public static void shutdown() {
        Log.debug("Flushing all data before exit!");
        try {
            db.flush();
        } catch (Exception e) {
            Log.error(e.getMessage(), e);
        }
        db.close();
        Log.debug("Shutted down.");
        System.exit(0);
    }


    static void setGuiToolSessionManager(GuiToolSessionManager guiToolSessionManager) {
        assert guiSM == null;
        guiSM = guiToolSessionManager;
        pulse.addListener(guiSM);
    }

    /**
     * @return GUITool (binary, object-serialization stream) service manager  
     */
    public GuiToolSessionManager getGuiToolSessionManager() {
        return guiSM;
    }

    static void setLogicLoader(LogicLoader llm) {
        assert logicLoader == null;
        logicLoader = llm;
    }
}