package ch.ethz.syslab.telesto.server.controller; import java.util.List; import ch.ethz.syslab.telesto.common.model.Client; import ch.ethz.syslab.telesto.common.model.ClientMode; import ch.ethz.syslab.telesto.common.protocol.IdentifyClientPacket; import ch.ethz.syslab.telesto.common.protocol.IdentifyClientResponsePacket; import ch.ethz.syslab.telesto.common.protocol.Packet; import ch.ethz.syslab.telesto.common.protocol.PingPacket; import ch.ethz.syslab.telesto.common.protocol.PongPacket; import ch.ethz.syslab.telesto.common.protocol.RegisterClientPacket; import ch.ethz.syslab.telesto.common.protocol.RegisterClientResponsePacket; import ch.ethz.syslab.telesto.common.protocol.handler.IServerAuthenticationProtocolHandler; import ch.ethz.syslab.telesto.common.protocol.handler.PacketProcessingException; import ch.ethz.syslab.telesto.common.protocol.handler.ProtocolHandler; import ch.ethz.syslab.telesto.common.util.ErrorType; import ch.ethz.syslab.telesto.server.db.Database; import ch.ethz.syslab.telesto.server.db.procedure.ClientProcedure; import ch.ethz.syslab.telesto.server.network.ServerConnection; public class ServerAuthenticationProtocolHandler extends ProtocolHandler implements IServerAuthenticationProtocolHandler { private Database db; private ServerConnection connection; public ServerAuthenticationProtocolHandler(Database database, ServerConnection connection) { db = database; this.connection = connection; } @Override public Packet handle(PingPacket packet) throws PacketProcessingException { return new PongPacket(); } @Override public Packet handle(RegisterClientPacket packet) throws PacketProcessingException { int clientId; try { clientId = db.callSimpleProcedure(ClientProcedure.REQUEST_ID, packet.clientName, packet.mode); } catch (PacketProcessingException e) { if (e.type == ErrorType.UNIQUE_CONSTRAINT) { // produce a more specific error message throw new PacketProcessingException(ErrorType.CLIENT_NAME_NOT_UNIQUE, "There is already a client with the given name"); } throw e; } connection.setClient(new Client(clientId, packet.clientName, ClientMode.fromByteValue(packet.mode))); return new RegisterClientResponsePacket(clientId); } @Override public Packet handle(IdentifyClientPacket packet) throws PacketProcessingException { List<Client> res = db.callClientProcedure(ClientProcedure.IDENTIFY, packet.clientId); if (!res.isEmpty()) { Client c = res.get(0); connection.setClient(c); return new IdentifyClientResponsePacket(c.mode.getByteValue(), c.name); } throw new PacketProcessingException(ErrorType.CLIENT_NOT_EXISTING, "Client id not found"); } }