org.manalith.ircbot.plugin.PluginManager.java Source code

Java tutorial

Introduction

Here is the source code for org.manalith.ircbot.plugin.PluginManager.java

Source

/*
org.manalith.ircbot.plugin/PluginManager.java
ManalithBot - An open source IRC bot based on the PircBot Framework.
Copyright (C) 2005, 2011, 2012  Ki-Beom, Kim
Copyright (C) 2012  Seong-ho, Cho  <darkcircle.0426@gmail.com>
    
This program 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.
    
This program 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.manalith.ircbot.plugin;

import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.annotation.PostConstruct;

import org.manalith.ircbot.Configuration;
import org.manalith.ircbot.common.stereotype.BotCommand;
import org.manalith.ircbot.common.stereotype.BotFilter;
import org.manalith.ircbot.common.stereotype.BotTimer;
import org.manalith.ircbot.plugin.admin.HelpPlugin;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
public class PluginManager {

    private Logger logger = LoggerFactory.getLogger(getClass());

    private List<Plugin> list = new ArrayList<>();
    private Map<Command, Object> commands = new HashMap<>();
    private Map<Method, Object> filters = new HashMap<>();
    private Map<Method, Object> timers = new HashMap<>();

    public PluginManager() {
        load(new HelpPlugin(this));
    }

    @PostConstruct
    public void onPostConstruct() {
        load(configuration.getPlugins());
    }

    @Autowired
    private Configuration configuration;

    public void load(List<Plugin> plugins) {
        plugins.forEach(this::load);
    }

    public void load(Plugin plugin) {
        extractEventDelegates(plugin);

        list.add(plugin);

        try {
            plugin.start();
            logger.info("{} ?? ?.", plugin.getName());
        } catch (Exception e) {
            logger.error("{} ??  .", plugin.getName());
            logger.error(e.getMessage(), e);
            unload(plugin);
        }
    }

    public void unload(Plugin plugin) {
        try {
            plugin.stop();
        } catch (Exception e) {
            logger.error(e.getMessage(), e);
        }

        list.remove(plugin);
    }

    private void extractEventDelegates(Plugin plugin) {
        Method[] methods = plugin.getClass().getDeclaredMethods();
        for (Method method : methods) {
            BotCommand command = method.getAnnotation(BotCommand.class);
            if (command != null) {
                commands.put(new Command(method, plugin), plugin);
                continue;
            }

            BotFilter filter = method.getAnnotation(BotFilter.class);
            if (filter != null) {
                filters.put(method, plugin);
                continue;
            }

            BotTimer timer = method.getAnnotation(BotTimer.class);
            if (timer != null) {
                timers.put(method, plugin);
                continue;
            }
        }
    }

    public List<Plugin> getPlugins() {
        return list;
    }

    public Map<Command, Object> getCommands() {
        return commands;
    }

    public Map<Method, Object> getFilters() {
        return filters;
    }

    public Map<Method, Object> getTimers() {
        return timers;
    }
}