/**
   * Stops the provided protocol instance
   *
   * @param handle An object provided at the connection time, that identifies the connection that is
   *     to be stopped
   */
  public static void requestStopProtocol(ProtocolHandle handle) {

    BasePlugin.logDebugMessage(
        "ProtocolActionDelegate",
        "A user is requesting to stop the protocol identified by " + handle);
    ClientModel clientModel = ClientModel.getInstance();
    clientModel.requestStopProtocol(handle);

    ServerModel serverModel = ServerModel.getInstance();
    serverModel.stopListeningToPort(handle);
  }
  /**
   * Restarts the provided protocol instance
   *
   * @param handle An object provided at the connection time, that identifies the connection that is
   *     to be restarted
   */
  public static void requestRestartProtocol(ProtocolHandle handle) {

    BasePlugin.logDebugMessage(
        "ProtocolActionDelegate",
        "An user is requesting to restart the protocol identified by " + handle);

    ClientModel clientModel = ClientModel.getInstance();
    clientModel.requestRestartProtocol(handle);

    ServerModel serverModel = ServerModel.getInstance();
    serverModel.requestRestartProtocol(handle);
  }
  /**
   * Starts a protocol, taking part as server in the communication
   *
   * @param portToBind The local port where to bind the server to
   * @param allMessages A map containing all messages that belong to the protocol. The message code
   *     as key
   * @param incomingMessages A collection containing the message ids of all incoming messages. The
   *     message ids much match the id field in a ProtocolMsgDefinition object from the allMessages
   *     map
   * @param outgoingMessages A collection containing the message ids of all outgoing messages. The
   *     message ids much match the id field in a ProtocolMsgDefinition object from the allMessages
   *     map
   * @param protocolInitializer The sequence of steps to execute for connection initialization
   * @param isBigEndianProtocol True if the protocol is big endian, false if little endian
   * @return A handle to identify the connection just made
   */
  public static ProtocolHandle requestStartProtocolAsServer(
      int portToBind,
      Map<Long, ProtocolMsgDefinition> allMessages,
      Collection<String> incomingMessages,
      Collection<String> outgoingMessages,
      IProtocolHandshake protocolInitializer,
      IProtocolExceptionHandler exceptionHandler,
      boolean isBigEndianProtocol) {

    BasePlugin.logDebugMessage(
        "ProtocolActionDelegate",
        "An user is requesting to start a server protocol at port " + portToBind + ".");
    ServerModel model = ServerModel.getInstance();
    return model.startListeningToPort(
        portToBind,
        allMessages,
        incomingMessages,
        outgoingMessages,
        protocolInitializer,
        exceptionHandler,
        isBigEndianProtocol);
  }
 /**
  * Tests if the protocol identified by handle is running or not
  *
  * @param handle The handle that identifies a protocol instance
  * @return True if the protocol is running, false otherwise
  */
 public static boolean isProtocolRunning(ProtocolHandle handle) {
   return ClientModel.getInstance().isClientProtocolRunning(handle)
       || ServerModel.getInstance().isListeningToPort(handle);
 }