public void processResponse(@NotNull final String line) {
    try {
      final ProtocolFrame frame = new ProtocolFrame(line);
      logFrame(frame, false);

      if (AbstractThreadCommand.isThreadCommand(frame.getCommand())) {
        processThreadEvent(frame);
      }
      else if (AbstractCommand.isWriteToConsole(frame.getCommand())) {
        writeToConsole(ProtocolParser.parseIo(frame.getPayload()));
      }
      else if (AbstractCommand.isExitEvent(frame.getCommand())) {
        fireCommunicationError();
      }
      else if (AbstractCommand.isCallSignatureTrace(frame.getCommand())) {
        recordCallSignature(ProtocolParser.parseCallSignature(frame.getPayload()));
      }
      else if (AbstractCommand.isConcurrencyEvent(frame.getCommand())) {
        recordConcurrencyEvent(ProtocolParser.parseConcurrencyEvent(frame.getPayload(), myDebugProcess.getPositionConverter()));
      }
      else if (AbstractCommand.isInputRequested(frame.getCommand())) {
        myDebugProcess.consoleInputRequested(ProtocolParser.parseInputCommand(frame.getPayload()));
      }
      else if (ProcessCreatedCommand.isProcessCreatedCommand(frame.getCommand())) {
        onProcessCreatedEvent(frame.getSequence());
      }
      else if (AbstractCommand.isShowWarningCommand(frame.getCommand())) {
        final String warningId = ProtocolParser.parseWarning(frame.getPayload());
        myDebugProcess.showWarning(warningId);
      }
      else {
        placeResponse(frame.getSequence(), frame);
      }
    }
    catch (Throwable t) {
      // shouldn't interrupt reader thread
      LOG.error(t);
    }
  }
public void processResponse(@NotNull final String line)