Fix merge conflicts in group REST API

Chad's change to include groups by UUID conflicted with Edwin's
change providing REST API endpoints to inspect members of a group.

Change-Id: Ic1083b376a1d7a63bc3199778a258ae1c3b5416d
This commit is contained in:
Shawn Pearce
2013-01-10 15:29:22 -08:00
parent 7202a8ce4c
commit 6e6c5de54a
3 changed files with 95 additions and 72 deletions

View File

@@ -14,6 +14,7 @@
package com.google.gerrit.server.group;
import com.google.gerrit.common.data.GroupDescription;
import com.google.gerrit.extensions.restapi.RestResource;
import com.google.gerrit.extensions.restapi.RestView;
import com.google.gerrit.reviewdb.client.AccountGroup;
@@ -30,12 +31,20 @@ public class GroupResource implements RestResource {
this.control = control;
}
public GroupDescription.Basic getGroup() {
return control.getGroup();
}
public String getName() {
return control.getGroup().getName();
return getGroup().getName();
}
public AccountGroup.UUID getGroupUUID() {
return control.getGroup().getGroupUUID();
return getGroup().getGroupUUID();
}
public boolean isInternal() {
return getGroup() instanceof GroupDescription.Internal;
}
public GroupControl getControl() {

View File

@@ -14,65 +14,59 @@
package com.google.gerrit.server.group;
import com.google.gerrit.common.data.GroupDetail;
import com.google.gerrit.common.data.GroupDescription;
import com.google.gerrit.extensions.registration.DynamicMap;
import com.google.gerrit.extensions.restapi.AuthException;
import com.google.gerrit.extensions.restapi.ChildCollection;
import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
import com.google.gerrit.extensions.restapi.RestView;
import com.google.gerrit.reviewdb.client.AccountGroup;
import com.google.gerrit.reviewdb.client.AccountGroupInclude;
import com.google.gerrit.reviewdb.client.AccountGroupIncludeByUuid;
import com.google.gerrit.reviewdb.server.ReviewDb;
import com.google.gerrit.server.account.GroupCache;
import com.google.gerrit.server.account.GroupControl;
import com.google.gerrit.server.account.GroupDetailFactory;
import com.google.gwtorm.server.OrmException;
import com.google.inject.Inject;
import com.google.inject.Provider;
public class IncludedGroupsCollection implements
ChildCollection<GroupResource, IncludedGroupResource> {
private final DynamicMap<RestView<IncludedGroupResource>> views;
private final Provider<ListIncludedGroups> list;
private final GroupControl.Factory groupControlFactory;
private final GroupCache groupCache;
private final GroupDetailFactory.Factory groupDetailFactory;
private final Provider<ReviewDb> dbProvider;
@Inject
IncludedGroupsCollection(final DynamicMap<RestView<IncludedGroupResource>> views,
final Provider<ListIncludedGroups> list,
final GroupControl.Factory groupControlFactory,
final GroupCache groupCache,
final GroupDetailFactory.Factory groupDetailFactory) {
IncludedGroupsCollection(DynamicMap<RestView<IncludedGroupResource>> views,
Provider<ListIncludedGroups> list,
GroupCache groupCache,
GroupControl.Factory groupControlFactory,
Provider<ReviewDb> dbProvider) {
this.views = views;
this.list = list;
this.groupControlFactory = groupControlFactory;
this.groupCache = groupCache;
this.groupDetailFactory = groupDetailFactory;
this.dbProvider = dbProvider;
}
@Override
public RestView<GroupResource> list() throws ResourceNotFoundException,
AuthException {
public RestView<GroupResource> list() {
return list.get();
}
@Override
public IncludedGroupResource parse(final GroupResource parent, final String id)
throws ResourceNotFoundException, Exception {
final GroupResource groupResource =
GroupsCollection.parse(id, groupControlFactory);
final AccountGroup group =
groupCache.get(parent.getControl().getGroup().getGroupUUID());
final GroupDetail groupDetail =
groupDetailFactory.create(group.getId()).call();
if (groupDetail.includes != null) {
for (final AccountGroupInclude groupInclude : groupDetail.includes) {
final AccountGroup includedGroup =
groupCache.get(groupInclude.getIncludeId());
if (includedGroup.getGroupUUID().equals(groupResource.getGroupUUID())) {
return new IncludedGroupResource(groupResource.getControl());
}
}
public IncludedGroupResource parse(GroupResource parent, String id)
throws ResourceNotFoundException, OrmException {
if (!parent.isInternal()) {
throw new ResourceNotFoundException(parent.getGroupUUID().get());
}
GroupDescription.Internal p = (GroupDescription.Internal) parent.getGroup();
GroupResource included = GroupsCollection.parse(id, groupControlFactory);
AccountGroupIncludeByUuid in = dbProvider.get()
.accountGroupIncludesByUuid().get(
new AccountGroupIncludeByUuid.Key(
p.getAccountGroup().getId(),
included.getGroupUUID()));
if (in != null) {
return new IncludedGroupResource(included.getControl());
}
throw new ResourceNotFoundException(id);
}

View File

@@ -14,59 +14,79 @@
package com.google.gerrit.server.group;
import static com.google.common.base.Strings.nullToEmpty;
import com.google.common.collect.Lists;
import com.google.gerrit.common.data.GroupDescriptions;
import com.google.gerrit.common.data.GroupDetail;
import com.google.gerrit.extensions.restapi.AuthException;
import com.google.gerrit.extensions.restapi.BadRequestException;
import com.google.gerrit.extensions.restapi.ResourceConflictException;
import com.google.gerrit.common.data.GroupDescription;
import com.google.gerrit.common.errors.NoSuchGroupException;
import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
import com.google.gerrit.extensions.restapi.RestReadView;
import com.google.gerrit.reviewdb.client.AccountGroup;
import com.google.gerrit.reviewdb.client.AccountGroupInclude;
import com.google.gerrit.server.account.GroupCache;
import com.google.gerrit.reviewdb.client.AccountGroupIncludeByUuid;
import com.google.gerrit.reviewdb.server.ReviewDb;
import com.google.gerrit.server.account.GroupControl;
import com.google.gerrit.server.account.GroupDetailFactory;
import com.google.gerrit.server.group.GetGroup.GroupInfo;
import com.google.gwtorm.server.OrmException;
import com.google.inject.Inject;
import com.google.inject.Provider;
import org.slf4j.Logger;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
public class ListIncludedGroups implements RestReadView<GroupResource> {
private final GroupControl.Factory groupControlFactory;
private final GroupCache groupCache;
private final GroupDetailFactory.Factory groupDetailFactory;
private static final Logger log = org.slf4j.LoggerFactory.getLogger(ListIncludedGroups.class);
private final GroupControl.Factory controlFactory;
private final Provider<ReviewDb> dbProvider;
@Inject
ListIncludedGroups(final GroupControl.Factory groupControlFactory,
final GroupCache groupCache,
final GroupDetailFactory.Factory groupDetailFactory) {
this.groupControlFactory = groupControlFactory;
this.groupCache = groupCache;
this.groupDetailFactory = groupDetailFactory;
ListIncludedGroups(GroupControl.Factory controlFactory,
Provider<ReviewDb> dbProvider) {
this.controlFactory = controlFactory;
this.dbProvider = dbProvider;
}
@Override
public List<GroupInfo> apply(final GroupResource resource)
throws AuthException, BadRequestException, ResourceConflictException,
Exception {
final List<GroupInfo> includedGroups = Lists.newArrayList();
final GroupControl groupControl =
groupControlFactory.validateFor(resource.getGroupUUID());
final AccountGroup group =
groupCache.get(groupControl.getGroup().getGroupUUID());
final GroupDetail groupDetail =
groupDetailFactory.create(group.getId()).call();
if (groupDetail.includes != null) {
for (final AccountGroupInclude groupInclude : groupDetail.includes) {
final AccountGroup includedGroup =
groupCache.get(groupInclude.getIncludeId());
includedGroups.add(GetGroup.parse(GroupDescriptions
.forAccountGroup(includedGroup)));
}
public List<GroupInfo> apply(GroupResource rsrc)
throws ResourceNotFoundException, OrmException {
if (!rsrc.isInternal()) {
throw new ResourceNotFoundException(rsrc.getGroupUUID().get());
}
return includedGroups;
boolean ownerOfParent = rsrc.getControl().isOwner();
List<GroupInfo> included = Lists.newArrayList();
for (AccountGroupIncludeByUuid u : dbProvider.get()
.accountGroupIncludesByUuid()
.byGroup(groupId(rsrc))) {
try {
GroupControl i = controlFactory.controlFor(u.getIncludeUUID());
if (ownerOfParent || i.isVisible()) {
included.add(GetGroup.parse(i.getGroup()));
}
} catch (NoSuchGroupException notFound) {
log.warn(String.format("Group %s no longer available, included into ",
u.getIncludeUUID(),
rsrc.getGroup().getName()));
continue;
}
}
Collections.sort(included, 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 nullToEmpty(a.id).compareTo(nullToEmpty(b.name));
}
});
return included;
}
private static AccountGroup.Id groupId(GroupResource rsrc) {
GroupDescription.Basic d = rsrc.getGroup();
return ((GroupDescription.Internal) d).getAccountGroup().getId();
}
}