Search in sources :

Example 1 with Completer

use of org.apache.karaf.shell.console.Completer in project karaf by apache.

the class ArgumentCompleter method getDefaultCompleter.

private Completer getDefaultCompleter(CommandSession session, Field field) {
    Completer completer = null;
    Class<?> type = field.getType();
    if (type.isAssignableFrom(File.class)) {
        completer = new FileCompleter(session);
    } else if (type.isAssignableFrom(Boolean.class) || type.isAssignableFrom(boolean.class)) {
        completer = new StringsCompleter(new String[] { "false", "true" }, false);
    } else if (type.isAssignableFrom(Enum.class)) {
        Set<String> values = new HashSet<>();
        for (Object o : EnumSet.allOf((Class<Enum>) type)) {
            values.add(o.toString());
        }
        completer = new StringsCompleter(values, false);
    } else {
    // TODO any other completers we can add?
    }
    return completer;
}
Also used : Completer(org.apache.karaf.shell.console.Completer) HashSet(java.util.HashSet)

Example 2 with Completer

use of org.apache.karaf.shell.console.Completer in project karaf by apache.

the class ArgumentCompleter method complete.

public int complete(final String buffer, final int cursor, final List<String> candidates) {
    ArgumentList list = delimit(buffer, cursor);
    int argpos = list.getArgumentPosition();
    int argIndex = list.getCursorArgumentIndex();
    // Store the argument list so that it can be used by completers.
    CommandSession commandSession = CommandSessionHolder.getSession();
    if (commandSession != null) {
        commandSession.put(ARGUMENTS_LIST, list);
    }
    Completer comp = null;
    String[] args = list.getArguments();
    int index = 0;
    // First argument is command name
    if (index < argIndex) {
        // Verify command name
        if (!verifyCompleter(commandCompleter, args[index])) {
            return -1;
        }
        // - we have a session
        if (!args[index].contains(":") && commandSession != null) {
            Function f1 = unProxy((Function) commandSession.get("*:" + args[index]));
            Function f2 = unProxy(this.function);
            if (f1 != null && f1 != f2) {
                return -1;
            }
        }
        index++;
    } else {
        comp = commandCompleter;
    }
    // Now, check options
    if (comp == null) {
        while (index < argIndex && args[index].startsWith("-")) {
            if (!verifyCompleter(optionsCompleter, args[index])) {
                return -1;
            }
            Option option = options.get(args[index]);
            if (option == null) {
                return -1;
            }
            Field field = fields.get(option);
            if (field != null && field.getType() != boolean.class && field.getType() != Boolean.class) {
                if (++index == argIndex) {
                    comp = NullCompleter.INSTANCE;
                }
            }
            index++;
        }
        if (comp == null && index >= argIndex && index < args.length && args[index].startsWith("-")) {
            comp = optionsCompleter;
        }
    }
    // Now check for if last Option has a completer
    int lastAgurmentIndex = argIndex - 1;
    if (lastAgurmentIndex >= 1) {
        Option lastOption = options.get(args[lastAgurmentIndex]);
        if (lastOption != null) {
            Field lastField = fields.get(lastOption);
            if (lastField != null && lastField.getType() != boolean.class && lastField.getType() != Boolean.class) {
                Option option = lastField.getAnnotation(Option.class);
                if (option != null) {
                    Completer optionValueCompleter = null;
                    String name = option.name();
                    if (optionalCompleters != null && name != null) {
                        optionValueCompleter = optionalCompleters.get(name);
                        if (optionValueCompleter == null) {
                            String[] aliases = option.aliases();
                            if (aliases.length > 0) {
                                for (int i = 0; i < aliases.length && optionValueCompleter == null; i++) {
                                    optionValueCompleter = optionalCompleters.get(option.aliases()[i]);
                                }
                            }
                        }
                    }
                    if (optionValueCompleter != null) {
                        comp = optionValueCompleter;
                    }
                }
            }
        }
    }
    // Check arguments
    if (comp == null) {
        int indexArg = 0;
        while (index < argIndex) {
            Completer sub = argsCompleters.get(indexArg >= argsCompleters.size() ? argsCompleters.size() - 1 : indexArg);
            if (!verifyCompleter(sub, args[index])) {
                return -1;
            }
            index++;
            indexArg++;
        }
        comp = argsCompleters.get(indexArg >= argsCompleters.size() ? argsCompleters.size() - 1 : indexArg);
    }
    int ret = comp.complete(list.getCursorArgument(), argpos, candidates);
    if (ret == -1) {
        return -1;
    }
    int pos = ret + (list.getBufferPosition() - argpos);
    if ((buffer != null) && (cursor != buffer.length()) && isDelimiter(buffer, cursor)) {
        for (int i = 0; i < candidates.size(); i++) {
            String val = candidates.get(i);
            while ((val.length() > 0) && isDelimiter(val, val.length() - 1)) {
                val = val.substring(0, val.length() - 1);
            }
            candidates.set(i, val);
        }
    }
    return pos;
}
Also used : CompletableFunction(org.apache.karaf.shell.console.CompletableFunction) Function(org.apache.felix.service.command.Function) Field(java.lang.reflect.Field) CommandSession(org.apache.felix.service.command.CommandSession) Completer(org.apache.karaf.shell.console.Completer) Option(org.apache.karaf.shell.commands.Option) HelpOption(org.apache.karaf.shell.commands.HelpOption)

Example 3 with Completer

use of org.apache.karaf.shell.console.Completer in project karaf by apache.

the class OldArgumentCompleter method complete.

public int complete(final String buffer, final int cursor, final List<String> candidates) {
    ArgumentList list = delimit(buffer, cursor);
    int argpos = list.getArgumentPosition();
    int argIndex = list.getCursorArgumentIndex();
    // Store the argument list so that it can be used by completers.
    CommandSession commandSession = CommandSessionHolder.getSession();
    if (commandSession != null) {
        commandSession.put(ARGUMENTS_LIST, list);
    }
    Completer comp = null;
    String[] args = list.getArguments();
    int index = 0;
    // First argument is command name
    if (index < argIndex) {
        // Verify command name
        if (!verifyCompleter(commandCompleter, args[index])) {
            return -1;
        }
        index++;
    } else {
        comp = commandCompleter;
    }
    // Now, check options
    if (comp == null) {
        while (index < argIndex && args[index].startsWith("-")) {
            if (!verifyCompleter(optionsCompleter, args[index])) {
                return -1;
            }
            Option option = options.get(args[index]);
            if (option == null) {
                return -1;
            }
            Field field = fields.get(option);
            if (field != null && field.getType() != boolean.class && field.getType() != Boolean.class) {
                if (++index == argIndex) {
                    comp = NullCompleter.INSTANCE;
                }
            }
            index++;
        }
        if (comp == null && index >= argIndex && index < args.length && args[index].startsWith("-")) {
            comp = optionsCompleter;
        }
    }
    // Now check for if last Option has a completer
    int lastAgurmentIndex = argIndex - 1;
    if (lastAgurmentIndex >= 1) {
        Option lastOption = options.get(args[lastAgurmentIndex]);
        if (lastOption != null) {
            Field lastField = fields.get(lastOption);
            if (lastField != null && lastField.getType() != boolean.class && lastField.getType() != Boolean.class) {
                Option option = lastField.getAnnotation(Option.class);
                if (option != null) {
                    Completer optionValueCompleter = null;
                    String name = option.name();
                    if (optionalCompleters != null && name != null) {
                        optionValueCompleter = optionalCompleters.get(name);
                        if (optionValueCompleter == null) {
                            String[] aliases = option.aliases();
                            if (aliases.length > 0) {
                                for (int i = 0; i < aliases.length && optionValueCompleter == null; i++) {
                                    optionValueCompleter = optionalCompleters.get(option.aliases()[i]);
                                }
                            }
                        }
                    }
                    if (optionValueCompleter != null) {
                        comp = optionValueCompleter;
                    }
                }
            }
        }
    }
    // Check arguments
    if (comp == null) {
        int indexArg = 0;
        while (index < argIndex) {
            Completer sub = argsCompleters.get(indexArg >= argsCompleters.size() ? argsCompleters.size() - 1 : indexArg);
            if (!verifyCompleter(sub, args[index])) {
                return -1;
            }
            index++;
            indexArg++;
        }
        comp = argsCompleters.get(indexArg >= argsCompleters.size() ? argsCompleters.size() - 1 : indexArg);
    }
    int ret = comp.complete(list.getCursorArgument(), argpos, candidates);
    if (ret == -1) {
        return -1;
    }
    int pos = ret + (list.getBufferPosition() - argpos);
    if ((buffer != null) && (cursor != buffer.length()) && isDelimiter(buffer, cursor)) {
        for (int i = 0; i < candidates.size(); i++) {
            String val = candidates.get(i);
            while ((val.length() > 0) && isDelimiter(val, val.length() - 1)) {
                val = val.substring(0, val.length() - 1);
            }
            candidates.set(i, val);
        }
    }
    return pos;
}
Also used : Field(java.lang.reflect.Field) CommandSession(org.apache.felix.service.command.CommandSession) Completer(org.apache.karaf.shell.console.Completer) Option(org.apache.felix.gogo.commands.Option)

Example 4 with Completer

use of org.apache.karaf.shell.console.Completer in project karaf by apache.

the class OldArgumentCompleter method complete.

public int complete(final Session session, final CommandLine list, final List<String> candidates) {
    int argpos = list.getArgumentPosition();
    int argIndex = list.getCursorArgumentIndex();
    // Store the argument list so that it can be used by completers.
    CommandSession commandSession = CommandSessionHolder.getSession();
    if (commandSession != null) {
        commandSession.put(ARGUMENTS_LIST, list);
    }
    Completer comp = null;
    String[] args = list.getArguments();
    int index = 0;
    // First argument is command name
    if (index < argIndex) {
        // Verify scope
        if (!Session.SCOPE_GLOBAL.equals(scope) && !session.resolveCommand(args[index]).equals(scope + ":" + name)) {
            return -1;
        }
        // Verify command name
        if (!verifyCompleter(commandCompleter, args[index])) {
            return -1;
        }
        index++;
    } else {
        comp = commandCompleter;
    }
    // Now, check options
    if (comp == null) {
        while (index < argIndex && args[index].startsWith("-")) {
            if (!verifyCompleter(optionsCompleter, args[index])) {
                return -1;
            }
            Option option = options.get(args[index]);
            if (option == null) {
                return -1;
            }
            Field field = fields.get(option);
            if (field != null && field.getType() != boolean.class && field.getType() != Boolean.class) {
                if (++index == argIndex) {
                    comp = NullCompleter.INSTANCE;
                }
            }
            index++;
        }
        if (comp == null && index >= argIndex && index < args.length && args[index].startsWith("-")) {
            comp = optionsCompleter;
        }
    }
    // Now check for if last Option has a completer
    int lastAgurmentIndex = argIndex - 1;
    if (lastAgurmentIndex >= 1) {
        Option lastOption = options.get(args[lastAgurmentIndex]);
        if (lastOption != null) {
            Field lastField = fields.get(lastOption);
            if (lastField != null && lastField.getType() != boolean.class && lastField.getType() != Boolean.class) {
                Option option = lastField.getAnnotation(Option.class);
                if (option != null) {
                    Completer optionValueCompleter = null;
                    String name = option.name();
                    if (optionalCompleters != null && name != null) {
                        optionValueCompleter = optionalCompleters.get(name);
                        if (optionValueCompleter == null) {
                            String[] aliases = option.aliases();
                            if (aliases.length > 0) {
                                for (int i = 0; i < aliases.length && optionValueCompleter == null; i++) {
                                    optionValueCompleter = optionalCompleters.get(option.aliases()[i]);
                                }
                            }
                        }
                    }
                    if (optionValueCompleter != null) {
                        comp = optionValueCompleter;
                    }
                }
            }
        }
    }
    // Check arguments
    if (comp == null) {
        int indexArg = 0;
        while (index < argIndex) {
            Completer sub = argsCompleters.get(indexArg >= argsCompleters.size() ? argsCompleters.size() - 1 : indexArg);
            if (!verifyCompleter(sub, args[index])) {
                return -1;
            }
            index++;
            indexArg++;
        }
        comp = argsCompleters.get(indexArg >= argsCompleters.size() ? argsCompleters.size() - 1 : indexArg);
    }
    int ret = comp.complete(list.getCursorArgument(), argpos, candidates);
    if (ret == -1) {
        return -1;
    }
    int pos = ret + (list.getBufferPosition() - argpos);
    /**
     *  Special case: when completing in the middle of a line, and the
     *  area under the cursor is a delimiter, then trim any delimiters
     *  from the candidates, since we do not need to have an extra
     *  delimiter.
     *
     *  E.g., if we have a completion for "foo", and we
     *  enter "f bar" into the buffer, and move to after the "f"
     *  and hit TAB, we want "foo bar" instead of "foo  bar".
     */
    String buffer = list.getBuffer();
    int cursor = list.getBufferPosition();
    if ((buffer != null) && (cursor != buffer.length()) && isDelimiter(buffer, cursor)) {
        for (int i = 0; i < candidates.size(); i++) {
            String val = candidates.get(i);
            while ((val.length() > 0) && isDelimiter(val, val.length() - 1)) {
                val = val.substring(0, val.length() - 1);
            }
            candidates.set(i, val);
        }
    }
    return pos;
}
Also used : Field(java.lang.reflect.Field) CommandSession(org.apache.felix.service.command.CommandSession) FileCompleter(org.apache.karaf.shell.console.completer.FileCompleter) Completer(org.apache.karaf.shell.console.Completer) StringsCompleter(org.apache.karaf.shell.console.completer.StringsCompleter) NullCompleter(org.apache.karaf.shell.console.completer.NullCompleter) Option(org.apache.felix.gogo.commands.Option)

Example 5 with Completer

use of org.apache.karaf.shell.console.Completer in project karaf by apache.

the class ArgumentCompleter method getDefaultCompleter.

private Completer getDefaultCompleter(Field field) {
    Completer completer = null;
    Class<?> type = field.getType();
    if (type.isAssignableFrom(File.class)) {
        completer = new FileCompleter(null);
    } else if (type.isAssignableFrom(Boolean.class) || type.isAssignableFrom(boolean.class)) {
        completer = new StringsCompleter(new String[] { "false", "true" }, false);
    } else if (type.isAssignableFrom(Enum.class)) {
        Set<String> values = new HashSet<>();
        for (Object o : EnumSet.allOf((Class<Enum>) type)) {
            values.add(o.toString());
        }
        completer = new StringsCompleter(values, false);
    } else {
    // TODO any other completers we can add?
    }
    return completer;
}
Also used : FileCompleter(org.apache.karaf.shell.console.completer.FileCompleter) StringsCompleter(org.apache.karaf.shell.console.completer.StringsCompleter) FileCompleter(org.apache.karaf.shell.console.completer.FileCompleter) Completer(org.apache.karaf.shell.console.Completer) StringsCompleter(org.apache.karaf.shell.console.completer.StringsCompleter) NullCompleter(org.apache.karaf.shell.console.completer.NullCompleter) HashSet(java.util.HashSet)

Aggregations

Completer (org.apache.karaf.shell.console.Completer)8 Field (java.lang.reflect.Field)4 CommandSession (org.apache.felix.service.command.CommandSession)4 HashSet (java.util.HashSet)3 FileCompleter (org.apache.karaf.shell.console.completer.FileCompleter)3 NullCompleter (org.apache.karaf.shell.console.completer.NullCompleter)3 StringsCompleter (org.apache.karaf.shell.console.completer.StringsCompleter)3 Option (org.apache.felix.gogo.commands.Option)2 Function (org.apache.felix.service.command.Function)2 HelpOption (org.apache.karaf.shell.commands.HelpOption)2 Option (org.apache.karaf.shell.commands.Option)2 ArrayList (java.util.ArrayList)1 HashMap (java.util.HashMap)1 Map (java.util.Map)1 Set (java.util.Set)1 TreeMap (java.util.TreeMap)1 CommandWithAction (org.apache.karaf.shell.commands.CommandWithAction)1 CompletableFunction (org.apache.karaf.shell.console.CompletableFunction)1