/**
   * The client should not parse the command line by itself, it needs the server to validate it.
   * Hence, the client will have to send incomplete command lines to the server on every keystroke
   * for validation. The server will reply with either a syntax highlight, help message, completion
   * information etc.
   *
   * @return
   */
  public void handleCommandLineInvocation(PbTopLevel topLevelMsgRcv) {
    CommandLineInvocation userAction =
        CommandLineInvocation.newFromProtoBuf(topLevelMsgRcv.getUserAction());
    if (userAction.whatWasinvoked == UserRequestedActionKind.EXECUTE) {
      List<UnResolvedCommandChain> parsedScript =
          commandLineParser.parseUserEditedCommand(userAction);
      List<ResolvedCommandChain> resolvedCmdChains = envVariableResolver.resolve(parsedScript);
      if (resolvedCmdChains.size() != 1) {
        log.error("We do not support multiple tasks yet"); // TODO
      }

      ResolvedCommandChain cmdChain = resolvedCmdChains.get(0);
      cmdChain.setTaskId(getSessionModel().getNextTaskId());
      TaskCreatedStatus taskCreated =
          new TaskCreatedStatus(
              cmdChain.getTaskId(), topLevelMsgRcv.getRequestId(), cmdChain.getUserEditedCommand());
      serverSideSessionModel.onUpstreamTaskCreated(taskCreated);
      executeTaskSync(cmdChain);
    } else if (userAction.whatWasinvoked == UserRequestedActionKind.AUTO_COMPLETE) {
      log.error(userAction.whatWasinvoked + " not implemented.");
    } else {
      log.error(userAction.whatWasinvoked + " not implemented.");
    }
  }
 public void executeTaskSync(ResolvedCommandChain commandchain) {
   log.info("executeTaskSync " + commandchain);
   PipelineExecutor executor =
       new PipelineExecutor(ServerSideShellSession.this, commandchain.getTaskId());
   executor.execute(commandchain);
 }