Change-Id: I322a204776f5ae5529f75a80be84352e4d1c82a6 Signed-off-by: Edwin Kempin <ekempin@google.com>
120 lines
3.8 KiB
Java
120 lines
3.8 KiB
Java
// Copyright (C) 2010 The Android Open Source Project
|
|
//
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
// you may not use this file except in compliance with the License.
|
|
// You may obtain a copy of the License at
|
|
//
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
//
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
// See the License for the specific language governing permissions and
|
|
// limitations under the License.
|
|
|
|
package com.google.gerrit.server.query.change;
|
|
|
|
import com.google.common.collect.ImmutableList;
|
|
import com.google.gerrit.index.query.AndPredicate;
|
|
import com.google.gerrit.index.query.Predicate;
|
|
import com.google.gerrit.index.query.QueryBuilder;
|
|
import com.google.gerrit.index.query.QueryParseException;
|
|
import com.google.gerrit.server.CurrentUser;
|
|
import com.google.gerrit.server.account.ProjectWatches.ProjectWatchKey;
|
|
import java.util.ArrayList;
|
|
import java.util.Collection;
|
|
import java.util.Collections;
|
|
import java.util.List;
|
|
|
|
public class IsWatchedByPredicate extends AndPredicate<ChangeData> {
|
|
protected static String describe(CurrentUser user) {
|
|
if (user.isIdentifiedUser()) {
|
|
return user.getAccountId().toString();
|
|
}
|
|
return user.toString();
|
|
}
|
|
|
|
protected final CurrentUser user;
|
|
|
|
public IsWatchedByPredicate(ChangeQueryBuilder.Arguments args, boolean checkIsVisible)
|
|
throws QueryParseException {
|
|
super(filters(args, checkIsVisible));
|
|
this.user = args.getUser();
|
|
}
|
|
|
|
protected static List<Predicate<ChangeData>> filters(
|
|
ChangeQueryBuilder.Arguments args, boolean checkIsVisible) throws QueryParseException {
|
|
List<Predicate<ChangeData>> r = new ArrayList<>();
|
|
ChangeQueryBuilder builder = new ChangeQueryBuilder(args);
|
|
for (ProjectWatchKey w : getWatches(args)) {
|
|
Predicate<ChangeData> f = null;
|
|
if (w.filter() != null) {
|
|
try {
|
|
f = builder.parse(w.filter());
|
|
if (QueryBuilder.find(f, IsWatchedByPredicate.class) != null) {
|
|
// If the query is going to infinite loop, assume it
|
|
// will never match and return null. Yes this test
|
|
// prevents you from having a filter that matches what
|
|
// another user is filtering on. :-)
|
|
continue;
|
|
}
|
|
} catch (QueryParseException e) {
|
|
continue;
|
|
}
|
|
}
|
|
|
|
Predicate<ChangeData> p;
|
|
if (w.project().equals(args.allProjectsName)) {
|
|
p = null;
|
|
} else {
|
|
p = builder.project(w.project().get());
|
|
}
|
|
|
|
if (p != null && f != null) {
|
|
r.add(and(p, f));
|
|
} else if (p != null) {
|
|
r.add(p);
|
|
} else if (f != null) {
|
|
r.add(f);
|
|
} else {
|
|
r.add(builder.status_open());
|
|
}
|
|
}
|
|
if (r.isEmpty()) {
|
|
return none();
|
|
} else if (checkIsVisible) {
|
|
return ImmutableList.of(or(r), builder.is_visible());
|
|
} else {
|
|
return ImmutableList.of(or(r));
|
|
}
|
|
}
|
|
|
|
protected static Collection<ProjectWatchKey> getWatches(ChangeQueryBuilder.Arguments args)
|
|
throws QueryParseException {
|
|
CurrentUser user = args.getUser();
|
|
if (user.isIdentifiedUser()) {
|
|
return user.asIdentifiedUser().state().getProjectWatches().keySet();
|
|
}
|
|
return Collections.<ProjectWatchKey>emptySet();
|
|
}
|
|
|
|
protected static List<Predicate<ChangeData>> none() {
|
|
Predicate<ChangeData> any = any();
|
|
return ImmutableList.of(not(any));
|
|
}
|
|
|
|
@Override
|
|
public int getCost() {
|
|
return 1;
|
|
}
|
|
|
|
@Override
|
|
public String toString() {
|
|
String val = describe(user);
|
|
if (val.indexOf(' ') < 0) {
|
|
return ChangeQueryBuilder.FIELD_WATCHEDBY + ":" + val;
|
|
}
|
|
return ChangeQueryBuilder.FIELD_WATCHEDBY + ":\"" + val + "\"";
|
|
}
|
|
}
|