diff options
Diffstat (limited to 'gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/AccountGroupMembersScreen.java')
-rw-r--r-- | gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/AccountGroupMembersScreen.java | 254 |
1 files changed, 169 insertions, 85 deletions
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/AccountGroupMembersScreen.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/AccountGroupMembersScreen.java index 4c0b1ba16c..c276a89e3e 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/AccountGroupMembersScreen.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/AccountGroupMembersScreen.java @@ -16,37 +16,36 @@ package com.google.gerrit.client.admin; import com.google.gerrit.client.Dispatcher; import com.google.gerrit.client.Gerrit; +import com.google.gerrit.client.VoidResult; +import com.google.gerrit.client.account.AccountInfo; +import com.google.gerrit.client.groups.GroupApi; +import com.google.gerrit.client.groups.GroupInfo; import com.google.gerrit.client.rpc.GerritCallback; +import com.google.gerrit.client.rpc.Natives; import com.google.gerrit.client.ui.AccountGroupSuggestOracle; import com.google.gerrit.client.ui.AccountLink; import com.google.gerrit.client.ui.AddMemberBox; import com.google.gerrit.client.ui.FancyFlexTable; import com.google.gerrit.client.ui.Hyperlink; import com.google.gerrit.client.ui.SmallHeading; -import com.google.gerrit.common.data.AccountInfoCache; -import com.google.gerrit.common.data.GroupDetail; -import com.google.gerrit.common.data.GroupInfo; -import com.google.gerrit.common.data.GroupInfoCache; -import com.google.gerrit.reviewdb.client.Account; import com.google.gerrit.reviewdb.client.AccountGroup; -import com.google.gerrit.reviewdb.client.AccountGroupInclude; -import com.google.gerrit.reviewdb.client.AccountGroupMember; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickHandler; +import com.google.gwt.user.client.ui.Anchor; import com.google.gwt.user.client.ui.Button; import com.google.gwt.user.client.ui.CheckBox; import com.google.gwt.user.client.ui.FlexTable.FlexCellFormatter; import com.google.gwt.user.client.ui.FlowPanel; import com.google.gwt.user.client.ui.Panel; -import com.google.gwtjsonrpc.common.VoidResult; +import java.util.Comparator; import java.util.HashSet; import java.util.List; +import javax.annotation.Nullable; + public class AccountGroupMembersScreen extends AccountGroupScreen { - private AccountInfoCache accounts = AccountInfoCache.empty(); - private GroupInfoCache groups = GroupInfoCache.empty(); private MemberTable members; private IncludeTable includes; @@ -60,7 +59,7 @@ public class AccountGroupMembersScreen extends AccountGroupScreen { private FlowPanel noMembersInfo; - public AccountGroupMembersScreen(final GroupDetail toShow, final String token) { + public AccountGroupMembersScreen(final GroupInfo toShow, final String token) { super(toShow, token); } @@ -111,8 +110,8 @@ public class AccountGroupMembersScreen extends AccountGroupScreen { private void initIncludeList() { addIncludeBox = - new AddMemberBox(Util.C.buttonAddIncludedGroup(), - Util.C.defaultAccountGroupName(), new AccountGroupSuggestOracle()); + new AddMemberBox(Util.C.buttonAddIncludedGroup(), + Util.C.defaultAccountGroupName(), new AccountGroupSuggestOracle()); addIncludeBox.addClickHandler(new ClickHandler() { @Override @@ -148,24 +147,20 @@ public class AccountGroupMembersScreen extends AccountGroupScreen { } @Override - protected void display(final GroupDetail groupDetail) { - switch (groupDetail.group.getType()) { - case INTERNAL: - accounts = groupDetail.accounts; - groups = groupDetail.groups; - members.display(groupDetail.members); - includes.display(groupDetail.includes); - break; - default: - memberPanel.setVisible(false); - includePanel.setVisible(false); - noMembersInfo.setVisible(true); - break; + protected void display(final GroupInfo group, final boolean canModify) { + if (AccountGroup.isInternalGroup(group.getGroupUUID()) + && !AccountGroup.isSystemGroup(group.getGroupUUID())) { + members.display(Natives.asList(group.members())); + includes.display(Natives.asList(group.includes())); + } else { + memberPanel.setVisible(false); + includePanel.setVisible(false); + noMembersInfo.setVisible(true); } - enableForm(groupDetail.canModify); - delMember.setVisible(groupDetail.canModify); - delInclude.setVisible(groupDetail.canModify); + enableForm(canModify); + delMember.setVisible(canModify); + delInclude.setVisible(canModify); } void doAddNewMember() { @@ -175,15 +170,12 @@ public class AccountGroupMembersScreen extends AccountGroupScreen { } addMemberBox.setEnabled(false); - Util.GROUP_SVC.addGroupMember(getGroupId(), nameEmail, - new GerritCallback<GroupDetail>() { - public void onSuccess(final GroupDetail result) { + GroupApi.addMember(getGroupUUID(), nameEmail, + new GerritCallback<AccountInfo>() { + public void onSuccess(final AccountInfo memberInfo) { addMemberBox.setEnabled(true); addMemberBox.setText(""); - if (result.accounts != null && result.members != null) { - accounts.merge(result.accounts); - members.display(result.members); - } + members.insert(memberInfo); } @Override @@ -201,15 +193,12 @@ public class AccountGroupMembersScreen extends AccountGroupScreen { } addIncludeBox.setEnabled(false); - Util.GROUP_SVC.addGroupInclude(getGroupId(), groupName, - new GerritCallback<GroupDetail>() { - public void onSuccess(final GroupDetail result) { + GroupApi.addIncludedGroup(getGroupUUID(), groupName, + new GerritCallback<GroupInfo>() { + public void onSuccess(final GroupInfo result) { addIncludeBox.setEnabled(true); addIncludeBox.setText(""); - if (result.groups != null && result.includes != null) { - groups.merge(result.groups); - includes.display(result.includes); - } + includes.insert(result); } @Override @@ -220,7 +209,7 @@ public class AccountGroupMembersScreen extends AccountGroupScreen { }); } - private class MemberTable extends FancyFlexTable<AccountGroupMember> { + private class MemberTable extends FancyFlexTable<AccountInfo> { private boolean enabled = true; MemberTable() { @@ -236,29 +225,28 @@ public class AccountGroupMembersScreen extends AccountGroupScreen { void setEnabled(final boolean enabled) { this.enabled = enabled; for (int row = 1; row < table.getRowCount(); row++) { - final AccountGroupMember k = getRowItem(row); - if (k != null) { + final AccountInfo i = getRowItem(row); + if (i != null) { ((CheckBox) table.getWidget(row, 1)).setEnabled(enabled); } } } void deleteChecked() { - final HashSet<AccountGroupMember.Key> ids = - new HashSet<AccountGroupMember.Key>(); + final HashSet<Integer> ids = new HashSet<Integer>(); for (int row = 1; row < table.getRowCount(); row++) { - final AccountGroupMember k = getRowItem(row); - if (k != null && ((CheckBox) table.getWidget(row, 1)).getValue()) { - ids.add(k.getKey()); + final AccountInfo i = getRowItem(row); + if (i != null && ((CheckBox) table.getWidget(row, 1)).getValue()) { + ids.add(i._account_id()); } } if (!ids.isEmpty()) { - Util.GROUP_SVC.deleteGroupMembers(getGroupId(), ids, + GroupApi.removeMembers(getGroupUUID(), ids, new GerritCallback<VoidResult>() { public void onSuccess(final VoidResult result) { for (int row = 1; row < table.getRowCount();) { - final AccountGroupMember k = getRowItem(row); - if (k != null && ids.contains(k.getKey())) { + final AccountInfo i = getRowItem(row); + if (i != null && ids.contains(i._account_id())) { table.removeRow(row); } else { row++; @@ -269,36 +257,80 @@ public class AccountGroupMembersScreen extends AccountGroupScreen { } } - void display(final List<AccountGroupMember> result) { + void display(final List<AccountInfo> result) { while (1 < table.getRowCount()) table.removeRow(table.getRowCount() - 1); - for (final AccountGroupMember k : result) { + for (final AccountInfo i : result) { final int row = table.getRowCount(); table.insertRow(row); applyDataRowStyle(row); - populate(row, k); + populate(row, i); + } + } + + void insert(AccountInfo info) { + Comparator<AccountInfo> c = new Comparator<AccountInfo>() { + @Override + public int compare(AccountInfo a, AccountInfo b) { + int cmp = nullToEmpty(a.name()).compareTo(nullToEmpty(b.name())); + if (cmp != 0) { + return cmp; + } + + cmp = nullToEmpty(a.email()).compareTo(nullToEmpty(b.email())); + if (cmp != 0) { + return cmp; + } + + return a._account_id() - b._account_id(); + } + + public String nullToEmpty(String str) { + return str == null ? "" : str; + } + }; + int insertPosition = table.getRowCount(); + int left = 1; + int right = table.getRowCount() - 1; + while (left <= right) { + int middle = (left + right) >>> 1; // (left+right)/2 + AccountInfo i = getRowItem(middle); + int cmp = c.compare(i, info); + + if (cmp < 0) { + left = middle + 1; + } else if (cmp > 0) { + right = middle - 1; + } else { + // group is already contained in the table + return; + } } + insertPosition = left; + + table.insertRow(insertPosition); + applyDataRowStyle(insertPosition); + populate(insertPosition, info); } - void populate(final int row, final AccountGroupMember k) { - final Account.Id accountId = k.getAccountId(); + void populate(final int row, final AccountInfo i) { CheckBox checkBox = new CheckBox(); table.setWidget(row, 1, checkBox); checkBox.setEnabled(enabled); - table.setWidget(row, 2, AccountLink.link(accounts, accountId)); - table.setText(row, 3, accounts.get(accountId).getPreferredEmail()); + table.setWidget(row, 2, new AccountLink(i)); + table.setText(row, 3, i.email()); final FlexCellFormatter fmt = table.getFlexCellFormatter(); fmt.addStyleName(row, 1, Gerrit.RESOURCES.css().iconCell()); fmt.addStyleName(row, 2, Gerrit.RESOURCES.css().dataCell()); fmt.addStyleName(row, 3, Gerrit.RESOURCES.css().dataCell()); - setRowItem(row, k); + setRowItem(row, i); } } - private class IncludeTable extends FancyFlexTable<AccountGroupInclude> { + private class IncludeTable extends FancyFlexTable<GroupInfo> { private boolean enabled = true; IncludeTable() { @@ -314,29 +346,28 @@ public class AccountGroupMembersScreen extends AccountGroupScreen { void setEnabled(final boolean enabled) { this.enabled = enabled; for (int row = 1; row < table.getRowCount(); row++) { - final AccountGroupInclude k = getRowItem(row); - if (k != null) { + final GroupInfo i = getRowItem(row); + if (i != null) { ((CheckBox) table.getWidget(row, 1)).setEnabled(enabled); } } } void deleteChecked() { - final HashSet<AccountGroupInclude.Key> keys = - new HashSet<AccountGroupInclude.Key>(); + final HashSet<AccountGroup.UUID> ids = new HashSet<AccountGroup.UUID>(); for (int row = 1; row < table.getRowCount(); row++) { - final AccountGroupInclude k = getRowItem(row); - if (k != null && ((CheckBox) table.getWidget(row, 1)).getValue()) { - keys.add(k.getKey()); + final GroupInfo i = getRowItem(row); + if (i != null && ((CheckBox) table.getWidget(row, 1)).getValue()) { + ids.add(i.getGroupUUID()); } } - if (!keys.isEmpty()) { - Util.GROUP_SVC.deleteGroupIncludes(getGroupId(), keys, + if (!ids.isEmpty()) { + GroupApi.removeIncludedGroups(getGroupUUID(), ids, new GerritCallback<VoidResult>() { public void onSuccess(final VoidResult result) { for (int row = 1; row < table.getRowCount();) { - final AccountGroupInclude k = getRowItem(row); - if (k != null && keys.contains(k.getKey())) { + final GroupInfo i = getRowItem(row); + if (i != null && ids.contains(i.getGroupUUID())) { table.removeRow(row); } else { row++; @@ -347,34 +378,87 @@ public class AccountGroupMembersScreen extends AccountGroupScreen { } } - void display(final List<AccountGroupInclude> result) { + void display(List<GroupInfo> list) { while (1 < table.getRowCount()) table.removeRow(table.getRowCount() - 1); - for (final AccountGroupInclude k : result) { + for (final GroupInfo i : list) { final int row = table.getRowCount(); table.insertRow(row); applyDataRowStyle(row); - populate(row, k); + populate(row, i); } } - void populate(final int row, final AccountGroupInclude k) { - AccountGroup.Id id = k.getIncludeId(); - GroupInfo group = groups.get(id); + void insert(GroupInfo info) { + Comparator<GroupInfo> c = new Comparator<GroupInfo>() { + @Override + public int compare(GroupInfo a, GroupInfo b) { + int cmp = nullToEmpty(a.name()).compareTo(nullToEmpty(b.name())); + if (cmp != 0) { + return cmp; + } + return a.getGroupUUID().compareTo(b.getGroupUUID()); + } + + private String nullToEmpty(@Nullable String str) { + return (str == null) ? "" : str; + } + }; + + int insertPosition = table.getRowCount(); + int left = 1; + int right = table.getRowCount() - 1; + while (left <= right) { + int middle = (left + right) >>> 1; // (left+right)/2 + GroupInfo i = getRowItem(middle); + int cmp = c.compare(i, info); + + if (cmp < 0) { + left = middle + 1; + } else if (cmp > 0) { + right = middle - 1; + } else { + // group is already contained in the table + return; + } + } + insertPosition = left; + + table.insertRow(insertPosition); + applyDataRowStyle(insertPosition); + populate(insertPosition, info); + } + + void populate(final int row, final GroupInfo i) { + final FlexCellFormatter fmt = table.getFlexCellFormatter(); + + AccountGroup.UUID uuid = i.getGroupUUID(); CheckBox checkBox = new CheckBox(); table.setWidget(row, 1, checkBox); checkBox.setEnabled(enabled); - table.setWidget(row, 2, - new Hyperlink(group.getName(), Dispatcher.toGroup(id))); - table.setText(row, 3, groups.get(id).getDescription()); + if (AccountGroup.isInternalGroup(uuid)) { + table.setWidget(row, 2, + new Hyperlink(i.name(), Dispatcher.toGroup(uuid))); + fmt.getElement(row, 2).setTitle(null); + table.setText(row, 3, i.description()); + } else if (i.url() != null) { + Anchor a = new Anchor(); + a.setText(i.name()); + a.setHref(i.url()); + a.setTitle("UUID " + uuid.get()); + table.setWidget(row, 2, a); + fmt.getElement(row, 2).setTitle(null); + } else { + table.setText(row, 2, i.name()); + fmt.getElement(row, 2).setTitle("UUID " + uuid.get()); + } - final FlexCellFormatter fmt = table.getFlexCellFormatter(); fmt.addStyleName(row, 1, Gerrit.RESOURCES.css().iconCell()); fmt.addStyleName(row, 2, Gerrit.RESOURCES.css().dataCell()); fmt.addStyleName(row, 3, Gerrit.RESOURCES.css().dataCell()); - setRowItem(row, k); + setRowItem(row, i); } } } |