/* * This file is part of aion-unique <aion-unique.org>. * * aion-unique 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. * * aion-unique 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 aion-unique. If not, see <http://www.gnu.org/licenses/>. */ package com.aionemu.gameserver.questEngine.handlers; import java.lang.reflect.Modifier; import org.apache.log4j.Logger; import com.aionemu.commons.scripting.classlistener.ClassListener; import com.aionemu.commons.scripting.classlistener.DefaultClassListener; import com.aionemu.commons.utils.ClassUtils; import com.aionemu.gameserver.questEngine.QuestEngine; import com.google.inject.Injector; /** * @author MrPoke * */ public class QuestHandlerLoader extends DefaultClassListener implements ClassListener { private static final Logger logger = Logger.getLogger(QuestHandlerLoader.class); private Injector injector; public QuestHandlerLoader(Injector injector) { this.injector = injector; } @Override public void postLoad(Class<?>[] classes) { for (Class<?> c : classes) { if (logger.isDebugEnabled()) logger.debug("Load class " + c.getName()); if (!isValidClass(c)) continue; if (ClassUtils.isSubclass(c, QuestHandler.class)) { injector.getInstance(QuestEngine.class).addQuestHandler((QuestHandler)injector.getInstance(c)); } } // call onClassLoad() super.postLoad(classes); } @Override public void preUnload(Class<?>[] classes) { if (logger.isDebugEnabled()) for (Class<?> c : classes)// debug messages logger.debug("Unload class " + c.getName()); // call onClassUnload() super.preUnload(classes); injector.getInstance(QuestEngine.class).clear(); } public boolean isValidClass(Class<?> clazz) { final int modifiers = clazz.getModifiers(); if (Modifier.isAbstract(modifiers) || Modifier.isInterface(modifiers)) return false; if (!Modifier.isPublic(modifiers)) return false; return true; } }