Temporarily remove ProjectAccessScreen

The ref_rights table is about to change its entire data model to
something stored in Git, and which uses a different layout in-memory
and on-disk than the old RefRight object.  Dropping the old web UI
before making the internal API changes reduces the amount of code that
is being modified at once.  A new UI will be built from scratch to
support the new data model more accurately than the old simple table
layout could do.

Change-Id: Idfdebc712b1241a81346084037bc5f6aeab6e42a
Signed-off-by: Shawn O. Pearce <sop@google.com>
diff --git a/gerrit-common/src/main/java/com/google/gerrit/common/data/InheritedRefRight.java b/gerrit-common/src/main/java/com/google/gerrit/common/data/InheritedRefRight.java
deleted file mode 100644
index 4dc998b..0000000
--- a/gerrit-common/src/main/java/com/google/gerrit/common/data/InheritedRefRight.java
+++ /dev/null
@@ -1,74 +0,0 @@
-// Copyright (C) 2010 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.common.data;
-
-import com.google.gerrit.reviewdb.RefRight;
-
-/**
- * Additional data about a {@link RefRight} not normally loaded: defines if a
- * right is inherited from a parent structure (e.g. a parent project).
- */
-public class InheritedRefRight {
-  private RefRight right;
-  private boolean inherited;
-  private boolean owner;
-
-  /**
-   * Creates a instance of a {@link RefRight} with data about inheritance
-   */
-  protected InheritedRefRight() {
-  }
-
-  /**
-   * Creates a instance of a {@link RefRight} with data about inheritance
-   *
-   * @param right the right
-   * @param inherited true if the right is inherited, false otherwise
-   * @param owner true if right is owned by current user, false otherwise
-   */
-  public InheritedRefRight(RefRight right, boolean inherited, boolean owner) {
-    this.right = right;
-    this.inherited = inherited;
-    this.owner = owner;
-  }
-
-  public RefRight getRight() {
-    return right;
-  }
-
-  public boolean isInherited() {
-    return inherited;
-  }
-
-  public boolean isOwner() {
-    return owner;
-  }
-
-  @Override
-  public boolean equals(Object o) {
-    if (o instanceof InheritedRefRight) {
-      InheritedRefRight a = this;
-      InheritedRefRight b = (InheritedRefRight) o;
-      return a.getRight().equals(b.getRight())
-          && a.isInherited() == b.isInherited();
-    }
-    return false;
-  }
-
-  @Override
-  public int hashCode() {
-    return getRight().hashCode();
-  }
-}
diff --git a/gerrit-common/src/main/java/com/google/gerrit/common/data/ProjectAdminService.java b/gerrit-common/src/main/java/com/google/gerrit/common/data/ProjectAdminService.java
index b5a986f..396ea0c 100644
--- a/gerrit-common/src/main/java/com/google/gerrit/common/data/ProjectAdminService.java
+++ b/gerrit-common/src/main/java/com/google/gerrit/common/data/ProjectAdminService.java
@@ -15,10 +15,8 @@
 package com.google.gerrit.common.data;
 
 import com.google.gerrit.common.auth.SignInRequired;
-import com.google.gerrit.reviewdb.ApprovalCategory;
 import com.google.gerrit.reviewdb.Branch;
 import com.google.gerrit.reviewdb.Project;
-import com.google.gerrit.reviewdb.RefRight;
 import com.google.gwt.user.client.rpc.AsyncCallback;
 import com.google.gwtjsonrpc.client.RemoteJsonService;
 import com.google.gwtjsonrpc.client.RpcImpl;
@@ -38,15 +36,6 @@
   void changeProjectSettings(Project update,
       AsyncCallback<ProjectDetail> callback);
 
-  @SignInRequired
-  void deleteRight(Project.NameKey projectName, Set<RefRight.Key> ids,
-      AsyncCallback<ProjectDetail> callback);
-
-  @SignInRequired
-  void addRight(Project.NameKey projectName, ApprovalCategory.Id categoryId,
-      String groupName, String refName, short min, short max,
-      AsyncCallback<ProjectDetail> callback);
-
   void listBranches(Project.NameKey projectName,
       AsyncCallback<ListBranchesResult> callback);
 
diff --git a/gerrit-common/src/main/java/com/google/gerrit/common/data/ProjectDetail.java b/gerrit-common/src/main/java/com/google/gerrit/common/data/ProjectDetail.java
index 2aa8c62..02aaf80 100644
--- a/gerrit-common/src/main/java/com/google/gerrit/common/data/ProjectDetail.java
+++ b/gerrit-common/src/main/java/com/google/gerrit/common/data/ProjectDetail.java
@@ -14,16 +14,10 @@
 
 package com.google.gerrit.common.data;
 
-import com.google.gerrit.reviewdb.AccountGroup;
 import com.google.gerrit.reviewdb.Project;
 
-import java.util.List;
-import java.util.Map;
-
 public class ProjectDetail {
   public Project project;
-  public Map<AccountGroup.Id, AccountGroup> groups;
-  public List<InheritedRefRight> rights;
   public boolean canModifyDescription;
   public boolean canModifyMergeType;
   public boolean canModifyAgreements;
@@ -36,14 +30,6 @@
     project = p;
   }
 
-  public void setGroups(final Map<AccountGroup.Id, AccountGroup> g) {
-    groups = g;
-  }
-
-  public void setRights(final List<InheritedRefRight> r) {
-    rights = r;
-  }
-
   public void setCanModifyDescription(final boolean cmd) {
     canModifyDescription = cmd;
   }
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/Dispatcher.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/Dispatcher.java
index 2b3ace4..92abd6a 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/Dispatcher.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/Dispatcher.java
@@ -44,7 +44,6 @@
 import com.google.gerrit.client.account.ValidateEmailScreen;
 import com.google.gerrit.client.admin.AccountGroupScreen;
 import com.google.gerrit.client.admin.GroupListScreen;
-import com.google.gerrit.client.admin.ProjectAccessScreen;
 import com.google.gerrit.client.admin.ProjectBranchesScreen;
 import com.google.gerrit.client.admin.ProjectInfoScreen;
 import com.google.gerrit.client.admin.ProjectListScreen;
@@ -432,7 +431,7 @@
           }
 
           if (ProjectScreen.ACCESS.equals(p)) {
-            return new ProjectAccessScreen(k);
+            return new NotFoundScreen();
           }
 
           return new NotFoundScreen();
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/AccessRightEditor.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/AccessRightEditor.java
deleted file mode 100644
index 8f6831b..0000000
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/AccessRightEditor.java
+++ /dev/null
@@ -1,404 +0,0 @@
-// Copyright (C) 2010 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.client.admin;
-
-import com.google.gerrit.client.Gerrit;
-import com.google.gerrit.client.rpc.GerritCallback;
-import com.google.gerrit.client.ui.AccountGroupSuggestOracle;
-import com.google.gerrit.client.ui.HintTextBox;
-import com.google.gerrit.client.ui.RPCSuggestOracle;
-import com.google.gerrit.common.data.ApprovalType;
-import com.google.gerrit.common.data.ProjectDetail;
-import com.google.gerrit.reviewdb.AccountGroup;
-import com.google.gerrit.reviewdb.ApprovalCategory;
-import com.google.gerrit.reviewdb.ApprovalCategoryValue;
-import com.google.gerrit.reviewdb.Project;
-import com.google.gerrit.reviewdb.RefRight;
-import com.google.gwt.event.dom.client.ChangeEvent;
-import com.google.gwt.event.dom.client.ChangeHandler;
-import com.google.gwt.event.dom.client.ClickEvent;
-import com.google.gwt.event.dom.client.ClickHandler;
-import com.google.gwt.event.dom.client.KeyCodes;
-import com.google.gwt.event.dom.client.KeyPressEvent;
-import com.google.gwt.event.dom.client.KeyPressHandler;
-import com.google.gwt.event.logical.shared.HasValueChangeHandlers;
-import com.google.gwt.event.logical.shared.ValueChangeEvent;
-import com.google.gwt.event.logical.shared.ValueChangeHandler;
-import com.google.gwt.event.shared.HandlerRegistration;
-import com.google.gwt.user.client.ui.Button;
-import com.google.gwt.user.client.ui.Composite;
-import com.google.gwt.user.client.ui.FlowPanel;
-import com.google.gwt.user.client.ui.Grid;
-import com.google.gwt.user.client.ui.ListBox;
-import com.google.gwt.user.client.ui.SuggestBox;
-
-public class AccessRightEditor extends Composite
-    implements HasValueChangeHandlers<ProjectDetail> {
-  private Project.NameKey projectKey;
-  private ListBox catBox;
-  private HintTextBox nameTxt;
-  private SuggestBox nameSug;
-  private HintTextBox referenceTxt;
-  private ListBox topBox;
-  private ListBox botBox;
-  private Button addBut;
-  private Button clearBut;
-
-  public AccessRightEditor(final Project.NameKey key) {
-    projectKey = key;
-
-    initWidgets();
-    initCategories();
-
-    final Grid grid = new Grid(5, 2);
-    grid.setText(0, 0, Util.C.columnApprovalCategory() + ":");
-    grid.setWidget(0, 1, catBox);
-
-    grid.setText(1, 0, Util.C.columnGroupName() + ":");
-    grid.setWidget(1, 1, nameSug);
-
-    grid.setText(2, 0, Util.C.columnRefName() + ":");
-    grid.setWidget(2, 1, referenceTxt);
-
-    grid.setText(3, 0, Util.C.columnRightRange() + ":");
-    grid.setWidget(3, 1, topBox);
-
-    grid.setText(4, 0, "");
-    grid.setWidget(4, 1, botBox);
-
-    FlowPanel fp = new FlowPanel();
-    fp.setStyleName(Gerrit.RESOURCES.css().addSshKeyPanel());
-
-    fp.add(grid);
-    fp.add(addBut);
-    fp.add(clearBut);
-    initWidget(fp);
-  }
-
-  protected void initWidgets() {
-    catBox = new ListBox();
-    catBox.addChangeHandler(new ChangeHandler() {
-      @Override
-      public void onChange(final ChangeEvent event) {
-        updateCategorySelection();
-      }
-    });
-
-    nameTxt = new HintTextBox();
-    nameSug = new SuggestBox(new RPCSuggestOracle(
-        new AccountGroupSuggestOracle()), nameTxt);
-    nameTxt.setVisibleLength(50);
-    nameTxt.setHintText(Util.C.defaultAccountGroupName());
-
-    referenceTxt = new HintTextBox();
-    referenceTxt.setVisibleLength(50);
-    referenceTxt.setText("");
-    referenceTxt.addKeyPressHandler(new KeyPressHandler() {
-      @Override
-      public void onKeyPress(KeyPressEvent event) {
-        if (event.getNativeEvent().getKeyCode() == KeyCodes.KEY_ENTER) {
-          doAddNewRight();
-        }
-      }
-    });
-
-    topBox = new ListBox();
-    botBox = new ListBox();
-
-    addBut = new Button(Util.C.buttonAddProjectRight());
-    addBut.addClickHandler(new ClickHandler() {
-      @Override
-      public void onClick(final ClickEvent event) {
-        doAddNewRight();
-      }
-    });
-
-    clearBut = new Button(Util.C.buttonClearProjectRight());
-    clearBut.addClickHandler(new ClickHandler() {
-      @Override
-      public void onClick(final ClickEvent event) {
-        clear();
-      }
-    });
-  }
-
-  protected void initCategories() {
-    for (final ApprovalType at : Gerrit.getConfig().getApprovalTypes()
-        .getApprovalTypes()) {
-      final ApprovalCategory c = at.getCategory();
-      catBox.addItem(c.getName(), c.getId().get());
-    }
-    for (final ApprovalType at : Gerrit.getConfig().getApprovalTypes()
-        .getActionTypes()) {
-      final ApprovalCategory c = at.getCategory();
-      if (Gerrit.getConfig().getWildProject().equals(projectKey)
-          && !c.getId().canBeOnWildProject()) {
-        // Giving out control of the WILD_PROJECT to other groups beyond
-        // Administrators is dangerous. Having control over WILD_PROJECT
-        // is about the same as having Administrator access as users are
-        // able to affect grants in all projects on the system.
-        //
-        continue;
-      }
-      catBox.addItem(c.getName(), c.getId().get());
-    }
-
-    if (catBox.getItemCount() > 0) {
-      catBox.setSelectedIndex(0);
-      updateCategorySelection();
-    }
-  }
-
-  public void enableForm(final boolean on) {
-    final boolean canAdd = on && catBox.getItemCount() > 0;
-    addBut.setEnabled(canAdd);
-    clearBut.setEnabled(canAdd);
-    nameTxt.setEnabled(canAdd);
-    referenceTxt.setEnabled(canAdd);
-    catBox.setEnabled(canAdd);
-    topBox.setEnabled(canAdd);
-    botBox.setEnabled(canAdd);
-  }
-
-  public void clear() {
-    setCat(null);
-    setName("");
-    setReference("");
-  }
-
-  public void load(final RefRight right, final AccountGroup group) {
-    final ApprovalType atype =
-       Gerrit.getConfig().getApprovalTypes().getApprovalType(
-          right.getApprovalCategoryId());
-
-    setCat(atype != null ? atype.getCategory().getName()
-                         : right.getApprovalCategoryId().get() );
-
-    setName(group.getName());
-    setReference(right.getRefPatternForDisplay());
-
-    setRange(atype.getCategory().isRange() ? atype.getValue(right.getMinValue())
-             : null, atype.getValue(right.getMaxValue()) );
-  }
-
-  protected void doAddNewRight() {
-    final ApprovalType at = getApprovalType();
-    ApprovalCategoryValue min = getMin(at);
-    ApprovalCategoryValue max = getMax(at);
-
-    if (at == null || min == null || max == null) {
-      return;
-    }
-
-    final String groupName = nameSug.getText();
-    if ("".equals(groupName)
-        || Util.C.defaultAccountGroupName().equals(groupName)) {
-      return;
-    }
-
-    final String refPattern = referenceTxt.getText();
-
-    addBut.setEnabled(false);
-    Util.PROJECT_SVC.addRight(projectKey, at.getCategory().getId(),
-        groupName, refPattern, min.getValue(), max.getValue(),
-        new GerritCallback<ProjectDetail>() {
-          public void onSuccess(final ProjectDetail result) {
-            addBut.setEnabled(true);
-            nameSug.setText("");
-            referenceTxt.setText("");
-            ValueChangeEvent.fire(AccessRightEditor.this, result);
-          }
-
-          @Override
-          public void onFailure(final Throwable caught) {
-            addBut.setEnabled(true);
-            super.onFailure(caught);
-          }
-        });
-  }
-
-  protected void updateCategorySelection() {
-    final ApprovalType at = getApprovalType();
-
-    if (at == null || at.getValues().isEmpty()) {
-      topBox.setEnabled(false);
-      botBox.setEnabled(false);
-      referenceTxt.setEnabled(false);
-      addBut.setEnabled(false);
-      clearBut.setEnabled(false);
-      return;
-    }
-
-    updateRanges(at);
-  }
-
-  protected void updateRanges(final ApprovalType at) {
-    ApprovalCategoryValue min = null, max = null, last = null;
-
-    topBox.clear();
-    botBox.clear();
-
-    for(final ApprovalCategoryValue v : at.getValues()) {
-      final int nval = v.getValue();
-      final String vStr = String.valueOf(nval);
-
-      String nStr = vStr + ": " + v.getName();
-      if (nval > 0) {
-        nStr = "+" + nStr;
-      }
-
-      topBox.addItem(nStr, vStr);
-      botBox.addItem(nStr, vStr);
-
-      if (min == null || nval < 0) {
-        min = v;
-      } else if (max == null && nval > 0) {
-        max = v;
-      }
-      last = v;
-    }
-
-    if (max == null) {
-      max = last;
-    }
-
-    if (ApprovalCategory.READ.equals(at.getCategory().getId())) {
-      // Special case; for READ the most logical range is just
-      // +1 READ, so assume that as the default for both.
-      min = max;
-    }
-
-    if (! at.getCategory().isRange()) {
-      max = null;
-    }
-
-    setRange(min, max);
-  }
-
-  protected void setCat(final String cat) {
-    if (cat == null) {
-      catBox.setSelectedIndex(0);
-    } else {
-      setSelectedText(catBox, cat);
-    }
-    updateCategorySelection();
-  }
-
-  protected void setName(final String name) {
-    nameTxt.setText(name);
-  }
-
-  protected void setReference(final String ref) {
-    referenceTxt.setText(ref);
-  }
-
-  protected void setRange(final ApprovalCategoryValue min,
-                          final ApprovalCategoryValue max) {
-    if (min == null || max == null) {
-      botBox.setVisible(false);
-      if (max != null) {
-        setSelectedValue(topBox, "" + max.getValue());
-        return;
-      }
-    } else {
-      botBox.setVisible(true);
-      setSelectedValue(botBox, "" + max.getValue());
-    }
-    setSelectedValue(topBox, "" + min.getValue());
-  }
-
-  private ApprovalType getApprovalType() {
-    int idx = catBox.getSelectedIndex();
-    if (idx < 0) {
-      return null;
-    }
-    return Gerrit.getConfig().getApprovalTypes().getApprovalType(
-             new ApprovalCategory.Id(catBox.getValue(idx)));
-  }
-
-  public ApprovalCategoryValue getMin(ApprovalType at) {
-    final ApprovalCategoryValue top = getTop(at);
-    final ApprovalCategoryValue bot = getBot(at);
-    if (bot == null) {
-      for (final ApprovalCategoryValue v : at.getValues()) {
-        if (0 <= v.getValue() && v.getValue() <= top.getValue()) {
-          return v;
-        }
-      }
-      return at.getMin();
-    }
-
-    if (top.getValue() > bot.getValue()) {
-      return bot;
-    }
-    return top;
-  }
-
-  public ApprovalCategoryValue getMax(ApprovalType at) {
-    final ApprovalCategoryValue top = getTop(at);
-    final ApprovalCategoryValue bot = getBot(at);
-    if (bot == null || bot.getValue() < top.getValue()) {
-      return top;
-    }
-    return bot;
-  }
-
-  protected ApprovalCategoryValue getTop(ApprovalType at) {
-    int idx = topBox.getSelectedIndex();
-    if (idx < 0) {
-      return null;
-    }
-    return at.getValue(Short.parseShort(topBox.getValue(idx)));
-  }
-
-  protected ApprovalCategoryValue getBot(ApprovalType at) {
-    int idx = botBox.getSelectedIndex();
-    if (idx < 0 || ! botBox.isVisible()) {
-      return null;
-    }
-    return at.getValue(Short.parseShort(botBox.getValue(idx)));
-  }
-
-  public HandlerRegistration addValueChangeHandler(
-      final ValueChangeHandler<ProjectDetail> handler) {
-    return addHandler(handler, ValueChangeEvent.getType());
-  }
-
-  public static boolean setSelectedText(ListBox box, String text) {
-    if (text == null) {
-      return false;
-    }
-    for (int i =0 ; i < box.getItemCount(); i++) {
-      if (text.equals(box.getItemText(i))) {
-        box.setSelectedIndex(i);
-        return true;
-      }
-    }
-    return false;
-  }
-
-  public static boolean setSelectedValue(ListBox box, String value) {
-    if (value == null) {
-      return false;
-    }
-    for (int i =0 ; i < box.getItemCount(); i++) {
-      if (value.equals(box.getValue(i))) {
-        box.setSelectedIndex(i);
-        return true;
-      }
-    }
-    return false;
-  }
-}
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/ProjectAccessScreen.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/ProjectAccessScreen.java
deleted file mode 100644
index b87f6f1..0000000
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/ProjectAccessScreen.java
+++ /dev/null
@@ -1,327 +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.client.admin;
-
-import com.google.gerrit.client.Dispatcher;
-import com.google.gerrit.client.Gerrit;
-import com.google.gerrit.client.rpc.GerritCallback;
-import com.google.gerrit.client.rpc.ScreenLoadCallback;
-import com.google.gerrit.client.ui.FancyFlexTable;
-import com.google.gerrit.client.ui.Hyperlink;
-import com.google.gerrit.client.ui.SmallHeading;
-import com.google.gerrit.common.data.ApprovalType;
-import com.google.gerrit.common.data.GerritConfig;
-import com.google.gerrit.common.data.InheritedRefRight;
-import com.google.gerrit.common.data.ProjectDetail;
-import com.google.gerrit.reviewdb.AccountGroup;
-import com.google.gerrit.reviewdb.ApprovalCategoryValue;
-import com.google.gerrit.reviewdb.Project;
-import com.google.gerrit.reviewdb.RefRight;
-import com.google.gwt.event.dom.client.ClickEvent;
-import com.google.gwt.event.dom.client.ClickHandler;
-import com.google.gwt.event.logical.shared.ValueChangeEvent;
-import com.google.gwt.event.logical.shared.ValueChangeHandler;
-import com.google.gwt.user.client.ui.Button;
-import com.google.gwt.user.client.ui.CheckBox;
-import com.google.gwt.user.client.ui.Grid;
-import com.google.gwt.user.client.ui.Panel;
-import com.google.gwt.user.client.ui.VerticalPanel;
-import com.google.gwt.user.client.ui.FlexTable.FlexCellFormatter;
-import com.google.gwtexpui.safehtml.client.SafeHtml;
-import com.google.gwtexpui.safehtml.client.SafeHtmlBuilder;
-
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-
-public class ProjectAccessScreen extends ProjectScreen {
-  private Panel parentPanel;
-  private Hyperlink parentName;
-
-  private RightsTable rights;
-  private Button delRight;
-  private AccessRightEditor rightEditor;
-  private CheckBox showInherited;
-
-  public ProjectAccessScreen(final Project.NameKey toShow) {
-    super(toShow);
-  }
-
-  @Override
-  protected void onInitUI() {
-    super.onInitUI();
-    initParent();
-    initRights();
-  }
-
-  @Override
-  protected void onLoad() {
-    super.onLoad();
-    Util.PROJECT_SVC.projectDetail(getProjectKey(),
-        new ScreenLoadCallback<ProjectDetail>(this) {
-          public void preDisplay(final ProjectDetail result) {
-            enableForm(true);
-            display(result);
-          }
-        });
-  }
-
-  private void enableForm(final boolean on) {
-    delRight.setEnabled(on);
-    rightEditor.enableForm(on);
-  }
-
-  private void initParent() {
-    parentName = new Hyperlink("", "");
-
-    showInherited = new CheckBox();
-    showInherited.setValue(true);
-    showInherited.addClickHandler(new ClickHandler() {
-      public void onClick(ClickEvent event) {
-        rights.showInherited(showInherited.getValue());
-      }
-    });
-
-    Grid g = new Grid(2, 3);
-    g.setWidget(0, 0, new SmallHeading(Util.C.headingParentProjectName()));
-    g.setWidget(1, 0, parentName);
-    g.setWidget(1, 1, showInherited);
-    g.setText(1, 2, Util.C.headingShowInherited());
-
-    parentPanel = new VerticalPanel();
-    parentPanel.add(g);
-    add(parentPanel);
-  }
-
-  private void initRights() {
-    rights = new RightsTable();
-
-    delRight = new Button(Util.C.buttonDeleteGroupMembers());
-    delRight.addClickHandler(new ClickHandler() {
-      @Override
-      public void onClick(final ClickEvent event) {
-        final HashSet<RefRight.Key> refRightIds = rights.getRefRightIdsChecked();
-        doDeleteRefRights(refRightIds);
-      }
-    });
-
-    rightEditor = new AccessRightEditor(getProjectKey());
-    rightEditor.addValueChangeHandler(new ValueChangeHandler<ProjectDetail>() {
-        @Override
-        public void onValueChange(ValueChangeEvent<ProjectDetail> event) {
-          display(event.getValue());
-        }
-      });
-
-    add(new SmallHeading(Util.C.headingAccessRights()));
-    add(rights);
-    add(delRight);
-    add(rightEditor);
-  }
-
-  void display(final ProjectDetail result) {
-    final Project project = result.project;
-
-    final Project.NameKey wildKey = Gerrit.getConfig().getWildProject();
-    final boolean isWild = wildKey.equals(project.getNameKey());
-    Project.NameKey parent = project.getParent();
-    if (parent == null) {
-      parent = wildKey;
-    }
-
-    parentPanel.setVisible(!isWild);
-    parentName.setTargetHistoryToken(Dispatcher.toProjectAdmin(parent, ACCESS));
-    parentName.setText(parent.get());
-
-    rights.display(result.groups, result.rights);
-
-    rightEditor.setVisible(result.canModifyAccess);
-    delRight.setVisible(rights.getCanDelete());
-  }
-
-  private void doDeleteRefRights(final HashSet<RefRight.Key> refRightIds) {
-    if (!refRightIds.isEmpty()) {
-      Util.PROJECT_SVC.deleteRight(getProjectKey(), refRightIds,
-          new GerritCallback<ProjectDetail>() {
-        @Override
-        public void onSuccess(final ProjectDetail result) {
-          //The user could no longer modify access after deleting a ref right.
-          display(result);
-        }
-      });
-    }
-  }
-
-  private class RightsTable extends FancyFlexTable<InheritedRefRight> {
-    boolean canDelete;
-    Map<AccountGroup.Id, AccountGroup> groups;
-
-    RightsTable() {
-      table.setWidth("");
-      table.setText(0, 2, Util.C.columnRightOrigin());
-      table.setText(0, 3, Util.C.columnApprovalCategory());
-      table.setText(0, 4, Util.C.columnGroupName());
-      table.setText(0, 5, Util.C.columnRefName());
-      table.setText(0, 6, Util.C.columnRightRange());
-
-      final FlexCellFormatter fmt = table.getFlexCellFormatter();
-      fmt.addStyleName(0, 1, Gerrit.RESOURCES.css().iconHeader());
-      fmt.addStyleName(0, 2, Gerrit.RESOURCES.css().dataHeader());
-      fmt.addStyleName(0, 3, Gerrit.RESOURCES.css().dataHeader());
-      fmt.addStyleName(0, 4, Gerrit.RESOURCES.css().dataHeader());
-      fmt.addStyleName(0, 5, Gerrit.RESOURCES.css().dataHeader());
-      fmt.addStyleName(0, 6, Gerrit.RESOURCES.css().dataHeader());
-
-      table.addClickHandler(new ClickHandler() {
-        @Override
-        public void onClick(final ClickEvent event) {
-          onOpenRow(table.getCellForEvent(event).getRowIndex());
-        }
-      });
-    }
-
-    HashSet<RefRight.Key> getRefRightIdsChecked() {
-      final HashSet<RefRight.Key> refRightIds = new HashSet<RefRight.Key>();
-      for (int row = 1; row < table.getRowCount(); row++) {
-        RefRight r = getRowItem(row).getRight();
-        if (r != null && table.getWidget(row, 1) instanceof CheckBox
-            && ((CheckBox) table.getWidget(row, 1)).getValue()) {
-          refRightIds.add(r.getKey());
-        }
-      }
-      return refRightIds;
-    }
-
-    void display(final Map<AccountGroup.Id, AccountGroup> grps,
-        final List<InheritedRefRight> refRights) {
-      groups = grps;
-      canDelete = false;
-
-      while (1 < table.getRowCount())
-        table.removeRow(table.getRowCount() - 1);
-
-      for (final InheritedRefRight r : refRights) {
-        final int row = table.getRowCount();
-        table.insertRow(row);
-        if (! showInherited.getValue() && r.isInherited()) {
-          table.getRowFormatter().setVisible(row, false);
-        }
-        applyDataRowStyle(row);
-        populate(row, r);
-      }
-    }
-
-    protected void onOpenRow(final int row) {
-      if (row > 0) {
-        RefRight right = getRowItem(row).getRight();
-        rightEditor.load(right, groups.get(right.getAccountGroupId()));
-      }
-    }
-
-    void populate(final int row, final InheritedRefRight r) {
-      final GerritConfig config = Gerrit.getConfig();
-      final RefRight right = r.getRight();
-      final ApprovalType ar =
-          config.getApprovalTypes().getApprovalType(
-              right.getApprovalCategoryId());
-      final AccountGroup group = groups.get(right.getAccountGroupId());
-
-      if (r.isInherited() || !r.isOwner()) {
-        table.setText(row, 1, "");
-      } else {
-        table.setWidget(row, 1, new CheckBox());
-        canDelete = true;
-      }
-
-      if (r.isInherited()) {
-        Project.NameKey fromProject = right.getKey().getProjectNameKey();
-        table.setWidget(row, 2, new Hyperlink(fromProject.get(), Dispatcher
-            .toProjectAdmin(fromProject, ACCESS)));
-      } else {
-        table.setText(row, 2, "");
-      }
-
-      table.setText(row, 3, ar != null ? ar.getCategory().getName()
-                                       : right.getApprovalCategoryId().get() );
-
-      if (group != null) {
-        table.setWidget(row, 4, new Hyperlink(group.getName(), Dispatcher
-            .toAccountGroup(group.getId())));
-      } else {
-        table.setText(row, 4, Util.M.deletedGroup(right.getAccountGroupId()
-            .get()));
-      }
-
-      table.setText(row, 5, right.getRefPatternForDisplay());
-
-      {
-        final SafeHtmlBuilder m = new SafeHtmlBuilder();
-        final ApprovalCategoryValue min, max;
-        min = ar != null ? ar.getValue(right.getMinValue()) : null;
-        max = ar != null ? ar.getValue(right.getMaxValue()) : null;
-
-        if (ar != null && ar.getCategory().isRange()) {
-          formatValue(m, right.getMinValue(), min);
-          m.br();
-        }
-        formatValue(m, right.getMaxValue(), max);
-        SafeHtml.set(table, row, 6, m);
-      }
-
-      final FlexCellFormatter fmt = table.getFlexCellFormatter();
-      fmt.addStyleName(row, 1, Gerrit.RESOURCES.css().iconCell());
-      fmt.addStyleName(row, 2, Gerrit.RESOURCES.css().dataCell());
-      fmt.addStyleName(row, 3, Gerrit.RESOURCES.css().dataCell());
-      fmt.addStyleName(row, 4, Gerrit.RESOURCES.css().dataCell());
-      fmt.addStyleName(row, 5, Gerrit.RESOURCES.css().dataCell());
-      fmt.addStyleName(row, 6, Gerrit.RESOURCES.css().dataCell());
-      fmt.addStyleName(row, 6, Gerrit.RESOURCES.css()
-          .projectAdminApprovalCategoryRangeLine());
-
-      setRowItem(row, r);
-    }
-
-    public void showInherited(boolean visible) {
-      for (int r = 0; r < table.getRowCount(); r++) {
-        if (getRowItem(r) != null && getRowItem(r).isInherited()) {
-          table.getRowFormatter().setVisible(r, visible);
-        }
-      }
-    }
-
-    private void formatValue(final SafeHtmlBuilder m, final short v,
-        final ApprovalCategoryValue e) {
-      m.openSpan();
-      m
-          .setStyleName(Gerrit.RESOURCES.css()
-              .projectAdminApprovalCategoryValue());
-      if (v == 0) {
-        m.append(' ');
-      } else if (v > 0) {
-        m.append('+');
-      }
-      m.append(v);
-      m.closeSpan();
-      if (e != null) {
-        m.append(": ");
-        m.append(e.getName());
-      }
-    }
-
-    private boolean getCanDelete() {
-      return canDelete;
-    }
-  }
-}
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/project/AddRefRight.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/project/AddRefRight.java
deleted file mode 100644
index 358b542..0000000
--- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/project/AddRefRight.java
+++ /dev/null
@@ -1,207 +0,0 @@
-// Copyright (C) 2010 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.httpd.rpc.project;
-
-import com.google.gerrit.common.data.ApprovalType;
-import com.google.gerrit.common.data.ApprovalTypes;
-import com.google.gerrit.common.data.ProjectDetail;
-import com.google.gerrit.common.errors.InvalidNameException;
-import com.google.gerrit.common.errors.NoSuchGroupException;
-import com.google.gerrit.httpd.rpc.Handler;
-import com.google.gerrit.reviewdb.AccountGroup;
-import com.google.gerrit.reviewdb.ApprovalCategory;
-import com.google.gerrit.reviewdb.Project;
-import com.google.gerrit.reviewdb.RefRight;
-import com.google.gerrit.reviewdb.ReviewDb;
-import com.google.gerrit.server.account.GroupCache;
-import com.google.gerrit.server.project.NoSuchProjectException;
-import com.google.gerrit.server.project.NoSuchRefException;
-import com.google.gerrit.server.project.ProjectCache;
-import com.google.gerrit.server.project.ProjectControl;
-import com.google.gerrit.server.project.RefControl;
-import com.google.gwtorm.client.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.assistedinject.Assisted;
-
-import org.eclipse.jgit.lib.Constants;
-import org.eclipse.jgit.lib.Repository;
-
-import java.util.Collections;
-
-import javax.annotation.Nullable;
-
-class AddRefRight extends Handler<ProjectDetail> {
-  interface Factory {
-    AddRefRight create(@Assisted Project.NameKey projectName,
-        @Assisted ApprovalCategory.Id categoryId,
-        @Assisted("groupName") String groupName,
-        @Nullable @Assisted("refPattern") String refPattern,
-        @Assisted("min") short min, @Assisted("max") short max);
-  }
-
-  private final ProjectDetailFactory.Factory projectDetailFactory;
-  private final ProjectControl.Factory projectControlFactory;
-  private final ProjectCache projectCache;
-  private final GroupCache groupCache;
-  private final ReviewDb db;
-  private final ApprovalTypes approvalTypes;
-
-  private final Project.NameKey projectName;
-  private final ApprovalCategory.Id categoryId;
-  private final AccountGroup.NameKey groupName;
-  private final String refPattern;
-  private final short min;
-  private final short max;
-
-  @Inject
-  AddRefRight(final ProjectDetailFactory.Factory projectDetailFactory,
-      final ProjectControl.Factory projectControlFactory,
-      final ProjectCache projectCache, final GroupCache groupCache,
-      final ReviewDb db, final ApprovalTypes approvalTypes,
-
-      @Assisted final Project.NameKey projectName,
-      @Assisted final ApprovalCategory.Id categoryId,
-      @Assisted("groupName") final String groupName,
-      @Nullable @Assisted("refPattern") final String refPattern,
-      @Assisted("min") final short min, @Assisted("max") final short max) {
-    this.projectDetailFactory = projectDetailFactory;
-    this.projectControlFactory = projectControlFactory;
-    this.projectCache = projectCache;
-    this.groupCache = groupCache;
-    this.approvalTypes = approvalTypes;
-    this.db = db;
-
-    this.projectName = projectName;
-    this.categoryId = categoryId;
-    this.groupName = new AccountGroup.NameKey(groupName);
-    this.refPattern = refPattern != null ? refPattern.trim() : null;
-
-    if (min <= max) {
-      this.min = min;
-      this.max = max;
-    } else {
-      this.min = max;
-      this.max = min;
-    }
-  }
-
-  @Override
-  public ProjectDetail call() throws NoSuchProjectException, OrmException,
-      NoSuchGroupException, InvalidNameException, NoSuchRefException {
-    final ProjectControl projectControl =
-        projectControlFactory.controlFor(projectName);
-
-    final ApprovalType at = approvalTypes.getApprovalType(categoryId);
-    if (at == null || at.getValue(min) == null || at.getValue(max) == null) {
-      throw new IllegalArgumentException("Invalid category " + categoryId
-          + " or range " + min + ".." + max);
-    }
-
-    String refPattern = this.refPattern;
-    if (refPattern == null || refPattern.isEmpty()) {
-      if (categoryId.equals(ApprovalCategory.SUBMIT)
-          || categoryId.equals(ApprovalCategory.PUSH_HEAD)) {
-        // Explicitly related to a branch head.
-        refPattern = Constants.R_HEADS + "*";
-
-      } else if (!at.getCategory().isAction()) {
-        // Non actions are approval votes on a change, assume these apply
-        // to branch heads only.
-        refPattern = Constants.R_HEADS + "*";
-
-      } else if (categoryId.equals(ApprovalCategory.PUSH_TAG)) {
-        // Explicitly related to the tag namespace.
-        refPattern = Constants.R_TAGS + "*";
-
-      } else if (categoryId.equals(ApprovalCategory.READ)
-          || categoryId.equals(ApprovalCategory.OWN)) {
-        // Currently these are project-wide rights, so apply that way.
-        refPattern = RefRight.ALL;
-
-      } else {
-        // Assume project wide for the default.
-        refPattern = RefRight.ALL;
-      }
-    }
-
-    boolean exclusive = refPattern.startsWith("-");
-    if (exclusive) {
-      refPattern = refPattern.substring(1);
-    }
-
-    while (refPattern.startsWith("/")) {
-      refPattern = refPattern.substring(1);
-    }
-
-    if (refPattern.startsWith(RefRight.REGEX_PREFIX)) {
-      String example = RefControl.shortestExample(refPattern);
-
-      if (!example.startsWith(Constants.R_REFS)) {
-        refPattern = RefRight.REGEX_PREFIX + Constants.R_HEADS
-                + refPattern.substring(RefRight.REGEX_PREFIX.length());
-        example = RefControl.shortestExample(refPattern);
-      }
-
-      if (!Repository.isValidRefName(example)) {
-        throw new InvalidNameException();
-      }
-
-    } else {
-      if (!refPattern.startsWith(Constants.R_REFS)) {
-        refPattern = Constants.R_HEADS + refPattern;
-      }
-
-      if (refPattern.endsWith("/*")) {
-        final String prefix = refPattern.substring(0, refPattern.length() - 2);
-        if (!"refs".equals(prefix) && !Repository.isValidRefName(prefix)) {
-          throw new InvalidNameException();
-        }
-      } else {
-        if (!Repository.isValidRefName(refPattern)) {
-          throw new InvalidNameException();
-        }
-      }
-    }
-
-    if (!projectControl.controlForRef(refPattern).isOwner()) {
-      throw new NoSuchRefException(refPattern);
-    }
-
-    if (exclusive) {
-      refPattern = "-" + refPattern;
-    }
-
-    final AccountGroup group = groupCache.get(groupName);
-    if (group == null) {
-      throw new NoSuchGroupException(groupName);
-    }
-    final RefRight.Key key =
-        new RefRight.Key(projectName, new RefRight.RefPattern(refPattern),
-            categoryId, group.getId());
-    RefRight rr = db.refRights().get(key);
-    if (rr == null) {
-      rr = new RefRight(key);
-      rr.setMinValue(min);
-      rr.setMaxValue(max);
-      db.refRights().insert(Collections.singleton(rr));
-    } else {
-      rr.setMinValue(min);
-      rr.setMaxValue(max);
-      db.refRights().update(Collections.singleton(rr));
-    }
-    projectCache.evictAll();
-    return projectDetailFactory.create(projectName).call();
-  }
-}
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/project/DeleteRefRights.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/project/DeleteRefRights.java
deleted file mode 100644
index ae8b98b..0000000
--- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/project/DeleteRefRights.java
+++ /dev/null
@@ -1,91 +0,0 @@
-// Copyright (C) 2010 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.httpd.rpc.project;
-
-import com.google.gerrit.common.data.ProjectDetail;
-import com.google.gerrit.httpd.rpc.Handler;
-import com.google.gerrit.reviewdb.Project;
-import com.google.gerrit.reviewdb.RefRight;
-import com.google.gerrit.reviewdb.ReviewDb;
-import com.google.gerrit.server.project.NoSuchProjectException;
-import com.google.gerrit.server.project.NoSuchRefException;
-import com.google.gerrit.server.project.ProjectCache;
-import com.google.gerrit.server.project.ProjectControl;
-import com.google.gwtorm.client.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.assistedinject.Assisted;
-
-import java.util.Collections;
-import java.util.Set;
-
-class DeleteRefRights extends Handler<ProjectDetail> {
-  interface Factory {
-    DeleteRefRights create(@Assisted Project.NameKey projectName,
-        @Assisted Set<RefRight.Key> toRemove);
-  }
-
-  private final ProjectDetailFactory.Factory projectDetailFactory;
-  private final ProjectControl.Factory projectControlFactory;
-  private final ProjectCache projectCache;
-  private final ReviewDb db;
-
-  private final Project.NameKey projectName;
-  private final Set<RefRight.Key> toRemove;
-
-  @Inject
-  DeleteRefRights(final ProjectDetailFactory.Factory projectDetailFactory,
-      final ProjectControl.Factory projectControlFactory,
-      final ProjectCache projectCache, final ReviewDb db,
-
-      @Assisted final Project.NameKey projectName,
-      @Assisted final Set<RefRight.Key> toRemove) {
-    this.projectDetailFactory = projectDetailFactory;
-    this.projectControlFactory = projectControlFactory;
-    this.projectCache = projectCache;
-    this.db = db;
-
-    this.projectName = projectName;
-    this.toRemove = toRemove;
-  }
-
-  @Override
-  public ProjectDetail call() throws NoSuchProjectException, OrmException,
-      NoSuchRefException {
-    final ProjectControl projectControl =
-        projectControlFactory.controlFor(projectName);
-
-    for (final RefRight.Key k : toRemove) {
-      if (!projectName.equals(k.getProjectNameKey())) {
-        throw new IllegalArgumentException("All keys must be from same project");
-      }
-      String refPattern = k.getRefPattern();
-      if (refPattern.startsWith("-")) {
-        refPattern = refPattern.substring(1);
-      }
-      if (!projectControl.controlForRef(refPattern).isOwner()) {
-        throw new NoSuchRefException(refPattern);
-      }
-    }
-
-    for (final RefRight.Key k : toRemove) {
-      final RefRight m = db.refRights().get(k);
-      if (m != null) {
-        db.refRights().delete(Collections.singleton(m));
-      }
-    }
-    projectCache.evictAll();
-    return projectDetailFactory.create(projectName).call();
-  }
-}
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/project/ProjectAdminServiceImpl.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/project/ProjectAdminServiceImpl.java
index 9b06dd9..07fe321 100644
--- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/project/ProjectAdminServiceImpl.java
+++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/project/ProjectAdminServiceImpl.java
@@ -17,10 +17,8 @@
 import com.google.gerrit.common.data.ListBranchesResult;
 import com.google.gerrit.common.data.ProjectAdminService;
 import com.google.gerrit.common.data.ProjectDetail;
-import com.google.gerrit.reviewdb.ApprovalCategory;
 import com.google.gerrit.reviewdb.Branch;
 import com.google.gerrit.reviewdb.Project;
-import com.google.gerrit.reviewdb.RefRight;
 import com.google.gwt.user.client.rpc.AsyncCallback;
 import com.google.inject.Inject;
 
@@ -34,8 +32,6 @@
   private final ListBranches.Factory listBranchesFactory;
   private final VisibleProjects.Factory visibleProjectsFactory;
   private final ProjectDetailFactory.Factory projectDetailFactory;
-  private final AddRefRight.Factory addRefRightFactory;
-  private final DeleteRefRights.Factory deleteRefRightsFactory;
 
   @Inject
   ProjectAdminServiceImpl(final AddBranch.Factory addBranchFactory,
@@ -43,17 +39,13 @@
       final DeleteBranches.Factory deleteBranchesFactory,
       final ListBranches.Factory listBranchesFactory,
       final VisibleProjects.Factory visibleProjectsFactory,
-      final ProjectDetailFactory.Factory projectDetailFactory,
-      final AddRefRight.Factory addRefRightFactory,
-      final DeleteRefRights.Factory deleteRefRightsFactory) {
+      final ProjectDetailFactory.Factory projectDetailFactory) {
     this.addBranchFactory = addBranchFactory;
     this.changeProjectSettingsFactory = changeProjectSettingsFactory;
     this.deleteBranchesFactory = deleteBranchesFactory;
     this.listBranchesFactory = listBranchesFactory;
     this.visibleProjectsFactory = visibleProjectsFactory;
     this.projectDetailFactory = projectDetailFactory;
-    this.addRefRightFactory = addRefRightFactory;
-    this.deleteRefRightsFactory = deleteRefRightsFactory;
   }
 
   @Override
@@ -74,21 +66,6 @@
   }
 
   @Override
-  public void deleteRight(final Project.NameKey projectName,
-      final Set<RefRight.Key> toRemove, final AsyncCallback<ProjectDetail> callback) {
-    deleteRefRightsFactory.create(projectName, toRemove).to(callback);
-  }
-
-  @Override
-  public void addRight(final Project.NameKey projectName,
-      final ApprovalCategory.Id categoryId, final String groupName,
-      final String refPattern, final short min, final short max,
-      final AsyncCallback<ProjectDetail> callback) {
-    addRefRightFactory.create(projectName, categoryId, groupName, refPattern,
-        min, max).to(callback);
-  }
-
-  @Override
   public void listBranches(final Project.NameKey projectName,
       final AsyncCallback<ListBranchesResult> callback) {
     listBranchesFactory.create(projectName).to(callback);
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/project/ProjectDetailFactory.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/project/ProjectDetailFactory.java
index ef632c4..1eb940b 100644
--- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/project/ProjectDetailFactory.java
+++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/project/ProjectDetailFactory.java
@@ -14,50 +14,28 @@
 
 package com.google.gerrit.httpd.rpc.project;
 
-import com.google.gerrit.common.data.ApprovalType;
-import com.google.gerrit.common.data.ApprovalTypes;
-import com.google.gerrit.common.data.InheritedRefRight;
 import com.google.gerrit.common.data.ProjectDetail;
 import com.google.gerrit.httpd.rpc.Handler;
-import com.google.gerrit.reviewdb.AccountGroup;
 import com.google.gerrit.reviewdb.Project;
-import com.google.gerrit.reviewdb.RefRight;
-import com.google.gerrit.server.account.GroupCache;
 import com.google.gerrit.server.project.NoSuchProjectException;
 import com.google.gerrit.server.project.ProjectControl;
 import com.google.gerrit.server.project.ProjectState;
-import com.google.gerrit.server.project.RefControl;
 import com.google.inject.Inject;
 import com.google.inject.assistedinject.Assisted;
 
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
 class ProjectDetailFactory extends Handler<ProjectDetail> {
   interface Factory {
     ProjectDetailFactory create(@Assisted Project.NameKey name);
   }
 
-  private final ApprovalTypes approvalTypes;
-  private final GroupCache groupCache;
   private final ProjectControl.Factory projectControlFactory;
 
   private final Project.NameKey projectName;
-  private Map<AccountGroup.Id, AccountGroup> groups;
 
   @Inject
-  ProjectDetailFactory(final ApprovalTypes approvalTypes,
-      final GroupCache groupCache,
-      final ProjectControl.Factory projectControlFactory,
+  ProjectDetailFactory(final ProjectControl.Factory projectControlFactory,
 
       @Assisted final Project.NameKey name) {
-    this.approvalTypes = approvalTypes;
-    this.groupCache = groupCache;
     this.projectControlFactory = projectControlFactory;
 
     this.projectName = name;
@@ -72,88 +50,13 @@
     final ProjectDetail detail = new ProjectDetail();
     detail.setProject(projectState.getProject());
 
-    groups = new HashMap<AccountGroup.Id, AccountGroup>();
-    final List<InheritedRefRight> refRights = new ArrayList<InheritedRefRight>();
-
-    for (final RefRight r : projectState.getInheritedRights()) {
-      RefControl rc = pc.controlForRef(r.getRefPattern());
-      boolean isOwner = rc.isOwner();
-
-      if (!isOwner && !rc.isVisible()) {
-        continue;
-      }
-
-      InheritedRefRight refRight = new InheritedRefRight(r, true, isOwner);
-      if (!refRights.contains(refRight)) {
-        refRights.add(refRight);
-        wantGroup(r.getAccountGroupId());
-      }
-    }
-
-    for (final RefRight r : projectState.getLocalRights()) {
-      RefControl rc = pc.controlForRef(r.getRefPattern());
-      boolean isOwner = rc.isOwner();
-
-      if (!isOwner && !rc.isVisible()) {
-        continue;
-      }
-
-      refRights.add(new InheritedRefRight(r, false, isOwner));
-      wantGroup(r.getAccountGroupId());
-    }
-
-    loadGroups();
-
-    Collections.sort(refRights, new Comparator<InheritedRefRight>() {
-      @Override
-      public int compare(final InheritedRefRight a, final InheritedRefRight b) {
-        final RefRight right1 = a.getRight();
-        final RefRight right2 = b.getRight();
-        int rc = categoryOf(right1).compareTo(categoryOf(right2));
-        if (rc == 0) {
-          rc = right1.getRefPattern().compareTo(right2.getRefPattern());
-        }
-        if (rc == 0) {
-          rc = groupOf(right1).compareTo(groupOf(right2));
-        }
-        return rc;
-      }
-
-      private String categoryOf(final RefRight r) {
-        final ApprovalType type =
-            approvalTypes.getApprovalType(r.getApprovalCategoryId());
-        if (type == null) {
-          return r.getApprovalCategoryId().get();
-        }
-        return type.getCategory().getName();
-      }
-
-      private String groupOf(final RefRight r) {
-        return groups.get(r.getAccountGroupId()).getName();
-      }
-    });
-
     final boolean userIsOwner = pc.isOwner();
     final boolean userIsOwnerAnyRef = pc.isOwnerAnyRef();
 
-    detail.setRights(refRights);
-    detail.setGroups(groups);
     detail.setCanModifyAccess(userIsOwnerAnyRef);
     detail.setCanModifyAgreements(userIsOwner);
     detail.setCanModifyDescription(userIsOwner);
     detail.setCanModifyMergeType(userIsOwner);
     return detail;
   }
-
-  private void wantGroup(final AccountGroup.Id id) {
-    groups.put(id, null);
-  }
-
-  private void loadGroups() {
-    final Set<AccountGroup.Id> toGet = groups.keySet();
-    groups = new HashMap<AccountGroup.Id, AccountGroup>();
-    for (AccountGroup.Id groupId : toGet) {
-      groups.put(groupId, groupCache.get(groupId));
-    }
-  }
 }
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/project/ProjectModule.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/project/ProjectModule.java
index 7932c79..8af54c2 100644
--- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/project/ProjectModule.java
+++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/project/ProjectModule.java
@@ -29,10 +29,8 @@
       @Override
       protected void configure() {
         factory(AddBranch.Factory.class);
-        factory(AddRefRight.Factory.class);
         factory(ChangeProjectSettings.Factory.class);
         factory(DeleteBranches.Factory.class);
-        factory(DeleteRefRights.Factory.class);
         factory(ListBranches.Factory.class);
         factory(VisibleProjects.Factory.class);
         factory(ProjectDetailFactory.Factory.class);