blob: f8b8cc7d84acf84e887b6dacd01fc8e4978ab32f [file] [log] [blame]
package com.google.gerrit.server.query.account;
import com.google.gerrit.index.query.PostFilterPredicate;
import com.google.gerrit.index.query.Predicate;
import com.google.gerrit.reviewdb.server.ReviewDb;
import com.google.gerrit.server.IdentifiedUser;
import com.google.gerrit.server.account.AccountState;
import com.google.gerrit.server.notedb.ChangeNotes;
import com.google.gerrit.server.permissions.ChangePermission;
import com.google.gerrit.server.permissions.PermissionBackend;
import com.google.gerrit.server.permissions.PermissionBackendException;
import com.google.gwtorm.server.OrmException;
import com.google.inject.Provider;
import java.util.Collection;
import java.util.Objects;
public class CanSeeChangePredicate extends PostFilterPredicate<AccountState> {
private final Provider<ReviewDb> db;
private final PermissionBackend permissionBackend;
private final IdentifiedUser.GenericFactory userFactory;
private final ChangeNotes changeNotes;
CanSeeChangePredicate(
Provider<ReviewDb> db,
PermissionBackend permissionBackend,
IdentifiedUser.GenericFactory userFactory,
ChangeNotes changeNotes) {
this.db = db;
this.permissionBackend = permissionBackend;
this.userFactory = userFactory;
this.changeNotes = changeNotes;
}
@Override
public boolean match(AccountState accountState) throws OrmException {
try {
return permissionBackend
.user(userFactory.create(accountState.getAccount().getId()))
.database(db)
.change(changeNotes)
.test(ChangePermission.READ);
} catch (PermissionBackendException e) {
throw new OrmException("Failed to check if account can see change", e);
}
}
@Override
public int getCost() {
return 1;
}
@Override
public Predicate<AccountState> copy(Collection<? extends Predicate<AccountState>> children) {
return new CanSeeChangePredicate(db, permissionBackend, userFactory, changeNotes);
}
@Override
public int hashCode() {
return Objects.hash(changeNotes.getChange().getChangeId());
}
@Override
public boolean equals(Object other) {
if (other == null) {
return false;
}
return getClass() == other.getClass()
&& changeNotes.getChange().getChangeId()
== ((CanSeeChangePredicate) other).changeNotes.getChange().getChangeId();
}
}