blob: 1d2e307f377767e0d264f6ff65cd54a66adb54cd [file] [log] [blame]
/*
* Copyright (c) 2013 VMware, Inc. All Rights Reserved.
*/
package com.vmware.gerrit.owners.common;
import com.google.gerrit.common.errors.EmailException;
import com.google.gerrit.extensions.api.changes.AddReviewerInput;
import com.google.gerrit.extensions.restapi.RestApiException;
import com.google.gerrit.reviewdb.client.Account;
import com.google.gerrit.reviewdb.client.Change;
import com.google.gerrit.server.CurrentUser;
import com.google.gerrit.server.change.ChangeResource;
import com.google.gerrit.server.change.ChangesCollection;
import com.google.gerrit.server.change.PostReviewers;
import com.google.gerrit.server.project.ChangeControl;
import com.google.gerrit.server.project.NoSuchChangeException;
import com.google.gwtorm.server.OrmException;
import javax.inject.Inject;
import javax.inject.Provider;
import javax.inject.Singleton;
import java.io.IOException;
import java.util.Collection;
@Singleton
public class ReviewerManager {
private final Provider<CurrentUser> currentUserProvider;
private final Provider<PostReviewers> postReviewersProvider;
private final ChangeControl.GenericFactory changeControlFactory;
private final ChangesCollection changesCollection;
@Inject
public ReviewerManager(Provider<CurrentUser> currentUserProvider,
Provider<PostReviewers> postReviewersProvider,
ChangeControl.GenericFactory changeControlFactory,
ChangesCollection changesCollection) {
this.currentUserProvider = currentUserProvider;
this.postReviewersProvider = postReviewersProvider;
this.changeControlFactory = changeControlFactory;
this.changesCollection = changesCollection;
}
public void addReviewers(Change change, Collection<Account.Id> reviewers) throws ReviewerManagerException {
try {
PostReviewers postReviewers = postReviewersProvider.get();
ChangeControl changeControl = changeControlFactory.controlFor(change, currentUserProvider.get());
ChangeResource changeResource = changesCollection.parse(changeControl);
// HACK(vspivak): Using PostReviewers is probably inefficient here, however it has all the hook/notification
// logic, so it's easier to call it then to mimic/copy the logic here.
for (Account.Id accountId : reviewers) {
AddReviewerInput input = new AddReviewerInput();
input.reviewer = accountId.toString();
postReviewers.apply(changeResource, input);
}
} catch (RestApiException e) {
throw new ReviewerManagerException(e);
} catch (NoSuchChangeException e) {
throw new ReviewerManagerException(e);
} catch (EmailException e) {
throw new ReviewerManagerException(e);
} catch (OrmException e) {
throw new ReviewerManagerException(e);
} catch (IOException e) {
throw new ReviewerManagerException(e);
}
}
}