Merge "Support changing of group options via REST"
This commit is contained in:
		@@ -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);
 | 
			
		||||
              }
 | 
			
		||||
 
 | 
			
		||||
@@ -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()));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -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 = []; }-*/;
 | 
			
		||||
 
 | 
			
		||||
@@ -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() {
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -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());
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
@@ -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) {
 | 
			
		||||
 
 | 
			
		||||
@@ -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;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
@@ -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);
 | 
			
		||||
 
 | 
			
		||||
@@ -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);
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
@@ -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();
 | 
			
		||||
      }
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user