public void messageReceived(IoSession ioSession, Object message) throws Exception {
   if (message instanceof DefaultPaxosMessage) {
     PaxosMessage paxosMessage = (DefaultPaxosMessage) message;
     switch (paxosMessage.getType()) {
       case PROPOSE:
         handlePropose(paxosMessage);
         break;
       case ACCEPTED:
         handleAccepted(paxosMessage);
         break;
       case PREPARE:
         handlePrepare(
             (Integer) paxosMessage.getValue(),
             paxosMessage.getProposerId()); // PSN and consensus instance dont matter
         break;
       case PREPARE_RESP:
         handlePrepareResponse(paxosMessage);
         break;
       case RECOVERY:
         handleRecovery(paxosMessage);
         break;
       case RECOVERY_RESP:
         handleRecoveryResponse(paxosMessage);
         break;
       case PING:
         if (paxosMessage.getProposerId() == getLeader()) // Leaders HeartBeat
         leaderLastHeard = new Date();
         else if (((Integer) paxosMessage.getValue())
             > preparedFor) { // I came alive and the leader is not who I thought.
           preparedFor = ((Integer) paxosMessage.getValue());
           handlePrepare(preparedFor, getLeader());
           sendRecovery();
         }
         break;
       default:
         throw new Exception(
             "received PaxosMessage of unknown type" + paxosMessage.getType().name());
     }
   } else if (message instanceof ChatMessage) { // Some client sent or some server forwarded.
     if (nodeIsLeader()) {
       propose(
           new DefaultPaxosMessage(
               nextInstance, nextPropose, id, PaxosMessageType.PROPOSE, (ChatMessage) message));
       nextInstance++;
     } else {
       sendToLeader((ChatMessage) message);
     }
   } else {
     throw new Exception("Unknown message type:" + message.getClass().getSimpleName());
   }
 }