/* (non-Javadoc)
   * @see madkit.netcomm.MadkitNetworkAgent#handleNetworkMessage(madkit.netcomm.NetworkMessage)
   */
  protected void handleNetworkMessage(NetworkMessage message) {
    switch (message.getType()) {
      case NetworkMessage.SYNCH_REQUEST:
        debug("handling NetworkMessage.SYNCH_REQUEST");
        Vector vec = (Vector) message.getArgument();
        handleSynchRequest(message.getSender(), vec);
        break;
      case NetworkMessage.ROUTE_MESSAGE:
        debug("Routing message");
        sendDistantMessage((KernelMessage) message.getArgument());
        break;

      case NetworkMessage.CONNECT_KERNEL:
        debug("CONNECT_KERNEL received");
        Vector v1 = (Vector) message.getArgument();
        Socket brSocket = (Socket) v1.get(0);
        KernelAddress id = (KernelAddress) v1.get(1); // check if the kernel is known
        SocketKernel distantSK = (SocketKernel) v1.get(2);

        if (id != null && routeTable.containsKey(id)) {
          debug("broadcast from known kernel");
          try {
            brSocket.close();
          } catch (IOException e) {
            debug(e.toString());
          }
          break;
        }
        launchNetConfigConnection(distantSK, brSocket, id);
        break;
      case NetworkMessage.KERNEL_DISCONNECTED:
        routeTable.remove(((KernelAddress) message.getArgument()).getID());
        break;
      case NetworkMessage.UPDATE_ROUTE:
        debug("UPDATE_ROUTE");
        Vector v = (Vector) message.getArgument();
        KernelAddress addr = (KernelAddress) v.get(0);
        AgentAddress p2p = (AgentAddress) v.get(1);
        DistantKernelInformation info = (DistantKernelInformation) routeTable.remove(addr.getID());
        info.setP2PAgent(p2p);
        info.setProtocol((String) v.get(2));
        routeTable.put(addr.getID(), info);
        sendMessage(
            getAgentWithRole(community, group, "netagent"),
            new NetworkMessage(NetworkMessage.UPDATE_ROUTE, v));
        sendMessage(
            message.getSender(), new NetworkMessage(NetworkMessage.UPDATE_ROUTE_DONE, addr));
        break;
      default:
        debug("unknown NetworkMessage Received");
        debug(message.toString());
        break;
    }
  }