Simplify DeleteVote to only use a single loop

The old logic was a little confusing:
 - Looked up approvals twice.
 - Looped over label types.
 - Created the message in the loop body.

Change-Id: Ib59df4cb3032800a305efb6928567e4d67dac07e
This commit is contained in:
Dave Borowitz
2016-08-24 11:53:32 -04:00
parent afe569ab25
commit 7b6ac472fb
2 changed files with 66 additions and 62 deletions

View File

@@ -14,8 +14,9 @@
package com.google.gerrit.server.change;
import static com.google.common.base.Preconditions.checkNotNull;
import com.google.gerrit.common.TimeUtil;
import com.google.gerrit.common.data.LabelType;
import com.google.gerrit.common.data.LabelTypes;
import com.google.gerrit.extensions.api.changes.DeleteVoteInput;
import com.google.gerrit.extensions.api.changes.NotifyHandling;
@@ -28,6 +29,7 @@ import com.google.gerrit.extensions.restapi.RestModifyView;
import com.google.gerrit.reviewdb.client.Account;
import com.google.gerrit.reviewdb.client.Change;
import com.google.gerrit.reviewdb.client.ChangeMessage;
import com.google.gerrit.reviewdb.client.LabelId;
import com.google.gerrit.reviewdb.client.PatchSet;
import com.google.gerrit.reviewdb.client.PatchSetApproval;
import com.google.gerrit.reviewdb.server.ReviewDb;
@@ -44,6 +46,7 @@ import com.google.gerrit.server.git.UpdateException;
import com.google.gerrit.server.mail.DeleteVoteSender;
import com.google.gerrit.server.mail.ReplyToChangeSender;
import com.google.gerrit.server.project.ChangeControl;
import com.google.gerrit.server.util.LabelVote;
import com.google.gwtorm.server.OrmException;
import com.google.inject.Inject;
import com.google.inject.Provider;
@@ -137,64 +140,66 @@ public class DeleteVote
PatchSet.Id psId = change.currentPatchSetId();
ps = psUtil.current(db.get(), ctl.getNotes());
PatchSetApproval psa = null;
StringBuilder msg = new StringBuilder();
// get all of the current approvals
boolean found = false;
LabelTypes labelTypes = ctx.getControl().getLabelTypes();
Map<String, Short> currentApprovals = new HashMap<>();
for (LabelType lt : labelTypes.getLabelTypes()) {
currentApprovals.put(lt.getName(), (short) 0);
for (PatchSetApproval a : approvalsUtil.byPatchSetUser(
ctx.getDb(), ctl, psId, accountId)) {
if (lt.getLabelId().equals(a.getLabelId())) {
currentApprovals.put(lt.getName(), a.getValue());
}
}
}
// removing votes so we need to determine the new set of approval scores
newApprovals.putAll(currentApprovals);
for (PatchSetApproval a : approvalsUtil.byPatchSetUser(
ctx.getDb(), ctl, psId, accountId)) {
if (ctl.canRemoveReviewer(a)) {
if (a.getLabel().equals(label)) {
// set the approval to 0 if vote is being removed
newApprovals.put(a.getLabel(), (short) 0);
// set old value only if the vote changed
oldApprovals.put(a.getLabel(), a.getValue());
msg.append("Removed ")
.append(a.getLabel()).append(formatLabelValue(a.getValue()))
.append(" by ").append(userFactory.create(a.getAccountId())
.getNameEmail())
.append("\n");
psa = a;
a.setValue((short)0);
ctx.getUpdate(psId).removeApprovalFor(a.getAccountId(), label);
break;
}
} else {
ctx.getDb(), ctl, psId, accountId)) {
if (labelTypes.byLabel(a.getLabelId()) == null) {
continue; // Ignore undefined labels.
} else if (!a.getLabel().equals(label)) {
// Populate map for non-matching labels, needed by VoteDeleted.
newApprovals.put(a.getLabel(), a.getValue());
continue;
} else if (!ctl.canRemoveReviewer(a)) {
throw new AuthException("delete vote not permitted");
}
// Set the approval to 0 if vote is being removed.
newApprovals.put(a.getLabel(), (short) 0);
found = true;
// Set old value, as required by VoteDeleted.
oldApprovals.put(a.getLabel(), a.getValue());
break;
}
if (psa == null) {
if (!found) {
throw new ResourceNotFoundException();
}
ctx.getDb().patchSetApprovals().upsert(Collections.singleton(psa));
if (msg.length() > 0) {
changeMessage =
new ChangeMessage(new ChangeMessage.Key(change.getId(),
ChangeUtil.messageUUID(ctx.getDb())),
ctx.getAccountId(),
ctx.getWhen(),
change.currentPatchSetId());
changeMessage.setMessage(msg.toString());
cmUtil.addChangeMessage(ctx.getDb(), ctx.getUpdate(psId),
changeMessage);
}
ctx.getUpdate(psId).removeApprovalFor(accountId, label);
ctx.getDb().patchSetApprovals().upsert(
Collections.singleton(deletedApproval(ctx)));
changeMessage =
new ChangeMessage(new ChangeMessage.Key(change.getId(),
ChangeUtil.messageUUID(ctx.getDb())),
ctx.getAccountId(),
ctx.getWhen(),
change.currentPatchSetId());
StringBuilder msg = new StringBuilder();
msg.append("Removed ");
LabelVote.appendTo(msg, label, checkNotNull(oldApprovals.get(label)));
changeMessage.setMessage(
msg.append(" by ")
.append(userFactory.create(accountId).getNameEmail())
.append("\n")
.toString());
cmUtil.addChangeMessage(ctx.getDb(), ctx.getUpdate(psId),
changeMessage);
return true;
}
private PatchSetApproval deletedApproval(ChangeContext ctx) {
return new PatchSetApproval(
new PatchSetApproval.Key(
ps.getId(),
accountId,
new LabelId(label)),
(short) 0,
ctx.getWhen());
}
@Override
public void postUpdate(Context ctx) {
if (changeMessage == null) {
@@ -220,11 +225,4 @@ public class DeleteVote
user.getAccount(), ctx.getWhen());
}
}
private static String formatLabelValue(short value) {
if (value > 0) {
return "+" + value;
}
return Short.toString(value);
}
}

View File

@@ -58,6 +58,16 @@ public abstract class LabelVote {
Short.parseShort(text.substring(e + 1), text.length()));
}
public static StringBuilder appendTo(StringBuilder sb, String label,
short value) {
if (value == (short) 0) {
return sb.append('-').append(label);
} else if (value < 0) {
return sb.append(label).append(value);
}
return sb.append(label).append('+').append(value);
}
public static LabelVote create(String label, short value) {
return new AutoValue_LabelVote(LabelType.checkNameInternal(label), value);
}
@@ -70,13 +80,9 @@ public abstract class LabelVote {
public abstract short value();
public String format() {
if (value() == (short) 0) {
return '-' + label();
} else if (value() < 0) {
return label() + value();
} else {
return label() + '+' + value();
}
// Max short string length is "-32768".length() == 6.
return appendTo(new StringBuilder(label().length() + 6), label(), value())
.toString();
}
public String formatWithEquals() {