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