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