From 4cac0d3a0952078ce8ebd3fdedbefeb7803ac080 Mon Sep 17 00:00:00 2001
From: James Moger <james.moger@gitblit.com>
Date: Fri, 28 Oct 2011 21:24:02 -0400
Subject: [PATCH] Added basic rss subscriptions to Manager

---
 src/com/gitblit/client/GitblitClient.java |  135 +++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 131 insertions(+), 4 deletions(-)

diff --git a/src/com/gitblit/client/GitblitClient.java b/src/com/gitblit/client/GitblitClient.java
index 9f4dd3e..ccde45a 100644
--- a/src/com/gitblit/client/GitblitClient.java
+++ b/src/com/gitblit/client/GitblitClient.java
@@ -19,8 +19,10 @@
 import java.io.Serializable;
 import java.util.ArrayList;
 import java.util.Collections;
+import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 
 import com.gitblit.GitBlitException.ForbiddenException;
 import com.gitblit.GitBlitException.NotAllowedException;
@@ -31,8 +33,11 @@
 import com.gitblit.models.RepositoryModel;
 import com.gitblit.models.ServerSettings;
 import com.gitblit.models.ServerStatus;
+import com.gitblit.models.SyndicatedEntryModel;
 import com.gitblit.models.UserModel;
 import com.gitblit.utils.RpcUtils;
+import com.gitblit.utils.StringUtils;
+import com.gitblit.utils.SyndicationUtils;
 
 /**
  * GitblitClient is a object that retrieves data from a Gitblit server, caches
@@ -44,6 +49,8 @@
 public class GitblitClient implements Serializable {
 
 	private static final long serialVersionUID = 1L;
+
+	protected final GitblitRegistration reg;
 
 	public final String url;
 
@@ -63,22 +70,35 @@
 
 	private final List<FederationModel> federationRegistrations;
 
+	private final List<SyndicatedEntryModel> syndicatedEntries;
+
 	private ServerStatus status;
 
-	public GitblitClient(String url, String account, char[] password) {
-		this.url = url;
-		this.account = account;
-		this.password = password;
+	public GitblitClient(GitblitRegistration reg) {
+		this.reg = reg;
+		this.url = reg.url;
+		this.account = reg.account;
+		this.password = reg.password;
 
 		this.allUsers = new ArrayList<UserModel>();
 		this.allRepositories = new ArrayList<RepositoryModel>();
 		this.federationRegistrations = new ArrayList<FederationModel>();
+		this.syndicatedEntries = new ArrayList<SyndicatedEntryModel>();
 	}
 
 	public void login() throws IOException {
 		refreshRepositories();
 
 		try {
+			// RSS feeds may be disabled by server
+			refreshSubscribedFeeds();
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+		
+		try {
+			// credentials may not have administrator access
+			// or server may have disabled rpc management
 			refreshUsers();
 			refreshSettings();
 			allowManagement = true;
@@ -91,6 +111,8 @@
 		}
 
 		try {
+			// credentials may not have administrator access
+			// or server may have disabled rpc administration
 			refreshStatus();
 			allowAdministration = true;
 		} catch (UnauthorizedException e) {
@@ -133,6 +155,7 @@
 		allRepositories.clear();
 		allRepositories.addAll(repositories.values());
 		Collections.sort(allRepositories);
+		updateSubscribedStates();
 		return allRepositories;
 	}
 
@@ -153,6 +176,110 @@
 		return status;
 	}
 
+	public List<SyndicatedEntryModel> refreshSubscribedFeeds() throws IOException {
+		Set<SyndicatedEntryModel> allFeeds = new HashSet<SyndicatedEntryModel>();
+		if (reg.feeds != null && reg.feeds.size() > 0) {
+			for (String feed : reg.feeds) {
+				String[] values = feed.split(":");
+				String repository = values[0];
+				String branch = null;
+				if (values.length > 1) {
+					branch = values[1];
+				}
+				List<SyndicatedEntryModel> list = SyndicationUtils.readFeed(url, repository,
+						branch, -1, account, password);
+				allFeeds.addAll(list);
+			}
+		}
+		syndicatedEntries.clear();
+		syndicatedEntries.addAll(allFeeds);
+		Collections.sort(syndicatedEntries);
+		return syndicatedEntries;
+	}
+
+	private void updateSubscribedStates() {
+		if (reg.feeds != null) {
+			Set<String> subscribedRepositories = new HashSet<String>();
+			for (String feed : reg.feeds) {
+				if (feed.indexOf(':') > -1) {
+					// strip branch
+					subscribedRepositories.add(feed.substring(0, feed.indexOf(':')).toLowerCase());
+				} else {
+					// default branch
+					subscribedRepositories.add(feed.toLowerCase());
+				}
+			}
+			// set subscribed flag
+			for (RepositoryModel repository : allRepositories) {
+				repository.subscribed = subscribedRepositories.contains(repository.name
+						.toLowerCase());
+			}
+		}
+	}
+
+	public List<SyndicatedEntryModel> getSyndicatedEntries() {
+		return syndicatedEntries;
+	}
+
+	public boolean isSubscribed(RepositoryModel repository, String branch) {
+		if (reg.feeds != null && reg.feeds.size() > 0) {
+			for (String feed : reg.feeds) {
+				String[] values = feed.split(":");
+				String repositoryName = values[0];
+				if (repository.name.equalsIgnoreCase(repositoryName)) {
+					return true;
+				}
+				// TODO check branch subscriptions
+				String branchName = null;
+				if (values.length > 1) {
+					branchName = values[1];
+				}
+			}
+		}
+		return false;
+	}
+
+	public boolean subscribe(RepositoryModel repository, String branch) {
+		String feed = repository.name;
+		if (!StringUtils.isEmpty(branch)) {
+			feed += ":" + branch;
+		}
+		if (reg.feeds == null) {
+			reg.feeds = new ArrayList<String>();
+		}
+		reg.feeds.add(feed);
+		updateSubscribedStates();
+		return true;
+	}
+
+	public boolean unsubscribe(RepositoryModel repository, String branch) {
+		String feed = repository.name;
+		if (!StringUtils.isEmpty(branch)) {
+			feed += ":" + branch;
+		}
+		reg.feeds.remove(feed);
+		if (syndicatedEntries.size() > 0) {
+			List<SyndicatedEntryModel> toRemove = new ArrayList<SyndicatedEntryModel>();
+			for (SyndicatedEntryModel model : syndicatedEntries) {
+				if (model.repository.equalsIgnoreCase(repository.name)) {
+					boolean emptyUnsubscribeBranch = StringUtils.isEmpty(branch);
+					boolean emptyFromBranch = StringUtils.isEmpty(model.branch);
+					if (emptyUnsubscribeBranch && emptyFromBranch) {
+						// default branch, remove
+						toRemove.add(model);
+					} else if (!emptyUnsubscribeBranch && !emptyFromBranch) {
+						if (model.branch.equals(branch)) {
+							// specific branch, remove
+							toRemove.add(model);
+						}
+					}
+				}
+			}
+		}
+		updateSubscribedStates();
+		return true;
+	}
+
 	public List<FederationModel> refreshFederationRegistrations() throws IOException {
 		List<FederationModel> list = RpcUtils.getFederationRegistrations(url, account, password);
 		federationRegistrations.clear();

--
Gitblit v1.9.1