protected RESULT execute()

in core/src/main/java/com/jetbrains/youtrackdb/internal/common/console/ConsoleApplication.java [330:506]


  protected RESULT execute(String iCommand) {
    var result = executeServerCommand(iCommand);
    if (result != RESULT.NOT_EXECUTED) {
      return result;
    }

    iCommand = iCommand.replaceAll("\n", ";\n");
    iCommand = iCommand.trim();

    if (iCommand.length() == 0)
    // NULL LINE: JUMP IT
    {
      return RESULT.OK;
    }

    if (isComment(iCommand))
    // COMMENT: JUMP IT
    {
      return RESULT.OK;
    }

    String[] commandWords;
    if (iCommand.toLowerCase().startsWith("load script")
        || iCommand.toLowerCase().startsWith("create database")
        || iCommand.toLowerCase().startsWith("drop database")
        || iCommand.toLowerCase().startsWith("connect")) {
      commandWords = iCommand.split(" ");
      commandWords = Arrays.stream(commandWords).filter(s -> s.length() > 0).toArray(String[]::new);
      for (var i = 2; i < commandWords.length; i++) {
        var wrappedInQuotes = false;
        if (commandWords[i].startsWith("'") && commandWords[i].endsWith("'")) {
          wrappedInQuotes = true;
        } else if (commandWords[i].startsWith("\"") && commandWords[i].endsWith("\"")) {
          wrappedInQuotes = true;
        }

        if (wrappedInQuotes) {
          commandWords[i] = commandWords[i].substring(1, commandWords[i].length() - 1);
        }
      }
    } else {
      commandWords = StringParser.getWords(iCommand, wordSeparator);
    }

    for (var cmd : helpCommands) {
      if (cmd.equals(commandWords[0])) {
        if (iCommand.length() > cmd.length()) {
          help(iCommand.substring(cmd.length() + 1));
        } else {
          help(null);
        }

        return RESULT.OK;
      }
    }

    for (var cmd : exitCommands) {
      if (cmd.equalsIgnoreCase(commandWords[0])) {
        return RESULT.EXIT;
      }
    }

    Method lastMethodInvoked = null;
    final var lastCommandInvoked = new StringBuilder(1024);

    var commandLowerCaseBuilder = new StringBuilder();
    for (var i = 0; i < commandWords.length; i++) {
      if (i > 0) {
        commandLowerCaseBuilder.append(" ");
      }
      commandLowerCaseBuilder.append(commandWords[i].toLowerCase(Locale.ENGLISH));
    }
    var commandLowerCase = commandLowerCaseBuilder.toString();

    for (var entry : getConsoleMethods().entrySet()) {
      final var m = entry.getKey();
      final var methodName = m.getName();
      final var ann = m.getAnnotation(ConsoleCommand.class);

      final var commandName = new StringBuilder();
      char ch;
      var commandWordCount = 1;
      for (var i = 0; i < methodName.length(); ++i) {
        ch = methodName.charAt(i);
        if (Character.isUpperCase(ch)) {
          commandName.append(" ");
          ch = Character.toLowerCase(ch);
          commandWordCount++;
        }
        commandName.append(ch);
      }

      if (!commandLowerCase.contentEquals(commandName)
          && !commandLowerCase.startsWith(commandName + " ")) {
        if (ann == null) {
          continue;
        }

        var aliases = ann.aliases();
        if (aliases == null || aliases.length == 0) {
          continue;
        }

        var aliasMatch = false;
        for (var alias : aliases) {
          if (iCommand.startsWith(alias.split(" ")[0])) {
            aliasMatch = true;
            commandWordCount = 1;
            break;
          }
        }

        if (!aliasMatch) {
          continue;
        }
      }

      Object[] methodArgs;

      // BUILD PARAMETERS
      if (ann != null && !ann.splitInWords()) {
        methodArgs = new String[]{iCommand.substring(iCommand.indexOf(' ') + 1)};
      } else {
        final var actualParamCount = commandWords.length - commandWordCount;
        if (m.getParameterTypes().length > actualParamCount) {
          // METHOD PARAMS AND USED PARAMS MISMATCH: CHECK FOR OPTIONALS
          for (var paramNum = m.getParameterAnnotations().length - 1;
              paramNum > actualParamCount - 1;
              paramNum--) {
            final var paramAnn = m.getParameterAnnotations()[paramNum];
            if (paramAnn != null) {
              for (var annNum = paramAnn.length - 1; annNum > -1; annNum--) {
                if (paramAnn[annNum] instanceof ConsoleParameter annotation) {
                  if (annotation.optional()) {
                    commandWords = ArrayUtils.copyOf(commandWords, commandWords.length + 1);
                  }
                  break;
                }
              }
            }
          }
        }
        methodArgs = ArrayUtils.copyOfRange(commandWords, commandWordCount, commandWords.length);
      }

      try {
        m.invoke(entry.getValue(), methodArgs);

      } catch (IllegalArgumentException ignore) {
        lastMethodInvoked = m;
        // GET THE COMMAND NAME
        lastCommandInvoked.setLength(0);
        for (var i = 0; i < commandWordCount; ++i) {
          if (lastCommandInvoked.length() > 0) {
            lastCommandInvoked.append(" ");
          }
          lastCommandInvoked.append(commandWords[i]);
        }
        continue;
      } catch (Exception e) {
        if (e.getCause() != null) {
          onException(e.getCause());
        } else {
          e.printStackTrace(err);
        }
        return RESULT.ERROR;
      }
      return RESULT.OK;
    }

    if (lastMethodInvoked != null) {
      syntaxError(lastCommandInvoked.toString(), lastMethodInvoked);
    }

    error(String.format("\n!Unrecognized command: '%s'", iCommand));
    return RESULT.ERROR;
  }