public static SimpleFilter parse()

in repository/service/src/main/java/org/apache/karaf/cave/repository/service/bundlerepository/SimpleFilter.java [170:246]


    public static SimpleFilter parse(String filter) {
        int idx = skipWhitespace(filter, 0);

        if ((filter == null) || (filter.length() == 0) || (idx >= filter.length())) {
            throw new IllegalArgumentException("Null or empty filter.");
        } else if (filter.charAt(idx) != '(') {
            throw new IllegalArgumentException("Missing opening parenthesis: " + filter);
        }

        SimpleFilter sf = null;
        Deque<Object> stack = new LinkedList<>();
        boolean isEscaped = false;
        while (idx < filter.length()) {
            if (sf != null) {
                throw new IllegalArgumentException(
                        "Only one top-level operation allowed: " + filter);
            }

            if (!isEscaped && (filter.charAt(idx) == '(')) {
                // Skip paren and following whitespace.
                idx = skipWhitespace(filter, idx + 1);

                if (filter.charAt(idx) == '&') {
                    int peek = skipWhitespace(filter, idx + 1);
                    if (filter.charAt(peek) == '(') {
                        idx = peek - 1;
                        stack.addFirst(new SimpleFilter(null, new ArrayList(), SimpleFilter.AND));
                    } else {
                        stack.addFirst(idx);
                    }
                } else if (filter.charAt(idx) == '|') {
                    int peek = skipWhitespace(filter, idx + 1);
                    if (filter.charAt(peek) == '(') {
                        idx = peek - 1;
                        stack.addFirst(new SimpleFilter(null, new ArrayList(), SimpleFilter.OR));
                    } else {
                        stack.addFirst(idx);
                    }
                } else if (filter.charAt(idx) == '!') {
                    int peek = skipWhitespace(filter, idx + 1);
                    if (filter.charAt(peek) == '(') {
                        idx = peek - 1;
                        stack.addFirst(new SimpleFilter(null, new ArrayList(), SimpleFilter.NOT));
                    } else {
                        stack.addFirst(idx);
                    }
                } else {
                    stack.addFirst(idx);
                }
            } else if (!isEscaped && (filter.charAt(idx) == ')')) {
                Object top = stack.removeFirst();
                Object next = stack.peekFirst();
                if (top instanceof SimpleFilter) {
                    if (next instanceof SimpleFilter) {
                        ((List<Object>) ((SimpleFilter) next).value).add(top);
                    } else {
                        sf = (SimpleFilter) top;
                    }
                } else if (next instanceof SimpleFilter) {
                    ((List<Object>) ((SimpleFilter) next).value).add(
                            SimpleFilter.subfilter(filter, (Integer) top, idx));
                } else {
                    sf = SimpleFilter.subfilter(filter, (Integer) top, idx);
                }
            } else {
                isEscaped = !isEscaped && (filter.charAt(idx) == '\\');
            }

            idx = skipWhitespace(filter, idx + 1);
        }

        if (sf == null) {
            throw new IllegalArgumentException("Missing closing parenthesis: " + filter);
        }

        return sf;
    }