ChangeFinder: Return ChangeNotes instead of ChangeControl
Change-Id: Idaeeb7d82cdd314bdc446216d4eee13b7bef5004
This commit is contained in:
		@@ -253,6 +253,7 @@ public abstract class AbstractDaemonTest {
 | 
			
		||||
  @Inject private InProcessProtocol inProcessProtocol;
 | 
			
		||||
  @Inject private Provider<AnonymousUser> anonymousUser;
 | 
			
		||||
  @Inject private SchemaFactory<ReviewDb> reviewDbProvider;
 | 
			
		||||
  @Inject private ChangeControl.GenericFactory changeControlFactory;
 | 
			
		||||
 | 
			
		||||
  private List<Repository> toClose;
 | 
			
		||||
 | 
			
		||||
@@ -1116,9 +1117,10 @@ public abstract class AbstractDaemonTest {
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  protected ChangeResource parseChangeResource(String changeId) throws Exception {
 | 
			
		||||
    List<ChangeControl> ctls = changeFinder.find(changeId, atrScope.get().getUser());
 | 
			
		||||
    assertThat(ctls).hasSize(1);
 | 
			
		||||
    return changeResourceFactory.create(ctls.get(0));
 | 
			
		||||
    List<ChangeNotes> notes = changeFinder.find(changeId);
 | 
			
		||||
    assertThat(notes).hasSize(1);
 | 
			
		||||
    return changeResourceFactory.create(
 | 
			
		||||
        changeControlFactory.controlFor(notes.get(0), atrScope.get().getUser()));
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  protected String createGroup(String name) throws Exception {
 | 
			
		||||
 
 | 
			
		||||
@@ -116,7 +116,6 @@ import com.google.gerrit.server.config.AnonymousCowardNameProvider;
 | 
			
		||||
import com.google.gerrit.server.git.ChangeMessageModifier;
 | 
			
		||||
import com.google.gerrit.server.git.ProjectConfig;
 | 
			
		||||
import com.google.gerrit.server.notedb.NoteDbChangeState.PrimaryStorage;
 | 
			
		||||
import com.google.gerrit.server.project.ChangeControl;
 | 
			
		||||
import com.google.gerrit.server.project.Util;
 | 
			
		||||
import com.google.gerrit.server.update.BatchUpdate;
 | 
			
		||||
import com.google.gerrit.server.update.BatchUpdateOp;
 | 
			
		||||
@@ -3304,9 +3303,7 @@ public class ChangeIT extends AbstractDaemonTest {
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  private ChangeResource parseResource(PushOneCommit.Result r) throws Exception {
 | 
			
		||||
    List<ChangeControl> ctls = changeFinder.find(r.getChangeId(), atrScope.get().getUser());
 | 
			
		||||
    assertThat(ctls).hasSize(1);
 | 
			
		||||
    return changeResourceFactory.create(ctls.get(0));
 | 
			
		||||
    return parseChangeResource(r.getChangeId());
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  private Optional<ReviewerState> getReviewerState(String changeId, Account.Id accountId)
 | 
			
		||||
 
 | 
			
		||||
@@ -25,7 +25,7 @@ import com.google.gerrit.reviewdb.client.Project;
 | 
			
		||||
import com.google.gerrit.reviewdb.server.ReviewDb;
 | 
			
		||||
import com.google.gerrit.server.cache.CacheModule;
 | 
			
		||||
import com.google.gerrit.server.change.ChangeTriplet;
 | 
			
		||||
import com.google.gerrit.server.project.ChangeControl;
 | 
			
		||||
import com.google.gerrit.server.notedb.ChangeNotes;
 | 
			
		||||
import com.google.gerrit.server.project.NoSuchChangeException;
 | 
			
		||||
import com.google.gerrit.server.query.change.ChangeData;
 | 
			
		||||
import com.google.gerrit.server.query.change.InternalChangeQuery;
 | 
			
		||||
@@ -59,7 +59,7 @@ public class ChangeFinder {
 | 
			
		||||
  private final Cache<Change.Id, String> changeIdProjectCache;
 | 
			
		||||
  private final Provider<InternalChangeQuery> queryProvider;
 | 
			
		||||
  private final Provider<ReviewDb> reviewDb;
 | 
			
		||||
  private final ChangeControl.GenericFactory changeControlFactory;
 | 
			
		||||
  private final ChangeNotes.Factory changeNotesFactory;
 | 
			
		||||
 | 
			
		||||
  @Inject
 | 
			
		||||
  ChangeFinder(
 | 
			
		||||
@@ -67,24 +67,22 @@ public class ChangeFinder {
 | 
			
		||||
      @Named(CACHE_NAME) Cache<Change.Id, String> changeIdProjectCache,
 | 
			
		||||
      Provider<InternalChangeQuery> queryProvider,
 | 
			
		||||
      Provider<ReviewDb> reviewDb,
 | 
			
		||||
      ChangeControl.GenericFactory changeControlFactory) {
 | 
			
		||||
      ChangeNotes.Factory changeNotesFactory) {
 | 
			
		||||
    this.indexConfig = indexConfig;
 | 
			
		||||
    this.changeIdProjectCache = changeIdProjectCache;
 | 
			
		||||
    this.queryProvider = queryProvider;
 | 
			
		||||
    this.reviewDb = reviewDb;
 | 
			
		||||
    this.changeControlFactory = changeControlFactory;
 | 
			
		||||
    this.changeNotesFactory = changeNotesFactory;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * Find changes matching the given identifier.
 | 
			
		||||
   *
 | 
			
		||||
   * @param id change identifier, either a numeric ID, a Change-Id, or project~branch~id triplet.
 | 
			
		||||
   * @param user user to wrap in controls.
 | 
			
		||||
   * @return possibly-empty list of controls for all matching changes, corresponding to the given
 | 
			
		||||
   *     user; may or may not be visible.
 | 
			
		||||
   * @return possibly-empty list of notes for all matching changes; may or may not be visible.
 | 
			
		||||
   * @throws OrmException if an error occurred querying the database.
 | 
			
		||||
   */
 | 
			
		||||
  public List<ChangeControl> find(String id, CurrentUser user) throws OrmException {
 | 
			
		||||
  public List<ChangeNotes> find(String id) throws OrmException {
 | 
			
		||||
    if (id.isEmpty()) {
 | 
			
		||||
      return Collections.emptyList();
 | 
			
		||||
    }
 | 
			
		||||
@@ -95,7 +93,7 @@ public class ChangeFinder {
 | 
			
		||||
      // Try project~numericChangeId
 | 
			
		||||
      Integer n = Ints.tryParse(id.substring(z + 1));
 | 
			
		||||
      if (n != null) {
 | 
			
		||||
        return fromProjectNumber(user, id.substring(0, z), n.intValue());
 | 
			
		||||
        return fromProjectNumber(id.substring(0, z), n.intValue());
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -103,7 +101,7 @@ public class ChangeFinder {
 | 
			
		||||
      // Try numeric changeId
 | 
			
		||||
      Integer n = Ints.tryParse(id);
 | 
			
		||||
      if (n != null) {
 | 
			
		||||
        return find(new Change.Id(n), user);
 | 
			
		||||
        return find(new Change.Id(n));
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -115,33 +113,22 @@ public class ChangeFinder {
 | 
			
		||||
      Optional<ChangeTriplet> triplet = ChangeTriplet.parse(id, y, z);
 | 
			
		||||
      if (triplet.isPresent()) {
 | 
			
		||||
        ChangeTriplet t = triplet.get();
 | 
			
		||||
        return asChangeControls(query.byBranchKey(t.branch(), t.id()), user);
 | 
			
		||||
        return asChangeNotes(query.byBranchKey(t.branch(), t.id()));
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Try isolated Ihash... format ("Change-Id: Ihash").
 | 
			
		||||
    return asChangeControls(query.byKeyPrefix(id), user);
 | 
			
		||||
    return asChangeNotes(query.byKeyPrefix(id));
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  private List<ChangeControl> fromProjectNumber(CurrentUser user, String project, int changeNumber)
 | 
			
		||||
  private List<ChangeNotes> fromProjectNumber(String project, int changeNumber)
 | 
			
		||||
      throws OrmException {
 | 
			
		||||
    Change.Id cId = new Change.Id(changeNumber);
 | 
			
		||||
    try {
 | 
			
		||||
      return ImmutableList.of(
 | 
			
		||||
          changeControlFactory.controlFor(
 | 
			
		||||
              reviewDb.get(), Project.NameKey.parse(project), cId, user));
 | 
			
		||||
          changeNotesFactory.createChecked(reviewDb.get(), Project.NameKey.parse(project), cId));
 | 
			
		||||
    } catch (NoSuchChangeException e) {
 | 
			
		||||
      return Collections.emptyList();
 | 
			
		||||
    } catch (IllegalArgumentException e) {
 | 
			
		||||
      String changeNotFound = String.format("change %s not found in ReviewDb", cId);
 | 
			
		||||
      String projectNotFound =
 | 
			
		||||
          String.format(
 | 
			
		||||
              "passed project %s when creating ChangeNotes for %s, but actual project is",
 | 
			
		||||
              project, cId);
 | 
			
		||||
      if (e.getMessage().equals(changeNotFound) || e.getMessage().startsWith(projectNotFound)) {
 | 
			
		||||
        return Collections.emptyList();
 | 
			
		||||
      }
 | 
			
		||||
      throw e;
 | 
			
		||||
    } catch (OrmException e) {
 | 
			
		||||
      // Distinguish between a RepositoryNotFoundException (project argument invalid) and
 | 
			
		||||
      // other OrmExceptions (failure in the persistence layer).
 | 
			
		||||
@@ -152,18 +139,18 @@ public class ChangeFinder {
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  public ChangeControl findOne(Change.Id id, CurrentUser user) throws OrmException {
 | 
			
		||||
    List<ChangeControl> ctls = find(id, user);
 | 
			
		||||
    if (ctls.size() != 1) {
 | 
			
		||||
  public ChangeNotes findOne(Change.Id id) throws OrmException {
 | 
			
		||||
    List<ChangeNotes> notes = find(id);
 | 
			
		||||
    if (notes.size() != 1) {
 | 
			
		||||
      throw new NoSuchChangeException(id);
 | 
			
		||||
    }
 | 
			
		||||
    return ctls.get(0);
 | 
			
		||||
    return notes.get(0);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  public List<ChangeControl> find(Change.Id id, CurrentUser user) throws OrmException {
 | 
			
		||||
  public List<ChangeNotes> find(Change.Id id) throws OrmException {
 | 
			
		||||
    String project = changeIdProjectCache.getIfPresent(id);
 | 
			
		||||
    if (project != null) {
 | 
			
		||||
      return fromProjectNumber(user, project, id.get());
 | 
			
		||||
      return fromProjectNumber(project, id.get());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Use the index to search for changes, but don't return any stored fields,
 | 
			
		||||
@@ -173,17 +160,16 @@ public class ChangeFinder {
 | 
			
		||||
    if (r.size() == 1) {
 | 
			
		||||
      changeIdProjectCache.put(id, r.get(0).project().get());
 | 
			
		||||
    }
 | 
			
		||||
    return asChangeControls(r, user);
 | 
			
		||||
    return asChangeNotes(r);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  private List<ChangeControl> asChangeControls(List<ChangeData> cds, CurrentUser user)
 | 
			
		||||
      throws OrmException {
 | 
			
		||||
    List<ChangeControl> ctls = new ArrayList<>(cds.size());
 | 
			
		||||
  private List<ChangeNotes> asChangeNotes(List<ChangeData> cds) throws OrmException {
 | 
			
		||||
    List<ChangeNotes> notes = new ArrayList<>(cds.size());
 | 
			
		||||
    if (!indexConfig.separateChangeSubIndexes()) {
 | 
			
		||||
      for (ChangeData cd : cds) {
 | 
			
		||||
        checkedAdd(cd, ctls, user);
 | 
			
		||||
        notes.add(cd.notes());
 | 
			
		||||
      }
 | 
			
		||||
      return ctls;
 | 
			
		||||
      return notes;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // If an index implementation uses separate non-atomic subindexes, it's possible to temporarily
 | 
			
		||||
@@ -195,18 +181,9 @@ public class ChangeFinder {
 | 
			
		||||
    Set<Change.Id> seen = Sets.newHashSetWithExpectedSize(cds.size());
 | 
			
		||||
    for (ChangeData cd : cds) {
 | 
			
		||||
      if (seen.add(cd.getId())) {
 | 
			
		||||
        checkedAdd(cd, ctls, user);
 | 
			
		||||
        notes.add(cd.notes());
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
    return ctls;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  private static void checkedAdd(ChangeData cd, List<ChangeControl> ctls, CurrentUser user)
 | 
			
		||||
      throws OrmException {
 | 
			
		||||
    try {
 | 
			
		||||
      ctls.add(cd.changeControl(user));
 | 
			
		||||
    } catch (NoSuchChangeException e) {
 | 
			
		||||
      // Ignore
 | 
			
		||||
    }
 | 
			
		||||
    return notes;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -26,10 +26,12 @@ import com.google.gerrit.reviewdb.client.Change;
 | 
			
		||||
import com.google.gerrit.reviewdb.server.ReviewDb;
 | 
			
		||||
import com.google.gerrit.server.ChangeFinder;
 | 
			
		||||
import com.google.gerrit.server.CurrentUser;
 | 
			
		||||
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.gerrit.server.project.ChangeControl;
 | 
			
		||||
import com.google.gerrit.server.project.NoSuchChangeException;
 | 
			
		||||
import com.google.gerrit.server.query.change.QueryChanges;
 | 
			
		||||
import com.google.gwtorm.server.OrmException;
 | 
			
		||||
import com.google.inject.Inject;
 | 
			
		||||
@@ -48,6 +50,7 @@ public class ChangesCollection
 | 
			
		||||
  private final CreateChange createChange;
 | 
			
		||||
  private final ChangeResource.Factory changeResourceFactory;
 | 
			
		||||
  private final PermissionBackend permissionBackend;
 | 
			
		||||
  private final ChangeControl.GenericFactory changeControlFactory;
 | 
			
		||||
 | 
			
		||||
  @Inject
 | 
			
		||||
  ChangesCollection(
 | 
			
		||||
@@ -58,7 +61,8 @@ public class ChangesCollection
 | 
			
		||||
      ChangeFinder changeFinder,
 | 
			
		||||
      CreateChange createChange,
 | 
			
		||||
      ChangeResource.Factory changeResourceFactory,
 | 
			
		||||
      PermissionBackend permissionBackend) {
 | 
			
		||||
      PermissionBackend permissionBackend,
 | 
			
		||||
      ChangeControl.GenericFactory changeControlFactory) {
 | 
			
		||||
    this.db = db;
 | 
			
		||||
    this.user = user;
 | 
			
		||||
    this.queryFactory = queryFactory;
 | 
			
		||||
@@ -67,6 +71,7 @@ public class ChangesCollection
 | 
			
		||||
    this.createChange = createChange;
 | 
			
		||||
    this.changeResourceFactory = changeResourceFactory;
 | 
			
		||||
    this.permissionBackend = permissionBackend;
 | 
			
		||||
    this.changeControlFactory = changeControlFactory;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @Override
 | 
			
		||||
@@ -82,34 +87,34 @@ public class ChangesCollection
 | 
			
		||||
  @Override
 | 
			
		||||
  public ChangeResource parse(TopLevelResource root, IdString id)
 | 
			
		||||
      throws ResourceNotFoundException, OrmException, PermissionBackendException {
 | 
			
		||||
    List<ChangeControl> ctls = changeFinder.find(id.encoded(), user.get());
 | 
			
		||||
    if (ctls.isEmpty()) {
 | 
			
		||||
    List<ChangeNotes> notes = changeFinder.find(id.encoded());
 | 
			
		||||
    if (notes.isEmpty()) {
 | 
			
		||||
      throw new ResourceNotFoundException(id);
 | 
			
		||||
    } else if (ctls.size() != 1) {
 | 
			
		||||
    } else if (notes.size() != 1) {
 | 
			
		||||
      throw new ResourceNotFoundException("Multiple changes found for " + id);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    ChangeControl ctl = ctls.get(0);
 | 
			
		||||
    if (!canRead(ctl)) {
 | 
			
		||||
    ChangeNotes change = notes.get(0);
 | 
			
		||||
    if (!canRead(change)) {
 | 
			
		||||
      throw new ResourceNotFoundException(id);
 | 
			
		||||
    }
 | 
			
		||||
    return changeResourceFactory.create(ctl);
 | 
			
		||||
    return changeResourceFactory.create(controlFor(change));
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  public ChangeResource parse(Change.Id id)
 | 
			
		||||
      throws ResourceNotFoundException, OrmException, PermissionBackendException {
 | 
			
		||||
    List<ChangeControl> ctls = changeFinder.find(id, user.get());
 | 
			
		||||
    if (ctls.isEmpty()) {
 | 
			
		||||
    List<ChangeNotes> notes = changeFinder.find(id);
 | 
			
		||||
    if (notes.isEmpty()) {
 | 
			
		||||
      throw new ResourceNotFoundException(toIdString(id));
 | 
			
		||||
    } else if (ctls.size() != 1) {
 | 
			
		||||
    } else if (notes.size() != 1) {
 | 
			
		||||
      throw new ResourceNotFoundException("Multiple changes found for " + id);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    ChangeControl ctl = ctls.get(0);
 | 
			
		||||
    if (!canRead(ctl)) {
 | 
			
		||||
    ChangeNotes change = notes.get(0);
 | 
			
		||||
    if (!canRead(change)) {
 | 
			
		||||
      throw new ResourceNotFoundException(toIdString(id));
 | 
			
		||||
    }
 | 
			
		||||
    return changeResourceFactory.create(ctl);
 | 
			
		||||
    return changeResourceFactory.create(controlFor(change));
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  private static IdString toIdString(Change.Id id) {
 | 
			
		||||
@@ -126,11 +131,16 @@ public class ChangesCollection
 | 
			
		||||
    return createChange;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  private boolean canRead(ChangeControl ctl) throws PermissionBackendException {
 | 
			
		||||
    return permissionBackend
 | 
			
		||||
        .user(user)
 | 
			
		||||
        .change(ctl.getNotes())
 | 
			
		||||
        .database(db)
 | 
			
		||||
        .test(ChangePermission.READ);
 | 
			
		||||
  private boolean canRead(ChangeNotes notes) throws PermissionBackendException {
 | 
			
		||||
    return permissionBackend.user(user).change(notes).database(db).test(ChangePermission.READ);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  private ChangeControl controlFor(ChangeNotes notes) throws ResourceNotFoundException {
 | 
			
		||||
    try {
 | 
			
		||||
      return changeControlFactory.controlFor(notes, user.get());
 | 
			
		||||
    } catch (NoSuchChangeException e) {
 | 
			
		||||
      throw new ResourceNotFoundException(
 | 
			
		||||
          String.format("Change %s not found", notes.getChangeId()));
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -52,11 +52,11 @@ import com.google.gerrit.server.config.AnonymousCowardName;
 | 
			
		||||
import com.google.gerrit.server.config.GerritServerConfig;
 | 
			
		||||
import com.google.gerrit.server.git.GitRepositoryManager;
 | 
			
		||||
import com.google.gerrit.server.git.MergeUtil;
 | 
			
		||||
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.gerrit.server.permissions.RefPermission;
 | 
			
		||||
import com.google.gerrit.server.project.ChangeControl;
 | 
			
		||||
import com.google.gerrit.server.project.CommitsCollection;
 | 
			
		||||
import com.google.gerrit.server.project.InvalidChangeOperationException;
 | 
			
		||||
import com.google.gerrit.server.project.ProjectControl;
 | 
			
		||||
@@ -194,19 +194,15 @@ public class CreateChange
 | 
			
		||||
      ObjectId parentCommit;
 | 
			
		||||
      List<String> groups;
 | 
			
		||||
      if (input.baseChange != null) {
 | 
			
		||||
        List<ChangeControl> ctls = changeFinder.find(input.baseChange, rsrc.getUser());
 | 
			
		||||
        if (ctls.size() != 1) {
 | 
			
		||||
        List<ChangeNotes> notes = changeFinder.find(input.baseChange);
 | 
			
		||||
        if (notes.size() != 1) {
 | 
			
		||||
          throw new UnprocessableEntityException("Base change not found: " + input.baseChange);
 | 
			
		||||
        }
 | 
			
		||||
        ChangeControl ctl = Iterables.getOnlyElement(ctls);
 | 
			
		||||
        if (!permissionBackend
 | 
			
		||||
            .user(user)
 | 
			
		||||
            .change(ctl.getNotes())
 | 
			
		||||
            .database(db)
 | 
			
		||||
            .test(ChangePermission.READ)) {
 | 
			
		||||
        ChangeNotes change = Iterables.getOnlyElement(notes);
 | 
			
		||||
        if (!permissionBackend.user(user).change(change).database(db).test(ChangePermission.READ)) {
 | 
			
		||||
          throw new UnprocessableEntityException("Base change not found: " + input.baseChange);
 | 
			
		||||
        }
 | 
			
		||||
        PatchSet ps = psUtil.current(db.get(), ctl.getNotes());
 | 
			
		||||
        PatchSet ps = psUtil.current(db.get(), change);
 | 
			
		||||
        parentCommit = ObjectId.fromString(ps.getRevision().get());
 | 
			
		||||
        groups = ps.getGroups();
 | 
			
		||||
      } else {
 | 
			
		||||
 
 | 
			
		||||
@@ -172,7 +172,7 @@ public class ChangeNotes extends AbstractChangeNotes<ChangeNotes> {
 | 
			
		||||
        // Prepopulate the change exists with proper noteDbState field.
 | 
			
		||||
        change = newNoteDbOnlyChange(project, changeId);
 | 
			
		||||
      } else {
 | 
			
		||||
        checkArgument(change != null, "change %s not found in ReviewDb", changeId);
 | 
			
		||||
        checkNotNull(change, "change %s not found in ReviewDb", changeId);
 | 
			
		||||
        checkArgument(
 | 
			
		||||
            change.getProject().equals(project),
 | 
			
		||||
            "passed project %s when creating ChangeNotes for %s, but actual project is %s",
 | 
			
		||||
 
 | 
			
		||||
@@ -14,9 +14,8 @@
 | 
			
		||||
 | 
			
		||||
package com.google.gerrit.sshd;
 | 
			
		||||
 | 
			
		||||
import static java.util.stream.Collectors.toList;
 | 
			
		||||
 | 
			
		||||
import com.google.gerrit.extensions.restapi.AuthException;
 | 
			
		||||
import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
 | 
			
		||||
import com.google.gerrit.reviewdb.client.Change;
 | 
			
		||||
import com.google.gerrit.reviewdb.client.Project;
 | 
			
		||||
import com.google.gerrit.reviewdb.server.ReviewDb;
 | 
			
		||||
@@ -30,7 +29,6 @@ import com.google.gerrit.server.permissions.GlobalPermission;
 | 
			
		||||
import com.google.gerrit.server.permissions.PermissionBackend;
 | 
			
		||||
import com.google.gerrit.server.permissions.PermissionBackendException;
 | 
			
		||||
import com.google.gerrit.server.project.ChangeControl;
 | 
			
		||||
import com.google.gerrit.server.project.NoSuchChangeException;
 | 
			
		||||
import com.google.gerrit.server.project.ProjectControl;
 | 
			
		||||
import com.google.gerrit.sshd.BaseCommand.UnloggedFailure;
 | 
			
		||||
import com.google.gwtorm.server.OrmException;
 | 
			
		||||
@@ -39,7 +37,6 @@ import java.util.ArrayList;
 | 
			
		||||
import java.util.Arrays;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
import java.util.Map;
 | 
			
		||||
import java.util.Optional;
 | 
			
		||||
 | 
			
		||||
public class ChangeArgumentParser {
 | 
			
		||||
  private final CurrentUser currentUser;
 | 
			
		||||
@@ -85,9 +82,8 @@ public class ChangeArgumentParser {
 | 
			
		||||
      ProjectControl projectControl,
 | 
			
		||||
      boolean useIndex)
 | 
			
		||||
      throws UnloggedFailure, OrmException, PermissionBackendException {
 | 
			
		||||
    List<ChangeControl> matched =
 | 
			
		||||
        useIndex ? changeFinder.find(id, currentUser) : changeFromNotesFactory(id, currentUser);
 | 
			
		||||
    List<ChangeControl> toAdd = new ArrayList<>(changes.size());
 | 
			
		||||
    List<ChangeNotes> matched = useIndex ? changeFinder.find(id) : changeFromNotesFactory(id);
 | 
			
		||||
    List<ChangeNotes> toAdd = new ArrayList<>(changes.size());
 | 
			
		||||
    boolean canMaintainServer;
 | 
			
		||||
    try {
 | 
			
		||||
      permissionBackend.user(currentUser).check(GlobalPermission.MAINTAIN_SERVER);
 | 
			
		||||
@@ -95,16 +91,16 @@ public class ChangeArgumentParser {
 | 
			
		||||
    } catch (AuthException | PermissionBackendException e) {
 | 
			
		||||
      canMaintainServer = false;
 | 
			
		||||
    }
 | 
			
		||||
    for (ChangeControl ctl : matched) {
 | 
			
		||||
      if (!changes.containsKey(ctl.getId())
 | 
			
		||||
          && inProject(projectControl, ctl.getProject())
 | 
			
		||||
    for (ChangeNotes notes : matched) {
 | 
			
		||||
      if (!changes.containsKey(notes.getChangeId())
 | 
			
		||||
          && inProject(projectControl, notes.getProjectName())
 | 
			
		||||
          && (canMaintainServer
 | 
			
		||||
              || permissionBackend
 | 
			
		||||
                  .user(currentUser)
 | 
			
		||||
                  .change(ctl.getNotes())
 | 
			
		||||
                  .change(notes)
 | 
			
		||||
                  .database(db)
 | 
			
		||||
                  .test(ChangePermission.READ))) {
 | 
			
		||||
        toAdd.add(ctl);
 | 
			
		||||
        toAdd.add(notes);
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -113,19 +109,18 @@ public class ChangeArgumentParser {
 | 
			
		||||
    } else if (toAdd.size() > 1) {
 | 
			
		||||
      throw new UnloggedFailure(1, "\"" + id + "\" matches multiple changes");
 | 
			
		||||
    }
 | 
			
		||||
    ChangeControl ctl = toAdd.get(0);
 | 
			
		||||
    changes.put(ctl.getId(), changesCollection.parse(ctl));
 | 
			
		||||
    Change.Id cId = toAdd.get(0).getChangeId();
 | 
			
		||||
    ChangeResource changeResource;
 | 
			
		||||
    try {
 | 
			
		||||
      changeResource = changesCollection.parse(cId);
 | 
			
		||||
    } catch (ResourceNotFoundException e) {
 | 
			
		||||
      throw new UnloggedFailure(1, "\"" + id + "\" no such change");
 | 
			
		||||
    }
 | 
			
		||||
    changes.put(cId, changeResource);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  private List<ChangeControl> changeFromNotesFactory(String id, CurrentUser currentUser)
 | 
			
		||||
      throws OrmException, UnloggedFailure {
 | 
			
		||||
    return changeNotesFactory
 | 
			
		||||
        .create(db, parseId(id))
 | 
			
		||||
        .stream()
 | 
			
		||||
        .map(changeNote -> controlForChange(changeNote, currentUser))
 | 
			
		||||
        .filter(changeControl -> changeControl.isPresent())
 | 
			
		||||
        .map(changeControl -> changeControl.get())
 | 
			
		||||
        .collect(toList());
 | 
			
		||||
  private List<ChangeNotes> changeFromNotesFactory(String id) throws OrmException, UnloggedFailure {
 | 
			
		||||
    return changeNotesFactory.create(db, parseId(id));
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  private List<Change.Id> parseId(String id) throws UnloggedFailure {
 | 
			
		||||
@@ -136,17 +131,9 @@ public class ChangeArgumentParser {
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  private Optional<ChangeControl> controlForChange(ChangeNotes change, CurrentUser user) {
 | 
			
		||||
    try {
 | 
			
		||||
      return Optional.of(changeControlFactory.controlFor(change, user));
 | 
			
		||||
    } catch (NoSuchChangeException e) {
 | 
			
		||||
      return Optional.empty();
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  private boolean inProject(ProjectControl projectControl, Project project) {
 | 
			
		||||
  private boolean inProject(ProjectControl projectControl, Project.NameKey project) {
 | 
			
		||||
    if (projectControl != null) {
 | 
			
		||||
      return projectControl.getProject().getNameKey().equals(project.getNameKey());
 | 
			
		||||
      return projectControl.getProject().getNameKey().equals(project);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // No --project option, so they want every project.
 | 
			
		||||
 
 | 
			
		||||
@@ -21,10 +21,8 @@ import com.google.gerrit.reviewdb.client.Project;
 | 
			
		||||
import com.google.gerrit.reviewdb.client.RevId;
 | 
			
		||||
import com.google.gerrit.reviewdb.server.ReviewDb;
 | 
			
		||||
import com.google.gerrit.server.ChangeFinder;
 | 
			
		||||
import com.google.gerrit.server.CurrentUser;
 | 
			
		||||
import com.google.gerrit.server.PatchSetUtil;
 | 
			
		||||
import com.google.gerrit.server.notedb.ChangeNotes;
 | 
			
		||||
import com.google.gerrit.server.project.ChangeControl;
 | 
			
		||||
import com.google.gerrit.server.project.NoSuchChangeException;
 | 
			
		||||
import com.google.gerrit.server.project.ProjectControl;
 | 
			
		||||
import com.google.gerrit.server.query.change.ChangeData;
 | 
			
		||||
@@ -44,7 +42,6 @@ public class PatchSetParser {
 | 
			
		||||
  private final ChangeNotes.Factory notesFactory;
 | 
			
		||||
  private final PatchSetUtil psUtil;
 | 
			
		||||
  private final ChangeFinder changeFinder;
 | 
			
		||||
  private final Provider<CurrentUser> self;
 | 
			
		||||
 | 
			
		||||
  @Inject
 | 
			
		||||
  PatchSetParser(
 | 
			
		||||
@@ -52,14 +49,12 @@ public class PatchSetParser {
 | 
			
		||||
      Provider<InternalChangeQuery> queryProvider,
 | 
			
		||||
      ChangeNotes.Factory notesFactory,
 | 
			
		||||
      PatchSetUtil psUtil,
 | 
			
		||||
      ChangeFinder changeFinder,
 | 
			
		||||
      Provider<CurrentUser> self) {
 | 
			
		||||
      ChangeFinder changeFinder) {
 | 
			
		||||
    this.db = db;
 | 
			
		||||
    this.queryProvider = queryProvider;
 | 
			
		||||
    this.notesFactory = notesFactory;
 | 
			
		||||
    this.psUtil = psUtil;
 | 
			
		||||
    this.changeFinder = changeFinder;
 | 
			
		||||
    this.self = self;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  public PatchSet parsePatchSet(String token, ProjectControl projectControl, String branch)
 | 
			
		||||
@@ -141,8 +136,8 @@ public class PatchSetParser {
 | 
			
		||||
      return notesFactory.create(db.get(), projectControl.getProject().getNameKey(), changeId);
 | 
			
		||||
    }
 | 
			
		||||
    try {
 | 
			
		||||
      ChangeControl ctl = changeFinder.findOne(changeId, self.get());
 | 
			
		||||
      return notesFactory.create(db.get(), ctl.getProject().getNameKey(), changeId);
 | 
			
		||||
      ChangeNotes notes = changeFinder.findOne(changeId);
 | 
			
		||||
      return notesFactory.create(db.get(), notes.getProjectName(), changeId);
 | 
			
		||||
    } catch (NoSuchChangeException e) {
 | 
			
		||||
      throw error("\"" + changeId + "\" no such change");
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user