| // Copyright (C) 2012 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.account; |
| |
| import com.google.gerrit.common.Nullable; |
| import com.google.gerrit.entities.AccountGroup; |
| import com.google.gerrit.entities.GroupDescription; |
| import com.google.gerrit.entities.GroupReference; |
| import com.google.gerrit.extensions.annotations.ExtensionPoint; |
| import com.google.gerrit.server.CurrentUser; |
| import com.google.gerrit.server.project.ProjectState; |
| import java.util.Collection; |
| |
| /** Implementations of GroupBackend provide lookup and membership accessors to a group system. */ |
| @ExtensionPoint |
| public interface GroupBackend { |
| /** Returns {@code true} if the backend can operate on the UUID. */ |
| boolean handles(AccountGroup.UUID uuid); |
| |
| /** |
| * Looks up a group in the backend. If the group does not exist, null is returned. |
| * |
| * @param uuid the group identifier |
| * @return the group |
| */ |
| @Nullable |
| GroupDescription.Basic get(AccountGroup.UUID uuid); |
| |
| /** Returns suggestions for the group name sorted by name. */ |
| Collection<GroupReference> suggest(String name, @Nullable ProjectState project); |
| |
| /** Returns the group membership checker for the backend. */ |
| GroupMembership membershipsOf(CurrentUser user); |
| |
| /** Returns {@code true} if the group with the given UUID is visible to all registered users. */ |
| boolean isVisibleToAll(AccountGroup.UUID uuid); |
| |
| default boolean isOrContainsExternalGroup(AccountGroup.UUID groupId) { |
| if (groupId != null) { |
| GroupDescription.Basic groupDescription = get(groupId); |
| if (!(groupDescription instanceof GroupDescription.Internal) |
| || containsExternalSubGroups((GroupDescription.Internal) groupDescription)) { |
| return true; |
| } |
| } |
| return false; |
| } |
| |
| private boolean containsExternalSubGroups(GroupDescription.Internal internalGroup) { |
| for (AccountGroup.UUID subGroupUuid : internalGroup.getSubgroups()) { |
| GroupDescription.Basic subGroupDescription = get(subGroupUuid); |
| if (!(subGroupDescription instanceof GroupDescription.Internal)) { |
| return true; |
| } |
| if (containsExternalSubGroups((GroupDescription.Internal) subGroupDescription)) { |
| return true; |
| } |
| } |
| return false; |
| } |
| } |