Merge "Support changing of group options via REST"

This commit is contained in:
David Pursehouse
2013-02-01 06:56:43 +00:00
committed by Gerrit Code Review
10 changed files with 170 additions and 16 deletions

View File

@@ -16,6 +16,7 @@ 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.groups.GroupApi;
import com.google.gerrit.client.rpc.GerritCallback;
import com.google.gerrit.client.ui.AccountGroupSuggestOracle;
@@ -23,7 +24,6 @@ import com.google.gerrit.client.ui.OnEditEnabler;
import com.google.gerrit.client.ui.RPCSuggestOracle;
import com.google.gerrit.client.ui.SmallHeading;
import com.google.gerrit.common.data.GroupDetail;
import com.google.gerrit.common.data.GroupOptions;
import com.google.gerrit.reviewdb.client.AccountGroup;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
@@ -34,7 +34,6 @@ import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwtexpui.clippy.client.CopyableLabel;
import com.google.gwtexpui.globalkey.client.NpTextArea;
import com.google.gwtexpui.globalkey.client.NpTextBox;
import com.google.gwtjsonrpc.common.VoidResult;
public class AccountGroupInfoScreen extends AccountGroupScreen {
private CopyableLabel groupUUIDLabel;
@@ -130,8 +129,8 @@ public class AccountGroupInfoScreen extends AccountGroupScreen {
final String newOwner = ownerTxt.getText().trim();
if (newOwner.length() > 0) {
GroupApi.setGroupOwner(getGroupUUID(), newOwner,
new GerritCallback<com.google.gerrit.client.VoidResult>() {
public void onSuccess(final com.google.gerrit.client.VoidResult result) {
new GerritCallback<VoidResult>() {
public void onSuccess(final VoidResult result) {
saveOwner.setEnabled(false);
}
});
@@ -161,8 +160,8 @@ public class AccountGroupInfoScreen extends AccountGroupScreen {
public void onClick(final ClickEvent event) {
final String txt = descTxt.getText().trim();
GroupApi.setGroupDescription(getGroupUUID(), txt,
new GerritCallback<com.google.gerrit.client.VoidResult>() {
public void onSuccess(final com.google.gerrit.client.VoidResult result) {
new GerritCallback<VoidResult>() {
public void onSuccess(final VoidResult result) {
saveDesc.setEnabled(false);
}
});
@@ -190,10 +189,8 @@ public class AccountGroupInfoScreen extends AccountGroupScreen {
saveGroupOptions.addClickHandler(new ClickHandler() {
@Override
public void onClick(final ClickEvent event) {
final GroupOptions groupOptions =
new GroupOptions(visibleToAllCheckBox.getValue());
Util.GROUP_SVC.changeGroupOptions(getGroupId(), groupOptions,
new GerritCallback<VoidResult>() {
GroupApi.setGroupOptions(getGroupUUID(),
visibleToAllCheckBox.getValue(), new GerritCallback<VoidResult>() {
public void onSuccess(final VoidResult result) {
saveGroupOptions.setEnabled(false);
}

View File

@@ -119,7 +119,7 @@ public class GroupTable extends NavigationTable<GroupInfo> {
table.setHTML(row, 1, Util.highlight(k.name(), toHighlight));
}
table.setText(row, 2, k.description());
if (k.isVisibleToAll()) {
if (k.options().isVisibleToAll()) {
table.setWidget(row, 3, new Image(Gerrit.RESOURCES.greenCheck()));
}

View File

@@ -64,6 +64,14 @@ public class GroupApi {
group(group).view("owner").put(in, cb);
}
/** Set the options for a group */
public static void setGroupOptions(AccountGroup.UUID group,
boolean isVisibleToAll, AsyncCallback<VoidResult> cb) {
GroupOptionsInput in = GroupOptionsInput.create();
in.isVisibleToAll(isVisibleToAll);
group(group).view("options").put(in, cb);
}
/** Add member to a group. */
public static void addMember(AccountGroup.UUID group, String member,
AsyncCallback<MemberInfo> cb) {
@@ -185,6 +193,16 @@ public class GroupApi {
}
}
private static class GroupOptionsInput extends JavaScriptObject {
final native void isVisibleToAll(boolean v) /*-{ if(v)this.is_visible_to_all=v; }-*/;
static GroupOptionsInput create() {
return (GroupOptionsInput) createObject();
}
protected GroupOptionsInput() {
}
}
private static class MemberInput extends JavaScriptObject {
final native void init() /*-{ this.members = []; }-*/;

View File

@@ -29,7 +29,7 @@ public class GroupInfo extends JavaScriptObject {
public final native String id() /*-{ return this.id; }-*/;
public final native String name() /*-{ return this.name; }-*/;
public final native boolean isVisibleToAll() /*-{ return this['visible_to_all'] ? true : false; }-*/;
public final native GroupOptionsInfo options() /*-{ return this.options; }-*/;
public final native String description() /*-{ return this.description; }-*/;
public final native String url() /*-{ return this.url; }-*/;
@@ -46,4 +46,11 @@ public class GroupInfo extends JavaScriptObject {
protected GroupInfo() {
}
public static class GroupOptionsInfo extends JavaScriptObject {
public final native boolean isVisibleToAll() /*-{ return this['is_visible_to_all'] ? true : false; }-*/;
protected GroupOptionsInfo() {
}
}
}

View File

@@ -0,0 +1,25 @@
// 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.RestReadView;
public class GetOptions implements RestReadView<GroupResource> {
@Override
public GroupOptionsInfo apply(GroupResource resource) {
return new GroupOptionsInfo(resource.getGroup());
}
}

View File

@@ -25,7 +25,7 @@ public class GroupInfo {
public String id;
public String name;
public String url;
public Boolean visibleToAll;
public GroupOptionsInfo options;
// These fields are only supplied for internal groups.
public String description;
@@ -36,7 +36,7 @@ public class GroupInfo {
id = Url.encode(group.getGroupUUID().get());
name = Strings.emptyToNull(group.getName());
url = Strings.emptyToNull(group.getUrl());
visibleToAll = group.isVisibleToAll() ? true : null;
options = new GroupOptionsInfo(group);
AccountGroup internalGroup = GroupDescriptions.toAccountGroup(group);
if (internalGroup != null) {

View File

@@ -0,0 +1,31 @@
// 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.GroupDescription;
import com.google.gerrit.reviewdb.client.AccountGroup;
public class GroupOptionsInfo {
final String kind = "gerritcodereview#groupoptions";
public Boolean isVisibleToAll;
public GroupOptionsInfo(GroupDescription.Basic group) {
isVisibleToAll = group.isVisibleToAll() ? true : null;
}
public GroupOptionsInfo(AccountGroup group) {
isVisibleToAll = group.isVisibleToAll() ? true : null;
}
}

View File

@@ -49,6 +49,8 @@ public class Module extends RestApiModule {
put(GROUP_KIND, "name").to(PutName.class);
get(GROUP_KIND, "owner").to(GetOwner.class);
put(GROUP_KIND, "owner").to(PutOwner.class);
get(GROUP_KIND, "options").to(GetOptions.class);
put(GROUP_KIND, "options").to(PutOptions.class);
child(GROUP_KIND, "members").to(MembersCollection.class);
get(MEMBER_KIND).to(GetMember.class);

View File

@@ -0,0 +1,74 @@
// 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.MethodNotAllowedException;
import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
import com.google.gerrit.extensions.restapi.RestModifyView;
import com.google.gerrit.reviewdb.client.AccountGroup;
import com.google.gerrit.reviewdb.server.ReviewDb;
import com.google.gerrit.server.account.GroupCache;
import com.google.gerrit.server.group.PutOptions.Input;
import com.google.gwtorm.server.OrmException;
import com.google.inject.Inject;
import java.util.Collections;
public class PutOptions implements RestModifyView<GroupResource, Input> {
static class Input {
Boolean isVisibleToAll;
}
private final GroupCache groupCache;
private final ReviewDb db;
@Inject
PutOptions(GroupCache groupCache, ReviewDb db) {
this.groupCache = groupCache;
this.db = db;
}
@Override
public GroupOptionsInfo apply(GroupResource resource, Input input)
throws MethodNotAllowedException, AuthException, BadRequestException,
ResourceNotFoundException, OrmException {
if (resource.toAccountGroup() == null) {
throw new MethodNotAllowedException();
} else if (!resource.getControl().isOwner()) {
throw new AuthException("Not group owner");
}
if (input == null) {
throw new BadRequestException("options are required");
}
if (input.isVisibleToAll == null) {
input.isVisibleToAll = false;
}
AccountGroup group = db.accountGroups().get(
resource.toAccountGroup().getId());
if (group == null) {
throw new ResourceNotFoundException();
}
group.setVisibleToAll(input.isVisibleToAll);
db.accountGroups().update(Collections.singleton(group));
groupCache.evict(group);
return new GroupOptionsInfo(group);
}
}

View File

@@ -88,8 +88,8 @@ public class ListGroupsCommand extends BaseCommand {
formatter.addColumn(Strings.nullToEmpty(info.description));
formatter.addColumn(o != null ? o.getName() : "n/a");
formatter.addColumn(o != null ? o.getGroupUUID().get() : "");
formatter.addColumn(Boolean.toString(
Objects.firstNonNull(info.visibleToAll, Boolean.FALSE)));
formatter.addColumn(Boolean.toString(Objects.firstNonNull(
info.options.isVisibleToAll, Boolean.FALSE)));
}
formatter.nextLine();
}