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;
}