Search in sources :

Example 1 with IDisableListener

use of fr.neatmonster.nocheatplus.components.registry.feature.IDisableListener in project NoCheatPlus by NoCheatPlus.

the class NoCheatPlus method onDisable.

/**
 * (Called on the plugin getting disabled.)
 * <hr>
 * Rough order of disabling:<br>
 * <ul>
 * <li>Prevent further registration. For now also disable listeners, though
 * this might get shifted still.</li>
 * <li><b>Call onDisable for IDisableListener instances, in reversed
 * order of registration.</b> This includes clearing all data (Needs extensions for sorting
 * by priority for IDisableListener instances.).</li>
 * <li>Random sequence of cleanup calls for other registries and logging
 * statistics.</li>
 * <li>Call removeComponent for all registered components.</li>
 * <li>Cleanup BlockProperties and clear most internal mappings for
 * components (needs a more clean registry approach).</li>
 * <li>(Command changes cleanup: currently disabled due to compatibility
 * issues, could cause other issues with dynamic plugin managers.)</li>
 * <li>Cleanup ConfigManager.</li>
 * <li>Shutdown LogManager.</li>
 * </ul>
 */
@Override
public void onDisable() {
    final boolean verbose = ConfigManager.getConfigFile().getBoolean(ConfPaths.LOGGING_EXTENDED_STATUS);
    // Remove listener references.
    if (verbose) {
        logManager.info(Streams.INIT, "Cleanup event registry (Bukkit)...");
    }
    // TODO: Prevent register feature ?
    eventRegistry.clear();
    BukkitScheduler sched = getServer().getScheduler();
    // Stop data-man task.
    if (dataManTaskId != -1) {
        sched.cancelTask(dataManTaskId);
        dataManTaskId = -1;
    }
    // Stop the tickTask.
    if (verbose) {
        logManager.info(Streams.INIT, "Stop TickTask...");
    }
    TickTask.setLocked(true);
    TickTask.purge();
    TickTask.cancel();
    TickTask.removeAllTickListeners();
    // Stop consistency checking task.
    if (consistencyCheckerTaskId != -1) {
        sched.cancelTask(consistencyCheckerTaskId);
        consistencyCheckerTaskId = -1;
    }
    // Just to be sure nothing gets left out.
    if (verbose) {
        logManager.info(Streams.INIT, "Stop all remaining tasks...");
    }
    sched.cancelTasks(this);
    // DisableListener.onDisable (includes DataManager cleanup.)
    if (verbose) {
        logManager.info(Streams.INIT, "onDisable calls (include DataManager cleanup)...");
    }
    // TODO: Reliable sorting order + sort now (checks and data cleanup late, data manager last, allow plugins to access stuff before data is reset).
    final ArrayList<IDisableListener> disableListeners = new ArrayList<IDisableListener>(this.disableListeners);
    Collections.reverse(disableListeners);
    for (final IDisableListener dl : disableListeners) {
        try {
            dl.onDisable();
        } catch (Throwable t) {
            logManager.severe(Streams.INIT, "IDisableListener (" + dl.getClass().getName() + "): " + t.getClass().getSimpleName() + " / " + t.getMessage());
            logManager.severe(Streams.INIT, t);
        }
    }
    // ExemptionManager cleanup.
    if (verbose) {
        logManager.info(Streams.INIT, "Reset ExemptionManager...");
    }
    NCPExemptionManager.clear();
    // Remove hooks.
    allViolationsHook.unregister();
    NCPHookManager.removeAllHooks();
    // Write some debug/statistics.
    final Counters counters = getGenericInstance(Counters.class);
    if (counters != null) {
        // Ensure we get this kind of information for the time being.
        if (verbose) {
            // Server logger needs info level.
            logManager.info(Streams.INIT, counters.getMergedCountsString(true));
        } else {
            logManager.debug(Streams.TRACE_FILE, counters.getMergedCountsString(true));
        }
    }
    // Unregister all added components explicitly (reverse order).
    if (verbose) {
        logManager.info(Streams.INIT, "Unregister all registered components...");
    }
    final ArrayList<Object> components = new ArrayList<Object>(this.allComponents);
    for (int i = components.size() - 1; i >= 0; i--) {
        removeComponent(components.get(i));
    }
    // Cleanup BlockProperties.
    if (verbose) {
        logManager.info(Streams.INIT, "Cleanup BlockProperties...");
    }
    BlockProperties.cleanup();
    if (verbose) {
        logManager.info(Streams.INIT, "Cleanup some mappings...");
    }
    // Remove IDisableListener instances.
    // Just in case.
    disableListeners.clear();
    // Remove listeners.
    listeners.clear();
    // Remove config listeners.
    notifyReload.clear();
    // Sub registries.
    subRegistries.clear();
    // Just in case: clear the subComponentHolders.
    subComponentholders.clear();
    // Generic instances registry.
    genericInstanceRegistry.clear();
    // Feature tags.
    featureTags.clear();
    // BlockChangeTracker.
    if (blockChangeListener != null) {
        blockChangeListener.setEnabled(false);
        // Only on disable.
        blockChangeListener = null;
    }
    blockChangeTracker.clear();
    // Restore changed commands.
    // if (verbose) LogUtil.logInfo("Undo command changes...");
    // undoCommandChanges();
    // Clear command changes list (compatibility issues with NPCs, leads to recalculation of perms).
    changedCommands.clear();
    // Cleanup the configuration manager.
    if (verbose) {
        logManager.info(Streams.INIT, "Cleanup ConfigManager...");
    }
    ConfigManager.cleanup();
    // Cleanup file logger.
    if (verbose) {
        logManager.info(Streams.INIT, "Shutdown LogManager...");
    }
    StaticLog.setUseLogManager(false);
    StaticLog.setStreamID(Streams.INIT);
    logManager.shutdown();
    // Tell the server administrator that we finished unloading NoCheatPlus.
    if (verbose) {
        // Bukkit logger.
        Bukkit.getLogger().info("[NoCheatPlus] All cleanup done.");
    }
    final PluginDescriptionFile pdfFile = getDescription();
    // Bukkit logger.
    Bukkit.getLogger().info("[NoCheatPlus] Version " + pdfFile.getVersion() + " is disabled.");
}
Also used : IDisableListener(fr.neatmonster.nocheatplus.components.registry.feature.IDisableListener) ArrayList(java.util.ArrayList) BukkitScheduler(org.bukkit.scheduler.BukkitScheduler) PluginDescriptionFile(org.bukkit.plugin.PluginDescriptionFile) Counters(fr.neatmonster.nocheatplus.stats.Counters)

Aggregations

IDisableListener (fr.neatmonster.nocheatplus.components.registry.feature.IDisableListener)1 Counters (fr.neatmonster.nocheatplus.stats.Counters)1 ArrayList (java.util.ArrayList)1 PluginDescriptionFile (org.bukkit.plugin.PluginDescriptionFile)1 BukkitScheduler (org.bukkit.scheduler.BukkitScheduler)1