void (@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); } }