James Moger
2012-11-24 ca12058bbf0f2aa391254cbc6a5915323cdd611b
src/com/gitblit/models/RegistrantAccessPermission.java
@@ -18,6 +18,7 @@
import java.io.Serializable;
import com.gitblit.Constants.AccessPermission;
import com.gitblit.Constants.PermissionType;
import com.gitblit.Constants.RegistrantType;
import com.gitblit.utils.StringUtils;
@@ -32,31 +33,116 @@
   public String registrant;
   public AccessPermission permission;
   public RegistrantType type;
   public boolean isExplicit;
   public RegistrantType registrantType;
   public PermissionType permissionType;
   public boolean mutable;
   public String source;
   public RegistrantAccessPermission() {
      isExplicit = true;
   }
   public RegistrantAccessPermission(RegistrantType registrantType) {
      this.registrantType = registrantType;
      this.permissionType = PermissionType.EXPLICIT;
      this.mutable = true;
   }
   
   public RegistrantAccessPermission(String registrant, AccessPermission permission, boolean isExplicit, RegistrantType type) {
   public RegistrantAccessPermission(String registrant, AccessPermission permission, PermissionType permissionType, RegistrantType registrantType, String source, boolean mutable) {
      this.registrant = registrant;
      this.permission = permission;
      this.isExplicit = isExplicit;
      this.type = type;
      this.permissionType = permissionType;
      this.registrantType = registrantType;
      this.source = source;
      this.mutable = mutable;
   }
   public boolean isAdmin() {
      return PermissionType.ADMINISTRATOR.equals(permissionType);
   }
   public boolean isOwner() {
      return PermissionType.OWNER.equals(permissionType);
   }
   public boolean isExplicit() {
      return PermissionType.EXPLICIT.equals(permissionType);
   }
   public boolean isRegex() {
      return PermissionType.REGEX.equals(permissionType);
   }
   public boolean isTeam() {
      return PermissionType.TEAM.equals(permissionType);
   }
   public boolean isMissing() {
      return PermissionType.MISSING.equals(permissionType);
   }
   public int getScore() {
      switch (registrantType) {
      case REPOSITORY:
         if (isAdmin()) {
            return 0;
         }
         if (isOwner()) {
            return 1;
         }
         if (isExplicit()) {
            return 2;
         }
         if (isRegex()) {
            return 3;
         }
         if (isTeam()) {
            return 4;
         }
      default:
         return 0;
      }
   }
   
   @Override
   public int compareTo(RegistrantAccessPermission p) {
      switch (type) {
      switch (registrantType) {
      case REPOSITORY:
         // repository permissions are sorted in score order
         // to convey the order in which permissions are tested
         int score1 = getScore();
         int score2 = p.getScore();
         if (score1 <= 2 && score2 <= 2) {
            // group admin, owner, and explicit together
            return StringUtils.compareRepositoryNames(registrant, p.registrant);
         }
         if (score1 < score2) {
            return -1;
         } else if (score2 < score1) {
            return 1;
         }
         return StringUtils.compareRepositoryNames(registrant, p.registrant);
      default:
         return registrant.toLowerCase().compareTo(p.registrant.toLowerCase());
         // user and team permissions are string sorted
         return registrant.toLowerCase().compareTo(p.registrant.toLowerCase());
      }
   }
   
   @Override
   public int hashCode() {
      return registrant.hashCode();
   }
   @Override
   public boolean equals(Object o) {
      if (o instanceof RegistrantAccessPermission) {
         RegistrantAccessPermission p = (RegistrantAccessPermission) o;
         return registrant.equals(p.registrant);
      }
      return false;
   }
   @Override
   public String toString() {
      return permission.asRole(registrant);
   }