From 6a80fb67ac30d2394fb1cefb898a7aef678b14cb Mon Sep 17 00:00:00 2001 From: Shawn Pearce Date: Sat, 19 Jan 2013 00:39:32 -0800 Subject: [PATCH] Remove group members in separate RPCs Some web servers don't like a request body during a DELETE method. Work around this by sending each member deletion as its own DELETE request. Change-Id: I67404e06ef6f87d5f96ead1c39ef1ed470ece86c --- .../com/google/gerrit/client/VoidResult.java | 4 ++ .../google/gerrit/client/groups/GroupApi.java | 37 ++++++++++++++----- 2 files changed, 31 insertions(+), 10 deletions(-) diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/VoidResult.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/VoidResult.java index 1f7418d129..d7bcd0cac8 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/VoidResult.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/VoidResult.java @@ -19,4 +19,8 @@ import com.google.gwt.core.client.JavaScriptObject; public final class VoidResult extends JavaScriptObject { protected VoidResult() { } + + public static VoidResult create() { + return createObject().cast(); + } } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/groups/GroupApi.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/groups/GroupApi.java index b0c1034dc1..48fb3ad3d8 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/groups/GroupApi.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/groups/GroupApi.java @@ -67,17 +67,34 @@ public class GroupApi { /** Remove members from a group. */ public static void removeMembers(AccountGroup.UUID groupUUID, - Set ids, AsyncCallback cb) { - if (ids.size() == 1) { - Account.Id u = ids.iterator().next(); - new RestApi(membersBase(groupUUID) + "/" + u).delete(cb); - } else { - RestApi call = new RestApi(membersBase(groupUUID)); - MemberInput input = MemberInput.create(); - for (Account.Id id : ids) { - input.add_member(id.toString()); + Set ids, final AsyncCallback cb) { + final int cnt = ids.size(); + if (cnt == 0) { + cb.onSuccess(VoidResult.create()); + return; + } + + final AsyncCallback state = new AsyncCallback() { + private int remaining = cnt; + private boolean error; + + @Override + public void onSuccess(VoidResult result) { + if (--remaining == 0 && !error) { + cb.onSuccess(result); + } } - call.data(input).delete(cb); + + @Override + public void onFailure(Throwable caught) { + if (!error) { + error = true; + cb.onFailure(caught); + } + } + }; + for (Account.Id u : ids) { + new RestApi(membersBase(groupUUID) + "/" + u).delete(state); } }