Merge "Add REST endpoints to retrieve group members and included groups"
This commit is contained in:
		@@ -315,6 +315,53 @@ and accepts the same options as query parameters.
 | 
			
		||||
  }
 | 
			
		||||
----
 | 
			
		||||
 | 
			
		||||
[[group-members]]
 | 
			
		||||
/groups/*/members/ (List Group Members)
 | 
			
		||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 | 
			
		||||
Lists the members of a group.
 | 
			
		||||
 | 
			
		||||
----
 | 
			
		||||
)]}'
 | 
			
		||||
[
 | 
			
		||||
  {
 | 
			
		||||
    "kind": "gerritcodereview#member",
 | 
			
		||||
    "full_name": "Jane Roe",
 | 
			
		||||
    "id": "1000097",
 | 
			
		||||
    "account_id": 1000097,
 | 
			
		||||
    "preferred_email": "jane.roe@example.com",
 | 
			
		||||
    "user_name": "jane"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "kind": "gerritcodereview#member",
 | 
			
		||||
    "full_name": "John Doe",
 | 
			
		||||
    "id": "1000096",
 | 
			
		||||
    "account_id": 1000096,
 | 
			
		||||
    "preferred_email": "john.doe@example.com",
 | 
			
		||||
    "user_name": "doe"
 | 
			
		||||
  }
 | 
			
		||||
]
 | 
			
		||||
----
 | 
			
		||||
 | 
			
		||||
[[included-groups]]
 | 
			
		||||
/groups/*/groups/ (List Included Groups)
 | 
			
		||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 | 
			
		||||
Lists the included groups of a group.
 | 
			
		||||
 | 
			
		||||
----
 | 
			
		||||
)]}'
 | 
			
		||||
[
 | 
			
		||||
  {
 | 
			
		||||
    "kind": "gerritcodereview#group",
 | 
			
		||||
    "id": "uuid-7ca042f4d5847936fcb90ca91057673157fd06fc",
 | 
			
		||||
    "name": "MyProject-Verifiers",
 | 
			
		||||
    "uuid": "7ca042f4d5847936fcb90ca91057673157fd06fc",
 | 
			
		||||
    "group_id": 38,
 | 
			
		||||
    "is_visible_to_all": false,
 | 
			
		||||
    "owner_uuid": "7ca042f4d5847936fcb90ca91057673157fd06fc"
 | 
			
		||||
  }
 | 
			
		||||
]
 | 
			
		||||
----
 | 
			
		||||
 | 
			
		||||
[[changes]]
 | 
			
		||||
/changes/ (Query Changes)
 | 
			
		||||
~~~~~~~~~~~~~~~~~~~~~~~~~
 | 
			
		||||
 
 | 
			
		||||
@@ -28,7 +28,7 @@ public class AccountResource implements RestResource {
 | 
			
		||||
 | 
			
		||||
  private final IdentifiedUser user;
 | 
			
		||||
 | 
			
		||||
  AccountResource(IdentifiedUser user) {
 | 
			
		||||
  public AccountResource(IdentifiedUser user) {
 | 
			
		||||
    this.user = user;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -69,6 +69,15 @@ public class GroupControl {
 | 
			
		||||
      }
 | 
			
		||||
      return c;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public GroupControl validateFor(final AccountGroup.UUID groupUUID)
 | 
			
		||||
        throws NoSuchGroupException {
 | 
			
		||||
      final GroupControl c = controlFor(groupUUID);
 | 
			
		||||
      if (!c.isVisible()) {
 | 
			
		||||
        throw new NoSuchGroupException(groupUUID);
 | 
			
		||||
      }
 | 
			
		||||
      return c;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  private final CurrentUser user;
 | 
			
		||||
 
 | 
			
		||||
@@ -43,6 +43,7 @@ import com.google.gerrit.server.account.EmailExpander;
 | 
			
		||||
import com.google.gerrit.server.account.GroupBackend;
 | 
			
		||||
import com.google.gerrit.server.account.GroupCacheImpl;
 | 
			
		||||
import com.google.gerrit.server.account.GroupControl;
 | 
			
		||||
import com.google.gerrit.server.account.GroupDetailFactory;
 | 
			
		||||
import com.google.gerrit.server.account.GroupIncludeCacheImpl;
 | 
			
		||||
import com.google.gerrit.server.account.GroupInfoCacheFactory;
 | 
			
		||||
import com.google.gerrit.server.account.IncludingGroupMembership;
 | 
			
		||||
@@ -154,6 +155,7 @@ public class GerritGlobalModule extends FactoryModule {
 | 
			
		||||
    factory(ChangeQueryBuilder.Factory.class);
 | 
			
		||||
    factory(GroupInfoCacheFactory.Factory.class);
 | 
			
		||||
    factory(VisibleGroups.Factory.class);
 | 
			
		||||
    factory(GroupDetailFactory.Factory.class);
 | 
			
		||||
    factory(InternalUser.Factory.class);
 | 
			
		||||
    factory(ProjectNode.Factory.class);
 | 
			
		||||
    factory(ProjectState.Factory.class);
 | 
			
		||||
 
 | 
			
		||||
@@ -20,7 +20,6 @@ import com.google.gerrit.server.ApprovalsUtil;
 | 
			
		||||
import com.google.gerrit.server.IdentifiedUser;
 | 
			
		||||
import com.google.gerrit.server.RequestCleanup;
 | 
			
		||||
import com.google.gerrit.server.account.AccountControl;
 | 
			
		||||
import com.google.gerrit.server.account.GroupDetailFactory;
 | 
			
		||||
import com.google.gerrit.server.account.GroupMembers;
 | 
			
		||||
import com.google.gerrit.server.account.PerformCreateGroup;
 | 
			
		||||
import com.google.gerrit.server.account.PerformRenameGroup;
 | 
			
		||||
@@ -84,7 +83,6 @@ public class GerritRequestModule extends FactoryModule {
 | 
			
		||||
    factory(MergeFailSender.Factory.class);
 | 
			
		||||
    factory(PerformCreateGroup.Factory.class);
 | 
			
		||||
    factory(PerformRenameGroup.Factory.class);
 | 
			
		||||
    factory(GroupDetailFactory.Factory.class);
 | 
			
		||||
    factory(GroupMembers.Factory.class);
 | 
			
		||||
    factory(CreateProject.Factory.class);
 | 
			
		||||
    factory(SuggestParentCandidates.Factory.class);
 | 
			
		||||
 
 | 
			
		||||
@@ -28,14 +28,18 @@ class GetGroup implements RestReadView<GroupResource> {
 | 
			
		||||
  @Override
 | 
			
		||||
  public Object apply(GroupResource resource) throws AuthException,
 | 
			
		||||
      BadRequestException, ResourceConflictException, Exception {
 | 
			
		||||
    GroupDescription.Basic group = resource.getControl().getGroup();
 | 
			
		||||
    return parse(resource.getControl().getGroup());
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  public static GroupInfo parse(final GroupDescription.Basic group) {
 | 
			
		||||
    GroupInfo info = new GroupInfo();
 | 
			
		||||
    info.name = resource.getName();
 | 
			
		||||
    info.uuid = resource.getGroupUUID().get();
 | 
			
		||||
    info.name = group.getName();
 | 
			
		||||
    info.uuid = group.getGroupUUID().get();
 | 
			
		||||
    info.isVisibleToAll = group.isVisibleToAll();
 | 
			
		||||
    if (group instanceof GroupDescription.Internal) {
 | 
			
		||||
      final AccountGroup internalGroup =
 | 
			
		||||
          ((GroupDescription.Internal) group).getAccountGroup();
 | 
			
		||||
      info.groupId = internalGroup.getId().get();
 | 
			
		||||
      info.description = Strings.emptyToNull(internalGroup.getDescription());
 | 
			
		||||
      info.ownerUuid = internalGroup.getOwnerGroupUUID().get();
 | 
			
		||||
    }
 | 
			
		||||
@@ -43,11 +47,12 @@ class GetGroup implements RestReadView<GroupResource> {
 | 
			
		||||
    return info;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  static class GroupInfo {
 | 
			
		||||
  public static class GroupInfo {
 | 
			
		||||
    final String kind = "gerritcodereview#group";
 | 
			
		||||
    String id;
 | 
			
		||||
    String name;
 | 
			
		||||
    String uuid;
 | 
			
		||||
    int groupId;
 | 
			
		||||
    String description;
 | 
			
		||||
    boolean isVisibleToAll;
 | 
			
		||||
    String ownerUuid;
 | 
			
		||||
 
 | 
			
		||||
@@ -0,0 +1,30 @@
 | 
			
		||||
// Copyright (C) 2013 The Android Open Source Project
 | 
			
		||||
//
 | 
			
		||||
// Licensed under the Apache License, Version 2.0 (the "License");
 | 
			
		||||
// you may not use this file except in compliance with the License.
 | 
			
		||||
// You may obtain a copy of the License at
 | 
			
		||||
//
 | 
			
		||||
// http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
//
 | 
			
		||||
// Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
// distributed under the License is distributed on an "AS IS" BASIS,
 | 
			
		||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
			
		||||
// See the License for the specific language governing permissions and
 | 
			
		||||
// limitations under the License.
 | 
			
		||||
 | 
			
		||||
package com.google.gerrit.server.group;
 | 
			
		||||
 | 
			
		||||
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.extensions.restapi.RestReadView;
 | 
			
		||||
import com.google.gerrit.server.group.GetGroup.GroupInfo;
 | 
			
		||||
 | 
			
		||||
public class GetIncludedGroup implements RestReadView<IncludedGroupResource>  {
 | 
			
		||||
 | 
			
		||||
  @Override
 | 
			
		||||
  public GroupInfo apply(final IncludedGroupResource resource) throws AuthException,
 | 
			
		||||
      BadRequestException, ResourceConflictException, Exception {
 | 
			
		||||
    return GetGroup.parse(resource.getControl().getGroup());
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,30 @@
 | 
			
		||||
// Copyright (C) 2013 The Android Open Source Project
 | 
			
		||||
//
 | 
			
		||||
// Licensed under the Apache License, Version 2.0 (the "License");
 | 
			
		||||
// you may not use this file except in compliance with the License.
 | 
			
		||||
// You may obtain a copy of the License at
 | 
			
		||||
//
 | 
			
		||||
// http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
//
 | 
			
		||||
// Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
// distributed under the License is distributed on an "AS IS" BASIS,
 | 
			
		||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
			
		||||
// See the License for the specific language governing permissions and
 | 
			
		||||
// limitations under the License.
 | 
			
		||||
 | 
			
		||||
package com.google.gerrit.server.group;
 | 
			
		||||
 | 
			
		||||
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.extensions.restapi.RestReadView;
 | 
			
		||||
import com.google.gerrit.server.group.MembersCollection.MemberInfo;
 | 
			
		||||
 | 
			
		||||
public class GetMember implements RestReadView<MemberResource> {
 | 
			
		||||
 | 
			
		||||
  @Override
 | 
			
		||||
  public MemberInfo apply(final MemberResource resource) throws AuthException,
 | 
			
		||||
      BadRequestException, ResourceConflictException, Exception {
 | 
			
		||||
    return MembersCollection.parse(resource.getUser().getAccount());
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
@@ -72,7 +72,12 @@ public class GroupsCollection implements
 | 
			
		||||
    } else if(!(user instanceof IdentifiedUser)) {
 | 
			
		||||
      throw new ResourceNotFoundException(id);
 | 
			
		||||
    }
 | 
			
		||||
    return parse(id, groupControlFactory);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  public static GroupResource parse(final String id,
 | 
			
		||||
      final GroupControl.Factory groupControlFactory)
 | 
			
		||||
      throws ResourceNotFoundException {
 | 
			
		||||
    final String decodedId = Url.decode(id);
 | 
			
		||||
    final GroupControl ctl;
 | 
			
		||||
    try {
 | 
			
		||||
 
 | 
			
		||||
@@ -0,0 +1,28 @@
 | 
			
		||||
// Copyright (C) 2013 The Android Open Source Project
 | 
			
		||||
//
 | 
			
		||||
// Licensed under the Apache License, Version 2.0 (the "License");
 | 
			
		||||
// you may not use this file except in compliance with the License.
 | 
			
		||||
// You may obtain a copy of the License at
 | 
			
		||||
//
 | 
			
		||||
// http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
//
 | 
			
		||||
// Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
// distributed under the License is distributed on an "AS IS" BASIS,
 | 
			
		||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
			
		||||
// See the License for the specific language governing permissions and
 | 
			
		||||
// limitations under the License.
 | 
			
		||||
 | 
			
		||||
package com.google.gerrit.server.group;
 | 
			
		||||
 | 
			
		||||
import com.google.gerrit.extensions.restapi.RestView;
 | 
			
		||||
import com.google.gerrit.server.account.GroupControl;
 | 
			
		||||
import com.google.inject.TypeLiteral;
 | 
			
		||||
 | 
			
		||||
public class IncludedGroupResource extends GroupResource {
 | 
			
		||||
  public static final TypeLiteral<RestView<IncludedGroupResource>> INCLUDED_GROUP_KIND =
 | 
			
		||||
      new TypeLiteral<RestView<IncludedGroupResource>>() {};
 | 
			
		||||
 | 
			
		||||
  IncludedGroupResource(final GroupControl control) {
 | 
			
		||||
    super(control);
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,84 @@
 | 
			
		||||
// Copyright (C) 2013 The Android Open Source Project
 | 
			
		||||
//
 | 
			
		||||
// Licensed under the Apache License, Version 2.0 (the "License");
 | 
			
		||||
// you may not use this file except in compliance with the License.
 | 
			
		||||
// You may obtain a copy of the License at
 | 
			
		||||
//
 | 
			
		||||
// http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
//
 | 
			
		||||
// Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
// distributed under the License is distributed on an "AS IS" BASIS,
 | 
			
		||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
			
		||||
// See the License for the specific language governing permissions and
 | 
			
		||||
// limitations under the License.
 | 
			
		||||
 | 
			
		||||
package com.google.gerrit.server.group;
 | 
			
		||||
 | 
			
		||||
import com.google.gerrit.common.data.GroupDetail;
 | 
			
		||||
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.server.account.GroupCache;
 | 
			
		||||
import com.google.gerrit.server.account.GroupControl;
 | 
			
		||||
import com.google.gerrit.server.account.GroupDetailFactory;
 | 
			
		||||
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;
 | 
			
		||||
 | 
			
		||||
  @Inject
 | 
			
		||||
  IncludedGroupsCollection(final DynamicMap<RestView<IncludedGroupResource>> views,
 | 
			
		||||
      final Provider<ListIncludedGroups> list,
 | 
			
		||||
      final GroupControl.Factory groupControlFactory,
 | 
			
		||||
      final GroupCache groupCache,
 | 
			
		||||
      final GroupDetailFactory.Factory groupDetailFactory) {
 | 
			
		||||
    this.views = views;
 | 
			
		||||
    this.list = list;
 | 
			
		||||
    this.groupControlFactory = groupControlFactory;
 | 
			
		||||
    this.groupCache = groupCache;
 | 
			
		||||
    this.groupDetailFactory = groupDetailFactory;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @Override
 | 
			
		||||
  public RestView<GroupResource> list() throws ResourceNotFoundException,
 | 
			
		||||
      AuthException {
 | 
			
		||||
    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());
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
    throw new ResourceNotFoundException(id);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @Override
 | 
			
		||||
  public DynamicMap<RestView<IncludedGroupResource>> views() {
 | 
			
		||||
    return views;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,72 @@
 | 
			
		||||
// Copyright (C) 2013 The Android Open Source Project
 | 
			
		||||
//
 | 
			
		||||
// Licensed under the Apache License, Version 2.0 (the "License");
 | 
			
		||||
// you may not use this file except in compliance with the License.
 | 
			
		||||
// You may obtain a copy of the License at
 | 
			
		||||
//
 | 
			
		||||
// http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
//
 | 
			
		||||
// Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
// distributed under the License is distributed on an "AS IS" BASIS,
 | 
			
		||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
			
		||||
// See the License for the specific language governing permissions and
 | 
			
		||||
// limitations under the License.
 | 
			
		||||
 | 
			
		||||
package com.google.gerrit.server.group;
 | 
			
		||||
 | 
			
		||||
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.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.server.account.GroupControl;
 | 
			
		||||
import com.google.gerrit.server.account.GroupDetailFactory;
 | 
			
		||||
import com.google.gerrit.server.group.GetGroup.GroupInfo;
 | 
			
		||||
import com.google.inject.Inject;
 | 
			
		||||
 | 
			
		||||
import java.util.List;
 | 
			
		||||
 | 
			
		||||
public class ListIncludedGroups implements RestReadView<GroupResource> {
 | 
			
		||||
  private final GroupControl.Factory groupControlFactory;
 | 
			
		||||
  private final GroupCache groupCache;
 | 
			
		||||
  private final GroupDetailFactory.Factory groupDetailFactory;
 | 
			
		||||
 | 
			
		||||
  @Inject
 | 
			
		||||
  ListIncludedGroups(final GroupControl.Factory groupControlFactory,
 | 
			
		||||
      final GroupCache groupCache,
 | 
			
		||||
      final GroupDetailFactory.Factory groupDetailFactory) {
 | 
			
		||||
    this.groupControlFactory = groupControlFactory;
 | 
			
		||||
    this.groupCache = groupCache;
 | 
			
		||||
    this.groupDetailFactory = groupDetailFactory;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @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)));
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return includedGroups;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,73 @@
 | 
			
		||||
// Copyright (C) 2013 The Android Open Source Project
 | 
			
		||||
//
 | 
			
		||||
// Licensed under the Apache License, Version 2.0 (the "License");
 | 
			
		||||
// you may not use this file except in compliance with the License.
 | 
			
		||||
// You may obtain a copy of the License at
 | 
			
		||||
//
 | 
			
		||||
// http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
//
 | 
			
		||||
// Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
// distributed under the License is distributed on an "AS IS" BASIS,
 | 
			
		||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
			
		||||
// See the License for the specific language governing permissions and
 | 
			
		||||
// limitations under the License.
 | 
			
		||||
 | 
			
		||||
package com.google.gerrit.server.group;
 | 
			
		||||
 | 
			
		||||
import com.google.common.collect.Lists;
 | 
			
		||||
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.extensions.restapi.RestReadView;
 | 
			
		||||
import com.google.gerrit.reviewdb.client.Account;
 | 
			
		||||
import com.google.gerrit.reviewdb.client.AccountGroup;
 | 
			
		||||
import com.google.gerrit.reviewdb.client.AccountGroupMember;
 | 
			
		||||
import com.google.gerrit.server.account.AccountCache;
 | 
			
		||||
import com.google.gerrit.server.account.GroupCache;
 | 
			
		||||
import com.google.gerrit.server.account.GroupControl;
 | 
			
		||||
import com.google.gerrit.server.account.GroupDetailFactory;
 | 
			
		||||
import com.google.gerrit.server.group.MembersCollection.MemberInfo;
 | 
			
		||||
import com.google.inject.Inject;
 | 
			
		||||
 | 
			
		||||
import java.util.List;
 | 
			
		||||
 | 
			
		||||
public class ListMembers implements RestReadView<GroupResource> {
 | 
			
		||||
  private final GroupControl.Factory groupControlFactory;
 | 
			
		||||
  private final GroupCache groupCache;
 | 
			
		||||
  private final GroupDetailFactory.Factory groupDetailFactory;
 | 
			
		||||
  private final AccountCache accountCache;
 | 
			
		||||
 | 
			
		||||
  @Inject
 | 
			
		||||
  ListMembers(final GroupControl.Factory groupControlFactory,
 | 
			
		||||
      final GroupCache groupCache,
 | 
			
		||||
      final GroupDetailFactory.Factory groupDetailFactory,
 | 
			
		||||
      final AccountCache accountCache) {
 | 
			
		||||
    this.groupControlFactory = groupControlFactory;
 | 
			
		||||
    this.groupCache = groupCache;
 | 
			
		||||
    this.groupDetailFactory = groupDetailFactory;
 | 
			
		||||
    this.accountCache = accountCache;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @Override
 | 
			
		||||
  public List<MemberInfo> apply(final GroupResource resource) throws AuthException,
 | 
			
		||||
      BadRequestException, ResourceConflictException, Exception {
 | 
			
		||||
    final List<MemberInfo> members = 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.members != null) {
 | 
			
		||||
      for (final AccountGroupMember member : groupDetail.members) {
 | 
			
		||||
        final Account account = accountCache.get(member.getAccountId()).getAccount();
 | 
			
		||||
        members.add(MembersCollection.parse(account));
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return members;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,29 @@
 | 
			
		||||
// Copyright (C) 2013 The Android Open Source Project
 | 
			
		||||
//
 | 
			
		||||
// Licensed under the Apache License, Version 2.0 (the "License");
 | 
			
		||||
// you may not use this file except in compliance with the License.
 | 
			
		||||
// You may obtain a copy of the License at
 | 
			
		||||
//
 | 
			
		||||
// http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
//
 | 
			
		||||
// Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
// distributed under the License is distributed on an "AS IS" BASIS,
 | 
			
		||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
			
		||||
// See the License for the specific language governing permissions and
 | 
			
		||||
// limitations under the License.
 | 
			
		||||
 | 
			
		||||
package com.google.gerrit.server.group;
 | 
			
		||||
 | 
			
		||||
import com.google.gerrit.extensions.restapi.RestView;
 | 
			
		||||
import com.google.gerrit.server.IdentifiedUser;
 | 
			
		||||
import com.google.gerrit.server.account.AccountResource;
 | 
			
		||||
import com.google.inject.TypeLiteral;
 | 
			
		||||
 | 
			
		||||
public class MemberResource extends AccountResource {
 | 
			
		||||
  public static final TypeLiteral<RestView<MemberResource>> MEMBER_KIND =
 | 
			
		||||
      new TypeLiteral<RestView<MemberResource>>() {};
 | 
			
		||||
 | 
			
		||||
  public MemberResource(IdentifiedUser user) {
 | 
			
		||||
    super(user);
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,114 @@
 | 
			
		||||
// Copyright (C) 2013 The Android Open Source Project
 | 
			
		||||
//
 | 
			
		||||
// Licensed under the Apache License, Version 2.0 (the "License");
 | 
			
		||||
// you may not use this file except in compliance with the License.
 | 
			
		||||
// You may obtain a copy of the License at
 | 
			
		||||
//
 | 
			
		||||
// http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
//
 | 
			
		||||
// Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
// distributed under the License is distributed on an "AS IS" BASIS,
 | 
			
		||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
			
		||||
// See the License for the specific language governing permissions and
 | 
			
		||||
// limitations under the License.
 | 
			
		||||
 | 
			
		||||
package com.google.gerrit.server.group;
 | 
			
		||||
 | 
			
		||||
import com.google.gerrit.common.data.GroupDetail;
 | 
			
		||||
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.Account;
 | 
			
		||||
import com.google.gerrit.reviewdb.client.AccountGroup;
 | 
			
		||||
import com.google.gerrit.reviewdb.client.AccountGroupMember;
 | 
			
		||||
import com.google.gerrit.server.IdentifiedUser;
 | 
			
		||||
import com.google.gerrit.server.account.GroupCache;
 | 
			
		||||
import com.google.gerrit.server.account.GroupDetailFactory;
 | 
			
		||||
import com.google.gerrit.server.util.Url;
 | 
			
		||||
import com.google.inject.Inject;
 | 
			
		||||
import com.google.inject.Provider;
 | 
			
		||||
 | 
			
		||||
public class MembersCollection implements
 | 
			
		||||
    ChildCollection<GroupResource, MemberResource> {
 | 
			
		||||
 | 
			
		||||
  private final DynamicMap<RestView<MemberResource>> views;
 | 
			
		||||
  private final Provider<ListMembers> list;
 | 
			
		||||
  private final IdentifiedUser.GenericFactory userGenericFactory;
 | 
			
		||||
  private final GroupCache groupCache;
 | 
			
		||||
  private final GroupDetailFactory.Factory groupDetailFactory;
 | 
			
		||||
 | 
			
		||||
  @Inject
 | 
			
		||||
  MembersCollection(final DynamicMap<RestView<MemberResource>> views,
 | 
			
		||||
      final Provider<ListMembers> list,
 | 
			
		||||
      final IdentifiedUser.GenericFactory userGenericFactory,
 | 
			
		||||
      final GroupCache groupCache,
 | 
			
		||||
      final GroupDetailFactory.Factory groupDetailFactory) {
 | 
			
		||||
    this.views = views;
 | 
			
		||||
    this.list = list;
 | 
			
		||||
    this.userGenericFactory = userGenericFactory;
 | 
			
		||||
    this.groupCache = groupCache;
 | 
			
		||||
    this.groupDetailFactory = groupDetailFactory;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @Override
 | 
			
		||||
  public RestView<GroupResource> list() throws ResourceNotFoundException,
 | 
			
		||||
      AuthException {
 | 
			
		||||
    return list.get();
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @Override
 | 
			
		||||
  public MemberResource parse(final GroupResource parent, final String id)
 | 
			
		||||
      throws ResourceNotFoundException, Exception {
 | 
			
		||||
    final Account.Id accountId;
 | 
			
		||||
    try {
 | 
			
		||||
      accountId = new Account.Id(Integer.parseInt(Url.decode(id)));
 | 
			
		||||
    } catch (NumberFormatException e) {
 | 
			
		||||
      throw new ResourceNotFoundException(id);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    final AccountGroup group =
 | 
			
		||||
        groupCache.get(parent.getControl().getGroup().getGroupUUID());
 | 
			
		||||
    final GroupDetail groupDetail =
 | 
			
		||||
        groupDetailFactory.create(group.getId()).call();
 | 
			
		||||
    if (groupDetail.members != null) {
 | 
			
		||||
      for (final AccountGroupMember member : groupDetail.members) {
 | 
			
		||||
        if (member.getAccountId().equals(accountId)) {
 | 
			
		||||
          return new MemberResource(
 | 
			
		||||
              userGenericFactory.create(accountId));
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
    throw new ResourceNotFoundException(id);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @Override
 | 
			
		||||
  public DynamicMap<RestView<MemberResource>> views() {
 | 
			
		||||
    return views;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  public static MemberInfo parse(final Account account) {
 | 
			
		||||
    final MemberInfo accountInfo = new MemberInfo();
 | 
			
		||||
    accountInfo.setId(account.getId());
 | 
			
		||||
    accountInfo.fullName = account.getFullName();
 | 
			
		||||
    accountInfo.preferredEmail = account.getPreferredEmail();
 | 
			
		||||
    accountInfo.userName = account.getUserName();
 | 
			
		||||
    return accountInfo;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  static class MemberInfo {
 | 
			
		||||
    final String kind = "gerritcodereview#member";
 | 
			
		||||
 | 
			
		||||
    String fullName;
 | 
			
		||||
    String id;
 | 
			
		||||
    int accountId;
 | 
			
		||||
    String preferredEmail;
 | 
			
		||||
    String userName;
 | 
			
		||||
 | 
			
		||||
    void setId(Account.Id i) {
 | 
			
		||||
      accountId = i.get();
 | 
			
		||||
      id = Url.encode(Integer.toString(accountId));
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
@@ -15,6 +15,8 @@
 | 
			
		||||
package com.google.gerrit.server.group;
 | 
			
		||||
 | 
			
		||||
import static com.google.gerrit.server.group.GroupResource.GROUP_KIND;
 | 
			
		||||
import static com.google.gerrit.server.group.IncludedGroupResource.INCLUDED_GROUP_KIND;
 | 
			
		||||
import static com.google.gerrit.server.group.MemberResource.MEMBER_KIND;
 | 
			
		||||
 | 
			
		||||
import com.google.gerrit.extensions.registration.DynamicMap;
 | 
			
		||||
import com.google.gerrit.extensions.restapi.RestApiModule;
 | 
			
		||||
@@ -25,7 +27,15 @@ public class Module extends RestApiModule {
 | 
			
		||||
    bind(GroupsCollection.class);
 | 
			
		||||
 | 
			
		||||
    DynamicMap.mapOf(binder(), GROUP_KIND);
 | 
			
		||||
    DynamicMap.mapOf(binder(), MEMBER_KIND);
 | 
			
		||||
    DynamicMap.mapOf(binder(), INCLUDED_GROUP_KIND);
 | 
			
		||||
 | 
			
		||||
    get(GROUP_KIND).to(GetGroup.class);
 | 
			
		||||
 | 
			
		||||
    child(GROUP_KIND, "members").to(MembersCollection.class);
 | 
			
		||||
    get(MEMBER_KIND).to(GetMember.class);
 | 
			
		||||
 | 
			
		||||
    child(GROUP_KIND, "groups").to(IncludedGroupsCollection.class);
 | 
			
		||||
    get(INCLUDED_GROUP_KIND).to(GetIncludedGroup.class);
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user