summaryrefslogtreecommitdiffstats
path: root/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/AccountGroupMembersScreen.java
diff options
context:
space:
mode:
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.java254
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);
}
}
}