James Moger
2012-11-01 b701ed7c4e138c4aaa3acb029f6e35fdf01388e4
src/com/gitblit/wicket/panels/RegistrantPermissionsPanel.java
@@ -15,6 +15,7 @@
 */
package com.gitblit.wicket.panels;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
@@ -28,16 +29,23 @@
import org.apache.wicket.markup.html.form.DropDownChoice;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.markup.html.form.IChoiceRenderer;
import org.apache.wicket.markup.html.panel.Fragment;
import org.apache.wicket.markup.repeater.Item;
import org.apache.wicket.markup.repeater.OddEvenItem;
import org.apache.wicket.markup.repeater.RefreshingView;
import org.apache.wicket.markup.repeater.util.ModelIteratorAdapter;
import org.apache.wicket.model.CompoundPropertyModel;
import org.apache.wicket.model.IModel;
import org.eclipse.jgit.lib.PersonIdent;
import com.gitblit.Constants.AccessPermission;
import com.gitblit.Constants.PermissionType;
import com.gitblit.Constants.RegistrantType;
import com.gitblit.GitBlit;
import com.gitblit.models.RegistrantAccessPermission;
import com.gitblit.models.UserModel;
import com.gitblit.utils.DeepCopier;
import com.gitblit.utils.StringUtils;
import com.gitblit.wicket.WicketUtils;
/**
@@ -50,8 +58,9 @@
   private static final long serialVersionUID = 1L;
   public RegistrantPermissionsPanel(String wicketId, List<String> allRegistrants, final List<RegistrantAccessPermission> permissions, final Map<AccessPermission, String> translations) {
   public RegistrantPermissionsPanel(String wicketId, RegistrantType registrantType, List<String> allRegistrants, final List<RegistrantAccessPermission> permissions, final Map<AccessPermission, String> translations) {
      super(wicketId);
      setOutputMarkupId(true);
      
      // update existing permissions repeater
      RefreshingView<RegistrantAccessPermission> dataView = new RefreshingView<RegistrantAccessPermission>("permissionRow") {
@@ -78,13 +87,77 @@
            
         public void populateItem(final Item<RegistrantAccessPermission> item) {
            final RegistrantAccessPermission entry = item.getModelObject();
            item.add(new Label("registrant", entry.registrant));
            if (entry.isExplicit) {
               item.add(new Label("regex", "").setVisible(false));
            if (RegistrantType.REPOSITORY.equals(entry.registrantType)) {
               String repoName = StringUtils.stripDotGit(entry.registrant);
               if (!entry.isMissing() && StringUtils.findInvalidCharacter(repoName) == null) {
                  // repository, strip .git and show swatch
                  Label registrant = new Label("registrant", repoName);
                  WicketUtils.setCssClass(registrant, "repositorySwatch");
                  WicketUtils.setCssBackground(registrant, repoName);
                  item.add(registrant);
               } else {
                  // regex or missing
                  Label label = new Label("registrant", entry.registrant);
                  WicketUtils.setCssStyle(label, "font-weight: bold;");
                  item.add(label);
               }
            } else if (RegistrantType.USER.equals(entry.registrantType)) {
               // user
               PersonIdent ident = new PersonIdent(entry.registrant, null);
               UserModel user = GitBlit.self().getUserModel(entry.registrant);
               if (user != null) {
                  ident = new PersonIdent(user.getDisplayName(), user.emailAddress);
               }
               Fragment userFragment = new Fragment("registrant", "userRegistrant", RegistrantPermissionsPanel.this);
               userFragment.add(new GravatarImage("userAvatar", ident, 20, false));
               userFragment.add(new Label("userName", entry.registrant));
               item.add(userFragment);
            } else {
               Label regex = new Label("regex", "regex");
               WicketUtils.setHtmlTooltip(regex, getString("gb.regexPermission"));
               // team
               Fragment teamFragment = new Fragment("registrant", "teamRegistrant", RegistrantPermissionsPanel.this);
               teamFragment.add(new Label("teamName", entry.registrant));
               item.add(teamFragment);
            }
            switch (entry.permissionType) {
            case ADMINISTRATOR:
               Label administrator = new Label("pType", entry.source == null ? getString("gb.administrator") : entry.source);
               WicketUtils.setHtmlTooltip(administrator, getString("gb.administratorPermission"));
               WicketUtils.setCssClass(administrator, "label label-inverse");
               item.add(administrator);
               break;
            case OWNER:
               Label owner = new Label("pType", getString("gb.owner"));
               WicketUtils.setHtmlTooltip(owner, getString("gb.ownerPermission"));
               WicketUtils.setCssClass(owner, "label label-info");
               item.add(owner);
               break;
            case TEAM:
               Label team = new Label("pType", entry.source == null ? getString("gb.team") : entry.source);
               WicketUtils.setHtmlTooltip(team, MessageFormat.format(getString("gb.teamPermission"), entry.source));
               WicketUtils.setCssClass(team, "label label-success");
               item.add(team);
               break;
            case REGEX:
               Label regex = new Label("pType", "regex");
               if (!StringUtils.isEmpty(entry.source)) {
                  WicketUtils.setHtmlTooltip(regex, MessageFormat.format(getString("gb.regexPermission"), entry.source));
               }
               WicketUtils.setCssClass(regex, "label");
               item.add(regex);
               break;
            default:
               if (entry.isMissing()) {
                  // repository is missing, this permission will be removed on save
                  Label missing = new Label("pType", getString("gb.missing"));
                  WicketUtils.setCssClass(missing, "label label-important");
                  WicketUtils.setHtmlTooltip(missing, getString("gb.missingPermission"));
                  item.add(missing);
               } else {
                  // standard permission
                  item.add(new Label("pType", "").setVisible(false));
               }
               break;
            }
            // use ajax to get immediate update of permission level change
@@ -95,8 +168,9 @@
            // only allow changing an explicitly defined permission
            // this is designed to prevent changing a regex permission in
            // a repository
            permissionChoice.setEnabled(entry.isExplicit);
            if (entry.isExplicit) {
            permissionChoice.setEnabled(entry.mutable);
            permissionChoice.setOutputMarkupId(true);
            if (entry.mutable) {
               permissionChoice.add(new AjaxFormComponentUpdatingBehavior("onchange") {
                 
                  private static final long serialVersionUID = 1L;
@@ -116,11 +190,21 @@
      // filter out registrants we already have permissions for
      final List<String> registrants = new ArrayList<String>(allRegistrants);
      for (RegistrantAccessPermission rp : permissions) {
         registrants.remove(rp.registrant);
         if (rp.mutable) {
            // remove editable duplicates
            // this allows for specifying an explicit permission
            registrants.remove(rp.registrant);
         } else if (rp.isAdmin()) {
            // administrators can not have their permission changed
            registrants.remove(rp.registrant);
         } else if (rp.isOwner()) {
            // owners can not have their permission changed
            registrants.remove(rp.registrant);
         }
      }
      // add new permission form
      IModel<RegistrantAccessPermission> addPermissionModel = new CompoundPropertyModel<RegistrantAccessPermission>(new RegistrantAccessPermission());
      IModel<RegistrantAccessPermission> addPermissionModel = new CompoundPropertyModel<RegistrantAccessPermission>(new RegistrantAccessPermission(registrantType));
      Form<RegistrantAccessPermission> addPermissionForm = new Form<RegistrantAccessPermission>("addPermissionForm", addPermissionModel);
      addPermissionForm.add(new DropDownChoice<String>("registrant", registrants));
      addPermissionForm.add(new DropDownChoice<AccessPermission>("permission", Arrays
@@ -133,7 +217,14 @@
         protected void onSubmit(AjaxRequestTarget target, Form<?> form) {
            // add permission to our list
            RegistrantAccessPermission rp = (RegistrantAccessPermission) form.getModel().getObject();
            permissions.add(DeepCopier.copy(rp));
            if (rp.permission == null) {
               return;
            }
            RegistrantAccessPermission copy = DeepCopier.copy(rp);
            if (StringUtils.findInvalidCharacter(copy.registrant) != null) {
               copy.permissionType = PermissionType.REGEX;
            }
            permissions.add(copy);
            
            // remove registrant from available choices
            registrants.remove(rp.registrant);
@@ -148,6 +239,12 @@
      add(addPermissionForm.setVisible(registrants.size() > 0));
   }
   
   protected boolean getStatelessHint()
   {
      return false;
   }
   private class AccessPermissionRenderer implements IChoiceRenderer<AccessPermission> {
      private static final long serialVersionUID = 1L;