package com.aionemu.gameserver.utils.chathandlers;
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.google.inject.Injector;
/**
* Created on: 12.09.2009 14:13:24
*
* @author Aquanox
*/
class ChatHandlersLoader
extends DefaultClassListener
implements ClassListener
{
private static final Logger logger = Logger.getLogger(ChatHandlersLoader.class);
private final Injector injector;
private final AdminCommandChatHandler adminCCH;
public ChatHandlersLoader(Injector injector, AdminCommandChatHandler handler)
{
this.injector = injector;
this.adminCCH = handler;
}
@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, AdminCommand.class))
{
adminCCH.registerAdminCommand((AdminCommand) injector.getInstance(c));
}
}
// call onClassLoad()
super.postLoad(classes);
logger.info("Loaded " + adminCCH.getSize() + " admin command handlers.");
}
@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);
adminCCH.clearHandlers();// unload all admin handlers.
}
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;
}
}