From 661db6c2948e4848b29645c66e17cbfcaa780ae0 Mon Sep 17 00:00:00 2001
From: James Moger <james.moger@gitblit.com>
Date: Wed, 23 Jan 2013 07:52:20 -0500
Subject: [PATCH] Revised multiple owners contribution

---
 src/com/gitblit/models/RepositoryModel.java |  116 ++++++++++++++++++++++++++-------------------------------
 1 files changed, 53 insertions(+), 63 deletions(-)

diff --git a/src/com/gitblit/models/RepositoryModel.java b/src/com/gitblit/models/RepositoryModel.java
index a27e9fd..320f16b 100644
--- a/src/com/gitblit/models/RepositoryModel.java
+++ b/src/com/gitblit/models/RepositoryModel.java
@@ -17,20 +17,17 @@
 
 import java.io.Serializable;
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.Date;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
 import java.util.TreeSet;
 
-import org.apache.wicket.markup.html.basic.MultiLineLabel;
-
 import com.gitblit.Constants.AccessRestrictionType;
 import com.gitblit.Constants.AuthorizationControl;
 import com.gitblit.Constants.FederationStrategy;
 import com.gitblit.utils.ArrayUtils;
-import com.gitblit.utils.MultiConfigUtil;
-import com.gitblit.utils.StringComparator;
 import com.gitblit.utils.StringUtils;
 
 /**
@@ -40,15 +37,14 @@
  * @author James Moger
  * 
  */
-public class RepositoryModel implements Serializable,
-		Comparable<RepositoryModel> {
+public class RepositoryModel implements Serializable, Comparable<RepositoryModel> {
 
 	private static final long serialVersionUID = 1L;
 
 	// field names are reflectively mapped in EditRepository page
 	public String name;
 	public String description;
-	private Set<String> repoAdministrators = new TreeSet<String>(new StringComparator());
+	public List<String> owners;
 	public Date lastChange;
 	public boolean hasCommits;
 	public boolean showRemoteBranches;
@@ -84,29 +80,28 @@
 	public String gcThreshold;
 	public int gcPeriod;
 	public int maxActivityCommits;
-
+	
 	public transient boolean isCollectingGarbage;
 	public Date lastGC;
-
-	private MultiConfigUtil multiConfigUtil = new MultiConfigUtil();
-
+	
 	public RepositoryModel() {
 		this("", "", "", new Date(0));
 	}
 
-	public RepositoryModel(String name, String description, String owner,
-			Date lastchange) {
+	public RepositoryModel(String name, String description, String owner, Date lastchange) {
 		this.name = name;
-		this.description = description;		
-		this.addRepoAdministrator(owner);
+		this.description = description;
 		this.lastChange = lastchange;
 		this.accessRestriction = AccessRestrictionType.NONE;
 		this.authorizationControl = AuthorizationControl.NAMED;
 		this.federationSets = new ArrayList<String>();
-		this.federationStrategy = FederationStrategy.FEDERATE_THIS;
+		this.federationStrategy = FederationStrategy.FEDERATE_THIS;	
 		this.projectPath = StringUtils.getFirstPathElement(name);
+		this.owners = new ArrayList<String>();
+		
+		addOwner(owner);
 	}
-
+	
 	public List<String> getLocalBranches() {
 		if (ArrayUtils.isEmpty(availableRefs)) {
 			return new ArrayList<String>();
@@ -119,30 +114,30 @@
 		}
 		return localBranches;
 	}
-
+	
 	public void addFork(String repository) {
 		if (forks == null) {
 			forks = new TreeSet<String>();
 		}
 		forks.add(repository);
 	}
-
+	
 	public void removeFork(String repository) {
 		if (forks == null) {
 			return;
 		}
 		forks.remove(repository);
 	}
-
+	
 	public void resetDisplayName() {
 		displayName = null;
 	}
-
+	
 	@Override
 	public int hashCode() {
 		return name.hashCode();
 	}
-
+	
 	@Override
 	public boolean equals(Object o) {
 		if (o instanceof RepositoryModel) {
@@ -163,25 +158,30 @@
 	public int compareTo(RepositoryModel o) {
 		return StringUtils.compareRepositoryNames(name, o.name);
 	}
-
+	
 	public boolean isFork() {
 		return !StringUtils.isEmpty(originRepository);
 	}
-
+	
+	public boolean isOwner(String username) {
+		if (StringUtils.isEmpty(username) || ArrayUtils.isEmpty(owners)) {
+			return false;
+		}
+		return owners.contains(username.toLowerCase());
+	}
+	
 	public boolean isPersonalRepository() {
-		return !StringUtils.isEmpty(projectPath)
-				&& projectPath.charAt(0) == '~';
+		return !StringUtils.isEmpty(projectPath) && projectPath.charAt(0) == '~';
 	}
-
+	
 	public boolean isUsersPersonalRepository(String username) {
-		return !StringUtils.isEmpty(projectPath)
-				&& projectPath.equalsIgnoreCase("~" + username);
+		return !StringUtils.isEmpty(projectPath) && projectPath.equalsIgnoreCase("~" + username);
 	}
-
+	
 	public boolean allowAnonymousView() {
 		return !accessRestriction.atLeast(AccessRestrictionType.VIEW);
 	}
-
+	
 	public RepositoryModel cloneAs(String cloneName) {
 		RepositoryModel clone = new RepositoryModel();
 		clone.originRepository = name;
@@ -202,46 +202,36 @@
 		return clone;
 	}
 
-	public void addRepoAdministrator(String repoAdministrator) {
-		if (repoAdministrator != null && repoAdministrator.trim().length() > 0) {
-			this.repoAdministrators.add(repoAdministrator.toLowerCase());
-		}
-	}
-
-	public void removeRepoAdministrator(String repoAdministrator) {
-		if (repoAdministrator != null && repoAdministrator.trim().length() > 0) {
-			this.repoAdministrators.remove(repoAdministrator.toLowerCase());
-		}
-	}
-
-	public void addRepoAdministrators(Set<String> repoAdministrators) {
-		if (repoAdministrators != null) {
-			for (String admin : repoAdministrators) {
-				this.addRepoAdministrator(admin);
+	public void addOwner(String username) {
+		if (!StringUtils.isEmpty(username)) {
+			String name = username.toLowerCase();
+			// a set would be more efficient, but this complicates JSON
+			// deserialization so we enforce uniqueness with an arraylist
+			if (!owners.contains(name)) {
+				owners.add(name);
 			}
 		}
 	}
 
-	public void removeRepoAdministrators(Set<String> repoAdministrators) {
-		if (repoAdministrators != null) {
-			for (String admin : repoAdministrators) {
-				this.removeRepoAdministrator(admin);
+	public void removeOwner(String username) {
+		if (!StringUtils.isEmpty(username)) {
+			owners.remove(username.toLowerCase());
+		}
+	}
+
+	public void addOwners(Collection<String> usernames) {
+		if (!ArrayUtils.isEmpty(usernames)) {
+			for (String username : usernames) {
+				addOwner(username);
 			}
 		}
 	}
 
-	public void removeAllRepoAdministrators() {
-		this.repoAdministrators.clear();
-	}
-	
-	public Set<String> getRepoAdministrators() {
-		return this.repoAdministrators;
-	}
-	
-	public boolean isRepoAdministrator(String username) {
-		if (username == null || username.trim().length() == 0) {
-			return false;
+	public void removeOwners(Collection<String> usernames) {
+		if (!ArrayUtils.isEmpty(owners)) {
+			for (String username : usernames) {
+				removeOwner(username);
+			}
 		}
-		return this.repoAdministrators.contains(username.toLowerCase());
 	}
 }
\ No newline at end of file

--
Gitblit v1.9.1