package org.starmod.net;
import org.starmod.net.codec.*;
import org.starmod.net.codec.sync.*;
import org.starmod.net.command.*;
import org.starmod.net.command.sync.*;
import org.starmod.net.handler.*;
import org.starmod.net.handler.sync.*;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.util.HashMap;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
public class CommandMap {
private HashMap<Integer, Class<? extends Command>> commands = new HashMap<>();
private ConcurrentMap<Class<? extends Command>, Codec> codecs = new ConcurrentHashMap<>();
private ConcurrentMap<Class<? extends Command>, Handler> handlers = new ConcurrentHashMap<>();
public CommandMap() {
loadDefaultCommands();
}
private <M extends Command, C extends Codec, H extends Handler> void bind(int id, Class<M> cmdClass, Class<C> codecClass, Class<H> handlerClass) {
Codec codec = null;
Handler handler = null;
try {
Constructor<C> codecCon = codecClass.getConstructor();
Constructor<H> handlerCon = handlerClass.getConstructor();
codecCon.setAccessible(true);
handlerCon.setAccessible(true);
codec = codecCon.newInstance();
handler = handlerCon.newInstance();
} catch (NoSuchMethodException | InvocationTargetException | InstantiationException | IllegalAccessException e) {
e.printStackTrace();
}
commands.put(id, cmdClass);
codecs.put(cmdClass, codec);
handlers.put(cmdClass, handler);
}
private void loadDefaultCommands() {
bind(0, Login.class, LoginCodec.class, LoginHandler.class);
bind(13, RequestGameMode.class, RequestGameModeCodec.class, RequestGameModeHandler.class);
bind(22, MessageTo.class, MessageToCodec.class, MessageToHandler.class);
bind(23, PingPong.class, PingPongCodec.class, PingPongHandler.class);
bind(9, RequestSyncAll.class, RequestSyncAllCodec.class, RequestSyncAllHandler.class);
}
public Codec getCodec(int id) {
return codecs.get(commands.get(id));
}
public Handler getHandler(int id) {
return handlers.get(commands.get(id));
}
}