diff options
Diffstat (limited to 'src/main/java/com/google/gerrit/server/rpc/account/GroupAdminServiceImpl.java')
-rw-r--r-- | src/main/java/com/google/gerrit/server/rpc/account/GroupAdminServiceImpl.java | 363 |
1 files changed, 0 insertions, 363 deletions
diff --git a/src/main/java/com/google/gerrit/server/rpc/account/GroupAdminServiceImpl.java b/src/main/java/com/google/gerrit/server/rpc/account/GroupAdminServiceImpl.java deleted file mode 100644 index 27ccfab1fd..0000000000 --- a/src/main/java/com/google/gerrit/server/rpc/account/GroupAdminServiceImpl.java +++ /dev/null @@ -1,363 +0,0 @@ -// Copyright (C) 2008 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.rpc.account; - -import com.google.gerrit.client.admin.GroupAdminService; -import com.google.gerrit.client.admin.GroupDetail; -import com.google.gerrit.client.reviewdb.Account; -import com.google.gerrit.client.reviewdb.AccountGroup; -import com.google.gerrit.client.reviewdb.AccountGroupMember; -import com.google.gerrit.client.reviewdb.AccountGroupMemberAudit; -import com.google.gerrit.client.reviewdb.ReviewDb; -import com.google.gerrit.client.rpc.NameAlreadyUsedException; -import com.google.gerrit.client.rpc.NoSuchAccountException; -import com.google.gerrit.client.rpc.NoSuchEntityException; -import com.google.gerrit.server.BaseServiceImplementation; -import com.google.gerrit.server.IdentifiedUser; -import com.google.gerrit.server.account.AccountCache; -import com.google.gerrit.server.account.AccountResolver; -import com.google.gerrit.server.account.GroupCache; -import com.google.gerrit.server.account.GroupControl; -import com.google.gerrit.server.account.NoSuchGroupException; -import com.google.gerrit.server.account.Realm; -import com.google.gwt.user.client.rpc.AsyncCallback; -import com.google.gwtjsonrpc.client.VoidResult; -import com.google.gwtorm.client.OrmException; -import com.google.gwtorm.client.Transaction; -import com.google.inject.Inject; -import com.google.inject.Provider; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.Comparator; -import java.util.HashSet; -import java.util.List; -import java.util.Set; - -class GroupAdminServiceImpl extends BaseServiceImplementation implements - GroupAdminService { - private final Provider<IdentifiedUser> identifiedUser; - private final AccountCache accountCache; - private final AccountResolver accountResolver; - private final Realm accountRealm; - private final GroupCache groupCache; - private final GroupControl.Factory groupControlFactory; - private final GroupDetailFactory.Factory groupDetailFactory; - - @Inject - GroupAdminServiceImpl(final Provider<ReviewDb> schema, - final Provider<IdentifiedUser> currentUser, - final AccountCache accountCache, final AccountResolver accountResolver, - final Realm accountRealm, final GroupCache groupCache, - final GroupControl.Factory groupControlFactory, - final GroupDetailFactory.Factory groupDetailFactory) { - super(schema, currentUser); - this.identifiedUser = currentUser; - this.accountCache = accountCache; - this.accountResolver = accountResolver; - this.accountRealm = accountRealm; - this.groupCache = groupCache; - this.groupControlFactory = groupControlFactory; - this.groupDetailFactory = groupDetailFactory; - } - - public void ownedGroups(final AsyncCallback<List<AccountGroup>> callback) { - run(callback, new Action<List<AccountGroup>>() { - public List<AccountGroup> run(ReviewDb db) throws OrmException { - final IdentifiedUser user = identifiedUser.get(); - final List<AccountGroup> result; - if (user.isAdministrator()) { - result = db.accountGroups().all().toList(); - } else { - final HashSet<AccountGroup.Id> seen = new HashSet<AccountGroup.Id>(); - result = new ArrayList<AccountGroup>(); - for (final AccountGroup.Id myGroup : user.getEffectiveGroups()) { - for (AccountGroup group : db.accountGroups().ownedByGroup(myGroup)) { - final AccountGroup.Id id = group.getId(); - if (!seen.add(id)) { - continue; - } - try { - GroupControl c = groupControlFactory.controlFor(id); - if (c.isOwner()) { - result.add(c.getAccountGroup()); - } - } catch (NoSuchGroupException e) { - continue; - } - } - } - } - Collections.sort(result, new Comparator<AccountGroup>() { - public int compare(final AccountGroup a, final AccountGroup b) { - return a.getName().compareTo(b.getName()); - } - }); - return result; - } - }); - } - - public void createGroup(final String newName, - final AsyncCallback<AccountGroup.Id> callback) { - run(callback, new Action<AccountGroup.Id>() { - public AccountGroup.Id run(final ReviewDb db) throws OrmException, - Failure { - final AccountGroup.NameKey nameKey = new AccountGroup.NameKey(newName); - if (db.accountGroups().get(nameKey) != null) { - throw new Failure(new NameAlreadyUsedException()); - } - - final AccountGroup group = - new AccountGroup(nameKey, new AccountGroup.Id(db - .nextAccountGroupId())); - group.setNameKey(nameKey); - group.setType(AccountGroup.Type.INTERNAL); - group.setDescription(""); - - final Account.Id me = getAccountId(); - final AccountGroupMember m = - new AccountGroupMember( - new AccountGroupMember.Key(me, group.getId())); - - final Transaction txn = db.beginTransaction(); - db.accountGroups().insert(Collections.singleton(group), txn); - db.accountGroupMembers().insert(Collections.singleton(m), txn); - db.accountGroupMembersAudit().insert( - Collections.singleton(new AccountGroupMemberAudit(m, me)), txn); - txn.commit(); - accountCache.evict(m.getAccountId()); - - return group.getId(); - } - }); - } - - public void groupDetail(final AccountGroup.Id groupId, - final AsyncCallback<GroupDetail> callback) { - groupDetailFactory.create(groupId).to(callback); - } - - public void changeGroupDescription(final AccountGroup.Id groupId, - final String description, final AsyncCallback<VoidResult> callback) { - run(callback, new Action<VoidResult>() { - public VoidResult run(final ReviewDb db) throws OrmException, Failure { - final AccountGroup group = db.accountGroups().get(groupId); - assertAmGroupOwner(db, group); - group.setDescription(description); - db.accountGroups().update(Collections.singleton(group)); - groupCache.evict(group); - return VoidResult.INSTANCE; - } - }); - } - - public void changeGroupOwner(final AccountGroup.Id groupId, - final String newOwnerName, final AsyncCallback<VoidResult> callback) { - run(callback, new Action<VoidResult>() { - public VoidResult run(final ReviewDb db) throws OrmException, Failure { - final AccountGroup group = db.accountGroups().get(groupId); - assertAmGroupOwner(db, group); - - final AccountGroup owner = - db.accountGroups().get(new AccountGroup.NameKey(newOwnerName)); - if (owner == null) { - throw new Failure(new NoSuchEntityException()); - } - - group.setOwnerGroupId(owner.getId()); - db.accountGroups().update(Collections.singleton(group)); - groupCache.evict(group); - return VoidResult.INSTANCE; - } - }); - } - - public void renameGroup(final AccountGroup.Id groupId, final String newName, - final AsyncCallback<VoidResult> callback) { - run(callback, new Action<VoidResult>() { - public VoidResult run(final ReviewDb db) throws OrmException, Failure { - final AccountGroup group = db.accountGroups().get(groupId); - assertAmGroupOwner(db, group); - - final AccountGroup.NameKey oldKey = group.getNameKey(); - final AccountGroup.NameKey newKey = new AccountGroup.NameKey(newName); - if (!newKey.equals(oldKey)) { - if (db.accountGroups().get(newKey) != null) { - throw new Failure(new NameAlreadyUsedException()); - } - group.setNameKey(newKey); - db.accountGroups().update(Collections.singleton(group)); - groupCache.evict(group); - groupCache.evictAfterRename(oldKey); - } - return VoidResult.INSTANCE; - } - }); - } - - public void changeGroupType(final AccountGroup.Id groupId, - final AccountGroup.Type newType, final AsyncCallback<VoidResult> callback) { - run(callback, new Action<VoidResult>() { - public VoidResult run(final ReviewDb db) throws OrmException, Failure { - final AccountGroup group = db.accountGroups().get(groupId); - assertAmGroupOwner(db, group); - group.setType(newType); - db.accountGroups().update(Collections.singleton(group)); - groupCache.evict(group); - return VoidResult.INSTANCE; - } - }); - } - - public void changeExternalGroup(final AccountGroup.Id groupId, - final AccountGroup.ExternalNameKey bindTo, - final AsyncCallback<VoidResult> callback) { - run(callback, new Action<VoidResult>() { - public VoidResult run(final ReviewDb db) throws OrmException, Failure { - final AccountGroup group = db.accountGroups().get(groupId); - assertAmGroupOwner(db, group); - group.setExternalNameKey(bindTo); - db.accountGroups().update(Collections.singleton(group)); - groupCache.evict(group); - return VoidResult.INSTANCE; - } - }); - } - - public void searchExternalGroups(final String searchFilter, - final AsyncCallback<List<AccountGroup.ExternalNameKey>> callback) { - final ArrayList<AccountGroup.ExternalNameKey> matches = - new ArrayList<AccountGroup.ExternalNameKey>(accountRealm - .lookupGroups(searchFilter)); - Collections.sort(matches, new Comparator<AccountGroup.ExternalNameKey>() { - @Override - public int compare(AccountGroup.ExternalNameKey a, - AccountGroup.ExternalNameKey b) { - return a.get().compareTo(b.get()); - } - }); - callback.onSuccess(matches); - } - - public void addGroupMember(final AccountGroup.Id groupId, - final String nameOrEmail, final AsyncCallback<GroupDetail> callback) { - run(callback, new Action<GroupDetail>() { - public GroupDetail run(ReviewDb db) throws OrmException, Failure, - NoSuchGroupException { - final GroupControl control = groupControlFactory.validateFor(groupId); - if (control.getAccountGroup().getType() != AccountGroup.Type.INTERNAL) { - throw new Failure(new NameAlreadyUsedException()); - } - - final Account a = findAccount(nameOrEmail); - if (!control.canAdd(a.getId())) { - throw new Failure(new NoSuchEntityException()); - } - - final AccountGroupMember.Key key = - new AccountGroupMember.Key(a.getId(), groupId); - AccountGroupMember m = db.accountGroupMembers().get(key); - if (m == null) { - m = new AccountGroupMember(key); - final Transaction txn = db.beginTransaction(); - db.accountGroupMembers().insert(Collections.singleton(m), txn); - db.accountGroupMembersAudit().insert( - Collections.singleton(new AccountGroupMemberAudit(m, - getAccountId())), txn); - txn.commit(); - accountCache.evict(m.getAccountId()); - } - - return groupDetailFactory.create(groupId).call(); - } - }); - } - - public void deleteGroupMembers(final AccountGroup.Id groupId, - final Set<AccountGroupMember.Key> keys, - final AsyncCallback<VoidResult> callback) { - run(callback, new Action<VoidResult>() { - public VoidResult run(final ReviewDb db) throws OrmException, - NoSuchGroupException, Failure { - final GroupControl control = groupControlFactory.validateFor(groupId); - if (control.getAccountGroup().getType() != AccountGroup.Type.INTERNAL) { - throw new Failure(new NameAlreadyUsedException()); - } - - for (final AccountGroupMember.Key k : keys) { - if (!groupId.equals(k.getAccountGroupId())) { - throw new Failure(new NoSuchEntityException()); - } - } - - final Account.Id me = getAccountId(); - for (final AccountGroupMember.Key k : keys) { - final AccountGroupMember m = db.accountGroupMembers().get(k); - if (m != null) { - if (!control.canRemove(m.getAccountId())) { - throw new Failure(new NoSuchEntityException()); - } - - AccountGroupMemberAudit audit = null; - for (AccountGroupMemberAudit a : db.accountGroupMembersAudit() - .byGroupAccount(m.getAccountGroupId(), m.getAccountId())) { - if (a.isActive()) { - audit = a; - break; - } - } - - final Transaction txn = db.beginTransaction(); - db.accountGroupMembers().delete(Collections.singleton(m), txn); - if (audit != null) { - audit.removed(me); - db.accountGroupMembersAudit().update( - Collections.singleton(audit), txn); - } else { - audit = new AccountGroupMemberAudit(m, me); - audit.removedLegacy(); - db.accountGroupMembersAudit().insert( - Collections.singleton(audit), txn); - } - txn.commit(); - accountCache.evict(m.getAccountId()); - } - } - return VoidResult.INSTANCE; - } - }); - } - - private void assertAmGroupOwner(final ReviewDb db, final AccountGroup group) - throws Failure { - try { - if (!groupControlFactory.controlFor(group.getId()).isOwner()) { - throw new Failure(new NoSuchGroupException(group.getId())); - } - } catch (NoSuchGroupException e) { - throw new Failure(new NoSuchGroupException(group.getId())); - } - } - - private Account findAccount(final String nameOrEmail) throws OrmException, - Failure { - final Account r = accountResolver.find(nameOrEmail); - if (r == null) { - throw new Failure(new NoSuchAccountException(nameOrEmail)); - } - return r; - } -} |