package auth;
import auth.handler.*;
import com.google.protobuf.Message;
import io.netty.channel.ChannelHandlerContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import protobuf.analysis.ParseMap;
import protobuf.generate.cli2srv.chat.Chat;
import protobuf.generate.cli2srv.login.Auth;
import protobuf.generate.internal.Internal;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.util.HashMap;
import java.util.Map;
/**
* Created by Dell on 2016/3/4.
*/
public class HandlerManager {
private static final Logger logger = LoggerFactory.getLogger(HandlerManager.class);
private static final Map<Integer, Constructor<? extends IMHandler>> _handlers = new HashMap<>();
public static void register(Class<? extends Message> msg, Class<? extends IMHandler> handler) {
int num = ParseMap.getPtoNum(msg);
try {
Constructor<? extends IMHandler> constructor = handler.getConstructor(String.class, long.class, Message.class, ChannelHandlerContext.class);
_handlers.put(num, constructor);
} catch (NoSuchMethodException e) {
throw new RuntimeException(e);
}
}
public static IMHandler getHandler(int msgNum, String userId, long netId,
Message msg, ChannelHandlerContext ctx)
throws IllegalAccessException, InvocationTargetException, InstantiationException {
Constructor<? extends IMHandler> constructor = _handlers.get(msgNum);
if(constructor == null) {
logger.error("handler not exist, Message Number: {}", msgNum);
return null;
}
return constructor.newInstance(userId, netId, msg, ctx);
}
public static void initHandlers() {
HandlerManager.register(Internal.Greet.class, GreetHandler.class);
HandlerManager.register(Auth.CLogin.class, CLoginHandler.class);
HandlerManager.register(Auth.CRegister.class, CRegisterHandler.class);
HandlerManager.register(Chat.CPrivateChat.class, CPrivateChatHandler.class);
}
}